智能检索新范式,让AIAgent自主决策,提升RAG效率100%!
市面上的 RAG 系统,不管叫什么名字,本质上只有两种做法:
第一种,一次性检索。把用户的 query 向量化,从语料库里捞出 Top-K 个文档片段,拼成一个大 prompt 塞给模型。GraphRAG、HippoRAG、LightRAG 都属于这一类——区别只是检索前怎么组织索引(知识图谱、层级树、还是线性图),但检索本身是一锤子买卖,模型没有第二次机会。
第二种,预定义工作流。人提前写好一套流程——先检索、再判断够不够、不够就改写 query 再检索——模型按步骤执行。IRCoT、FLARE、Self-RAG、MA-RAG 都是这个路子。看起来是多轮的,但每一步干什么、什么顺序,都是人定死的,模型只是流水线上的工人。
这两种做法有一个共同问题:模型不参与检索决策。用什么方式检索、检索几次、什么时候该停,全是人预先规定好的。模型的推理能力再强,在检索这个环节上也使不上劲。
针对这个困境,前不久中科大团队提出了一套全新的A-RAG框架,通过把检索的决策权交还给模型,RAG可以更聪明的决定应该搜怎么,怎么搜。
接下来,本文将深度解读A-RAG 是什么,以及如何把它与Milvus的混合检索能力相结合。
01
A-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 就能把全部算力用在问题推理上,而不是工具选择上。
03
Milvus 2.6 把检索决策做进了数据库
A-RAG 给 Agent 配备了两个检索工具,每次查询都需要运行时决策。Milvus 2.6 的 Full-Text Search 把这个决策从运行时移到了写入时。
具体做法是:在 Collection 里定义一个开启了enable_analyzer=True的文本字段,同时挂一个 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_analyzer=True和SPARSE_FLOAT_VECTOR两行定义的实际含义:前者告诉 Milvus“这个文本字段需要分词”,后者告诉 Milvus“把分词结果转成 BM25 稀疏向量存进来”。查询时你只需要提交原始文本,Milvus 把向量化这一步也替你做了。
04
怎么落地
Schema 定义
*核心就一件事:*建 Collection 时同时定义稠密向量、稀疏向量两个字段,并挂上 BM25 Function。
这里有一个容易忽略的细节——enable_analyzer=True只是告诉 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(uri="http://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_primary=True, auto_id=True)
schema.add_field("text", DataType.VARCHAR, max_length=2000, enable_analyzer=True)
schema.add_field("dense_vector",DataType.FLOAT_VECTOR, dim=768)
schema.add_field("sparse_vector",DataType.SPARSE_FLOAT_VECTOR) # BM25 输出字段
schema.add_field("user_id", DataType.VARCHAR, max_length=64)
schema.add_field("create_time", DataType.INT64)
# ── 2. BM25 Function(核心:text → sparse_vector 的自动映射)──
bm25_function = Function(
name="bm25",
function_type=FunctionType.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_name="dense_vector",
index_type="AUTOINDEX",
metric_type="COSINE"
)
index_params.add_index(
field_name="sparse_vector",
index_type="SPARSE_INVERTED_INDEX",
metric_type="BM25" # ⚠️ 必须是 BM25,不能写IP
)
# ── 4. 创建 Collection ────────────────────────────────────────
client.create_collection(
collection_name="arag_docs",
schema=schema,
index_params=index_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": "RRF(Reciprocal Rank Fusion)将多路检索结果按排名加权合并,无需手动调权重。",
"dense_vector": np.random.rand(768).tolist(),
"user_id": "u_002",
"create_time": 1700003000
},
]
client.insert(collection_name="arag_docs", data=data)
#等待数据刷入(生产环境可改为 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(uri="http://localhost:19530")
# 查询文本(生产环境中query_embedding 替换为真实 embedding 结果)
query_text = "向量数据库如何进行关键词检索"
query_embedding = np.random.rand(768).tolist()
# ── 语义检索:理解查询意图 ────────────────────────────────────
dense_req = AnnSearchRequest(
data=[query_embedding],
anns_field="dense_vector",
param={"metric_type": "COSINE"},
limit=10
)
# ── 关键词检索:精确匹配专有名词、版本号、型号 ─────────────────
# data 传原始文本字符串,Milvus 内部通过 BM25 Function 自动向量化
sparse_req = AnnSearchRequest(
data=[query_text],
anns_field="sparse_vector",
param={"metric_type": "BM25"},
limit=10
)
# ── 两路并发,RRF 融合排序后返回 Top 5 ────────────────────────
results = client.hybrid_search(
collection_name="arag_docs",
reqs=[dense_req, sparse_req],
ranker=RRFRanker(k=60),# k=60 是经验值,大多数场景无需调整
limit=5,
output_fields=["text", "user_id", "create_time"]
)
print(f"查询:{query_text}\n{'─'*50}")
for hit in results[0]:
print(f"Score : {hit['distance']:.4f}")
print(f"Text : {hit['entity']['text']}")
print(f"User : {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(uri="http://localhost:19530")
query_text = "向量数据库如何进行关键词检索"
query_embedding = np.random.rand(768).tolist()
dense_req = AnnSearchRequest(
data=[query_embedding],
anns_field="dense_vector",
param={"metric_type": "COSINE"},
limit=10
)
sparse_req = AnnSearchRequest(
data=[query_text],
anns_field="sparse_vector",
param={"metric_type": "BM25"},
limit=10
)
# ── 只检索 u_001 用户、指定时间之后的文档 ──────────────────────
results = client.hybrid_search(
collection_name="arag_docs",
reqs=[dense_req, sparse_req],
ranker=RRFRanker(k=60),
filter='user_id == "u_001" and create_time > 1700000000',
limit=5,
output_fields=["text", "user_id", "create_time"]
)
print(f"查询(已过滤 user_id=u_001):{query_text}\n{'─'*50}")
for hit in results[0]:
print(f"Score : {hit['distance']:.4f}")
print(f"Text : {hit['entity']['text']}")
print(f"User : {hit['entity']['user_id']} | Time: {hit['entity']['create_time']}")
print()
这三段代码,覆盖了从写入到查询的完整链路——BM25 Function 在写入时自动构建稀疏向量,hybrid_search 在查询时两路并发融合。Agent 不需要做任何检索决策,Milvus 在底层替它做完了。
最后
对于正在迷茫择业、想转行提升,或是刚入门的程序员、编程小白来说,有一个问题几乎人人都在问:未来10年,什么领域的职业发展潜力最大?
答案只有一个:人工智能(尤其是大模型方向)
当下,人工智能行业正处于爆发式增长期,其中大模型相关岗位更是供不应求,薪资待遇直接拉满——字节跳动作为AI领域的头部玩家,给硕士毕业的优质AI人才(含大模型相关方向)开出的月基础工资高达5万—6万元;即便是非“人才计划”的普通应聘者,月基础工资也能稳定在4万元左右。
再看阿里、腾讯两大互联网大厂,非“人才计划”的AI相关岗位应聘者,月基础工资也约有3万元,远超其他行业同资历岗位的薪资水平,对于程序员、小白来说,无疑是绝佳的转型和提升赛道。
如果你还不知道从何开始,我自己整理一套全网最全最细的大模型零基础教程,我也是一路自学走过来的,很清楚小白前期学习的痛楚,你要是没有方向还没有好的资源,根本学不到东西!
下面是我整理的大模型学习资源,希望能帮到你。

👇👇扫码免费领取全部内容👇👇

最后
1、大模型学习路线

2、从0到进阶大模型学习视频教程
从入门到进阶这里都有,跟着老师学习事半功倍。

3、 入门必看大模型学习书籍&文档.pdf(书面上的技术书籍确实太多了,这些是我精选出来的,还有很多不在图里)

4、 AI大模型最新行业报告
2026最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

5、面试试题/经验

【大厂 AI 岗位面经分享(107 道)】

【AI 大模型面试真题(102 道)】

【LLMs 面试真题(97 道)】

6、大模型项目实战&配套源码

适用人群

四阶段学习规划(共90天,可落地执行)
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
-
硬件选型
-
带你了解全球大模型
-
使用国产大模型服务
-
搭建 OpenAI 代理
-
热身:基于阿里云 PAI 部署 Stable Diffusion
-
在本地计算机运行大模型
-
大模型的私有化部署
-
基于 vLLM 部署大模型
-
案例:如何优雅地在阿里云私有部署开源大模型
-
部署一套开源 LLM 项目
-
内容安全
-
互联网信息服务算法备案
-
…
👇👇扫码免费领取全部内容👇👇

3、这些资料真的有用吗?
这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。
资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)