当前位置: 首页 > article >正文

12.人工智能实战:RAG 检索命中了但回答仍然错误?上下文压缩、引用约束与反幻觉 Prompt 的工程实践

人工智能实战RAG 检索命中了但回答仍然错误上下文压缩、引用约束与反幻觉 Prompt 的工程实践一、问题场景资料明明找到了模型还是胡说上一篇我们解决了 RAG 系统里最常见的问题召回不准通过结构化切分 混合检索 rerank 重排 TopK 控制检索效果明显提升。但很快又遇到第二个问题资料已经召回正确模型回答仍然不稳定。典型表现1. 引用了正确资料但回答多加了不存在的内容 2. 多个资料放在一起后模型混合了不同规则 3. 明明资料里没有答案模型仍然强行回答 4. 模型回答看起来很自信但依据不明确 5. 长上下文下模型忽略了真正关键的一句话这类问题比“召回失败”更隐蔽。因为你看检索结果资料是对的但最终回答还是错的很多人会继续换模型或者把 Prompt 写得更长。但实际工程经验是RAG 的生成阶段不是简单把资料塞给模型而是要做上下文治理。这篇文章重点解决检索命中后如何让模型严格基于资料回答减少幻觉和错引。二、真实问题复现准备几条容易冲突的制度文档docs[{id:policy_001,title:差旅报销制度,content:一线城市住宿费每天不超过500元二线城市住宿费每天不超过350元。},{id:policy_002,title:销售部门特殊报销制度,content:销售部门因客户拜访产生的住宿费一线城市每天不超过650元。},{id:policy_003,title:实习生报销制度,content:实习生差旅住宿费每天不超过200元需提前审批。}]用户问销售同事去一线城市出差住宿费最多报销多少如果上下文拼接不清楚模型可能回答一线城市住宿费每天不超过500元。但正确答案应该是销售部门客户拜访场景下一线城市住宿费每天不超过650元。这说明资料都在但模型没有正确识别适用条件。三、原因分析RAG 生成阶段的三个核心问题1. 上下文太长关键证据被稀释很多系统为了保险会塞很多文档TopK 10 每段 1000 字 总上下文接近 10000 字模型看似信息更多实际问题更大1. 噪声增加 2. 适用条件混乱 3. 关键句被淹没 4. token 成本上升2. 资料之间存在冲突或适用条件不同企业文档里经常存在通用规则 部门特殊规则 地区特殊规则 新旧版本规则 例外条款如果 Prompt 没有要求模型判断适用条件就容易答错。3. 没有强制引用依据如果不要求模型引用资料编号它会自由生成。这在 RAG 里非常危险。因为你无法判断回答来自资料还是模型自己编的。四、解决方案设计生成阶段要做四件事1. 上下文压缩只保留和问题直接相关的句子 2. 资料结构化保留来源、标题、适用条件 3. 强引用约束回答必须引用资料编号 4. 无答案兜底资料不足时必须回答无法确定目标不是让模型回答得更长而是回答更可控、更可追溯。五、上下文压缩不要把整段都塞进去假设重排后拿到这些资料retrieved_docs[{id:policy_001,title:差旅报销制度,content:适用于全体员工。一线城市住宿费每天不超过500元二线城市住宿费每天不超过350元。},{id:policy_002,title:销售部门特殊报销制度,content:适用于销售部门客户拜访场景。销售部门因客户拜访产生的住宿费一线城市每天不超过650元。},{id:policy_003,title:实习生报销制度,content:适用于实习生。实习生差旅住宿费每天不超过200元需提前审批。}]可以先做一个简单的句子级压缩defsplit_sentences(text:str):separators[。,,\n]sentences[text]forsepinseparators:new_sentences[]forsinsentences:new_sentences.extend(s.split(sep))sentencesnew_sentencesreturn[s.strip()forsinsentencesifs.strip()]根据关键词筛选相关句defcompress_context(query:str,docs:list[dict]):keywords[wforwinqueryifw.strip()]compressed[]fordocindocs:sentencessplit_sentences(doc[content])selected[]forsentenceinsentences:ifany(kinsentenceforkin[销售,一线城市,住宿费,报销]):selected.append(sentence)ifselected:compressed.append({id:doc[id],title:doc[title],content:。.join(selected)})returncompressed这个版本比较简单生产环境可以用1. 小模型摘要 2. 句向量相似度筛选 3. LLM extract 4. 规则 rerank但核心原则不变生成阶段不要塞无关信息。六、构造带引用的上下文defbuild_cited_context(docs:list[dict]):blocks[]fordocindocs:blockf [资料ID:{doc[id]}] 标题:{doc[title]}内容:{doc[content]}blocks.append(block.strip())return\n\n.join(blocks)生成的上下文类似[资料ID: policy_001] 标题: 差旅报销制度 内容: 适用于全体员工。一线城市住宿费每天不超过500元 [资料ID: policy_002] 标题: 销售部门特殊报销制度 内容: 适用于销售部门客户拜访场景。销售部门因客户拜访产生的住宿费一线城市每天不超过650元这样模型更容易区分通用规则 vs 特殊规则七、设计反幻觉 Prompt重点不是写得华丽而是约束清楚。defbuild_anti_hallucination_prompt(query:str,context:str):returnf 你是企业知识库问答助手。 请严格根据【资料】回答问题不要使用资料之外的常识或猜测。 【回答规则】 1. 如果资料中存在直接答案请给出明确答案。 2. 如果资料存在多个规则请优先使用与用户问题条件最匹配的规则。 3. 如果资料中没有答案请回答“根据现有资料无法确定”。 4. 回答中必须标注引用的资料ID。 5. 不允许编造资料ID不允许引用不存在的内容。 【资料】{context}【用户问题】{query}【输出格式】 直接答案 依据 注意事项 这个 Prompt 解决三个问题1. 限定信息来源 2. 要求判断适用条件 3. 强制输出依据八、增加答案校验器生成完答案后不要直接返回。可以做一个简单校验defvalidate_answer(answer:str,allowed_doc_ids:list[str]):has_referenceany(doc_idinanswerfordoc_idinallowed_doc_ids)ifnothas_reference:returnFalse,answer has no valid referenceforbidden_words[我认为,可能,一般来说,通常情况下]ifany(wordinanswerforwordinforbidden_words):returnFalse,answer may contain unsupported speculationreturnTrue,ok调用allowed_ids[doc[id]fordocincompressed_docs]valid,reasonvalidate_answer(answer,allowed_ids)ifnotvalid:answer根据现有资料无法确定。这个校验器很简单但工程上很有用。尤其是面向制度、合同、财务、法务类知识库时宁可回答不知道也不要胡说。九、完整流程代码defrag_generate(query:str,retrieved_docs:list[dict]):compressed_docscompress_context(query,retrieved_docs)ifnotcompressed_docs:return{answer:根据现有资料无法确定。,references:[]}contextbuild_cited_context(compressed_docs)promptbuild_anti_hallucination_prompt(query,context)# 这里替换成真实 LLM 调用answercall_llm(prompt)allowed_ids[doc[id]fordocincompressed_docs]valid,reasonvalidate_answer(answer,allowed_ids)ifnotvalid:return{answer:根据现有资料无法确定。,references:allowed_ids,validation:reason}return{answer:answer,references:allowed_ids,validation:ok}十、模拟 LLM 调用为了本地可运行可以先用 mockdefcall_llm(prompt:str):return 直接答案 销售同事因客户拜访去一线城市出差住宿费最多报销650元/天。 依据 该规则来自资料ID: policy_002其中说明销售部门因客户拜访产生的住宿费一线城市每天不超过650元。 注意事项 如果不是销售部门客户拜访场景则可能适用普通差旅报销制度。 测试query销售同事去一线城市出差住宿费最多报销多少resultrag_generate(query,retrieved_docs)print(result[answer])print(result[references])十一、验证结果优化前问题销售同事去一线城市出差住宿费最多报销多少 回答一线城市住宿费每天不超过500元。 问题忽略了销售部门特殊规则。优化后回答销售部门客户拜访场景下一线城市住宿费最多650元/天。 引用policy_002。核心变化不是模型变强了而是上下文更干净约束更明确答案可追溯。十二、踩坑记录坑 1上下文越多越好这是 RAG 里非常常见的误区。上下文越多模型越容易混淆。正确做法是召回多一点生成少一点。也就是召回 TopK 可以较大 最终放进 Prompt 的内容必须精简。坑 2没有区分通用规则和特殊规则企业知识库里经常存在例外条款。如果不让模型判断适用条件它很容易选通用规则。Prompt 中必须明确优先使用与用户问题条件最匹配的规则。坑 3不要求引用资料 ID不要求引用就没法追责。用户问依据是什么系统必须能回答来自哪份资料哪个片段。坑 4让模型自由发挥RAG 的目标不是发挥创造力而是基于资料回答。所以制度问答、合同问答、内部文档问答应降低自由度temperature 0 或 0.1坑 5没有答案也强行回答RAG 系统最重要的能力之一是知道自己不知道。Prompt 必须允许模型回答根据现有资料无法确定。十三、适合收藏的生成阶段 Checklist上下文 [ ] 是否压缩无关内容 [ ] 是否保留资料来源 [ ] 是否保留标题 [ ] 是否保留适用条件 [ ] 是否限制最大上下文长度 Prompt [ ] 是否要求严格根据资料回答 [ ] 是否允许回答无法确定 [ ] 是否要求引用资料ID [ ] 是否要求判断适用条件 [ ] 是否禁止编造 校验 [ ] 是否检查引用ID [ ] 是否检查答案是否包含猜测词 [ ] 是否对无引用答案降级 [ ] 是否记录最终上下文十四、经验总结RAG 的生成阶段核心不是让模型“更会说”而是让模型更守规矩。很多答错问题并不是因为模型能力差而是因为1. 上下文太乱 2. 资料冲突没有处理 3. Prompt 没有约束 4. 回答没有校验一句话总结RAG 生成质量 干净上下文 明确约束 可追溯引用 后置校验。十五、后续优化建议可以继续做1. 句子级 rerank 2. LLM-based context compression 3. 引用片段高亮 4. 答案一致性校验 5. 多轮追问时重写 query 6. 对高风险问题强制返回引用 7. 对制度类问题使用低 temperature 8. 对无答案问题建立拒答策略最后一句经验RAG 系统最怕的不是回答少而是没有依据地回答多。

相关文章:

12.人工智能实战:RAG 检索命中了但回答仍然错误?上下文压缩、引用约束与反幻觉 Prompt 的工程实践

人工智能实战:RAG 检索命中了但回答仍然错误?上下文压缩、引用约束与反幻觉 Prompt 的工程实践 一、问题场景:资料明明找到了,模型还是胡说 上一篇我们解决了 RAG 系统里最常见的问题: 召回不准通过: 结…...

别再乱用uni.navigateTo了!uni-app五种路由跳转API的保姆级选择指南

别再乱用uni.navigateTo了!uni-app五种路由跳转API的保姆级选择指南 在uni-app开发中,路由跳转是构建应用导航的基础能力,但很多开发者往往只停留在"能用"层面,对五种核心API的区别和适用场景缺乏深度理解。你是否遇到过…...

Arm Fast Models硬件追踪组件在嵌入式调试中的应用

1. Arm Fast Models追踪组件概述在嵌入式系统开发领域,硬件行为追踪是调试和验证的关键手段。Arm Fast Models提供的trace组件系统能够实时捕获硬件模块的寄存器访问、状态转换和中断信号等关键事件。这套系统特别适用于以下场景:驱动开发阶段的寄存器操…...

11.人工智能实战:RAG 问答总是“答非所问”?从召回失败到重排优化的完整工程排查与解决方案

人工智能实战:RAG 问答总是“答非所问”?从召回失败到重排优化的完整工程排查与解决方案一、问题场景:模型不傻,但它拿到的上下文是错的 在做企业知识库问答系统时,很多人第一版架构通常是这样: 用户问题↓…...

用贪心算法搞定多机调度:一个Python实现带你理解最长处理时间优先策略

用贪心算法实现高效多机调度:Python实战与策略优化 在分布式计算和任务调度领域,如何合理分配有限的计算资源以最小化总完成时间是一个经典难题。想象一下这样的场景:你手头有数十个数据处理任务,每项任务耗时不同,而可…...

猫抓Cat-Catch资源嗅探工具终极实战指南:3步轻松捕获网页多媒体资源

猫抓Cat-Catch资源嗅探工具终极实战指南:3步轻松捕获网页多媒体资源 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否经常遇到这样…...

核心组件大换血:Backbone与Neck魔改篇:YOLO26缝合FasterNet主干:基于PConv(部分卷积)的延迟与算力双优化

一、为什么你的“轻量级”YOLO跑不快?——问题的根源 很多做目标检测落地的开发者都有这样的困惑:用了各种“轻量级”骨干网络替换YOLO原生Backbone,FLOPs(浮点运算次数)确实降了,但实际跑起来延迟还是高、吞吐上不去,尤其在边缘设备和CPU上更加明显。这就好比你买了一…...

核心组件大换血:Backbone与Neck魔改篇:YOLO26引入VanillaNet基础极简架构:反直觉的无跳连接也能涨点?

导语:一个违反“深度学习常识”的实验 2026年1月,Ultralytics正式发布了YOLO26——一个从底层重新设计、专为边缘和低功耗环境打造的统一检测架构。根据Ultralytics官方在2026年1月发布的介绍,YOLO26并非一次渐进式升级,而是代表了生产级视觉AI在训练、部署和扩展方式上的…...

为什么你的Windows资源管理器需要QTTabBar?3个理由告诉你答案

为什么你的Windows资源管理器需要QTTabBar?3个理由告诉你答案 【免费下载链接】qttabbar QTTabBar is a small tool that allows you to use tab multi label function in Windows Explorer. https://www.yuque.com/indiff/qttabbar 项目地址: https://gitcode.co…...

Java代码优化技巧:循环展开与内存访问优化

循环展开优化循环展开&#xff08;Loop Unrolling&#xff09;是一种减少循环控制开销的技术&#xff0c;通过减少循环次数、增加每次迭代的工作量来提升性能。适用于循环体简单且迭代次数固定的场景。示例代码&#xff1a;未展开的循环for (int i 0; i < 100; i) {sum ar…...

Docker容器化部署OpenClaw AI智能体:安全隔离与自动化实践指南

1. 项目概述&#xff1a;在Docker中安全运行OpenClaw如果你和我一样&#xff0c;对AI智能体&#xff08;Agent&#xff09;的潜力感到兴奋&#xff0c;但又对让它直接在你的开发机上“为所欲为”心存顾虑&#xff0c;那么今天分享的这个项目绝对值得你花时间了解一下。我最近在…...

第五部分-后期特效与着色器——24. 后期特效基础

24. 后期特效基础 1. 概述 后期特效&#xff08;Post-Processing&#xff09;是在场景渲染完成后&#xff0c;对渲染结果进行额外处理的技术。通过 EffectComposer 合成器&#xff0c;可以叠加多种特效&#xff0c;如泛光、景深、颜色校正等。 ┌───────────────…...

云原生部署技能包:为智能体与自动化工作流提供多云一键部署能力

1. 项目概述&#xff1a;一个云原生部署的智能“副驾驶”最近在折腾一个挺有意思的开源项目&#xff0c;叫cloud-deploy-skill。简单来说&#xff0c;它不是一个独立的部署工具&#xff0c;而是一个可以被集成到智能体&#xff08;Agent&#xff09;或自动化工作流中的“技能包…...

Bonsai:为Cursor AI瘦身的本地化规则集,节省65% Token

1. 项目概述&#xff1a;Bonsai - 为 Cursor AI 瘦身的本地化规则集如果你和我一样&#xff0c;日常重度依赖 Cursor 这类 AI 编程助手&#xff0c;那你肯定也经历过那种“话痨式”的回复。每次问一个简单的技术问题&#xff0c;它总会先来一段“当然可以&#xff01;”&#x…...

5个实战技巧:用VinXiangQi深度AI分析突破象棋对弈瓶颈

5个实战技巧&#xff1a;用VinXiangQi深度AI分析突破象棋对弈瓶颈 【免费下载链接】VinXiangQi Xiangqi syncing tool based on Yolov5 / 基于Yolov5的中国象棋连线工具 项目地址: https://gitcode.com/gh_mirrors/vi/VinXiangQi 你是否经常在象棋对弈中陷入开局被动、中…...

创业团队如何利用Taotoken管理多个项目的API Key与访问权限

创业团队如何利用Taotoken管理多个项目的API Key与访问权限 1. 多项目环境下的API Key管理挑战 小型创业团队在同时推进多个AI应用原型开发时&#xff0c;通常会面临模型API调用的管理难题。不同项目可能使用不同的模型供应商&#xff0c;团队成员权限需要差异化控制&#xf…...

PORTool:基于奖励树的LLM工具调用优化方案

1. 项目背景与核心价值在大型语言模型&#xff08;LLM&#xff09;应用落地的过程中&#xff0c;工具调用&#xff08;Tool Calling&#xff09;能力正成为区分模型实用性的关键指标。传统方法通常采用监督微调&#xff08;SFT&#xff09;或人类反馈强化学习&#xff08;RLHF&…...

Stable Diffusion风格优化器:LoRA与参数调优实战指南

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目&#xff0c;叫vibeforge1111/vibeship-optimizer。乍一看这个标题&#xff0c;可能会有点摸不着头脑&#xff0c;但如果你对AI生成内容&#xff0c;特别是Stable Diffusion这类文生图模型的应用和优化感兴趣&#xff0c…...

YOLOv5实战:手把手教你用BiFPN替换PANet,实测疵点检测mAP提升7个点

YOLOv5工业质检实战&#xff1a;BiFPN特征融合在疵点检测中的性能突破 在工业质检领域&#xff0c;毫米级的表面缺陷往往决定着产品的最终品质。传统人工检测不仅效率低下&#xff0c;且漏检率常高达15%-20%。我们团队在最近三个月的产线测试中发现&#xff0c;基于YOLOv5的深度…...

生成式AI性能评估:核心指标与GenAI-Perf实战

1. 生成式AI性能评估的挑战与机遇在生成式AI模型的实际部署中&#xff0c;性能评估远比传统机器学习模型复杂得多。作为一名长期从事AI基础设施优化的工程师&#xff0c;我深刻体会到&#xff1a;当面对动辄数十亿参数的大语言模型&#xff08;LLM&#xff09;时&#xff0c;简…...

C++实现Windows防休眠工具:模拟鼠标移动与系统API调用详解

1. 项目概述&#xff1a;一个让鼠标指针“动起来”的Windows小工具 如果你和我一样&#xff0c;在Windows系统上工作或学习时&#xff0c;偶尔会离开电脑前&#xff0c;但又不想让屏幕进入休眠或锁屏状态&#xff08;比如正在下载大文件&#xff0c;或者需要保持某个远程会话在…...

大模型动态记忆管理:MemAct框架原理与实践

1. 项目概述&#xff1a;当大模型学会"记笔记"在自然语言处理领域&#xff0c;大型语言模型&#xff08;LLM&#xff09;的上下文窗口就像人类的工作记忆——容量有限却至关重要。传统方法中&#xff0c;模型被动接收全部对话历史&#xff0c;导致重要信息淹没在文本…...

Java字节流详解FileInputStream和FileOutputStream

Java 字节流详解&#xff1a;FileInputStream 和 FileOutputStream 从入门到实践 一、前言 在 Java 中&#xff0c;文件的读写操作是最基础也是最高频的 I/O 场景之一。字节流&#xff08;Byte Stream&#xff09;作为 Java I/O 体系的两大分支之一&#xff0c;负责处理所有二进…...

AI智能体开发实战:从开源Cookbook到生产级应用构建指南

1. 项目概述&#xff1a;一份面向开发者的AI实战手册最近在整理自己的技术工具箱时&#xff0c;我重新审视了Dave Ebbelaar维护的“AI Cookbook”项目。这并非一个需要你从零开始部署的复杂系统&#xff0c;而是一个开源的、由代码片段和教程组成的集合库。它的核心价值在于&am…...

Kapitan配置管理:基于Jsonnet与Jinja2的多环境云原生配置实践

1. 项目概述&#xff1a;为什么我们需要Kapitan这样的配置管理工具&#xff1f;在云原生和基础设施即代码&#xff08;IaC&#xff09;的时代&#xff0c;我们手里的配置文件正以前所未有的速度膨胀。Kubernetes的YAML清单、Terraform的HCL文件、Helm的Chart、Ansible的Playboo…...

沉淀仓核心配件(H 管)安装与作用

以下技术要点是南京比德园艺服务有限公司创作&#xff0c;内容如下&#xff1a;H 管是沉淀仓的核心配件&#xff0c;南京比德园艺所有鱼池项目的沉淀仓均强制标配 H 管。H 管的核心作用是分散水流&#xff0c;避免进水直冲底部翻起已沉淀的杂质&#xff1b;稳定水流速度&#x…...

编程入门:if和switch分支结构

一、if分支1.基本结构&#xff1a;&#xff08;1&#xff09;if&#xff08;布尔表达式&#xff09;{执行语句} 执行原理&#xff1a;如果布尔表达式的结果为true&#xff0c;则执行{}中内容&#xff0c;如果为false&#xff0c;则不执行{}中的内容。不论花括号中的语句是否执…...

《AI大模型应用开发实战从入门到精通共60篇》041、异步编程:用asyncio提升LLM应用的并发性能

041 异步编程&#xff1a;用asyncio提升LLM应用的并发性能 从一次线上事故说起 凌晨两点&#xff0c;告警电话把我从床上拽起来。监控显示我们的LLM对话服务响应时间从200ms飙到了8秒&#xff0c;CPU负载却只有30%。查日志发现&#xff0c;每次用户请求都在等上游的OpenAI接口返…...

避开“毒王”分子:药物化学家如何利用警示子结构(SA)库提前规避研发雷区

药物化学家的结构排雷指南&#xff1a;如何利用警示子结构规避研发风险 在药物研发的漫长征程中&#xff0c;化学家们常常面临一个残酷的现实&#xff1a;约90%的候选药物最终未能通过临床试验&#xff0c;其中近半数折戟于安全性问题。那些看似微小的分子片段——一个苯环上的…...

小龙虾算法COA实战:调参指南与在CEC2005测试函数上的表现分析

小龙虾优化算法COA实战&#xff1a;参数调优与性能评估全解析 在智能优化算法的研究领域&#xff0c;生物启发式算法因其独特的搜索机制和解决复杂问题的能力而备受关注。小龙虾优化算法&#xff08;Crayfish Optimization Algorithm, COA&#xff09;作为2023年提出的新型智能…...