You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Genkit云函数generate报错及输出可靠性优化咨询

问题:Firebase Genkit生成图片物品描述时频繁出现Schema匹配失败报错

使用Firebase Genkit创建Cloud Function,用于生成图片中物品的描述,但90%的情况下会抛出如下错误:

FAILED_PRECONDITION: Generation resulted in no candidates matching provided output schema

相关代码

Schema定义:

const InventoryItem = z.object({
  name: z.string().describe("the name of the item"),
  description: z
    .string()
    .describe("a brief description of the item"),
  funFact: z.string().optional().describe("a fun fact about the item"),
});

流程代码:

export const identifyItemFromUrl = onFlow(
  {
    name: "identifyItemFromUrl",
    inputSchema: z.string().url(),
    outputSchema: InventoryItem,
    authPolicy: noAuth(),
  },
  async (url) => {
    const prompt =
      "Identify this item.";

    const llmResponse = await generate({
      model: gemini15Pro,
      prompt: [
        { text: prompt },
        {
          media: {
            url: url,
            contentType: "image/jpeg",
          },
        },
      ],
      output: { schema: InventoryItem },
    });

    return llmResponse.output()!;
  }
);

疑问

  1. generate方法的工作机制是随机生成响应直到匹配schema吗?
  2. 有没有方法提升输出的可靠性?

解答

关于generate方法的工作机制

generate并非随机生成直到匹配Schema。它的工作流程是:

  1. 将传入的Zod Schema转换为模型可理解的格式(如JSON Schema),并附加到提示上下文;
  2. 引导模型生成符合结构要求的内容;
  3. 生成完成后,用Zod直接验证输出内容是否匹配Schema;
  4. 如果验证失败,默认不会自动重试,直接返回FAILED_PRECONDITION错误。

提升输出可靠性的方法

  • 优化提示词,明确格式要求:将原有的简单提示替换为更具体的指令,比如:

    根据提供的图片,生成符合以下JSON结构的物品信息:
    {
      "name": "物品名称",
      "description": "物品的简短描述",
      "funFact": "可选的趣味知识(可省略)"
    }
    严格按照该JSON结构输出,不要添加任何额外的解释性文字。
    

    明确的指令能大幅降低模型输出偏离结构的概率。

  • 启用自动重试机制:在generate配置中添加maxRetries参数,设置重试次数,比如:

    const llmResponse = await generate({
      model: gemini15Pro,
      prompt: [...],
      output: { schema: InventoryItem },
      maxRetries: 3 // 最多重试3次
    });
    

    当首次输出不符合Schema时,会自动重新调用模型生成内容,直到匹配或达到重试上限。

  • 调整Schema的灵活性:

    • 为可选字段补充更清晰的描述,让模型明确可以忽略该字段;
    • 对必填字段适当放宽验证规则,比如给description添加minLength(1)避免空字符串,同时不设置过严的长度限制。
  • 确保图片质量与可访问性:

    • 确认传入的图片URL可公开访问,没有权限限制;
    • 保证图片清晰,物品主体突出,避免模糊、过暗或包含过多无关元素的图片。
  • 添加示例输出:在提示中加入符合Schema的示例,帮助模型理解预期格式,比如:

    示例输出:
    {"name": "复古金属钥匙扣", "description": "带有汽车图案的圆形金属钥匙扣,表面做旧处理", "funFact": "钥匙扣最早作为身份标识出现在19世纪"}
    

内容的提问来源于stack exchange,提问作者Code on the Rocks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 17:16:12