拒绝对话“胡编乱造”:从原理到实战,打造生产级稳定的 AI Agent

2 阅读3分钟

拒绝对话“胡编乱造”:从原理到实战,打造生产级稳定的 AI Agent

前言:Agent 很美,但“落地”很碎

最近在折腾 AI Agent 时,我发现了一个真相:Demo 只要 Prompt 写得好,生产环境却得靠代码跑。

很多人在初试 Agent 时,最崩溃的就是模型开始“胡编乱造”:要么把北京的天气说成上海的,要么明明问的是明天,它却给你昨天的答案。这种稳定性问题,是 Agent 走向实战的最大绊脚石。

今天结合我自己的踩坑经验,咱们聊聊如何通过 ReAct 范式代码护栏,驯服那些不听话的智能体。


一、 为什么你的 Agent 会“脑补”?

一个标准的 Agent 由感知 (Perception)规划 (Planning)行动 (Action)记忆 (Memory) 组成。

通过复盘我发现,幻觉通常发生在规划行动的交界处:

  1. 规划层飘了:LLM 没理解复杂的约束,随手构思了一个错误的执行路径。
  2. 行动层空了:调用 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++;
  }
}

四、 进阶总结:稳定性的三个锦囊

  1. System Prompt 边界化:在 Prompt 里明确告诉它:“如果你不知道,请回复不知道,或者调用搜索,严禁编造日期。”
  2. 结构化输出 (JSON Mode) :永远不要让模型直接回复纯文本,强制 JSON 输出是前后端联调的基石,也是 Agent 稳定的前提。
  3. 闭环验证:在最终输出给用户前,增加一个“Self-Reflection”环节。让 LLM 自己核对一下: “我刚才查到的北京天气,真的是用户问的明天的吗?”

结语

AI Agent 的上限取决于 LLM 的智力,但它的下限——也就是你系统的鲁棒性,是由你的工程逻辑决定的。

作为一个前端开发者,你不必因为不懂深度学习算法而焦虑。相反,你在 数据流管理、类型约束、错误处理 上的积累,恰恰是让 Agent 从“玩具”变成“工具”的关键。

Keep Coding, Keep Thinking. 让我们用代码,给 AI 装上刹车和方向盘。