AI Agent 的幻觉检测与事实验证

在 AI Agent 系统中,大语言模型(LLM)作为核心推理引擎,其输出的可靠性直接决定了 Agent 能否在真实业务场景中稳定落地。然而,LLM 普遍存在一个致命缺陷——幻觉(Hallucination)。当 Agent 调用工具、生成报告或执行多轮推理时,一旦产生幻觉,不仅会导致任务失败,还可能引发事实层面的严重错误。因此,建立系统化的幻觉检测与事实验证机制,是构建可信 AI Agent 的关键一步。

一、LLM 幻觉类型分析

在 Agent 架构中,幻觉并非单一现象,可细分为以下三类:

1. 事实性幻觉(Factual Hallucination)

模型生成与客观事实不符的内容。例如,Agent 在查询数据库时声称某用户存在于系统中,但该用户已被删除;或回答历史事件时编造不存在的日期和人物。

2. 忠实性幻觉(Faithfulness Hallucination)

模型输出与上下文或指令不一致。在 Agent 多轮对话中,模型可能忽略了用户明确设定的约束条件,或者在执行工具链时偏离了任务目标。例如,用户要求"仅返回 JSON 格式",但模型附加了多余的解释文本。

3. 推理链幻觉(Reasoning Hallucination)

在 Chain-of-Thought(CoT)等推理结构中,模型在中间的推理步骤中引入了错误的假设或逻辑跳跃。这类幻觉尤其隐蔽,因为最终答案可能恰好正确,但推理路径本身是有缺陷的。 识别幻觉类型有助于针对性地选择检测策略,避免"一刀切"的粗放治理。

二、Self-Consistency 检测

Self-Consistency 是一种基于统计投票的幻觉检测方法,其核心思想是:如果模型对同一问题的多次采样输出高度一致,则其可靠性较高;反之,若输出分散,则存在幻觉风险。 在 Agent 场景中,可将其应用于关键决策节点:

import asyncio
from openai import AsyncOpenAI

client = AsyncOpenAI()

async def self_consistency_check(prompt: str, n: int = 5, threshold: float = 0.6):
    """
    对同一 Prompt 进行多次采样,统计高频答案
    """
    responses = []
    for _ in range(n):
        resp = await client.chat.completions.create(
            model="gpt-4o",
            messages=[{"role": "user", "content": prompt}],
            temperature=0.7,
        )
        responses.append(resp.choices[0].message.content.strip())

    # 统计答案频次
    from collections import Counter
    counts = Counter(responses)
    most_common, freq = counts.most_common(1)[0]
    confidence = freq / n

    return {
        "answer": most_common,
        "confidence": confidence,
        "is_reliable": confidence >= threshold,
        "distribution": dict(counts)
    }

使用示例:检测 Agent 回答的事实可靠性

result = asyncio.run(self_consistency_check( "请问2024年诺贝尔物理学奖得主是谁?" )) print(f"答案:{result['answer']}, 置信度:{result['confidence']:.2f}") Self-Consistency 的局限在于其成本较高(需要多次调用),因此建议仅在 Agent 的关键决策或高风险输出节点使用,而非全量检测。

三、外部知识验证(External Knowledge Verification)

Self-Consistency 只能检测一致性,无法验证真实性。对于事实性幻觉,最有效的方法是引入外部知识源进行交叉验证。

1. 检索增强验证(RAG-based Verification)

在 Agent 输出后,将关键声明抽取为原子事实,通过检索模块(如向量数据库或搜索引擎)查询对应的权威来源,判断是否存在支撑。

from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity

model = SentenceTransformer('BAAI/bge-large-zh-v1.5')

def verify_fact_with_rag(claim: str, retrieved_docs: list[str]) -> dict:
    """
    通过向量相似度判断声明是否被检索文档支持
    """
    claim_emb = model.encode([claim])
    doc_embs = model.encode(retrieved_docs)
    similarities = cosine_similarity(claim_emb, doc_embs)[0]

    max_sim = float(similarities.max())
    best_doc = retrieved_docs[similarities.argmax()]

    return {
        "claim": claim,
        "max_similarity": max_sim,
        "verified": max_sim > 0.78,
        "supporting_doc": best_doc if max_sim > 0.78 else None
    }

2. 结构化数据源验证

对于 Agent 生成的结构化数据(如数据库查询结果、API 返回值),可直接与原始数

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐