生产级 AI 智能体需要可靠、正确地执行任务,并长期保持输出质量。本课讨论三类方法:反思循环,让智能体评价并改进自己的输出;系统化排查幻觉,识别和处理编造信息;智能体评估框架,例如使用 LangSmith 监控与比较性能。
通过反思循环提高输出质量
反思循环是一种提示词策略,让智能体在最终回答前检查初步结果,评价并完善答案。它以额外计算时间换取可能更高的质量与准确性。在质量比几秒延迟更重要的生产场景中,这种取舍可能值得。以下方法增加自查或改进步骤,帮助在答案交给用户前发现幻觉与推理错误。
简单自我评价
最直接的方法是先生成答案,再检查错误或违反要求的地方。例如,追加“请检查上述答案是否正确、是否遵循指令”的提示词,由同一个 LLM 或另一个实例返回评价。结果可以是简单的是/否标记,也可以是具体问题列表。模型由此充当内部评审者。自我评价本身不自动修改答案,但提供了发现明显问题的机会。
- 反思步骤
- LLM 处理已有回答,将改进后的回答返回用户。
分阶段阅读 · 2 个阶段
实现方式:增加一次模型调用即可。例如,第一次生成答案,第二次要求“评估上述答案的正确性及存在的错误”。发现问题后,可以记录或交给人工检查。LangGraph 中可以让生成节点连接评价节点。若要提高最终结果,还需要将反馈用于修改。
带重试的迭代反思
更进一步的方法是依据评价重新尝试,形成生成 → 反思 → 修改的循环。智能体检查答案质量,发现问题后根据反馈产生新版本。例如,在后续提示词中加入“根据上述反馈,给出改进后的答案”。可以在达到指定轮数,或评价确认成功后结束。每轮提供新的机会,后续结果可能更加周全。
- 改进循环
- 改进后的回答可以再次进入反思步骤,最多循环 k 次。
分阶段阅读 · 2 个阶段
以下 LangGraph 示例定义 generate 和 reflect 两个节点,通过 should_continue 判断消息数量,控制循环:
from langgraph.graph import MessageGraph, END
builder = MessageGraph()
builder.add_node("generate", generator_node) # 生成答案
builder.add_node("reflect", reflection_node) # 评价答案
builder.set_entry_point("generate")
def should_continue(state):
# 限制消息数量,防止无限循环
if len(state) > 6:
return END
return "reflect"
builder.add_conditional_edges("generate", should_continue)
builder.add_edge("reflect", "generate")
graph = builder.compile()
generator_node 可以调用 LLM 回答用户问题,reflection_node 则根据当前对话进行严格评价。图依次运行 generate → reflect → generate,直到 should_continue 返回 END。反馈追加到消息状态后,生成节点可以在下一轮使用并修正问题。这种带反馈的重试有助于逐步提高准确性和指令遵循程度。示例中的两个节点函数需由应用定义。
结合外部反馈的 Reflexion:Reflexion 将外部知识或工具引入反思。模型检查答案后可能发现信息不足,便发起搜索,再根据结果修改。让评价基于检索事实和引用等外部证据,有助于更有效地纠正事实错误。循环仍可设置次数限制,最终答案则具有更充分依据。反思还可以结合记忆、知识库检查或计算验证。
先评价再修改
Critique-Then-Revise 使用固定阶段:起草、评价、修改。它通常通过一个结构化提示词或预定调用序列完成,评价后生成最终答案。
例如,在 system 或 few-shot 提示词中规定:第一步,回答用户问题;第二步,识别草稿中的事实错误和不足;第三步,修正问题,只输出修改后的答案。过程中的草稿和问题列表用于生成最终结果。
这种自我修订方式具有以下优势:
- 有针对性地改进:明确列出问题,减少修改时遗漏或重复错误。
- 降低过度自信:主动检查错误,有助于减少导致幻觉的不当确定性。
- 无需外部反馈:使用模型自身评价,可以在一次 API 调用或调用链中自主运行。
同时需要考虑:
- 更长输入输出与费用:多步骤处理可能使 token 使用增加到约两倍,评价较长时更多,并增加延迟和 API 成本。
- 知识限制:缺少事实时,自我评价可能发现信息不足,却无法凭空补齐正确知识。因此,需要时应结合检索或工具。
用户只需看到整理后的结果。这种方法适用于问答、解释生成,以及初次代码中存在模型能够通过检查发现的问题的任务。
排查幻觉与提高可靠性
幻觉指模型以肯定语气输出事实错误或没有意义的内容,是 LLM 智能体的重要问题。反思可以鼓励自查,本节进一步讨论如何结合内部策略与外部工具,系统发现、诊断并减少幻觉。即使设计良好,模型仍可能产生错误,因此需要持续识别这些失败,建立可信系统。
幻觉是什么,为什么出现?
模型输出不符合现实或所提供数据时,就可能产生幻觉。例如,用户询问一份实际未进入上下文的文档,模型却编造出貌似合理的摘要。模型学习语言模式,生成统计上可能的文本,但这不能自动保证事实正确。训练数据不足或过时、提示词和目标不清楚、上下文窗口有限导致关键事实被忽视,都可能引发问题。模型不确定时,也可能继续尝试回答。
生产环境中的幻觉会损害信任,关键信息错误还可能造成伤害。因此,幻觉排查是 LLMOps 的重要任务,需要既能发现单次错误,也能降低总体发生率。
发现幻觉
第一步是判断输出是否存在幻觉。开放任务没有现成标准答案时尤其困难。下面回顾 RAG 评估中涉及的方法:
有参考答案的评估:存在标准答案或预期结果时,可以与智能体输出比较。BLEU、ROUGE 等传统指标衡量文本相似度;RAGAS 的 Answer Correctness 等指标会将答案分成事实,依据参考答案计算事实精确率和召回率。这些方法适合测试集,但实际线上问题通常没有预先给定的答案。
无参考答案的评估:如果系统具有应当使用的上下文或检索文档,可以检查回答对上下文的忠实程度。另一个模型或程序把答案分成事实陈述,再逐项验证。无法从来源找到或推断的信息可能属于幻觉。Faithfulness 衡量答案是否有上下文支持;context utilization 检查是否使用了重要相关文档。RAG 答案中出现无法由检索资料支持的陈述,是需要检查的信号。
LLM 事实检查:没有参考答案或上下文时,也可以让另一模型或同一模型判断正确性。例如,向评判模型提供用户问题与助手回答,要求检查是否真实、指出问题。同一模型同时回答和评判时,可能遗漏自己的错误,也可能把正确内容误判为错误,但仍可作为一个信号。更可靠或专门化的评判模型可能有所帮助。
人工反馈:用户或内部评审可以指出错误,是发现细微或高影响幻觉的重要来源。人工无法逐条检查所有结果,但反馈按钮、评分和抽样评估,可以补充自动方法,帮助了解幻觉发生频率及形式。
可观测性与启发式规则:运行轨迹也能揭示问题。例如,工具返回空结果或错误,模型随后仍给出肯定答案,就值得检查。声称“根据某来源”却没有取得该来源,也是可疑信号。监控状态可以帮助实时发现并拦截此类问题。
生产系统通常结合多种方法,例如每个答案使用 LLM 评估,收集用户反馈,并每天对有标准答案的测试集进行离线评估。
根因分析与状态检查
发现幻觉后,需要解释原因,此时详细日志和状态追踪十分有用。
- 检查提示词与对话:用户问题是否模糊、缺少必要背景?系统指令是否没有明确限制猜测?启用反思时,检查评价是否发现问题,后续生成是否利用了反馈。
- 检查工具与知识检索:智能体可能未正确调用工具,或工具失败却没有被处理。例如,检索查询不佳导致“未找到结果”,随后模型却编造某本书的答案。可靠系统应改写查询或说明没有找到信息,必要时修改空结果处理逻辑。
- 检查可用的中间过程:若应用能够取得模型的显式中间步骤,可以检查是否早期做出错误假设,或已知道信息缺失却继续猜测,再调整指令与流程。并非所有模型都提供内部推理内容。
- 寻找多次事件的共同模式:例如,要求提供来源,却没有真实检索工具,可能导致编造引用。应加入来源检索,或仅在有依据时要求引用。还应检查各步骤状态和记忆中是否已有错误事实,摘要是否引入了新错误。
- 使用监控面板:LangSmith 等工具可以跟踪“检测到幻觉”等指标,分析长期趋势。新版本发布后指标激增,可能说明变更引入问题。像处理传统程序异常一样,记录详细信息、持续监控并调查重要事件。
减少与预防幻觉
诊断后,需要修改系统并验证是否减少后续错误。
- 提示词工程与指令调整:明确要求信息不足时说明限制或请求澄清,禁止编造。Few-shot 示例可以展示缺少信息时应如何回答。合适的 system 指令有助于减少幻觉;分步骤处理也可能减少推理任务中的错误。
- 检索增强:通过向量数据库或网页搜索补充知识,并确认智能体实际使用了检索内容。
- 输出检查:草稿交给用户前,使用第二个模型或规则检查。发现可疑陈述时,让智能体修正,或返回说明限制的响应,将检测结果用于预防错误传播。
- 改善工具与反思:分析发现工具被跳过或误用时,调整逻辑或提示词。例如,库存问题应先查询检索工具,再依据结果回答。
- 要求外部证据:让答案提供引用或依据,便于审查。引用并不消除幻觉,但可以检查来源是否真的支持主张;无法找到来源时,应进一步核实。评估时也可以考察各项主张是否有提供资料支持。
- 持续学习:把真实对话中的提示词、错误答案与正确答案整理成数据,可能用于再训练或微调;也可以在强化学习奖励中纳入减少幻觉的目标。这是较复杂的长期方法,我个人尚未在实践中见到广泛采用。
幻觉排查是持续循环:发现问题,通过轨迹与反思分析原因,应用修改,再评估是否有效,以及是否引入其他问题。
- 人工参与
- 根据评估未通过的案例改进Agent系统与应用。
- 人工反馈
- 人工反馈与追踪记录进入同一评估循环。
分阶段阅读 · 3 个阶段
智能体评估的主要组成
测试数据集:收集任务或用户问题,并提供标准答案,或至少说明优质回答应满足什么。例如,具有真实答案的事实问答,或已知理想处理方式的客户请求。LangSmith 可以创建数据集并标注预期输出,形成基准测试集。
指标与标准:明确要测量的方面:
- 正确性:答案是否正确?
- 相关性:是否围绕主题并回答用户需求?
- 幻觉率:是否包含无法核实或编造的信息?
- 工具使用正确性:是否按预期使用工具?可以评估工具调用轨迹,例如需要数据库查询时,是否实际调用了数据库工具。
- 稳健性:问题略微改述,答案是否显著变化?
- 有害性与规则遵循:公开使用的智能体是否产生有害内容,或违反规定?
- 效率:需要多少步骤和时间?
自动评估器:尽可能为指标实现自动评估。可以使用 LLM-as-judge,通过提示词让另一个模型评分;也可以用 Python 函数,例如在确定性环境中比较工具调用序列是否符合预期。自动化有助于快速评估数百或数千个案例。
人工评估:风格、帮助程度等仍可能需要人工判断,虽然也可微调评分模型。可以每周随机检查 50 个结果,发现自动指标未覆盖的问题。
报告与基准比较:汇总自动与人工指标,展示变化趋势,并按查询类型或难度分类。每次更新智能体或模型,都重新评估,检查改善或退步。
结合内部反思与外部评估
两者相互补充:
- 内部反思:实时提高单个答案质量,尽可能在用户看到结果前发现错误。
- 外部评估:观察长期与整体表现,识别单次反思无法解决的失败模式。例如,反思纠正了 70% 的错误,剩余 30% 仍会体现在指标和日志中,帮助判断是否需要微调或新工具。
可靠部署通常结合两者。内部评价内容可以记录下来,再进入评估流水线分析。例如,日志显示反思提到“信息不足”时,最终答案经常错误,就可以在相应条件下加强检索。外部分析由此改进内部循环:内部反思减少即时错误,外部框架指导系统性改善,共同形成持续改进过程。