如何正确构建指定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
相关产品推荐
相关产品推荐

