尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

从向量检索到逻辑检索:Agentic RAG如何突破传统RAG瓶颈

从向量检索到逻辑检索:Agentic RAG如何突破传统RAG瓶颈 1. 项目概述从向量检索到逻辑检索的范式转移最近在跟几个做RAG检索增强生成项目的朋友聊天大家普遍有个感觉基于向量嵌入Embeddings的语义检索好像越来越不够用了。我们辛辛苦苦把文档切片、向量化、存进Milvus或Pinecone但用户一问稍微复杂点、需要多步推理的问题比如“对比A方案和B方案在成本与性能上的优劣并给出建议”系统就常常“掉链子”。返回的片段要么是孤立的、缺乏上下文要么干脆漏掉了关键信息。这让我开始重新审视我们习以为常的RAG架构。我们是不是过于依赖“向量相似度”这个单一信号了当大语言模型LLM本身已经具备了强大的逻辑推理和指令理解能力时我们是否应该让LLM更深度地参与到“检索”这个核心环节中而不仅仅是最后的“生成”环节这就是“Rethinking Agentic RAG”这个命题的核心。传统的RAG流程可以概括为“检索器Retriever找片段LLM大模型编答案”。检索器无论是基于BM25的关键词匹配还是更流行的基于Embeddings的向量检索其本质都是在做“模式匹配”。它们根据查询的向量表示从海量文档块中找出最“像”的几个。但“像”不等于“相关”更不等于“能回答问题”。特别是当问题涉及多跳推理Multi-hop、逻辑判断如因果、对比、条件或需要整合分散信息时这种基于静态、孤立片段相似度的检索方式其天花板非常明显。而“Agentic RAG”或“LLM-Driven Logical Retrieval”指向的是一种新思路让LLM扮演一个“主动的推理者”和“检索策略制定者”而不仅仅是“被动的答案生成器”。在这个范式下LLM会根据对用户问题的深度理解动态规划检索路径可能包括将复杂问题分解为多个子问题、决定每一步检索的目标和策略是用关键词还是用向量或是查数据库、对中间结果进行逻辑验证和筛选、甚至发起多轮迭代检索直至收集到足够且可靠的证据链。这不再是简单的“一次检索一次生成”而是形成了一个由LLM驱动的、具有感知、规划、行动、反思能力的智能体Agent工作流。这不仅仅是技术上的小修小补而是一种架构层面的重新思考。它意味着检索过程从“基于相似度的模式匹配”转向“基于逻辑和推理的信息寻径”。对于开发者而言我们需要构建的不再只是一个“向量数据库提示词工程”的管道而是一个能让LLM安全、高效、可控地调用各种工具检索工具、计算工具、API等并自主完成复杂任务的智能系统。接下来我将结合具体的实践场景拆解这一转变背后的核心逻辑、技术实现路径以及我们踩过的那些坑。2. 传统RAG的瓶颈为什么Embeddings检索会“失灵”在深入新架构之前我们必须先搞清楚老办法到底在哪出了问题。基于Embeddings的语义检索无疑是RAG的基石它让机器能理解“苹果公司”和“iPhone制造商”之间的语义关联这是关键词匹配做不到的。但在实际复杂应用中它的局限性暴露无遗。2.1 语义相似度的固有缺陷最根本的问题在于语义相似度不等于答案相关性更不等于逻辑完备性。向量模型把文本映射到高维空间计算的是整体语义的“距离”。但一个复杂问题往往需要多个分散的、语义上可能并不直接“相似”的信息片段组合起来才能解答。举个例子用户问“我们项目预算紧张是应该选用AWS的t3.micro实例还是阿里云的ecs.g6.low” 一个训练良好的Embedding模型可能会把“预算紧张”和“成本优化”、“便宜”的文档片段找出来也可能把“t3.micro”和AWS实例规格文档匹配上。但它极有可能漏掉“阿里云ecs.g6.low”的具体性能参数文档或者找不到直接对比两者价格性能比的表格。因为“AWS t3.micro”和“阿里云 ecs.g6.low”在语义空间里可能并不接近尽管它们在用户问题中是并列对比项。检索系统返回了一堆关于“成本”和单个产品介绍的片段却无法提供直接的对比证据LLM就只能基于这些碎片信息“脑补”导致答案可能不准确或缺乏依据。2.2 多跳推理与信息分散难题当问题需要多步推理时传统RAG几乎束手无策。比如“张三在2023年发表的论文中引用了李四的哪个理论而这个理论后来被王五在哪个会议上质疑了” 这是一个典型的三跳查询1) 找到张三2023年的论文2) 从论文中找出引用的李四的理论3) 找到王五质疑该理论的会议记录。基于原始问题的单次向量检索很可能直接返回一些关于“张三”、“李四理论”或“学术批评”的泛泛之谈根本无法精准串联起这条证据链。这需要系统能理解问题的逻辑结构并分步执行定向检索。2.3 对动态、实时或结构化数据的无力传统RAG的索引通常是离线的、批处理的。数据一旦被切片向量化存入数据库就变成了静态的快照。如果用户问题涉及实时信息如“今天某支股票的价格”、需要复杂计算如“根据过去三个月销售数据预测下季度趋势”或需要查询高度结构化的数据库如“找出所有年龄大于30岁且购买过产品A的用户”单纯的向量检索就完全失效了。它无法执行SQL查询也无法调用实时API。2.4 检索结果冲突与噪声干扰在实践里我们经常遇到检索回来多个片段彼此矛盾或者包含大量噪声的情况。比如关于某个软件配置参数文档的不同版本可能有不同说法。基于相似度的检索只是把“最像”的Top-K个片段扔给LLMLLM需要自行判断孰是孰非这增加了幻觉风险。一个更智能的系统应该在检索阶段就进行初步的逻辑校验和冲突检测。注意这里常有一个误区认为只要用更强大的Embedding模型如text-embedding-3-large或者混合检索Hybrid Search结合BM25和向量就能解决所有问题。它们确实能提升单次检索的召回率但无法从根本上解决逻辑推理、多步查询和动态数据获取的核心矛盾。这好比给一辆马车换上更好的轮子但它依然跑不过汽车。我们需要的是引擎的升级。3. Agentic RAG的核心LLM作为检索的“大脑”那么如何升级引擎答案是将LLM从流程末端推到前端让它成为检索过程的“指挥官”或“大脑”。这就是Agentic RAG的核心思想将检索任务构建成一个由LLM驱动的、可规划、可执行、可反思的智能体Agent工作流。3.1 智能体的基本构成感知、规划、行动、反思一个典型的Agentic RAG系统其内部运作遵循一个循环或链式流程感知PerceptionLLM深度解析用户查询。这不仅仅是提取关键词而是理解其意图、实体、约束条件和隐含的逻辑关系。例如对于“对比A和B”LLM需要识别出这是一个对比型查询主体是A和B并可能隐含了对比的维度如成本、性能。规划Planning基于对查询的理解LLM规划出达成目标所需的步骤序列。这可能包括问题分解将复杂问题拆解为一系列更简单、可独立检索的子问题。工具选择为每个子问题分配合适的工具。工具不限于向量检索还包括关键词搜索用于精确匹配名称、代码、SQL查询用于结构化数据、API调用用于实时信息、甚至计算器。策略制定决定检索的查询词。LLM可能会为向量检索生成一个更优化、更全面的查询改写Query Rewriting例如将“预算紧张选哪个云服务器”改写成“AWS t3.micro 成本 价格 规格 与 阿里云 ecs.g6.low 对比 性价比”。行动ActionLLM按照规划通过预定义的接口如LangChain的Tools、LlamaIndex的Query Engines调用相应的工具执行检索或计算并获取结果。反思ReflectionLLM评估上一步行动的结果。是否已回答了子问题信息是否充足、可靠是否存在矛盾如果不够它可能会迭代调整查询词重新检索或者基于已获得的信息提出一个新的、更精准的子问题。这个过程可能循环多次直到收集到令人满意的证据集合。3.2 逻辑检索的具体体现在这个框架下“逻辑检索”体现在多个层面查询理解与分解的逻辑LLM运用其常识和推理能力理解“为什么”、“如何”这类问题并将其分解为“是什么”、“在哪里”等可检索的事实性问题。检索路径的逻辑检索不再是并行的、一次性的而是串行的、有依赖关系的。第二步检索的查询词可能依赖于第一步检索的结果。例如先检索到“张三2023年的论文标题”再用这个标题去检索其全文内容。结果验证与合成的逻辑LLM在检索过程中就对中间结果进行初步校验比如检查时间是否吻合、来源是否权威、多个来源的信息是否一致。这相当于在检索阶段就植入了一层事实核查减轻了最终生成阶段的幻觉压力。3.3 与传统RAG架构的对比为了更直观地理解我们可以用一个表格来对比两种范式特性传统RAG (Embedding-Driven)Agentic RAG (LLM-Driven Logical Retrieval)核心驱动力查询与文档的向量相似度LLM对任务的理解、规划和推理能力检索模式单次、并行、静态多次、串行/有向无环图、动态检索单元固定的文档切片Chunk可变的查询目标可能是Chunk也可能是数据库记录、API结果工具使用主要或仅使用向量检索器灵活使用多种工具向量检索、关键词搜索、SQL查询、API、计算器等处理逻辑模式匹配任务分解、条件判断、循环迭代适用场景事实性问答、简单总结复杂推理、多跳问答、数据分析和综合建议开发者重心文档预处理、Embedding模型调优、提示工程智能体工作流设计、工具封装、任务规划与验证逻辑实操心得开始设计Agentic RAG时最容易犯的错误是“过度设计”试图让LLM规划所有事情。实际上很多任务的规划路径是相对固定的。我们的经验是先为最常见的几类复杂查询如对比、多跳推理、计算设计好预定义的、模块化的工作流模板。LLM的角色首先是“分类器”判断用户问题属于哪一类模板然后按模板执行。只有在模板无法处理时才尝试让LLM进行更自由的规划。这大大提高了系统的稳定性和可控性。4. 构建LLM驱动的逻辑检索系统关键组件与实操理论说完了我们来点硬的。如何动手搭建一个这样的系统这里我以基于LangChain和LlamaIndex这两个流行框架的混合思路为例拆解核心组件和步骤。请注意这只是一个参考架构你需要根据自身的数据源和业务需求进行调整。4.1 系统核心组件设计一个基本的LLM驱动逻辑检索系统包含以下核心层Orchestrator (协调器/智能体)这是系统的大脑通常由一个主LLM如GPT-4 Claude 3或本地部署的Qwen2.5-72B-Instruct担任。它负责解析用户输入、规划任务、调用工具、评估结果并组织最终答案。在LangChain中这通常通过AgentExecutor和ReAct等框架实现在LlamaIndex中则可以通过AgentRunner和自定义的QueryEngine链来构建。工具集 (Toolkit)这是系统的手和脚。你需要为智能体配备一系列它可调用的工具。至少应包括向量检索工具连接你的向量数据库Milvus, Pinecone, Weaviate等执行语义搜索。关键词检索工具连接Elasticsearch或直接使用BM25用于精确匹配术语、代码、产品型号等。结构化数据查询工具封装数据库连接能将自然语言转换为SQL并执行可利用LangChain的SQLDatabaseToolkit。API调用工具封装获取实时数据、执行计算或访问外部知识的API。计算工具简单的数学计算器。网页搜索工具在授权和合规前提下连接搜索引擎API。记忆与状态管理智能体需要记住对话历史、已执行的步骤和中间结果。这可以通过简单的对话缓冲区ConversationBufferMemory或更复杂的向量存储记忆来实现确保在多轮交互中保持上下文连贯。验证与重排模块这不是必须的但能极大提升质量。在智能体收集到所有证据片段后可以引入一个独立的“验证器”LLM可以用一个更小、更快的模型对证据的相关性、一致性和支持度进行评分和重排过滤掉噪声和矛盾信息再将最优质的证据送给生成器。4.2 实操步骤以“技术方案对比”场景为例假设我们有一个包含产品文档、技术白皮书和客户案例的内部知识库用户想对比“使用Kubernetes自建微服务”和“采用某云厂商的Serverless服务”的优劣。步骤1定义工具首先我们封装好必要的工具。假设知识库已向量化并存入Milvus。# 伪代码示例 (基于 LangChain) from langchain.tools import Tool from langchain.vectorstores import Milvus from langchain.embeddings import HuggingFaceEmbeddings # 1. 向量检索工具 vector_store Milvus(embedding_functionHuggingFaceEmbeddings(...), connection_args{...}) vector_retriever vector_store.as_retriever(search_kwargs{k: 5}) def vector_search(query: str) - str: docs vector_retriever.get_relevant_documents(query) return \n\n.join([doc.page_content for doc in docs]) vector_tool Tool(nameTechnical_Doc_Semantic_Search, funcvector_search, descriptionUseful for searching technical documentation and whitepapers based on meaning.) # 2. 关键词检索工具 (例如使用Elasticsearch) from elasticsearch import Elasticsearch es_client Elasticsearch(...) def keyword_search(query: str) - str: # 构建ES查询精确匹配产品名、特性名等 response es_client.search(indextech_docs, body{query: {match: {content: query}}}) # ... 处理结果 return formatted_results keyword_tool Tool(nameProduct_Feature_Keyword_Search, funckeyword_search, descriptionUseful for finding exact matches of product names, feature names, or error codes.) # 3. 成本计算API工具 (假设) def calculate_cost(resource_type, config, duration): # 调用内部成本计算API或使用公式 cost api_call(resource_type, config, duration) return fEstimated cost for {resource_type} with config {config} over {duration}: ${cost} cost_tool Tool(nameCost_Calculator, funccalculate_cost, descriptionUseful for calculating estimated costs for infrastructure resources.)步骤2构建智能体工作流我们使用LangChain的ReAct框架来构建一个能使用上述工具的智能体。from langchain.agents import initialize_agent, AgentType from langchain.llms import OpenAI # 或 ChatOpenAI, 或其他兼容LLM from langchain.memory import ConversationBufferMemory llm OpenAI(temperature0, model_namegpt-4) # 使用推理能力强的模型 memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) tools [vector_tool, keyword_tool, cost_tool] agent initialize_agent( tools, llm, agentAgentType.ZERO_SHOT_REACT_DESCRIPTION, # 或使用更强大的OPENAI_FUNCTIONS verboseTrue, # 开启详细日志方便调试 memorymemory, handle_parsing_errorsTrue # 重要处理解析错误 )步骤3设计提示词与任务规划智能体的强大与否很大程度上取决于给它的系统提示词System Prompt。我们需要在提示词中明确它的角色、能力和任务规划逻辑。system_prompt 你是一个资深技术架构师助手擅长通过分析内部知识库来对比不同技术方案的优劣。 你的工作流程如下 1. **理解与分析**仔细分析用户的问题识别出需要对比的实体如A和B以及用户关心的对比维度如成本、性能、复杂度、维护性。 2. **规划与分解**将对比问题分解为一系列子任务。例如 - 子任务1分别检索实体A和实体B的核心定义、特性和适用场景。 - 子任务2针对“成本”维度检索A和B的定价模型、资源消耗数据或使用工具进行成本估算。 - 子任务3针对“性能”维度检索基准测试报告或相关性能指标。 - 子任务4检索关于A和B的运维复杂度、学习曲线等资料。 3. **执行与收集**使用你手头的工具按顺序执行这些子任务。优先使用Technical_Doc_Semantic_Search进行宽泛的技术概念搜索使用Product_Feature_Keyword_Search进行精确的产品特性查找使用Cost_Calculator进行成本估算。 4. **综合与报告**收集所有相关信息后以结构化的方式如表格总结A和B在各个维度上的优劣并基于已知信息给出客观的建议。如果信息不足请明确指出哪些方面缺乏数据。 记住每次使用工具后仔细阅读返回的结果判断是否解决了当前子任务是否需要进一步检索或调整查询词。 # 在实际使用中可以将system_prompt通过LLM的接口传入或者作为对话的初始消息。当用户提问“对比自建K8s和云Serverless的优劣”时智能体可能会产生如下思考链通过verbose日志可以看到Thought: 用户需要对比两个技术方案自建KubernetesA和云Serverless服务B。我需要从成本、性能、复杂度等维度分析。首先我需要了解两者的基本定义和核心特性。 Action: 使用Technical_Doc_Semantic_Search查询词为“自建 Kubernetes 微服务 架构 特点 优势 劣势”。 Observation: [返回关于K8s自主可控、灵活但运维复杂等内容的文档片段]。 Thought: 我获得了A的信息。现在需要B的信息。 Action: 使用Technical_Doc_Semantic_Search查询词为“云 Serverless 服务 特点 优势 劣势 无服务器”。 Observation: [返回关于Serverless免运维、按需付费、冷启动等内容的片段]。 Thought: 现在需要对比成本。这需要具体数据。我先搜索定价信息。 Action: 使用Product_Feature_Keyword_Search查询词为“Kubernetes 集群 节点 定价”。 Observation: [返回某云厂商K8s托管服务的定价页面摘要]。 Thought: 这不是自建成本。自建成本涉及硬件、人力等。我需要换个问法。同时Serverless的成本模型不同。 Action: 使用Cost_Calculator工具计算运行一个中等规模应用在自建K8s假设配置和典型Serverless平台上一年的预估成本。 Observation: [工具返回两个数字]。 Thought: 我有了成本数据。接下来是性能和复杂度... 后续继续规划并执行检索步骤4结果生成与后处理智能体完成所有规划步骤并收集证据后会调用LLM的生成能力将证据综合成最终答案。为了提高质量我们可以在最终生成前加入一个“重排与验证”步骤# 伪代码简单的验证器 def validate_and_rerank(evidence_chunks, original_query): validation_prompt f 给定用户问题{original_query} 以及以下检索到的文本片段 {evidence_chunks} 请评估每个片段对于回答问题的相关性和重要性1-5分并过滤掉完全不相关或可信度极低的片段。只输出最重要的3-5个片段的索引和分数。 # 调用一个快速、便宜的LLM如gpt-3.5-turbo进行评估 validated_chunks call_fast_llm(validation_prompt) return validated_chunks # 在智能体输出最终答案前先对收集的所有证据进行验证和过滤 final_evidence validate_and_rerank(all_retrieved_chunks, user_query) final_answer agent.run(f基于以下已验证信息{final_evidence}请综合回答用户问题{user_query})5. 实战中的挑战与优化策略理想很丰满但现实很骨感。在实际构建和运营LLM驱动的逻辑检索系统时我们遇到了不少挑战也总结出一些优化策略。5.1 挑战一规划错误与无限循环智能体可能会做出错误的规划比如在一个无关的子问题上陷入死循环或者提出的查询词过于模糊导致检索无效。应对策略设置最大迭代次数在AgentExecutor中严格限制max_iterations例如10-15次防止无限循环消耗资源。细化工具描述为每个工具编写清晰、具体的description说明其精确的用途、输入格式和输出示例。这是引导LLM正确使用工具的关键。提供少量示例Few-Shot在系统提示词中提供1-2个规划成功的完整示例Thought/Action/Observation循环让LLM有样学样。后置规划验证对于关键任务可以引入一个“规划审核”步骤。让另一个LLM或同一LLM对生成的规划进行评估判断其合理性后再执行。5.2 挑战二工具调用成本与延迟每次工具调用都涉及LLM生成、网络IO调用API或查询数据库可能导致响应变慢尤其是涉及多轮迭代时。使用GPT-4等昂贵模型成本也会飙升。应对策略本地化与缓存使用性能优秀的本地Embedding模型如BGE、GTE避免调用远程API。对LLM进行本地部署使用Qwen、Llama等开源模型虽然单次推理可能稍慢但消除了网络延迟且长期成本可控。对常见的检索结果尤其是来自稳定知识库的进行缓存避免重复查询。分层模型策略让一个较小、较快的模型如Qwen2.5-7B负责简单的工具调用规划和结果初步整理只让大模型如Qwen2.5-72B负责最复杂的最终综合与生成。异步执行如果子任务之间没有强依赖关系可以尝试并行执行减少总体延迟。5.3 挑战三检索质量的不稳定性即使规划正确底层检索工具尤其是向量检索返回的结果质量也可能波动导致智能体基于噪声信息进行推理产生“垃圾进垃圾出”的问题。应对策略混合检索与重排序在工具层面向量检索工具内部就采用混合检索Hybrid Search结合语义和关键词分数。返回更多结果如Top-10然后使用一个交叉编码器Cross-Encoder重排模型如bge-reranker对结果进行精排只将最相关的3-5个片段交给智能体。这能显著提升输入信息的质量。动态分块与索引优化反思文档预处理流程。对于技术文档尝试按章节、按主题进行智能分块而不是简单的固定长度滑动窗口。为不同的块类型概述、参数详情、代码示例、故障排除添加元数据标签让智能体在规划时能指定检索的块类型。工具结果的后处理在工具函数内部对原始检索结果进行清洗、去重和摘要只返回最精华的信息减少LLM需要处理的文本量。5.4 挑战四评估与调试困难传统RAG的评估相对直接检索召回率、答案准确性。但Agentic系统的评估更复杂涉及规划合理性、工具使用效率、多步推理正确性等。应对策略结构化日志与追踪充分利用LangChain的LangSmith或自定义的日志系统记录下每一次LLM的Thought、Action、Observation。这是调试的黄金资料。构建端到端测试集不仅测试最终答案还要测试中间步骤。例如对于一个多跳问题检查系统是否正确地分解出了子问题以及每个子问题是否检索到了正确的证据。人工审核关键路径在初期对复杂查询的执行路径进行人工审核找出规划中的常见错误模式并据此优化提示词或工具设计。6. 典型应用场景与未来展望LLM驱动的逻辑检索并非万能但在特定场景下它能带来质的提升。6.1 最适合的应用场景复杂决策支持与对比分析如前文所述的技术选型、产品对比、方案评估。系统能自动搜集、整理、对比多方信息。深度研究与调查报告生成用户提出一个开放性问题如“分析电动汽车电池技术的最新进展及其面临的挑战”。系统可以规划检索学术论文、行业新闻、技术报告并综合成一份结构化的摘要。多步骤故障诊断与排查用户描述一个复杂的系统错误现象。智能体可以像专家一样逐步提问或自主检索获取更多上下文检索知识库中的故障树、解决方案并给出诊断步骤和建议。动态数据问答结合SQL工具和API工具回答诸如“上个月销售额最高的产品是什么它的主要客户群体是谁”这类需要联查数据库和文档的问题。个性化学习与知识探索根据用户当前的知识水平和兴趣动态规划学习路径检索难度适中的概念解释、进阶教程和实际案例。6.2 技术演进方向规划模型的专门化未来可能会出现专门为任务规划和工具调用优化的、更小更高效的“规划器”模型与大型“生成器”模型分离进一步提升效率和稳定性。工作流的可视化与可编排像LangChain和LlamaIndex这样的框架会提供更高级的可视化工作流编排界面让开发者能通过拖拽方式设计复杂的Agent逻辑降低开发门槛。更强的验证与溯源能力对智能体每一步的决策和生成的内容提供更细粒度的溯源和置信度评估让用户清楚答案是如何一步步推导出来的增强可信度。与知识图谱的深度融合将向量检索与符号化的知识图谱Ontology结合。LLM可以理解查询并将其转化为对知识图谱的查询获取精确的实体、关系和属性再结合向量检索获取相关的非结构化文本描述实现“精准关联”的检索。从我个人的实践来看从Embedding-Driven RAG转向LLM-Driven Logical Retrieval最大的改变不是某个组件的替换而是思维模式的升级。我们不再仅仅思考“如何把文档塞给模型”而是开始思考“如何让模型像专家一样主动去寻找和整合信息”。这个过程充满挑战调试一个智能体比调优一个检索器要复杂得多但当你看到它能够自主完成一个复杂的多步调研任务时那种成就感也是前所未有的。这条路还很长但无疑是让RAG真正走向“智能”的关键一步。
返回列表