A-RAG 解读:能做好混合检索策略的RAG,才是真 Agentic RAG

news2026/5/4 19:23:26
市面上的 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…