A-RAG 解读:能做好混合检索策略的RAG,才是真 Agentic RAG
市面上的 RAG 系统不管叫什么名字本质上只有两种做法第一种一次性检索。把用户的 query 向量化从语料库里捞出 Top-K 个文档片段拼成一个大 prompt 塞给模型。GraphRAG、HippoRAG、LightRAG 都属于这一类——区别只是检索前怎么组织索引知识图谱、层级树、还是线性图但检索本身是一锤子买卖模型没有第二次机会。第二种预定义工作流。人提前写好一套流程——先检索、再判断够不够、不够就改写 query 再检索——模型按步骤执行。IRCoT、FLARE、Self-RAG、MA-RAG 都是这个路子。看起来是多轮的但每一步干什么、什么顺序都是人定死的模型只是流水线上的工人。这两种做法有一个共同问题模型不参与检索决策。用什么方式检索、检索几次、什么时候该停全是人预先规定好的。模型的推理能力再强在检索这个环节上也使不上劲。针对这个困境前不久中科大团队提出了一套全新的A-RAG框架通过把检索的决策权交还给模型RAG可以更聪明的决定应该搜怎么怎么搜。接下来本文将深度解读A-RAG 是什么以及如何把它与Milvus的混合检索能力相结合。01A-RAG 是什么A-RAG 论文中作者定义真正的 Agentic RAG 需要同时满足三个条件自主策略选择Autonomous Strategy迭代执行Iterative Execution交错式工具调用Interleaved Tool Use现有方法最多满足其中一两个A-RAG 是唯一三个全满足的。具体怎么做A-RAG 给 Agent 暴露三个不同粒度的检索接口keyword_search关键词精确匹配。不建倒排索引查询时直接对语料做文本匹配返回命中的句子片段和所在 chunk 的 ID。适合查专有名词、型号、人名这类精确实体。semantic_search语义向量检索。把 query 编码成向量和预先计算好的句子级 embedding 做余弦相似度匹配返回语义最相关的句子片段。适合理解模糊的、自然语言描述的问题。chunk_read读取完整文档块。前两个工具只返回片段摘要Agent 觉得某个 chunk 值得深入看就调这个工具读全文。没有预定义流程没有固定顺序。Agent 自己决定什么时候用哪个工具用几次什么时候停什么时候直接给答案。这三个工具覆盖了从关键词级、句子级到文档块级的三层信息粒度论文把它叫做层级检索接口Hierarchical Retrieval Interfaces——Agent 可以先粗筛再精读也可以直接精确命中完全取决于问题本身的特征。02实验结果说明了什么在 HotpotQA、2WikiMultiHopQA、MuSiQue 等多跳问答基准上A-RAG 全面超过 GraphRAG、HippoRAG2 和各类 Workflow RAG 方法。在 MuSiQue 这类需要跨段落多步跳转的难题上A-RAG 对最优基线的领先幅度超过 10 个百分点。但分数不是重点重点是 Agent 的行为。论文做了消融实验单独去掉 keyword_search准确率明显下滑单独去掉 semantic_search下滑幅度更大。两个工具都在起作用但分工不同——Agent 碰到精确实体时会主动选 keyword_search碰到模糊描述时走 semantic_search。没人教它这么做是模型自己根据问题特征选的。真正值得关注的是上下文效率。只给 Agent 一个 embedding 检索工具A-RAG Naive它平均要消耗 56,360 个 token 才能回答 MuSiQue 的问题给齐三个工具A-RAG Full降到 5,663 个 token准确率反而更高。工具越丰富Agent 检索得越少越准。不是因为它更懒而是因为它能直接用对的方式找到对的东西不再需要靠反复撒网来弥补单一工具的盲区。但A-RAG 的代价是显性的每次查询Agent 都要先推理一轮该用哪个工具这个决策本身在消耗 token 和响应时间。如果检索融合能在数据库层完成Agent 就能把全部算力用在问题推理上而不是工具选择上。03Milvus 2.6 把检索决策做进了数据库A-RAG 给 Agent 配备了两个检索工具每次查询都需要运行时决策。Milvus 2.6 的 Full-Text Search 把这个决策从运行时移到了写入时。具体做法是在 Collection 里定义一个开启了enable_analyzerTrue的文本字段同时挂一个 BM25 Function——Milvus 在写入文档时自动分词、构建关键词权重输出成一个SPARSE_FLOAT_VECTOR字段存进去。这个稀疏向量字段始终和稠密向量字段并排存在不需要 Agent 在推理时决定“要不要走关键词这条路”两条路在数据层面从写入起就都准备好了。A-RAG 的理论设计和 Milvus 2.6 的工程决策在结构上是同构的A-RAG运行时决策Milvus 2.6写入时构建keyword_search精确词汇匹配SPARSE_FLOAT_VECTOR BM25 Function自动构建关键词稀疏索引semantic_search向量相似度检索FLOAT_VECTOR稠密向量语义检索Agent 每次推理决定走哪条路hybrid_search两路并发RRF 自动融合决策过程消耗 Agent token数据库层透明完成零决策成本这个对应关系说明了一件事A-RAG 在理论层面证明了混合检索的必要性Milvus 2.6 把这个必要性变成了一个字段类型。你不再需要维护两套独立的检索系统也不需要在 Agent 的 prompt 里教它什么时候该用哪个工具——写入时定义好 schema查询时一个hybrid_search接口把两条路都走完结果融合好再返回。这也是第 04 节代码里enable_analyzerTrue和SPARSE_FLOAT_VECTOR两行定义的实际含义前者告诉 Milvus“这个文本字段需要分词”后者告诉 Milvus“把分词结果转成 BM25 稀疏向量存进来”。查询时你只需要提交原始文本Milvus 把向量化这一步也替你做了。04怎么落地Schema 定义*核心就一件事*建 Collection 时同时定义稠密向量、稀疏向量两个字段并挂上 BM25 Function。这里有一个容易忽略的细节——enable_analyzerTrue只是告诉 Milvus 这个文本字段需要分词真正把分词结果转成 BM25 稀疏向量的是schema.add_function()这一步。少了这一步sparse_vector字段在写入时永远是空的关键词检索会静默失败不报错只是什么都查不到。写入数据时sparse_vector字段无需手动提供Milvus 在写入时自动完成 text →分词 → BM25 权重 → 稀疏向量的完整链路。from pymilvus import MilvusClient, DataType, Function, FunctionType import numpy as np import time client MilvusClient(urihttp://localhost:19530) # 若 Collection 已存在先清除方便重复运行 if client.has_collection(arag_docs): client.drop_collection(arag_docs) # ── 1. Schema 定义 ────────────────────────────────────────── schema client.create_schema() schema.add_field(id,DataType.INT64,is_primaryTrue, auto_idTrue) schema.add_field(text, DataType.VARCHAR, max_length2000, enable_analyzerTrue) schema.add_field(dense_vector,DataType.FLOAT_VECTOR, dim768) schema.add_field(sparse_vector,DataType.SPARSE_FLOAT_VECTOR) # BM25 输出字段 schema.add_field(user_id, DataType.VARCHAR, max_length64) schema.add_field(create_time, DataType.INT64) # ── 2. BM25 Function核心text → sparse_vector 的自动映射── bm25_function Function( namebm25, function_typeFunctionType.BM25, input_field_names[text], # 从 text 字段读原文 output_field_names[sparse_vector] # 自动写入稀疏向量字段 ) schema.add_function(bm25_function) # ── 3. 索引定义 ─────────────────────────────────────────────── index_params client.prepare_index_params() index_params.add_index( field_namedense_vector, index_typeAUTOINDEX, metric_typeCOSINE ) index_params.add_index( field_namesparse_vector, index_typeSPARSE_INVERTED_INDEX, metric_typeBM25 # ⚠️ 必须是 BM25不能写IP ) # ── 4. 创建 Collection ──────────────────────────────────────── client.create_collection( collection_namearag_docs, schemaschema, index_paramsindex_params ) # ── 5. 写入测试数据 ────────────────────────────────────────── # 生产环境中 dense_vector 替换为真实 embedding如 sentence-transformers 输出 # sparse_vector 字段无需手动提供BM25 Function 在写入时自动生成 data [ { text: Milvus 是一个高性能云原生向量数据库支持十亿级向量的毫秒级检索。, dense_vector: np.random.rand(768).tolist(), user_id: u_001, create_time: 1700000100 }, { text: A-RAG 通过层级检索接口让 LLM 在keyword_search 和 semantic_search 之间自主决策。, dense_vector: np.random.rand(768).tolist(), user_id: u_001, create_time: 1700001000 }, { text: BM25 是一种经典的关键词检索算法擅长精确匹配型号、版本号等专有名词。, dense_vector: np.random.rand(768).tolist(), user_id: u_002, create_time: 1700002000 }, { text: RRFReciprocal Rank Fusion将多路检索结果按排名加权合并无需手动调权重。, dense_vector: np.random.rand(768).tolist(), user_id: u_002, create_time: 1700003000 }, ] client.insert(collection_namearag_docs, datadata) #等待数据刷入生产环境可改为 flush wait_for_loading time.sleep(2) print(✅ Collection 创建完成数据写入就绪。)Hybrid Search 无 Filter两路检索同时发出RRF 自动融合一个接口搞定。sparse_req的data传的是原始文本字符串不是向量——Milvus 内部会调用写入时定义的同一套 BM25 Function 完成查询向量化。这和dense_req需要你自己传 embedding 是不同的稠密向量这边模型的选择768 维还是 1536 维、归一化方式都由你控制稀疏向量这边Milvus 全权接管。from pymilvus import MilvusClient, AnnSearchRequest, RRFRanker import numpy as np client MilvusClient(urihttp://localhost:19530) # 查询文本生产环境中query_embedding 替换为真实 embedding 结果 query_text 向量数据库如何进行关键词检索 query_embedding np.random.rand(768).tolist() # ── 语义检索理解查询意图 ──────────────────────────────────── dense_req AnnSearchRequest( data[query_embedding], anns_fielddense_vector, param{metric_type: COSINE}, limit10 ) # ── 关键词检索精确匹配专有名词、版本号、型号 ───────────────── # data 传原始文本字符串Milvus 内部通过 BM25 Function 自动向量化 sparse_req AnnSearchRequest( data[query_text], anns_fieldsparse_vector, param{metric_type: BM25}, limit10 ) # ── 两路并发RRF 融合排序后返回 Top 5 ──────────────────────── results client.hybrid_search( collection_namearag_docs, reqs[dense_req, sparse_req], rankerRRFRanker(k60),# k60 是经验值大多数场景无需调整 limit5, output_fields[text, user_id, create_time] ) print(f查询{query_text}\n{─*50}) for hit in results[0]: print(fScore : {hit[distance]:.4f}) print(fText : {hit[entity][text]}) print(fUser : {hit[entity][user_id]}| Time: {hit[entity][create_time]}) print()Hybrid Search 带 Filter生产环境里通常还需要元数据过滤——比如多租户场景下只检索当前用户的文档或者只检索特定时间范围内的内容。加一个filter参数不影响两路向量检索的并发执行。Milvus 的执行顺序是先做向量检索召回候选集再对候选集做标量过滤——不是全量扫描所以加 filter 不会拖慢检索性能。from pymilvus import MilvusClient, AnnSearchRequest, RRFRanker import numpy as np client MilvusClient(urihttp://localhost:19530) query_text 向量数据库如何进行关键词检索 query_embedding np.random.rand(768).tolist() dense_req AnnSearchRequest( data[query_embedding], anns_fielddense_vector, param{metric_type: COSINE}, limit10 ) sparse_req AnnSearchRequest( data[query_text], anns_fieldsparse_vector, param{metric_type: BM25}, limit10 ) # ── 只检索 u_001 用户、指定时间之后的文档 ────────────────────── results client.hybrid_search( collection_namearag_docs, reqs[dense_req, sparse_req], rankerRRFRanker(k60), filteruser_id u_001 and create_time 1700000000, limit5, output_fields[text, user_id, create_time] ) print(f查询已过滤 user_idu_001{query_text}\n{─*50}) for hit in results[0]: print(fScore : {hit[distance]:.4f}) print(fText : {hit[entity][text]}) print(fUser : {hit[entity][user_id]} | Time: {hit[entity][create_time]}) print()这三段代码覆盖了从写入到查询的完整链路——BM25 Function 在写入时自动构建稀疏向量hybrid_search 在查询时两路并发融合。Agent 不需要做任何检索决策Milvus 在底层替它做完了。05尾声语义检索理解意思、关键词匹配精确命中各有各的死角——A-RAG 的答案是让模型自己决定走哪条Milvus 2.6 的答案是两条路同时跑、数据库层融好再返回。前者每次查询多花一轮 Agent 推理后者在写入时就把准备工作做完了。解法不同指向同一件事单走一条路不够用。学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2545110.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!