结构感知布尔检索驱动的深度研究智能体:搜索-检视-抓取策略 Search, Inspect, Fetch: Exploiting Boolean Retrieval for Deep-Research Agents
用字段化布尔检索保留网页结构,智能体检视后只抓取相关章节,更准且更省token。
前置知识
深度研究智能体的 Search–Visit 循环
Deep-research agent(如 Tongyi DeepResearch)通过 ReAct 式循环回答难题:每轮先 formulate 一个子查询,检索 top-k 网页摘要,再 visit 选中的网页,把整页内容读进上下文用于回答或生成下一个子查询。证据随迭代不断累积,与一次性检索读取(retrieve-then-read)不同。
本文的批评对象就是这种'每次 visit 整张网页'的工作流;理解它才能理解 SIEVE 改的究竟是哪一步、为什么改这一步能同时省 token 又提精度。
BM25 与稠密检索 (dense retrieval)
BM25 是基于词频 $tf$ 与逆文档频率 $idf$ 的稀疏打分函数,对查询与文档做词面匹配;稠密检索(如 BAAI/bge-base-en-v1.5、Qwen3-Embedding)把文本编码成向量,用内积或余弦相似度衡量语义相关。两者常互补:词面信号防止语义漂移,语义信号覆盖同义表达。
SIEVE 的默认排序器 $R$ 用 Reciprocal Rank Fusion 把 BM25 与 dense 融合;要读懂消融里'换不同 dense encoder'的实验,必须分清选择(selection)与排序(ranking)两件事。
Reciprocal Rank Fusion (RRF)
RRF 把多个排序器的排名融合成一个分数:$\text{RRF}(d)=\sum_{r\in R}\frac{1}{k+\text{rank}_r(d)}$,常用 $k=60$。它不依赖原始分数的尺度,因此能把 BM25 与稠密相似度的排名直接相加,是 BM25+Dense 这类混合检索的标准做法。
论文默认配置 BM25+Dense 就靠 RRF 融合;理解 RRF 才能理解为何 SIEVE 的 ranking 阶段是'可互换'(interchangeable)的——换 BM25、dense 或 fusion 都不破坏整体流程。
字段化布尔检索 (Fielded Boolean Retrieval / BQL)
用 term[field] 限定词出现在某字段(title/section/body/author/date),用 AND/OR/NOT、短语 "..."、通配符 word*、日期范围 date[RANGE] 组合约束。它决定候选集 $C_q=\{d\in D: d\models q\}$——哪些文档'有资格'被考虑,而非它们之间的优先级。
这是 SIEVE 的核心创新载体。布尔检索在医学系统评价(systematic review)里用了几十年但难写,本文的贡献正是让 LLM agent 在循环中自动构造并修订这类查询。
ReAct 智能体骨架
ReAct 让 LLM 在 Thought–Action–Observation 之间循环:模型先思考再调用工具(如 search/fetch),观察工具返回后再思考。论文沿用各 agent 自带的 ReAct scaffold,只替换'内容访问工具'及其指令,其他(系统提示、终止契约)保持不变。
理解 ReAct 才能理解为何作者强调'控制变量':三个不同 backbone(Tongyi-DR、Qwen-AgentWorld、OpenResearcher)都用同一 scaffold,差异只在工具与手册,从而能干净地归因 SIEVE 的增益。
研究动机
现有 deep-research agent 普遍采用 Search–Visit 工作流:每轮检索后,visit 选中的网页会把整张网页 $x_d=x_{d,1}\oplus\cdots\oplus x_{d,n_d}$ 全部读进上下文,即使只有一个章节相关。这和网页的真实组织方式严重错配——HTML 天然暴露 title、headings、sections、author、date、infobox 等可解析字段,但当前 agent 工作流最多在界面上'展示'这些线索,却不让 agent 用结构去同时控制检索与内容访问。结果是无关节节被反复拖入上下文:作者在 BCP-S 上观察到 BM25 Search–Visit 平均每个问题消耗 68k token、HotpotQA 20k、MuSiQue 43k,其中大量是被整页 visit 带进来的噪声。同时,单一 ranker 只能'偏好'某些属性(如某字段含某词),却无法保证每条结果都满足硬约束(如日期落在区间内、标题不含某概念)。
本文的目标是本文要让网页结构从检索一直存活到证据访问的全过程:agent 应当能 (1) 搜索网页字段以筛出'合格'的来源,(2) 检视这些来源的结构以定位相关章节,(3) 只抓取真正需要的章节而非整页。作者把这一策略命名为 search–inspect–fetch(SIEVE),希望在不损失、甚至提升准确率的前提下大幅压缩进入上下文的 token 量。具体地,他们针对 HotpotQA、MuSiQue、BROWSECOMP-Plus 三个难度递增的 QA 集合,构造 flat/structured 配对数据来干净地隔离'结构可寻址'这一变量,并用同 ranker、同 top-k 的 Search–Fetch 控制来单独检验 BQL 候选选择的价值,最终在准确率与上下文效率两个维度同时超越传统 Search–Visit。
与已有工作不同的是,本文的独特切入角度是把'经典但难用'的字段化布尔检索,嫁接到 LLM agent 的研究循环里。布尔检索在专业搜索(尤其医学系统评价 Wang et al. 2023a,b,2025,2026)里长期有用却因'需要专家手写修订'而受限;LLM agent 恰好擅长从用户问题构造组合查询、检视返回证据、并在循环中修订约束。更关键的是,作者把 BQL 候选选择、可互换 ranker、结构化结果卡、章节级 fetch 这四个传统工作流常被'坍缩'在一起的决策显式拆开,并设计零命中回退(fallback)让过紧约束可恢复——这正是连接'字段化选择'与'章节抓取'的桥梁,是已有工作(SIRA、LogicalRAG、Clarke & Smucker 2026)都没做到的。
核心方法
SIEVE 只遵循一条设计原则:网页结构必须贯穿检索到证据访问的完整交互。直觉上,如果 search 能定位到相关章节但结果列表丢弃了这信息,或后续 visit 仍返回整页,那结构就毫无用处。因此 SIEVE 把传统 Search–Visit 工作流里常被合并的四个决策显式拆开:(1) 哪些网页合格(Boolean 选择)、(2) 它们如何排序(可互换 ranker)、(3) 内容访问前 agent 看到什么(结构化结果卡)、(4) 哪些内容进入上下文(章节 fetch)。一轮交互从 BQL 查询走到有序结果卡,再到一个被选中的章节;该章节返回的证据再驱动下一轮。技术上,visit 返回完整网页,inspect 指查看结果卡,fetch 返回一个具名章节,三者共享每次 12,000-token 的动作上限。
核心创新是严格分离'选择(selection)'与'排序(ranking)'。布尔约束决定哪些来源可接受(admissible),排序决定哪些可接受的来源应被优先检视。形式上,BQL 表达式 $q$ 编译为 Lucene filter 得候选集 $C_q=\{d\in D: d\models q\}$,再用可互换 ranker 取 $L_q=\text{TopK}_{d\in C_q} R(d, q^+)$,$q^+$ 是正向查询词。默认 $R$ 把 title/body 上的 BM25 与 BAAI/bge-base-en-v1.5 的 dense 分数用 RRF 融合。关键在于:没有任何 ranker 能把被布尔过滤掉的网页重新加回来,从而保证硬约束成立;同时 ranking 保持模块化,可换纯 BM25、纯 dense 或 fusion。这和 SIRA(把答案骨架编译成加权 BM25)、LogicalRAG(多轮生成布尔但返回整页)有本质区别——SIEVE 真正把字段化选择连到了结果检视与章节抓取,让结构在四个决策点都可操作。
方法步骤详情
步骤:(1) 结构化源表示——网页 $d=(m_d, \langle(h_{d,j}, x_{d,j})\rangle)$,visit 返回拼接 $x_d$,fetch 只返回某个 $x_{d,j}$。(2) Search——agent 提交 BQL 表达式(term[field]、AND/OR/NOT、短语、word*、date[RANGE]),编译为 Lucene filter 得候选集 $C_q=\{d\in D: d\models q\}$,再用 ranker $R$ 取 top-k。(3) 回退——零命中时先返回按约束覆盖度排序的部分匹配、层内用配置 ranker;若无部分匹配则用正向词对全库做 BM25。该回退仅在零命中后触发、从不扩大非空候选集,占 36.8–53.7% 调用。(4) Inspect——top-k 渲染成紧凑结果卡,含 title、章节标题、25-token snippet、命中字段与 infobox 键。(5) Fetch——agent 请求具名章节,返回 $x_{d,j}$ 而非整页,可交替三动作直到回答或达 100 步预算。
技术新颖性
技术新颖性体现在三处。第一,把字段化候选选择与结果检视、章节抓取打通,让结构在四个决策点都'可操作',而不是只在文本里可见——这是 focused retrieval 长期目标(Callan 1994、Trotman & Sigurbjörnsson 2005)在 agent 时代的新落地。第二,给布尔检索设计了'带恢复'的工作流:零命中时先做按覆盖度排序的部分匹配,再退到 BM25 全库排序,从而既保留显式约束又避免过紧查询卡死;这把'精确选择'与'可靠恢复'做成互补对,而非替代关系。第三,把'写好布尔查询需要专家'这一历史障碍交给 LLM agent:日志显示字段限制出现在 42.8–69.1% 的问题里、布尔组合出现在 34.1–44.1%,证明 agent 确实在用 BQL 的表达力。此外作者还用附录 C.4 的 Indri-style 执行器对照(同样保留结果卡与章节 fetch),证明增益来自 BQL 工作流本身而非某个查询语言实现。
实验结果
Table 1 给出全貌。对比各集合最强 Search–Visit,SIEVE 默认 BM25+Dense 在 HotpotQA 43.7→45.3(+1.6)、MuSiQue 26.1→29.2(+3.1)、BCP-S 36.5→37.2(+0.7),token 分别少 30.4%、50.6%、20.7%;BCP-S 上 judge 与 EM 双双提升(+2.5、+3.4)。Figure 3 显示这是全集性偏移:约 2/3 的 BCP-S 问题更省 token,增益集中在省 token 一侧。与同 section-fetch、同 ranker 的 Search–Fetch 对照,SIEVE 在全部 9 个 ranker×集合对上都更准,证明增益来自 BQL 选择而非某个 ranker。组件消融:去 25-token snippet 掉 2.9–6.8 点;去零命中回退 BCP-S 掉 6.4 点,证明回退是布尔设计的必要组成。失败分析显示 BCP-S 42.7–46.5% 是检索失败、Wikipedia 48.2–60.1% 是综合失败。
查看结构化数据
| 任务 | 指标 | 本文 | 基线 | 提升 |
|---|---|---|---|---|
| HotpotQA 多跳问答 | Exact Match (%) | SIEVE (BQL-filtered BM25+Dense) 45.3 | 最强 Search–Visit (BM25) 43.7 | +1.6 点,token 从 20k 降到 14k(-30.4%) |
| MuSiQue 复杂多跳问答 | Exact Match (%) | SIEVE (BQL-filtered BM25+Dense) 29.2 | 最强 Search–Visit (BM25) 26.1 | +3.1 点,token 从 43k 降到 21k(-50.6%) |
| BROWSECOMP-Plus-Structured 深度研究 | LLM-judge Accuracy (%) | SIEVE (BQL-filtered BM25+Dense) 37.2 | 最强 Search–Visit (Dense) 36.5 | +0.7 点(相对 BM25 Search–Visit +2.5),token 从 58k 降到 46k(-20.7%) |
| BCP-S(EM 口径) | Exact Match (%) | SIEVE 34.5 | BM25 Search–Visit 31.1 | +3.4 点 |
| BCP-S 结构化执行器对照 | Judge Accuracy (%) | SIEVE 37.2 | Indri+dense 32.3 | +4.9 点,recall 56.6 vs 48.9 |
| Snippet 消融(三集合平均) | Accuracy (points) | SIEVE 含 snippet | SIEVE 去 snippet | +2.9(HotpotQA)/+4.3(MuSiQue)/+6.8(BCP-S) |
局限与改进
作者承认:综合比较只用一个主 backbone(Tongyi-DeepResearch-30B-A3B)与三个 QA 集合,向 Qwen-AgentWorld、OpenResearcher 的迁移虽覆盖三集合但不足以推广到其他 agent、领域或真实网页搜索;Wikipedia 条件下 judge overlay 不完整,故用 exact match 作主指标。实验并非完全对称:查询语言系统拿到条件专属手册、答案恢复对部分单元不完整、context 早停规则中途引入。BCP-S 章节树由 gpt-5.5-nano 一次性生成(虽经确定性过程施加边界、不重写文本),标题/边界可能不准;Wikipedia 按标题匹配更新快照却未做内容核对。零命中 BQL 用近似 BM25(与 Lucene top-5 Jaccard 仅 0.546),故 SIEVE 是'带恢复的布尔工作流'而非纯 Lucene 系统。我的观察:SIEVE 联合改了候选选择、结果卡、内容访问三件事,控制实验未完全交叉每个交互组合,证据支持的是完整系统而非每个算子的独立效应。
独立分析的弱点
第一,过紧约束会误伤相关来源:agent 若把 AND 堆叠过多(手册警告'3+ 子句通常过指定而零命中')就可能排除本该考虑的网页;改进方向是把 BQL 写作做成有反馈的约束学习,让 agent 从零命中/部分命中里学会何时松绑。第二,回退路径的近似 BM25 与主 Lucene 排序器分歧显著(top-5 Jaccard 0.546),而回退占 36.8–53.7% 调用;改进方向是用 Lucene 原生 BM25 重写回退或引入 dense 回退缩小分歧。第三,BCP-S 章节化依赖单次 LLM 调用,存在退化长尾(最差一个标题在 83 个章节里重复、3.5% 网页有重复标题);改进方向是用多模型投票或基于 DOM 的确定性分割。第四,领域局限于 factoid QA,未检验检索式摘要、长报告生成等更开放任务;改进方向是把 search–inspect–fetch 迁移到 summarization/long-form QA。第五,未在真实网页(噪声解析、反爬、动态内容)上验证;改进方向是接入 live web search 评估字段解析鲁棒性。
未来方向
作者明确点出三个方向:(1) 把'保留源组织'推广为 deep-research 检索的一般原则——不要把网页拍平,而让 agent 在原始粒度上访问信息;(2) 把历史上需要专家的布尔检索能力交给 LLM agent 在研究循环中自动完成,使其对通用 deep-research 系统实用;(3) 针对不同集合的瓶颈分别发力——BCP-S 主要是检索失败(42.7–46.5%),需要更好的检索;HotpotQA/MuSiQue 主要是综合失败(48.2–60.1%),需要更好的证据抽取与推理。基于成果可延伸的方向:把 BQL 与 query-focused snippet 扩展到多模态网页(图、表、视频章节)、把零命中回退替换为学习型约束松弛器、把字段化选择与 RAG 的 chunk 粒度选择统一、以及在 agent 训练阶段把'何时用字段约束、何时用 dense'作为可学习的工具使用策略。
复现评估
复现友好度较高。代码以 SkimSearchAgent 库开源(github.com/ielab/skim-search-agent),含 BQL 执行器、search/fetch 工具、集合构建器与评测脚手架。数据基于公开 benchmark:HotpotQA、MuSiQue、browsecomp-plus(100,195 网页 + 830 题),并构造 flat/structured 配对集合以干净隔离'结构可寻址'变量;附录详述 BCP-S 字段解析与一次性章节化、Wikipedia 标题匹配流程,并附 section-quality 审计。三个 agent backbone 均用 vLLM 本地服务,temperature 0.6、seed 42、最大 100 步、每次 search 返回 k=5、visit/fetch 各 12,000-token 上限,统计用配对检验加 Bonferroni 校正。主要门槛是算力:完整对比并叠加消融需可观 GPU 时;context 早停与答案恢复 overlay 的不对称会限制部分跨组比较,复现时需按附录仔细对齐。
论文图表
堆叠条形图按集合×方法(Search–Visit vs SIEVE)展示四类结果占比。SIEVE 在每个集合都减少 selection 失败;BCP-S 上 retrieval 失败占 42.7–46.5%,Wikipedia 上 synthesis 失败占 48.2–60.1%。
定位不同集合的瓶颈:BCP-S 要补检索,Wikipedia 要补综合推理,从而指明后续改进的差异化方向。