拒绝对话“胡编乱造”:从原理到实战,打造生产级稳定的 AI Agent
前言:Agent 很美,但“落地”很碎
最近在折腾 AI Agent 时,我发现了一个真相:Demo 只要 Prompt 写得好,生产环境却得靠代码跑。
很多人在初试 Agent 时,最崩溃的就是模型开始“胡编乱造”:要么把北京的天气说成上海的,要么明明问的是明天,它却给你昨天的答案。这种稳定性问题,是 Agent 走向实战的最大绊脚石。
今天结合我自己的踩坑经验,咱们聊聊如何通过 ReAct 范式和代码护栏,驯服那些不听话的智能体。
一、 为什么你的 Agent 会“脑补”?
一个标准的 Agent 由感知 (Perception) 、规划 (Planning) 、行动 (Action) 和 记忆 (Memory) 组成。
通过复盘我发现,幻觉通常发生在规划和行动的交界处:
- 规划层飘了:LLM 没理解复杂的约束,随手构思了一个错误的执行路径。
- 行动层空了:调用 API 报错或返回意外结果,Agent 没处理好,直接开始“强行解释”。
二、 核心驱动力:深度理解 ReAct 范式
要解决稳定性,必须死磕 ReAct (Reason + Act) 。很多人会把顺序搞混,记住这个硬逻辑:
Think (思考) -> Act (行动) -> Observe (观察)
- Think:我该干什么?需要什么参数?
- Act:真刀真枪去调 API(这里是注入代码校验的最佳时机)。
- Observe:看结果,并反思:“这结果对吗?不对我就重来。”
注意: 先有 Act 才有 Observe。如果没有行动就去观察,那不叫 Agent,那叫“空想家”。
三、 硬核实战:Node.js 打造带“护栏”的引擎
光说不练假把式。作为前端出身,我习惯用 TypeScript 给 Agent 加上强类型约束。
1. 工具层的“防御性编程”
不要相信 LLM 传回来的任何参数。在执行前,先用代码硬核校验:
// 定义一个带参数校验的天气工具
async function weatherTool(params: { location: string; date: string }) {
// 护栏 1:格式校验。防止 Agent 随手传个“明天”而不是标准日期
const dateRegex = /^\d{4}-\d{2}-\d{2}$/;
if (!dateRegex.test(params.date)) {
throw new Error(`参数错误:日期格式应为 YYYY-MM-DD,你传的是 ${params.date}`);
}
console.log(`[Executing] 查询 ${params.location} 的天气...`);
// 模拟 API 返回
return { temp: 25, unit: "C", city: params.location, date: params.date };
}
2. 构建 ReAct 循环引擎
我们需要一个 while 循环,让 Agent 在达成目标前不断迭代,并处理错误。
async function runStableAgent(userPrompt: string) {
let context = `User Request: ${userPrompt}\n`;
let turns = 0;
while (turns < 5) {
// 1. THINK: 引导模型输出结构化思考
const response = await llm.generateJSON(`
你是一个严谨的助手。根据当前上下文决定行动。
可选 Action: "query_weather" 或 "final_answer"。
上下文: ${context}
`);
// 2. ACT: 执行并拦截错误
if (response.action === "final_answer") {
console.log("🎉 最终答案:", response.content);
break;
}
try {
// 3. OBSERVE: 获取观察结果
const observation = await weatherTool(response.params);
context += `Thought: 我已执行查询。\nObservation: ${JSON.stringify(observation)}\n`;
} catch (error) {
// 关键:把错误信息喂回给模型,让它自己修正幻觉!
context += `Observation: 错误 - ${error.message}。请修正后重新执行。\n`;
}
turns++;
}
}
四、 进阶总结:稳定性的三个锦囊
- System Prompt 边界化:在 Prompt 里明确告诉它:“如果你不知道,请回复不知道,或者调用搜索,严禁编造日期。”
- 结构化输出 (JSON Mode) :永远不要让模型直接回复纯文本,强制 JSON 输出是前后端联调的基石,也是 Agent 稳定的前提。
- 闭环验证:在最终输出给用户前,增加一个“Self-Reflection”环节。让 LLM 自己核对一下: “我刚才查到的北京天气,真的是用户问的明天的吗?”
结语
AI Agent 的上限取决于 LLM 的智力,但它的下限——也就是你系统的鲁棒性,是由你的工程逻辑决定的。
作为一个前端开发者,你不必因为不懂深度学习算法而焦虑。相反,你在 数据流管理、类型约束、错误处理 上的积累,恰恰是让 Agent 从“玩具”变成“工具”的关键。
Keep Coding, Keep Thinking. 让我们用代码,给 AI 装上刹车和方向盘。