如何配置AI SDK使LLM仅生成工具结果摘要而非重复Markdown内容?
问题描述
使用AI SDK v4.1.42 + @ai-sdk/openai v1.1.13 + React 19时,调用streamText()返回的消息包含两部分:
- 工具结果:结构化数据对象,已通过专用UI组件(如
ProductTable)渲染 - LLM文本结果:会重复输出工具结果的完整Markdown格式内容,导致和UI组件展示重复
期望LLM仅生成与工具结果相关的简短说明或上下文,不重复输出Markdown格式的工具内容,同时保留工具结果的UI组件渲染。之前hemabil( mix mornCard ioDec专家守.options导致ain调整系统提示明确要求仅返回简短摘要,但未生效。
解决方案
1. 强化系统提示指令
系统提示需要更明确、强制地告知LLM:工具结果会通过UI组件展示,无需在文本中重复输出,仅需提供简短的上下文说明或引用。
修改/api/chat/route.ts中的systemPrompt:
const systemPrompt = ` 你是助手,调用工具获取结果后: 1. 绝对不要在文本响应中重复工具返回的结构化数据,也不要将其格式化为Markdown(比如表格) 2. 仅生成简短自然语言说明,告知用户工具已获取到相关信息,或补充必要上下文 3. 文本响应必须简洁,只聚焦辅助理解工具结果的内容 `;
2. 配置工具调用后的行为
AI SDK支持通过toolCallBehavior参数控制LLM在工具调用后的响应逻辑,可在streamText中添加该配置:
const result = streamText({ model: openai('gpt-4o-mini'), system: systemPrompt, messages, maxSteps: 10, tools, toolCallBehavior: { type: 'auto', promptInstructions: '工具结果将通过专用UI组件展示,你只需生成简短文本说明,无需重复工具数据' } });
3. 前端文本过滤(备选方案)
若上述SDK配置仍不生效,可在前端渲染文本时过滤掉重复的Markdown内容。以getProducts工具为例,检测并移除文本中的表格格式:
// 在ChatInterface.tsx的文本渲染逻辑中修改 if (part.type === 'text') { let filteredText = part.text; // 匹配并移除Markdown表格格式,可根据实际工具输出调整正则 filteredText = filteredText.replace(/(\|.*\|[\r\n])+/g, ''); return <Message key={`text-${index}`} role={message.role} text={filteredText} />; }
关键注意事项
- 系统提示指令必须清晰无歧义,避免LLM误解需要输出工具结果格式
- 若gpt-4o-mini对指令遵循度不足,可尝试切换到gpt-4o等更强大的模型测试
- 检查工具定义是否包含多余描述,导致LLM认为需要输出格式内容
内容的提问来源于stack exchange,提问作者Loiic
相关产品推荐
相关产品推荐

