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

如何正确构建指定InputSchema的Genkit多字段挪威语翻译Flow?

处理Genkit Flow翻译任务的正确方式及空字段bug修复

问题背景

需要构建一个Genkit Flow,接收如下结构的JSON输入:

{
   "title": "string",
   "message": "string",
   "label": "string"
}

返回结构相同但各属性内容均译为挪威语的对象。当前实现代码虽能运行,但存在bug:当label字段为空字符串时,模型会误译“label”这个字段名称而非返回空。

当前实现代码:

export const translateInAppMessage = ai.defineFlow(
{
    name: "translateInAppMessage",
    inputSchema: z.object({
        title: z.string(),
        message: z.string(),
        label: z.string(),
    }),
    outputSchema: z.object({
        title: z.string(),
        message: z.string(),
        label: z.string().nullable(),
    }),
},

async (subject) => {
    const prompt = JSON.stringify(subject);
    const llmResponse = await ai.generate({
        model: gemini15Flash,
        prompt: prompt,
        output: {
            schema: z.object({
                title: z.string().describe("translate title  to norwegian"),
                message: z.string().describe("translate message to norwegian"),
                label: z.string().describe("translate label to norwegian").nullable(),
            })
        }
    });
    return llmResponse.output;
});

正确实现方案

1. 优化提示词,明确空字段规则

直接传入JSON字符串容易让模型误解空字段的含义,需要用自然语言清晰定义任务,同时明确空字段的处理逻辑:

  • 明确告知模型要翻译的是每个字段的内容,而非字段名
  • 规定如果字段内容是空字符串,直接返回空字符串,不进行翻译操作

2. 预处理输入字段,提前过滤空值

在调用LLM之前,先检查输入中的空字段,对于空字符串的字段,可以直接保留空值,避免模型处理时产生歧义。

3. 完善Schema描述,增强模型理解

给每个字段的describe补充更明确的规则,让模型清楚空字段的处理方式。

修改后的完整代码

export const translateInAppMessage = ai.defineFlow(
{
    name: "translateInAppMessage",
    inputSchema: z.object({
        title: z.string(),
        message: z.string(),
        label: z.string(),
    }),
    outputSchema: z.object({
        title: z.string(),
        message: z.string(),
        label: z.string().nullable(),
    }),
},

async (subject) => {
    // 预处理空字段,提前保留空值
    const processedInput = { ...subject };
    // 构建明确的提示词
    const prompt = `请将以下对象中的每个字段内容翻译成挪威语:
${JSON.stringify(processedInput)}
注意规则:
1. 仅翻译字段的内容,不要翻译字段名称(如title、message、label)
2. 如果某个字段的内容是空字符串,直接返回空字符串,不要进行任何翻译操作`;

    const llmResponse = await ai.generate({
        model: gemini15Flash,
        prompt: prompt,
        output: {
            schema: z.object({
                title: z.string().describe("将输入的title字段内容翻译成挪威语;若输入为空字符串则返回空"),
                message: z.string().describe("将输入的message字段内容翻译成挪威语;若输入为空字符串则返回空"),
                label: z.string().describe("将输入的label字段内容翻译成挪威语;若输入为空字符串则返回空").nullable(),
            })
        }
    });

    // 确保空字段返回正确的空值(防止模型返回非预期内容)
    const result = llmResponse.output;
    if (subject.label === "") {
        result.label = "";
    }
    return result;
});

关键改进点

  • 提示词明确区分字段名和字段内容,避免模型误译字段名
  • 增加空字段预处理和后处理逻辑,确保空字符串字段返回正确结果
  • Schema描述补充空字段处理规则,进一步引导模型输出符合预期的结果

内容的提问来源于stack exchange,提问作者pb4now

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:19:58