在构建基于大语言模型的AI智能体时,最棘手的问题之一是模型会在没有真实依据的情况下生成看似权威的内容。这类被称为幻觉的现象,表现为Agent返回了不存在的API字段、虚构的用户订单或错误的法规条款。由于模型底层是基于token概率预测而非事实数据库查询,它无法天然区分“记忆中的模式”和“客观发生的事实”。当智能体被接入自动化流程,这些捏造内容可能直接触发邮件发送、数据库写入等不可逆操作。

从模型信号层面识别潜在幻觉
许多开发者忽略了一个事实:主流推理接口在返回文本的同时,往往携带了可用于评估确定性的信号。以开放权重模型为例,输出token的logprob值能够反映模型对该词的把握程度。如果一段关于“某银行利率为3.2%”的描述,其中关键数值的logprob低于阈值,说明模型是在低置信度下“猜”出的内容,这类片段应被标记为可疑。
另一种实用做法是要求Agent在给出结论时附带自我声明,例如让模型输出JSON结构,其中包含confidence字段与sources数组。虽然模型自我评估并不完全可靠,但结合多次采样的一致性检测,能过滤掉部分随口编造的回答。我们在内部系统中采用三次采样投票,若同一事实在三次生成中表述差异超过预设容忍度,则转入人工审核队列。
下面示例展示如何从推理响应中提取低概率词并打标,这里用伪代码表达核心逻辑:
import json
def flag_low_confidence(response, threshold=0.5):
flagged = []
for token_info in response['tokens']:
if token_info['logprob'] < threshold:
flagged.append(token_info['text'])
return flagged
sample_response = {
'tokens': [
{'text': '利率', 'logprob': 0.91},
{'text': '3.2%', 'logprob': 0.21},
{'text': '已', 'logprob': 0.88}
]
}
print(flag_low_confidence(sample_response))
借助外部知识库进行事实校验
仅靠模型自身信号远远不够,工程上更稳健的方案是把Agent的产出与权威数据源比对。对于结构化事实,如商品库存、用户余额,可直接在过滤层调用业务系统的只读接口进行核实。当Agent声称“用户A余额为999元”时,过滤器向账务服务发送查询,若返回不一致则拦截该消息并回写修正提示给模型重试。
对于非结构化知识,例如法律条文或论文结论,可维护一个向量库,将Agent输出切分为实体关系三元组后做相似度检索。若库中不存在近似记录,则判定为高风险幻觉。下表对比了两种校验方式的适用边界:
| 校验方式 | 延迟开销 | 覆盖能力 | 实施成本 |
|---|---|---|---|
| 业务接口实时查 | 低(毫秒级) | 仅限内部数据 | 需暴露安全只读API |
| 向量库语义检索 | 中(百毫秒) | 外部知识广泛 | 需构建与更新索引 |
以下代码演示如何用向量库比对Agent输出的实体关系,这里以简化版余弦距离为例:
def check_hallucination(entity_pair, vector_store, top_k=1):
vec = embed(entity_pair)
hits = vector_store.search(vec, top_k)
if not hits or hits[0].score < 0.75:
return True
return False
agent_output = '二甲双胍可降低空腹血糖'
if check_hallucination(agent_output, medical_store):
print('疑似幻觉:外部知识库无支撑')
构建多层过滤流水线拦截捏造内容
单一检测手段容易漏判,生产环境推荐将识别与过滤拆成串行流水线。第一层做格式与敏感词粗筛,例如出现“绝对”“肯定”等过度断言词汇且缺乏引用时扣分;第二层跑置信度分析;第三层调用外部校验。任何一层判黑即终止向用户透出,并生成带有追踪ID的告警日志,方便后续用真实投诉样本回流优化阈值。
在流水线设计上,要避免阻塞主对话链路。可采用异步旁路校验:Agent先返回带“待核实”标签的草稿,后台任务确认无误后再推送正式版。这种方式在客服机器人中效果明显,既保住了响应速度,又把幻觉导致的错误承诺量降低了约六成。需要强调的是,过滤规则应支持热更新,因为模型版本迭代后幻觉分布会偏移。
下面给出一个流水线调度的简单实现骨架,展示如何组合前述模块:
def filter_pipeline(text, model_resp):
if coarse_block(text):
return 'blocked_by_coarse'
if flag_low_confidence(model_resp):
return 'low_confidence'
if check_hallucination(text, store):
return 'no_external_support'
return 'pass'
status = filter_pipeline('根据内部消息下月涨价', sample_response)
print(status)
通过上述信号识别、知识校验与分层流水线的配合,团队可以在不替换底层模型的前提下,显著抑制Agent捏造事实带来的业务风险。实际落地时建议先以日志模式运行过滤器,统计误杀与漏杀比例,再逐步切换为强拦截。