Agent检索与输出精确性提升

发布时间:2026/7/27 2:45:34

Agent检索与输出精确性提升
提高 Agent 的检索精度和输出精度核心思想只有一句话把线性 RAG改成带评估与纠错的图。单趟检索→塞给 LLM→输出必然会出现三种典型失败查询词和文档语义错位、Top-K 里混入高分低相关内容、生成时出现无依据的幻觉论断。LangGraph 的价值就是让你用节点 条件边把评估、改写、重试、人工兜底编程进流程 。一、检索精确性从相似度走向相关性传统 RAG 默认向量相似 ≈ 相关但在生产环境中这经常不成立——一篇关于 Apache 的 TLS 文章可能因为语义接近而排在 Nginx HTTPS 配置答案前面 。要从根本上提升检索精度需要在索引端和检索端同时做工。1. 索引端让被检索的块本身就是高质量的 结构感知切分Structure-Aware Chunking不要用固定的CharacterTextSplitter一刀切。Markdown / HTML 文档应当先按标题层级切再做二次递归切分这样每个 chunk 都带有section_path之类的元数据检索时能定位到具体章节 。fromlangchain_text_splittersimportMarkdownHeaderTextSplitter,RecursiveCharacterTextSplitter header_splitterMarkdownHeaderTextSplitter(headers_to_split_on[(#,h1),(##,h2),(###,h3)])sub_splitterRecursiveCharacterTextSplitter(chunk_size800,chunk_overlap100)defchunk_documents(raw_docs):all_chunks[]fordocinraw_docs:md_chunksheader_splitter.split_text(doc)forchunkinmd_chunks:iflen(chunk.page_content)800:sub_chunkssub_splitter.split_documents([chunk])all_chunks.extend(sub_chunks)else:all_chunks.append(chunk)returnall_chunks参数经验值来自生产实践中文通用文档chunk_size500, overlap100技术文档/论文chunk_size800, overlap150法律条款chunk_size800, overlap200按第X条切代码chunk_size200, overlap30overlap 的作用至关重要——一段话如果被切到中间前后两块都不完整检索时两块都匹配不上 。 父子文档切分Parent Document Retriever用小 chunk 做精确嵌入匹配但返回给 LLM 时用大 chunk 保留上下文 fromlangchain.retrieversimportParentDocumentRetrieverfromlangchain.storageimportInMemoryStore child_splitterRecursiveCharacterTextSplitter(chunk_size200)# 用于嵌入parent_splitterRecursiveCharacterTextSplitter(chunk_size2000)# 用于返回retrieverParentDocumentRetriever(vectorstorevectorstore,docstoreInMemoryStore(),child_splitterchild_splitter,parent_splitterparent_splitter,) 元数据注入每个 chunk 必须带doc_source、time_updated、section_path。这些是后续做元数据过滤如filter{region: EMEA, department: IT}的基础 。2. 检索端混合检索 查询改写 重排序 混合检索Dense Sparse纯向量检索在术语精确匹配上会翻车如ESG碳排放等专业词。BM25 弥补了这一点fromlangchain.retrieversimportBM25Retriever,EnsembleRetriever bm25_retrieverBM25Retriever.from_documents(docs)vector_retrievervectorstore.as_retriever()ensemble_retrieverEnsembleRetriever(retrievers[bm25_retriever,vector_retriever],weights[0.3,0.7]# 语义匹配权重更高)✍️ 查询改写Query Rewriting用户的原始 query 经常含糊“手机点了坏链接怎么办”需要先改写成检索友好形式“移动设备钓鱼邮件事件响应流程”fromlangchain.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParser rewrite_promptChatPromptTemplate.from_messages([(system,你是一个查询改写器。给定用户问题将其改写为更适合向量数据库检索的形式使其更具体或使用不同的关键词。仅返回改写后的问题。),(human,原始问题{question}),])rewrite_chainrewrite_prompt|llm|StrOutputParser()defrewrite_query(state):rewrittenrewrite_chain.invoke({question:state[question]})return{question:rewritten,rewrite_count:state.get(rewrite_count,0)1} 重排序RerankingBi-encoder嵌入模型召回快但不精确Cross-encoder 重排能把 Query-Document 对联合打分精度显著提升 fromlangchain.retrievers.contextual_compressionimportContextualCompressionRetrieverfromlangchain_community.cross_encodersimportHuggingFaceCrossEncoderfromlangchain.retrievers.document_compressorsimportCrossEncoderReranker# 先用向量库宽召回 k20base_retrievervectorstore.as_retriever(search_kwargs{k:20})# 再用 Cross-encoder 重排取 top 5cross_encoderHuggingFaceCrossEncoder(model_nameBAAI/bge-reranker-base)rerankerCrossEncoderReranker(modelcross_encoder,top_n5)retrieverContextualCompressionRetriever(base_compressorreranker,base_retrieverbase_retriever,) 进阶HyDE假设文档嵌入让用户 query 先生成一段假设性答案再用这段答案去检索能显著提升语义对齐 defhyde_retrieve(state,retriever,model):hyde_promptf请写一段可能回答以下问题的文档内容{state[query]}hypothetical_docmodel.invoke(hypothetical_doc).content docsretriever.invoke(hypothetical_doc)return{retrieved_docs:docs}二、输出精确性让 Agent 学会自我纠错光有好的检索还不够。要让最终输出精确必须在图中加入评估节点和条件重试。这是 LangGraph 相比 Chain 最大的优势——决策可编程。1. 文档相关性评分GraderLLM 对每条检索到的文档打分相关/不相关过滤掉高分低相关的噪声 frompydanticimportBaseModel,FieldclassGradeDocument(BaseModel):对检索文档的相关性评分score:strField(descriptionyes 表示相关no 表示不相关)grade_promptChatPromptTemplate.from_messages([(system,你是文档相关性评估器。判断检索到的文档是否包含能回答用户问题的关键信息。),(human,文档{document}\n\n问题{question}),])doc_gradergrade_prompt|llm.with_structured_output(GradeDocument)defgrade_documents(state):questionstate[question]documentsstate[documents]filtered[]fordocindocuments:resultdoc_grader.invoke({document:doc.page_content,question:question})ifresult.scoreyes:filtered.append(doc)return{documents:filtered}2. 幻觉检测Hallucination Check生成答案后验证答案中的每一个论断是否都能在检索文档中找到支撑 classGradeHallucination(BaseModel):score:strField(descriptionyes 表示答案完全由检索文档支撑no 表示存在无依据的论断)hallucination_promptChatPromptTemplate.from_messages([(system,判断生成答案中的每个事实论断是否都能在检索文档中找到依据。),(human,文档{documents}\n\n答案{generation}),])hallucination_graderhallucination_prompt|llm.with_structured_output(GradeHallucination)defcheck_hallucination(state):resulthallucination_grader.invoke({documents:state[documents],generation:state[generation],})return{hallucination_check:result.score}3. 答案质量评估Answer QualityclassGradeAnswer(BaseModel):score:strField(descriptionyes 表示答案切实回应了问题no 表示答非所问)answer_graderanswer_prompt|llm.with_structured_output(GradeAnswer)defcheck_answer_quality(state):resultanswer_grader.invoke({question:state[question],generation:state[generation],})return{answer_quality:result.score}4. 强制引用与 citation 校验为防止 LLM 编造引用如CITATION: [fake_source]需要在 prompt 中强制要求输出格式为 后处理校验提取答案中的所有 citation 编号确认其确实存在于state[documents]列表中不存在的 citation 一律剔除并触发重新生成5. 重试预算Retry Budget—— 防止无限循环这是生产环境最容易踩的坑。如果不设上限一个知识库中根本没有答案的问题会让 Agent 无限改写-重试 defdecide_after_grading(state):ifstate[relevance_decision]relevant:returngenerateifstate.get(rewrite_count,0)2:# 最多改写 2 次returngenerate# 用现有文档硬生成returnrewrite三、LangGraph 完整实现自纠错 RAG Agent把上面所有环节组装成一个图。状态定义如下 fromtypingimportTypedDict,List,Annotatedfromlangchain_core.documentsimportDocumentimportoperatorclassGraphState(TypedDict):question:strdocuments:List[Document]generation:strrewrite_count:inthallucination_check:stranswer_quality:strerror_reason:str图的结构START → rewrite_query → retrieve → grade_documents │ ┌───────────────┼───────────────┐ relevant not relevant rewrite_count2 │ │ │ generate ───────► rewrite_query generate │ check_hallucination │ ┌───────┼───────┐ grounded not_grounded (回到 generate) │ check_answer_quality │ ┌─────┼─────┐ useful not_useful (回到 rewrite_query 或 finish) │ FINISH核心节点实现fromlanggraph.graphimportStateGraph,END workflowStateGraph(GraphState)# 1. 查询改写节点workflow.add_node(rewrite_query,rewrite_query)# 2. 检索节点混合检索 重排defretrieve(state):querystate[question]# 这里可以注入 metadata 过滤documentsensemble_retriever.invoke(query)return{documents:documents}workflow.add_node(retrieve,retrieve)# 3. 文档评分节点workflow.add_node(grade_documents,grade_documents)# 4. 生成节点defgenerate(state):promptChatPromptTemplate.from_template(你是一个企业知识库助手。仅基于提供的上下文回答问题。\n上下文\n{context}\n\n问题{question}\n\n要求\n1. 答案必须以 [citation:N] 标注来源\n2. 如果上下文无法回答问题明确说我不知道\n3. 禁止编造信息)chainprompt|llm context\n\n.join([doc.page_contentfordocinstate[documents]])generationchain.invoke({context:context,question:state[question]}).contentreturn{generation:generation}workflow.add_node(generate,generate)# 5. 幻觉检测节点workflow.add_node(check_hallucination,check_hallucination)# 6. 答案质量节点workflow.add_node(check_answer_quality,check_answer_quality)# 边和条件路由workflow.set_entry_point(rewrite_query)workflow.add_edge(rewrite_query,retrieve)workflow.add_edge(retrieve,grade_documents)defdecide_after_grading(state):ifnotstate[documents]:returnrewriteifstate.get(rewrite_count,0)2:returngeneratereturnrewriteworkflow.add_conditional_edges(grade_documents,decide_after_grading,{generate:generate,rewrite:rewrite_query})workflow.add_edge(generate,check_hallucination)defdecide_after_hallucination(state):returngenerateifstate[hallucination_check]not_groundedelsecheck_answer_qualityworkflow.add_conditional_edges(check_hallucination,decide_after_hallucination,{generate:generate,check_answer_quality:check_answer_quality})defdecide_after_quality(state):ifstate[answer_quality]not_useful:ifstate.get(rewrite_count,0)2:returnfinishreturnrewritereturnfinishworkflow.add_conditional_edges(check_answer_quality,decide_after_quality,{rewrite:rewrite_query,finish:END})appworkflow.compile()四、人在回路Human-in-the-Loop终极精确性兜底对于高风险场景如发邮件、删数据库、对外承诺可以让 Agent 在执行工具前暂停等待人工审批 fromlanggraph.typesimportinterrupt,Commandfromlanggraph.checkpoint.memoryimportMemorySaverdefreview_tool_call(state):在工具真正执行前暂停让人审批/编辑/拒绝tool_callstate[messages][-1].tool_calls[0]human_responseinterrupt({question:批准此操作,tool_name:tool_call[name],tool_args:tool_call[args],})ifhuman_response[type]approve:return{}elifhuman_response[type]edit:state[messages][-1].tool_calls[0][args]human_response[edited_args]return{messages:[state[messages][-1]]}else:# rejectreturn{messages:[ToolMessage(content用户拒绝了此操作。,tool_call_idtool_call[id])]}# 编译时必须带 checkpointer否则无法暂停/恢复memoryMemorySaver()graphworkflow.compile(checkpointermemory)五、性能优化从 2.3s 到 380ms 的真实路径检索精确性提升后延迟往往恶化。生产环境的几个关键优化 优化项操作效果向量库分片按source_type拆分 Chroma 为多子库-42% 耗时BM25 预热高频词结果预加载到内存 dict-28% 耗时异步并行检索asyncio.gather并行多通道timeout1.2s-31% 耗时Score 预计算归一化向量化时预计算为 [0,1] 存入 metadata-15% CPUimportasyncioasyncdefparallel_retrieve(query):tasks[vector_retriever.ainvoke(query),bm25_retriever.ainvoke(query)]resultsawaitasyncio.gather(*tasks,return_exceptionsTrue)# 合并 去重 重排...六、评估没有评估的优化都是瞎忙精确性提升必须可量化。建议跟踪以下指标检索侧RecallK、MRRMean Reciprocal Rank、重排后 Top-5 准确率生成侧Faithfulness忠实度、Answer Relevancy、Citation Accuracy端到端任务成功率、人工抽检合格率使用 LangSmith 或自定义日志追踪每一步的输入输出找出瓶颈节点 。最终总结提升 LangChain/LangGraph Agent 的精确性本质是把一次性管道重构成带评估回路的图。关键认知相似度 ≠ 相关性。向量检索只是宽召回的手段真正的精度来自评估-改写-重排-校验这一整套图节点协作。检索端要做的事结构感知切分 父子文档 元数据注入混合检索BM25 向量做宽召回Cross-encoder 重排序做精准排序查询改写消除查询鸿沟生成端要做的事文档相关性评分过滤噪声幻觉检测确保每句话有依据答案质量评估确保切题强制引用 citation 校验防编造重试预算防止无限循环架构端要做的事LangGraph 状态图把上述节点编程化人在回路兜底高风险操作性能优化保证生产可用性持续评估驱动迭代最常见的三个反模式❌ 不设重试上限 → 死循环烧钱❌ 只用向量检索不用重排 → Top-K 稀释❌ 编译时不加 checkpointer → 人在回路失效按这套思路落地检索精确性和输出精确性可以同时获得质的提升——其核心在于让 Agent 具备自我怀疑和自我纠错的能力而不是盲目相信第一趟检索和第一次生成。

相关新闻

ARM固件逆向:5种定位ELF入口点的方法与实战技巧

ARM固件逆向:5种定位ELF入口点的方法与实战技巧

2026/7/27 2:45:34

1. 项目概述:从固件二进制到可执行逻辑的逆向之旅在嵌入式安全、设备分析和漏洞挖掘的领域,我们常常会面对一个最基础也最关键的挑战:拿到一个设备的固件文件,如何找到它的第一行代码在哪里开始执行?这个问题&#xff…

智能监控告警系统2.0:动态基线算法与告警聚合实战

智能监控告警系统2.0:动态基线算法与告警聚合实战

2026/7/27 2:35:33

1. 项目背景与核心价值监控告警系统就像给IT基础设施装上的"神经系统",任何风吹草动都能第一时间感知。在运维领域干了十几年,我见过太多因为告警不及时导致的故障蔓延案例。传统的监控系统往往存在两个致命伤:要么误报满天飞让运维…

30米分辨率CATCD树木覆盖数据的技术解析与应用实践

30米分辨率CATCD树木覆盖数据的技术解析与应用实践

2026/7/27 2:35:33

1. 项目背景与数据价值作为一名长期从事地理空间数据分析的研究者,我深知高质量长时间序列地表覆盖数据的稀缺性。传统森林资源调查往往存在两个痛点:一是时间分辨率低(通常5-10年一次),二是空间细节不足(常…

抖音批量下载终极指南:免费高效的douyin-downloader完整解决方案

抖音批量下载终极指南:免费高效的douyin-downloader完整解决方案

2026/7/27 3:35:36

抖音批量下载终极指南:免费高效的douyin-downloader完整解决方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fall…

视觉注意机制解析:从认知原理到AI应用

视觉注意机制解析:从认知原理到AI应用

2026/7/27 3:35:35

1. 视觉注意的基本概念与分类 视觉注意是人类认知系统中最核心的功能之一,它决定了我们如何从海量视觉信息中选择性地处理关键内容。想象一下,当你走进一家拥挤的咖啡馆时,虽然眼前有数十个人在走动,但你却能立即注意到朋友向你招…

桌面宠物框架革命:DyberPet如何重塑数字陪伴体验

桌面宠物框架革命:DyberPet如何重塑数字陪伴体验

2026/7/27 3:35:35

桌面宠物框架革命:DyberPet如何重塑数字陪伴体验 【免费下载链接】DyberPet Desktop Cyber Pet Framework based on PySide6 项目地址: https://gitcode.com/GitHub_Trending/dy/DyberPet 你是否曾想过,让喜爱的动漫角色真正"活"在你的…

AgentScope模型层配置:多模型统一调用与流式输出实践

AgentScope模型层配置:多模型统一调用与流式输出实践

2026/7/27 3:35:35

1. AgentScope 模型层深度配置解析在当今多模型生态系统中,开发者经常面临一个核心痛点:不同厂商的API接口差异巨大,导致切换模型时需要重写大量代码。AgentScope的ModelWrapper设计正是为了解决这一问题而生。通过统一封装层,开发…

AI如何用六套算法重塑学术写作全流程

AI如何用六套算法重塑学术写作全流程

2026/7/27 3:35:35

1. 项目概述:AI如何重塑学术写作生态在当前的学术出版领域,研究人员平均需要花费47%的工作时间在论文撰写和修改上。这个数字背后是无数个熬夜赶稿的夜晚、反复修改的挫折感,以及被拒稿时的无奈。传统论文写作就像在迷宫中摸索前行——你需要…

基于C#与Halcon的智能焊缝跟踪系统设计与实现

基于C#与Halcon的智能焊缝跟踪系统设计与实现

2026/7/27 3:25:35

1. 项目背景与核心价值在工业自动化领域,焊缝跟踪技术一直是智能制造的关键环节。传统人工焊接不仅效率低下,且质量稳定性难以保证。我们团队最近完成了一个基于ABB机器人的智能焊缝跟踪系统,通过C#与Halcon的联合编程实现了亚毫米级的跟踪精…

[具身智能-649]:个人电脑搭建 RTSP 服务完整方案(Windows / Ubuntu 双平台,适配 RDK X5 rtsp2display 调试)

[具身智能-649]:个人电脑搭建 RTSP 服务完整方案(Windows / Ubuntu 双平台,适配 RDK X5 rtsp2display 调试)

2026/7/26 0:04:02

目标:电脑作为RTSP 服务端,循环推送 H264/H265 视频流; RDK X5 通过 rtsp2display 拉流预览,完全不需要在开发板编译 live555。 提供两套成熟方案: ✅ 方案 A:FFmpeg(最简单,优先推…

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

2026/7/26 0:04:02

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

PDF拆分压完图糊了?2026国内免费实测,档案员都在用的组合方案

PDF拆分压完图糊了?2026国内免费实测,档案员都在用的组合方案

2026/7/26 0:04:02

说实话,提到PDF拆分再压缩,我真是被折腾得够呛。 上个月公司年度合同归档,一份300多页的PDF总合同,需要按年份拆分成三个独立文件,再分别压缩到10MB以内方便邮件发送各部门确认。我心想这还不简单?先找个海…

多模态 AI 前端工程——图像上传、压缩与流式返回的协同设计

多模态 AI 前端工程——图像上传、压缩与流式返回的协同设计

2026/7/27 0:05:04

多模态 AI 前端工程——图像上传、压缩与流式返回的协同设计 一、多模态对话的「首字节延迟」:上传与流式的协同鸿沟 多模态 AI 应用的前端体验,往往卡在"首字节延迟"上。用户上传一张图片,提一个问题,然后盯着空白对…

【微科普】网红水晶香薰真相拆解:透明固体香薰并非香精结晶,一文理清各类无火香薰释香机理

【微科普】网红水晶香薰真相拆解:透明固体香薰并非香精结晶,一文理清各类无火香薰释香机理

2026/7/27 0:05:04

文章目录第一章 大众普遍存在的认知误区:水晶香薰是芳香烃结晶产物1.1 聚丙烯酸钠凝胶水晶珠体系(市面占比90%家用水晶香薰)1.2 无机盐硬质结晶载体:泻盐与钾明矾香薰原石1.3 植物多糖与PVA整块果冻型水晶香膏1.4 唯一特例&#x…

优启通3.7修改版:深度优化的PE系统维护工具

优启通3.7修改版:深度优化的PE系统维护工具

2026/7/27 0:05:04

1. 项目概述今天要跟大家分享的是一个经过深度优化的PE工具——优启通3.7(2025修改版)。这个版本是在原版基础上进行了大量功能增强和兼容性改进的12月最新版本,特别适合系统维护人员和电脑爱好者使用。作为一个长期从事IT运维的老兵&#xf…