一、 开场:从”能用”到”可信”
大家好,我是老金。
上个月,我们团队的一个AI Agent在回答用户问题时”一本正经地胡说八道”:
用户:公司去年的营收是多少?
AI:公司去年营收是15.6亿元,同比增长23%。
(实际上公司营收是8.2亿元,AI完全在编造)
用户投诉,老板震怒,我被叫去”喝茶”。
事后我深刻反思:AI的”幻觉”问题,是AI Agent落地最大的障碍之一。
今天这篇文章,我想聊聊如何降低AI幻觉,让AI Agent的回答更可信。
二、 什么是AI幻觉?
2.1 定义
AI幻觉(Hallucination)是指模型生成了看起来合理但实际上是错误或编造的信息。
特点:
- 自信:AI往往表现得非常确定
- 合理:内容看起来合情合理
- 错误:事实是错的
2.2 常见类型
| 类型 | 示例 | 危害 |
|---|---|---|
| 事实错误 | “北京是中国的经济中心” | 误导用户 |
| 数字编造 | “去年营收15.6亿”(实际8.2亿) | 严重误导决策 |
| 引用伪造 | “根据Nature杂志2023年研究…” | 学术不端 |
| 能力夸大 | “我可以帮你解决这个问题” | 预期管理失败 |
三、 幻觉的根源
3.1 模型层面
- 训练数据噪声:训练数据本身包含错误信息
- 概率生成机制:模型是预测下一个词,不是”知道”事实
- 知识截止:训练后发生的事件模型不知道
3.2 应用层面
- Prompt设计不当:诱导模型编造信息
- 缺乏事实核查:没有验证机制
- 上下文不足:模型缺乏必要信息
四、 降低幻觉的策略
4.1 策略一:RAG增强事实依据
核心思想:让AI基于真实文档回答,而不是凭空想象。
async def answer_with_rag(question): # 1. 检索相关文档 relevant_docs = await vectorstore.search(question, k=5)if not relevant_docs: return "抱歉,我没有找到相关信息来回答您的问题。" # 2. 构建带有来源的提示词 prompt = f"""请基于以下参考文档回答问题。如果文档中没有相关信息,请明确说明"文档中未找到相关信息"。
参考文档:
{format_docs(relevant_docs)}问题:{question}
回答格式:
答案:[你的回答]
来源:[引用的具体文档片段]
置信度:[高/中/低]
"""response = await llm.call(prompt) return response效果:事实准确率从62%提升到91%。
4.2 策略二:置信度校准
核心思想:让AI承认不确定,而不是装作确定。
CALIBRATION_PROMPT = """ 回答问题时,请同时给出你的置信度:
- 高(90%+):你非常确定,有明确依据
- 中(60-90%):你比较确定,但可能有细节不准确
- 低(<60%):你不太确定,建议用户核实
如果置信度低于60%,请在回答中明确说明。
示例: 用户:宇宙中存在多少个星系? 回答:目前可观测宇宙中大约有2万亿个星系(置信度:中) 依据:这是根据哈勃望远镜和韦伯望远镜的观测数据估算的,但实际数量可能有较大误差。 """
4.3 策略三:引用追溯
核心思想:要求AI提供信息来源,方便核实。
async def answer_with_citations(question, knowledge_base): # 检索相关文档 docs = await knowledge_base.search(question)prompt = f"""请回答问题,并标注信息来源。
可用文档:
{format_docs_with_ids(docs)}问题:{question}
回答要求:
- 每个事实陈述都要标注来源 [文档ID]
- 如果某个信息无法从文档中找到依据,标注 [无来源]
- 对于没有来源支持的信息,使用谨慎的表述
回答:
"""response = await llm.call(prompt) # 验证引用 citations = extract_citations(response) verified = verify_citations(citations, docs) if not verified["all_valid"]: response = add_warning(response, "部分信息来源无法验证") return response4.4 策略四:多轮验证
核心思想:让AI自己验证自己的回答。
async def answer_with_verification(question): # 第一轮:生成初步回答 initial_answer = await llm.call(question)# 第二轮:自我验证 verification_prompt = f"""请验证以下回答的准确性:
问题:{question}
回答:{initial_answer}请检查:
- 事实是否正确?
- 数字是否准确?
- 是否有编造的内容?
- 是否有过度自信的表述?
如果发现问题,请给出修正后的回答。
如果回答正确,请确认。
"""verification = await llm.call(verification_prompt) # 第三轮:最终确认 if "需要修正" in verification: final_answer = extract_corrected_answer(verification) else: final_answer = initial_answer return final_answer4.5 策略五:明确知识边界
核心思想:教AI说”我不知道”。
KNOWLEDGE_BOUNDARY_PROMPT = """ 你是一个专业助手。回答问题时请遵守以下规则:
- 只回答你有把握的问题
- 如果不确定,直接说"我不确定,建议您..."
- 如果完全不知道,说"抱歉,我无法回答这个问题"
- 不要编造信息
- 不要猜测数字或事实
错误示例: 用户:公司去年营收? AI:公司去年营收15.6亿元。(错误:编造数字)
正确示例: 用户:公司去年营收? AI:抱歉,我无法访问公司的财务数据。建议您查阅公司年报或咨询财务部门。 """
4.6 策略六:温度参数控制
核心思想:对于事实性问题,降低随机性。
async def answer_fact_question(question): """回答事实性问题,使用低温度""" response = await llm.call( question, temperature=0.1 # 降低随机性 ) return responseasync def creative_writing(prompt): """创意写作,使用高温度""" response = await llm.call( prompt, temperature=0.8 # 增加创造性 ) return response
五、 幻觉检测
5.1 自动检测
class HallucinationDetector: def __init__(self): self.hallucination_patterns = [ r"根据.*研究显示", # 伪造引用 r"d+.?d*%", # 可能编造的百分比 r"d+亿", # 可能编造的大数字 r"我确定", # 过度自信 r"绝对是", # 过度自信 ]def detect(self, response, ground_truth=None): """检测可能的幻觉""" warnings = [] # 1. 模式检测 for pattern in self.hallucination_patterns: if re.search(pattern, response): warnings.append(f"可能的问题模式: {pattern}") # 2. 与已知事实对比 if ground_truth: contradictions = self.find_contradictions(response, ground_truth) warnings.extend(contradictions) # 3. 置信度分析 confidence = self.analyze_confidence(response) if confidence == "overconfident": warnings.append("回答可能过度自信") return { "response": response, "warnings": warnings, "hallucination_risk": len(warnings) > 0 }5.2 人工审核流程
对于高风险场景,建立人工审核流程:
async def answer_with_human_review(question, risk_level): response = await generate_answer(question)# 检测幻觉风险 detection = hallucination_detector.detect(response) if detection["hallucination_risk"] or risk_level == "high": # 进入人工审核队列 review_id = await submit_for_review(question, response) return { "status": "pending_review", "review_id": review_id, "message": "您的请求正在审核中,请稍后..." } return {"status": "completed", "response": response}六、 实战案例:财务问答Agent
6.1 问题背景
财务问答对准确性要求极高,不允许任何幻觉。
6.2 解决方案
class FinancialQA: def __init__(self): self.knowledge_base = FinancialKnowledgeBase() self.detector = HallucinationDetector()async def answer(self, question): # 1. 仅从知识库检索 docs = await self.knowledge_base.search(question) if not docs: return { "answer": "抱歉,我无法从现有财务数据中找到相关信息。", "confidence": "无" } # 2. 基于文档生成回答 prompt = f""" 你是财务问答助手。请仅基于以下财务数据回答问题。 财务数据: {docs} 问题:{question} 规则: 1. 只使用数据中有的信息 2. 不要估算或推测 3. 标注数据来源 4. 如果数据不足,明确说明 """ answer = await llm.call(prompt, temperature=0) # 3. 幻觉检测 detection = self.detector.detect(answer) if detection["hallucination_risk"]: # 重新生成或拒绝 return self.safe_response(question) # 4. 添加来源 answer_with_source = self.add_source_links(answer, docs) return answer_with_source6.3 效果
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 事实准确率 | 68% | 96% |
| 幻觉率 | 23% | 3% |
| 用户信任度 | 3.2/5 | 4.7/5 |
七、 写在最后
消除AI幻觉没有银弹,但可以通过多种策略大幅降低。
核心原则:
- RAG优先:让AI基于事实回答
- 承认无知:教AI说”我不知道”
- 引用来源:每个事实都有出处
- 检测验证:建立幻觉检测机制
记住:宁可说”不知道”,也不要编造。
我是技术老金,我们下期见!
📌 往期精彩回顾