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

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

人工智能实战RAG 问答总是“答非所问”从召回失败到重排优化的完整工程排查与解决方案一、问题场景模型不傻但它拿到的上下文是错的在做企业知识库问答系统时很多人第一版架构通常是这样用户问题 ↓ Embedding 向量化 ↓ 向量数据库检索 TopK ↓ 拼接上下文 ↓ 大模型回答这个链路看起来很标准实际开发时也很容易跑通。但上线测试后经常会出现非常尴尬的问题1. 用户问 A系统回答 B 2. 知识库里明明有答案但模型说不知道 3. 检索出来的文档看起来相关但真正答案不在里面 4. TopK 设置越大回答反而越混乱 5. 模型生成很流畅但事实错误很多一开始我也以为是大模型能力不够于是尝试换更大的模型 调 temperature 增加 max_tokens 加更长的 system prompt结果发现效果并不稳定。后来完整排查链路后才发现真正的问题不是“生成失败”而是“检索失败”。也就是说模型不是不会回答而是你给它的上下文本来就不对。这篇文章重点解决一个真实工程问题RAG 系统答非所问如何从召回、切分、重排、上下文拼接四个层面系统优化。二、真实问题复现一个“能跑但不好用”的 RAG先写一个最小可运行版本。1. 安装依赖pipinstallsentence-transformers faiss-cpu fastapi uvicorn numpy2. 准备测试文档docs[公司报销制度差旅住宿费一线城市每天不超过500元二线城市每天不超过350元。,公司年假制度员工入职满一年后享有5天年假满三年后享有10天年假。,服务器上线规范生产环境发布必须经过代码评审、自动化测试和灰度发布。,大模型部署规范推理服务必须配置限流、熔断、监控和日志追踪。,]3. 基础向量检索importfaissimportnumpyasnpfromsentence_transformersimportSentenceTransformer modelSentenceTransformer(sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2)docs[公司报销制度差旅住宿费一线城市每天不超过500元二线城市每天不超过350元。,公司年假制度员工入职满一年后享有5天年假满三年后享有10天年假。,服务器上线规范生产环境发布必须经过代码评审、自动化测试和灰度发布。,大模型部署规范推理服务必须配置限流、熔断、监控和日志追踪。,]doc_vectorsmodel.encode(docs,normalize_embeddingsTrue)doc_vectorsnp.array(doc_vectors).astype(float32)indexfaiss.IndexFlatIP(doc_vectors.shape[1])index.add(doc_vectors)query一线城市出差住酒店最多报销多少钱query_vectormodel.encode([query],normalize_embeddingsTrue)query_vectornp.array(query_vector).astype(float32)scores,idsindex.search(query_vector,k2)forscore,idxinzip(scores[0],ids[0]):print(score,docs[idx])这个例子可能正常召回报销制度。但真实企业文档不是几句话而是1. PDF 2. Word 3. Markdown 4. 飞书文档 5. Wiki 6. 工单记录 7. 历史会议纪要文档一复杂问题马上出现。三、原因分析RAG 答非所问通常不是一个问题很多人把 RAG 效果不好归因于Embedding 模型不好这只是其中一种可能。实际工程里RAG 问答失败通常来自五类问题1. 文档切分错误 2. 召回 TopK 不合理 3. 向量召回语义不准 4. 缺少重排 rerank 5. 上下文拼接太粗暴四、问题一文档切分不合理文档切分是 RAG 的第一道关。错误切分示例每 500 字强制切一段这样会导致1. 一个完整条款被切断 2. 标题和正文分离 3. 表格语义丢失 4. 召回片段缺少上下文例如原文第三章 差旅报销标准 一线城市住宿费每天不超过500元。 二线城市住宿费每天不超过350元。如果切成chunk1: 第三章 差旅报销标准 一线城市住宿费每天 chunk2: 不超过500元。二线城市住宿费每天不超过350元。用户问一线城市住宿费多少可能召回 chunk2但 chunk2 没有“一线城市”的完整语义。五、解决方案一按结构切分而不是按长度硬切更合理的切分策略标题 段落 标题 条款 标题 表格行示例代码defsplit_by_paragraph(text:str,max_chars:int500):paragraphs[p.strip()forpintext.split(\n)ifp.strip()]chunks[]currentforpinparagraphs:iflen(current)len(p)max_chars:current\npelse:ifcurrent:chunks.append(current.strip())currentpifcurrent:chunks.append(current.strip())returnchunks如果有标题可以把标题带入每个 chunkdefattach_title_to_chunks(title:str,chunks:list[str]):return[f{title}\n{chunk}forchunkinchunks]这样可以避免正文被召回但不知道属于哪个章节。六、问题二只用向量召回容易“语义相似但事实不相关”向量召回的优势是语义匹配但它也有明显问题语义相似 ≠ 答案相关例如用户问生产环境发布需要哪些步骤向量召回可能返回大模型部署规范推理服务必须配置限流、熔断、监控和日志追踪。这段和“生产环境”语义相近但真正答案应该是服务器上线规范生产环境发布必须经过代码评审、自动化测试和灰度发布。这就是向量检索的典型问题。七、解决方案二混合检索 BM25 向量召回工程上更稳的方案是向量召回 关键词召回向量召回负责语义泛化关键词召回负责精确匹配。安装pipinstallrank-bm25 jieba示例代码importjiebafromrank_bm25importBM25Okapi docs[公司报销制度差旅住宿费一线城市每天不超过500元二线城市每天不超过350元。,公司年假制度员工入职满一年后享有5天年假满三年后享有10天年假。,服务器上线规范生产环境发布必须经过代码评审、自动化测试和灰度发布。,大模型部署规范推理服务必须配置限流、熔断、监控和日志追踪。,]tokenized_docs[list(jieba.cut(doc))fordocindocs]bm25BM25Okapi(tokenized_docs)query生产环境发布需要哪些步骤tokenized_querylist(jieba.cut(query))scoresbm25.get_scores(tokenized_query)rankedsorted(enumerate(scores),keylambdax:x[1],reverseTrue)foridx,scoreinranked[:3]:print(score,docs[idx])八、混合召回代码实现defvector_search(query,top_k5):query_vectormodel.encode([query],normalize_embeddingsTrue)query_vectornp.array(query_vector).astype(float32)scores,idsindex.search(query_vector,top_k)results[]forscore,idxinzip(scores[0],ids[0]):results.append({doc:docs[idx],score:float(score),source:vector})returnresultsdefbm25_search(query,top_k5):tokenized_querylist(jieba.cut(query))scoresbm25.get_scores(tokenized_query)rankedsorted(enumerate(scores),keylambdax:x[1],reverseTrue)results[]foridx,scoreinranked[:top_k]:results.append({doc:docs[idx],score:float(score),source:bm25})returnresultsdefhybrid_search(query,top_k5):candidatesvector_search(query,top_k)bm25_search(query,top_k)seenset()merged[]foritemincandidates:ifitem[doc]notinseen:merged.append(item)seen.add(item[doc])returnmerged九、问题三没有 rerankTopK 顺序不可靠混合召回之后会得到一批候选片段。但这批候选片段只是“可能相关”不代表顺序正确。这时需要rerank 重排重排模型会同时看query document判断它们的真实相关性。十、解决方案三加入 Cross Encoder 重排安装pipinstallsentence-transformers示例fromsentence_transformersimportCrossEncoder rerankerCrossEncoder(cross-encoder/ms-marco-MiniLM-L-6-v2)defrerank(query:str,candidates:list[dict],top_k:int3):pairs[(query,item[doc])foritemincandidates]scoresreranker.predict(pairs)reranked[]foritem,scoreinzip(candidates,scores):new_itemitem.copy()new_item[rerank_score]float(score)reranked.append(new_item)rerankedsorted(reranked,keylambdax:x[rerank_score],reverseTrue)returnreranked[:top_k]完整调用query生产环境发布需要哪些步骤candidateshybrid_search(query,top_k5)final_docsrerank(query,candidates,top_k3)foriteminfinal_docs:print(item[rerank_score],item[doc])十一、问题四上下文拼接太粗暴很多系统直接这样拼context\n.join([doc[doc]fordocinfinal_docs])然后丢给模型。问题是1. 没有来源标记 2. 没有相关性顺序 3. 没有控制总长度 4. 多个片段可能互相冲突更合理的方式是defbuild_context(docs:list[dict],max_chars:int3000):parts[]total0fori,iteminenumerate(docs,start1):textf[资料{i}]\n{item[doc]}\niftotallen(text)max_chars:breakparts.append(text)totallen(text)return\n.join(parts)十二、构造更稳的 Promptdefbuild_prompt(query:str,context:str):returnf 你是一个企业知识库问答助手。 请严格根据【资料】回答用户问题。 如果资料中没有答案请回答根据现有资料无法确定。 不要编造资料之外的内容。 【资料】{context}【用户问题】{query}【回答要求】 1. 先给出直接答案 2. 再说明依据来自哪条资料 3. 不要输出资料中没有的信息 这样可以降低模型幻觉。十三、完整 RAG 流程defrag_answer(query:str):candidateshybrid_search(query,top_k8)reranked_docsrerank(query,candidates,top_k3)contextbuild_context(reranked_docs,max_chars3000)promptbuild_prompt(query,context)return{prompt:prompt,references:reranked_docs}十四、验证结果优化前向量召回 Top3 命中率65% 回答准确率60% 经常答非所问优化后混合召回 rerank Top3 命中率85% 回答准确率明显提升 错误回答减少这里要注意RAG 优化不能只看模型回答要先看检索命中率。如果检索没命中生成阶段再强也没用。十五、踩坑记录坑 1只优化 Prompt不看召回很多人看到回答错了就不断改 Prompt。但如果上下文本来就是错的Prompt 再好也救不了。坑 2TopK 设置越大越好TopK 太小容易漏答案。TopK 太大会引入噪声。一般建议召回阶段 TopK 8~20 重排后 TopK 3~5坑 3文档切分只按长度这会破坏语义结构。建议优先按标题 段落 条款 表格行坑 4没有记录召回结果RAG 系统必须把每次召回的文档记录下来。否则用户说回答错了你根本不知道模型看到了什么。坑 5把所有历史对话都塞进上下文上下文越长成本越高噪声越多。RAG 系统要控制有效上下文不是堆得越多越好。十六、适合收藏的 RAG 排查 Checklist文档处理 [ ] 是否按结构切分 [ ] 是否保留标题 [ ] 是否处理表格 [ ] 是否保留来源 召回阶段 [ ] 是否有向量召回 [ ] 是否有关键词召回 [ ] 是否做去重 [ ] 是否记录召回结果 重排阶段 [ ] 是否使用 rerank [ ] 是否控制重排后 TopK [ ] 是否评估 TopK 命中率 生成阶段 [ ] 是否限制上下文长度 [ ] 是否要求基于资料回答 [ ] 是否允许回答“无法确定” [ ] 是否输出引用依据 评估阶段 [ ] 是否有测试问题集 [ ] 是否统计召回命中率 [ ] 是否人工抽检回答质量十七、经验总结RAG 系统最容易犯的错误是把问题都归因于大模型。但真实工程里RAG 的质量通常取决于1. 文档是否处理好 2. 召回是否准确 3. 重排是否有效 4. 上下文是否干净 5. Prompt 是否约束清楚一句话总结RAG 不是“检索 生成”的简单拼接而是一套信息筛选系统。如果你的 RAG 系统总是答非所问不要第一时间换模型。应该先问模型到底拿到了什么资料十八、后续优化建议可以继续增强1. 使用更强的中文 Embedding 模型 2. 引入 bge-reranker 等中文重排模型 3. 对表格做结构化解析 4. 建立离线评测集 5. 统计不同问题类型的召回命中率 6. 对高频问题建立缓存 7. 对长文档做父子 chunk 检索 8. 引入 query rewrite 改写用户问题最后一句经验RAG 的核心不是让模型更会编而是让模型只看正确资料。

相关文章:

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年提出的新型智能…...

Monica 部署指南:自建个人 CRM,记录人际关系的私人助手

Monica 部署指南:自建个人 CRM,记录人际关系的私人助手 Monica 是一个开源的个人 CRM(客户关系管理)工具,但它的目标不是商业客户,而是你生活里真正重要的人——朋友、家人、同事。它帮你记录每个人的生日、联系方式、共同话题、上次见面说了什么,让你成为一个更有心的…...

BetterGI:基于计算机视觉的原神智能辅助工具深度解析

BetterGI&#xff1a;基于计算机视觉的原神智能辅助工具深度解析 【免费下载链接】better-genshin-impact &#x1f4e6;BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙 | 全连音游 | 自…...

南派三叔《盗墓笔记》小说1-9卷全txt电子版

《盗墓笔记》是一部由南派三叔创作的长篇探险悬疑小说&#xff0c;讲述了一个普通青年吴邪在偶然得到一本古老笔记后&#xff0c;与经验丰富的盗墓者胖子、神秘莫测的张起灵等人一起踏上探索古墓、追寻秘密的旅程。今天特别为大家整理分享《盗墓笔记》全套9卷&#xff0c;txt电…...