Agent 落地痛点:如何用工程手段抑制大模型虚假输出

摘要

大模型智能体(Agent)在实际业务落地过程中,幻觉是绕不开的顽疾。仅仅依靠提示词优化很难彻底解决模型编造事实、伪造工具参数、生成虚假引用等问题。

本文抛开模型微调,从工程实践角度,梳理输入、推理、输出全链路的降噪手段,给出一套可直接复用的工程约束方案,帮助开发者降低Agent虚假输出带来的业务风险。
关键词:AI智能体 · Agent · 大模型幻觉 · 工具调用 · RAG · 工程化落地

目录

📋 目录

  1. 前言:Agent开发最大的坑不是能力不够,而是幻觉
  2. 为什么只靠Prompt解决不了幻觉问题
  3. 全链路工程抑制思路:输入‑推理‑输出三层防护
  4. 输入层:切断污染源,从源头减少幻觉诱因
  5. 推理层:约束思考逻辑,限制模型自由发挥
  6. 输出层:后置校验拦截,对结果做强制校验
  7. Python极简Demo:三层防护简易实现
  8. 工程方案的局限性
  9. 落地实践总结

1. 前言:Agent开发最大的坑不是能力不够,而是幻觉

现在很多同学快速基于大模型搭建Agent,支持工具调用、任务拆解、RAG检索,Demo跑起来效果看着很不错。一旦投入真实业务,各类幻觉问题就会集中爆发:

  • 调用工具时:编造不存在的函数,参数乱填,接口直接报错;
  • RAG检索时:检索不到有效文档,模型自己编造文档片段假装是检索结果;
  • 任务规划时:生成逻辑矛盾、无法执行的子任务;
  • 输出答案时:自信输出错误数据、虚假案例,人很难一眼分辨真假。很多人的第一反应就是写更强的提示词,反复告诫模型“不要编造,不知道就说不知道”。但线上运行会发现,大模型经常无视prompt约束,依旧输出虚假内容。Agent的幻觉问题,不能只交给模型自律,需要工程手段做强制约束。

2. 为什么只靠Prompt解决不了幻觉问题

  1. 上下文过载:上下文越长,指令遵循能力下降,写在prompt里的约束容易被遗忘;
  2. 模型固有倾向:大模型的目标是生成通顺连贯文本,不是保证事实正确;
  3. 复杂任务下推理压力大:多步骤工具调用、多轮规划时,模型更容易跑偏;
  4. 对抗性输入:用户模糊、歧义的提问,会诱导模型编造内容。

提示词属于“软约束”,只能降低概率,无法兜底。真正线上可用的Agent,必须叠加硬工程逻辑,形成软硬结合防护。

3. 全链路工程抑制思路:输入‑推理‑输出三层防护

整体分为三层防护链路:

  1. 输入层降噪:对用户query、检索上下文、工具返回结果做预处理过滤,把脏数据拦截在交给大模型之前;
  2. 推理层约束:规范Agent思考格式,强制要求模型严格基于已有信息作答,禁止无依据脑补;
  3. 输出层校验:模型输出完成后,用代码规则做校验,识别虚假、越界输出,不合格直接拦截拒绝回答。

三层层层递进,不修改模型权重,完全属于应用层工程开发,普通开发者就可以落地。

4. 输入层:切断污染源,从源头减少幻觉诱因

输入是幻觉的源头,如果给到模型的上下文本身杂乱、冗余、噪声多,幻觉概率会大幅上升。

4.1 用户Query预处理

  • 过滤无意义乱码、超长无效输入;
  • 识别明显超出业务知识库范围的问题,提前拦截,直接回复不在能力范围;

4.2 RAG检索上下文清洗

检索回来的文档片段不能直接一股脑丢给大模型:

  1. 过滤低相似度文档,低于阈值直接丢弃,不送入上下文;
  2. 对文档做去重,避免重复片段占用token;
  3. 标记文档来源,强制带上来源标识,后续推理阶段要求模型只能使用标记内信息。

常见错误做法:不管检索分数高低,全部塞给大模型,模型会把噪声内容进行脑补加工,生成错误答案。

4.3 工具返回结果校验

工具调用返回的内容,先做格式校验,异常报错、空数据,明确标记【工具未获取到有效数据】,而不是直接把原始报错文本丢进大模型上下文。

5. 推理层:约束思考逻辑,限制模型自由发挥

推理层不是靠说教式prompt,而是强格式约束,强制Agent按照固定范式思考。

5.1 强制区分已知信息与未知信息

Prompt核心约束示例:

规则:
1. 你的所有回答,只能使用【参考资料】和【工具返回结果】里面提供的信息。
2. 如果参考资料和工具返回没有对应信息,禁止编造,直接输出:“现有信息不足以回答该问题”。
3. 禁止自行杜撰数据、案例、接口、文档内容。
4. 思考过程需要写明:哪些信息来自参考资料,哪些信息缺失。

5.2 Agent工具调用强格式

禁止自由文本输出工具调用,要求输出固定JSON格式,模型不能随意写函数。只允许调用预定义函数列表内的工具,不在列表中的函数一律视为非法。

好处:就算模型想编造工具,输出的JSON会被代码解析直接识别,拒绝执行。

5.3 任务规划约束

Agent做子任务拆解时,每一个子任务必须绑定对应的可用工具,不能生成脱离工具集的任务。

6. 输出层:后置校验拦截,对结果做强制校验

模型输出完成,不直接返回给用户,先经过代码校验,这是最后一道防线。

校验可以做这几件事:

  1. 工具调用输出校验:解析模型输出的JSON,校验函数名、参数是否在允许集合内,参数类型是否合法,非法直接丢弃,不执行;
  2. 幻觉关键词检测:检测输出中出现不存在的文档名称、虚构编号;
  3. 信息溯源校验:如果Agent声称引用某段资料,校验该片段是否真实存在于输入上下文;
  4. 未知标记识别:如果模型识别信息不足,直接返回兜底话术,不输出生成内容。

输出层是硬约束,模型再怎么“不听话”,代码可以直接拦截结果,不会把虚假内容暴露给用户。

7. Python极简Demo:三层防护简易实现

仅演示架构逻辑,没有真实大模型调用,模拟三层校验流程

from typing import List, Dict

class AgentAntiHallucination:
    def __init__(self, allow_tools: List[str]):
        self.allow_tools = allow_tools  #允许调用的工具白名单

    def input_layer_filter(self, query: str, rag_docs: List[Dict]) -> tuple[str, List[Dict]]:
        """输入层降噪:过滤低质量检索文档"""
        valid_docs = []
        for doc in rag_docs:
            if doc.get("score",0) >= 0.6:
                valid_docs.append(doc)
        return query, valid_docs

    def output_layer_check(self, llm_output: dict) -> tuple[bool, str]:
        """输出层校验:校验工具调用合法性"""
        tool_name = llm_output.get("tool_name","")
        if tool_name and tool_name not in self.allow_tools:
            return False, f"非法工具 {tool_name},已拦截,不允许执行"
        return True, "校验通过"

if __name__ == "__main__":
    agent = AgentAntiHallucination(allow_tools=["search_doc","get_time"])
    user_query = "查询某个业务数据"
    raw_docs = [{"content":"xxx","score":0.3},{"content":"yyy","score":0.7}]
    #输入层处理
    clean_query, clean_docs = agent.input_layer_filter(user_query, raw_docs)
    print(f"过滤后有效文档数量:{len(clean_docs)}")
    #模拟模型输出,编造一个不存在的工具
    mock_llm_out = {"tool_name":"fake_tool","params":{}}
    ok,msg = agent.output_layer_check(mock_llm_out)
    print(msg)

运行结果:

过滤后有效文档数量:1
非法工具 fake_tool,已拦截,不允许执行

这个示例非常简单,但体现核心思想:很多校验工作交给代码,而不是全部交给大模型自己判断

8. 工程方案的局限性

这套三层降噪属于应用层方案,可以大幅降低幻觉出现概率,但不能100%彻底消除幻觉:

  1. 对于事实高度模糊、资料本身互相矛盾的场景,依然会有出错风险;
  2. 需要维护工具白名单、相似度阈值,业务变更的时候需要同步调整规则;
  3. 会带来误拦截:部分正常回答有可能被校验逻辑误判,需要做阈值调优。

想要进一步降低幻觉,可以结合Reranker重排序检索结果、小模型做结果校验,或者针对性微调。但对于大部分普通开发者,优先把应用层工程防护做好,收益最高。

9. 落地实践总结

  1. Agent幻觉不要迷信Prompt,提示词只是软约束,必须配套工程硬逻辑;
  2. 输入层做好过滤,脏的上下文是幻觉重要来源;
  3. 推理层强制格式,限制模型自由脑补空间;
  4. 输出层做代码校验,作为兜底防线,拦截非法输出;
  5. 三层降噪架构不需要微调大模型,普通开发者就可以快速落地。

Agent能力强不强看模型,稳不稳定,看工程防护。很多Demo效果惊艳的Agent,上线之后漏洞百出,大多是忽略了幻觉的工程治理。

更多推荐