微信扫码
添加专属顾问
前言
经典RAG应用的范式与架构已经非常流行,我们可以在很短的时间内借助成熟框架开发一个简单能用的RAG应用。在【RAG实战篇系列】文章中,风叔也介绍了一个最最基本的Naive RAG系统,以及优化RAG系统的十八般武器。
但是,实际应用场景要远比理论中复杂。以企业级应用场景为例,企业内部有大量不同来源与类型的文档,比如word、pdf等非结构化数据,以及mysql数据库这种结构化数据。
假设,我们现在需要在这些文档之上构建一个知识密集型的应用或工具,包括:
如果使用传统的RAG架构,要实现这种复杂的场景显然是不现实的。传统RAG系统在回答文档相关的事实性问题时可以表现得不错,但是实际的知识应用要更为复杂,包括推理性和总结性的各类问题。 当然我们也可以借助一些改进的RAG范式来提高应用场景的适应性,比如GraphRAG,但在一些跨文档或者需要结合工具的场景下仍然无法胜任。
这种情况下,Agentic RAG就能派上用场了。
1. Agentic RAG的概念
Agentic RAG是一种结合了AI Agent和RAG系统的方法,借助Agent的任务规划与工具能力,来协调完成对多文档的、多类型的检索问答需求。
下图可以很清晰地解释Agentic RAG的原理,读过风叔之前文章的读者应该靠接,AI Agent的四大模块分别是感知、规划、记忆和工具。在Agentic RAG模式中:
这样,通过Agent和RAG的强强联合,Agentic RAG既能准确的解析不同类型的文件,还能利用Agent强大的规划和推理能力,面对用户Query选择最合适的路由策略和处理方法,大幅提升系统面对海量文档、跨文档检索、全局提炼与总结等问题时的处理能力。
2. Agentic RAG的应用场景
Agentic RAG模式吸收了AI Agent和RAG的优点,AI Agent擅长规划、反思和执行,而RAG系统擅长本地知识的获取和检索。因此,Agentic RAG可以在很多场景下发挥价值。
企业知识管理:企业数据非常繁多,文件类型、格式、内容也千差万别。但是我们可以构建一个Agentic RAG部队,每个Agent后面都接了相应的数据源和Rag系统,专门处理不同的领域或不同部门的数据。这样,既能高效地访问和综合来自多个数据源的信息,也能打破不同部门的数据孤岛。
智能客服:传统的智能客服会先识别用户的意图,然后交给不同的Bot来跟进,当Bot也无法回答时,再转人工坐席。一套智能客服背后都要接很多个Bot,而且每个Bot都要进行特殊配置和训练,非常繁琐。通过Agentic RAG,Top Agent可以真正理解多样的用户查询意图,从而自动分配给对应的Doc Agent,从正确的源文档检索相关信息,并提供准确和个性化的响应。
设备检修:当电气设备出现设备故障时,通常都需要品牌方派遣专业的检修人员,而且需要查询很久产品手册才能定位问题所在。一个电气设备的产品手册可能少则几百页,多则数千页,故障类型也多种多样。利用Agentic RAG,就能帮助维修人员更快速地在现场定位问题,找到解决方案。
智能投研:在传统的券商部门,投研部门的每个人每周都要阅读大量的新闻和报告,进行关键信息的总结、提炼和推理,并撰写投资研究报告,非常重复而且低效。而通过Agentic Rag,我们可以针对技术、产品、行业、财务、政策等不同的领域构建专门的Doc Agent,比如财务Agent就专门负责搜索和读取目标公司或行业的财务数据,整理财务报告。最终Top Agent汇总多个Agent的输出之后,生成最终的报告
我们还能列出非常多的Agentic Rag的应用场景,这里就不一一赘述了。
3. Agentic RAG的实现
下面,我们结合源代码,介绍Agentic Rag的实现方式。
第一步,准备测试文档
首先准备三个RAG相关的测试PDF文档,其名称与路径分别保存。当然,在实际应用中,这里文档数量可以扩展到非常大:
names = ['c-rag','self-rag','kg-rag']files = ['c-rag.pdf','self-rag.pdf','kg-rag.pdf']
第二步,创建Doc Agent的函数
创建一个针对单个文档生成Doc Agent的函数,在这个函数中,将对一个文档创建两个索引与对应的RAG引擎:
针对普通事实性问题的向量索引与RAG引擎
针对更高层语义理解的总结类问题的摘要索引与RAG引擎
最后,我们把这两个引擎作为一个Agent可使用的两个tool,构建一个Doc Agent返回。
#采用chroma向量数据库chroma = chromadb.HttpClient(host="localhost", port=8000)collection = chroma.get_or_create_collection(name="agentic_rag")vector_store = ChromaVectorStore(chroma_collection=collection)#创建针对某个文档的doc_agentdef create_doc_agent(file,name):#文档拆分print(f'Starting to create doc agent for 【{name}】...\n')docs =SimpleDirectoryReader(input_files = [file]).load_data()splitter = SentenceSplitter(chunk_size=500,chunk_overlap=50)nodes = splitter.get_nodes_from_documents(docs)#创建向量索引,并做持久保存if not os.path.exists(f"./storage/{name}"):print('Creating vector index...\n')storage_context = StorageContext.from_defaults(vector_store=vector_store)vector_index = VectorStoreIndex(nodes,storage_context=storage_context)vector_index.storage_context.persist(persist_dir=f"./storage/{name}")else:print('Loading vector index...\n')storage_context = StorageContext.from_defaults(persist_dir=f"./storage/{name}",vector_store=vector_store)vector_index = load_index_from_storage(storage_context=storage_context)#创建基于向量的查询引擎query_engine = vector_index.as_query_engine(similarity_top_k=5)#创建摘要索引与对应的查询引擎summary_index = SummaryIndex(nodes)summary_engine = summary_index.as_query_engine(response_mode="tree_summarize")#将RAG引擎转化为两个toolquery_tool = QueryEngineTool.from_defaults(query_engine=query_engine,name=f'query_tool',description=f'Use if you want to query details about {name}')summary_tool = QueryEngineTool.from_defaults(query_engine=summary_engine,name=f'summary_tool',description=f'Use ONLY IF you want to get a holistic summary of the documents. DO NOT USE if you want to query some details about {name}.')#创建一个doc agentdoc_agent = **ReActAgent** .from_tools( **[query_tool,summary_tool]** ,verbose=True,system_prompt=f"""You are a specialized agent designed to answer queries about {name}.You must ALWAYS use at least one of the tools provided when answering a question; DO NOT rely on prior knowledge. DO NOT fabricate answer.""")return doc_agent
这部分代码主要目的就是把两个查询的RAG引擎包装成工具,一个是query_tool,用于回答事实性问题;一个是summary_tool,用于回答总结性问题。当然,实际情况下我们可以结合需要,构建更多类型的引擎。
最后我们构建了一个ReAct思考范式的AI Agent,并把构建的RAG tools插入。
第三步,批量创建Doc Agent
有了上面的函数后,就可以批量创建好这些文档的Doc Agent。这里把每一个文档名字和对应的Agent保存在一个dict中:
#创建不同文档的agent print('===============================================\n')print('Creating tool agents for different documents...\n')doc_agents_dict = {} for name, file in zip(names, files): doc_agent = create_doc_agent(file, name) doc_agents_dict[name] = tool_agent第四步,创建Top Agent
最后,我们需要创建一个顶层的Top Agent,这个Agent的作用是接收客户的请求问题,然后规划这个问题的查询计划,并使用工具来完成,而这里的工具就是上面创建好的多个Doc Agent:
#首先将Doc Agent进行“工具化”print('===============================================\n')print('Creating tools from doc agents...\n')all_tools = []for name in names:agent_tool = QueryEngineTool.from_defaults(#注意,Agent本身也是一种Query Engine,所以直接转为toolquery_engine=doc_agents_dict[name],#这个工具的名字name=f"tool\_{name.replace("-", "")}",#描述这个工具的作用和使用方法description=f"Use this tool if you want to answer any questions about {name}.")all_tools.append(agent_tool)#创建Top Agentprint('Creating top agent...\n')top_agent = **OpenAIAgent.** from_tools( **tools=all_tools** ,verbose=True,system_prompt="""You are an agent designed to answer queries over a set of given papers.Please always use the tools provided to answer a question.Do not rely on prior knowledge.DO NOT fabricate answer""" )
注意这里我们创建的Top Agent使用了 OpenAIAgent ,而不是ReActAgent,这也展示了这种架构的灵活性,不同Agent可以按需使用不同的推理范式。
我们通过Prompt告诉Top Agent,“请始终使用提供的工具来回答问题”,就是让Top Agent对问题进行路由。
第五步,测试
现在来简单测试这个Top Agent,并观察其执行的过程:
输入一个问题: Please introduce Retrieval Evaluator in C-RAG pattern?
==Entering Chat REPLType "exit" to exit.Human: Please introduce Retrieval Evaluator in C-RAG pattern?Added user message to memory: Please introduce Retrieval Evaluator in C-RAG pattern?== Callina Function ==Calling function: tool crag with args: {"input": "Retrieval Evaluator in C-RAG pattern")Thought: The user is asking about the "Retrieval Evaluator"in the C-RAG pattern. I need to use a tool to help me answer the question.Action: query toolAction Input: { 'input: Retrieval Evaluator in C-RAG pattern'}Observation: The retrieval evaluator in the CRAG pattern is designed to evaluate the relevance of retrieved documents to the input questi egree based on the relevance scores calculated for each question-document pair. Depending on this confidence level, the evaluator trigger actions- Correct, Incorrect, or Ambiguous. This process helps in determining whether the retrieved documents are suitable for generatinThought: I can answer without using any more tools. I'll use the user's lanquage to answerAnswer: The Retrieval Evaluator in the C-RAG pattern is responsible for evaluating the relevance of retrieved documents to the input ques e level based on relevance scores for each question-document pair, triggering actions like Correct, Incorrect, or Ambiquous. This evaluat Leved documents are appropriate for generating a responseGot output: The Retrieval Evaluator in the C-RAG pattern is responsible for evaluating the relevance of retrieved documents to the input dence level based on relevance scores for each question-document pair, triggering actions like Correct, Incorrect, or Ambiquous. This eva retrieved documents are appropriate for generating a response.
注意观察上面的Thought环节,可以看出Agent的“思考”过程:
第一,在TopAgent这一层,通过OpenAI的function calling来实现,这里的函数名tool_crag,也就是后端Doc Agent的名称。
第二,然后来到Doc Agent层,Doc Agent收到请求后,通过ReAct范式的思考过程,决定需要调用query_tool工具,也就是通过向量索引进行响应的RAG引擎。收到返回后DocAgent通过观察与推理,认为可以回答这个问题,并返回结果给Top Agent。
第三,Top Agent收到函数调用的结果后,认为无需再次进行其他函数调用,因此直接输出了结果,整个迭代过程结束。
第六步,进一步优化Agentic Rag
上面我们只用了三个文档,构建了针对它们的DocAgent。如果这里的文档数量是几十或者几百,过多的Doc Agent作为Tools塞给Top Agent进行推理选择时会带来一些问题,比如LLM产生困惑并推理错误的概率会提高,比如过多的Tools信息导致上下文过大,成本与延迟增加。
一种可行的方法是,利用RAG的思想对Tools进行检索,即只把本次输入问题语义相关的Tools(即这里的多个Doc Agent)交给Top Agent使用。
总结
相对于更适用于对少数文档进行简单查询的经典RAG应用,Agentic RAG的方法通过更具有自主能力的AI Agent来对其进行增强,具备了极大的灵活性与扩展性, 几乎可以完成任意基于知识的复杂任务:
关于Agentic RAG的介绍就先到这里。
后记
这篇文章之后,整个《RAG实战篇》系列就全部介绍完了,这个系列一共包括十篇文章,从最经典的Naive RAG开始,然后沿着RAG的主要环节,即索引、查询转换、路由、查询构建、检索召回、内容生成六大环节,依次介绍了每个环节的主要优化方案。然后,风叔又介绍了RAG系统的两座高山,GraphRAG和Agentic RAG。至此,相信大家对RAG系统已经有了更加深刻的认识,并且能够搭建一个相对完整的RAG系统。
整个RAG在学术界和工业界,依然在飞速的升级进化,后续风叔还会针对该话题,零星做一些介绍。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-07-04
大模型支持的上下文已超 1M, RAG 是不是没有意义了?
2026-07-03
RAG 检索优化策略:从命中率到答案质量的一套工程打法
2026-07-03
RAG 落地总翻车?全球赛事冠军架构,改造适配企业级生产
2026-07-01
提升 RAG 准确率全攻略 让你的 AI 知识库 真正靠谱起来!
2026-06-30
教程:如何用AutoRAG + Milvus避免RAG 与Agent 中出现串租问题
2026-06-30
知识库不是文件堆——我把RAG准确率从60%调到了92%
2026-06-30
本体论语义建设新思路,另类RAG来解决检索问题
2026-06-30
别把RAG当架构:Ontology(本体)才是Agent的业务世界
2026-04-06
2026-04-27
2026-04-23
2026-04-20
2026-04-09
2026-04-12
2026-04-22
2026-04-10
2026-05-14
2026-04-30
2026-07-04
2026-06-23
2026-06-23
2026-06-15
2026-06-10
2026-06-10
2026-05-20
2026-05-18
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。