Beyond Semantic Similarity: Rethinking Retrieval for Agentic Search via Direct Corpus Interaction
Paper: arXiv:2605.05242 Code: DCI-Agent/DCI-Agent-Lite Code reference:
main@208111d3(2026-05-09)
1. Motivation (研究动机)
现有 Search / RAG 系统通常把语料访问压缩成一个固定的 retrieval interface:先把文档切 chunk、建 BM25 / dense embedding index,再把用户或 agent 的 query 映射成 top- snippet。这个接口在传统 RAG 中高效,但在 agentic search 中会变成瓶颈:agent 需要组合稀疏线索、验证精确字符串约束、查看局部上下文、根据中间证据修正假设;如果关键证据在 top- 阶段被过滤掉,后续再强的 reasoning 也无法恢复它。
论文关心的不是“换一个更强的 embedding model”,而是重新定义 agent 与 corpus 的交互方式。作者指出,BrowseComp-Plus 这类 deep-research benchmark 经常要求 agent 先找到中间实体,再用多个弱线索交叉验证答案;retriever-mediated access 只能返回 ranked list 和短 snippet,agent 很难主动做 grep 'foo' | grep 'bar' 这种组合式过滤,也难以在命中文档后继续定位到最小可用证据片段。
这个问题值得研究,因为它把 retrieval 从一个“相似度排序模块”变成 agent 可编排的工作环境。如果 agent 可以直接对 raw corpus 使用 terminal primitives,那么 retrieval 不再是一次 top- 调用,而是多轮 search / inspect / refine / verify 的过程;这可能同时提高答案正确率、降低对离线索引的依赖,并让本地私有语料、代码库、日志、网页 dump 等异构 corpus 直接成为可搜索环境。
2. Idea (核心思想)
核心洞察:agentic search 的关键能力不是语义相似度本身,而是“可组合、可验证、可逐步缩小范围的 corpus interaction”。Direct Corpus Interaction (DCI) 让 agent 跳过 embedding model、vector index、top- retriever API,直接用 grep / rg / find / glob / read / bash / lightweight scripts 操作 raw corpus。
本文的主要创新是把 retrieval interface 从 ranked snippet list 改成 general-purpose command-line interface,并用两个实现来验证这个范式:DCI-Agent-Lite 是轻量、可控的 terminal agent;DCI-Agent-CC 是基于 Claude Code 的更强 scaffold。作者还提出 coverage 与 localization 两类 trajectory-level metrics,用来区分“是否到达 gold document”和“是否把证据定位到小片段”。
更具体地说,DCI 把 search 拆成 agent 可组合的微操作:先用 broad keyword search 扩大候选范围,再用 chained filters 合并稀疏约束,再用 local context peek 验证片段,最后把新发现的 entity / date / title 作为下一轮 query。这个过程类似人在本地代码库或文档库里查证问题,而不是把问题一次性丢给一个 black-box retriever。
与 conventional retriever 的根本差异在于:Qwen3-Embedding-8B / BM25 这类方法先决定哪些文档暴露给 agent,agent 只能在返回候选里推理;DCI 则让 agent 自己决定搜索路径,可以先 broad search,再 chain search,再局部查看上下文。它牺牲的是运行时工具调用与 latency 的可控性,换来的是更高分辨率的证据探索。
这个想法也不是简单否定 retriever。论文真正强调的是 interface bottleneck:当问题需要 exact lexical constraints、multi-hop clue conjunctions、局部文本验证时,retriever 的 similarity score 可能把“看似不相似但逻辑上必要”的证据排除在外。DCI 的贡献是把这些本来只能由检索系统内部决定的搜索动作,开放给 agent 作为可规划、可观察、可纠错的动作空间。
3. Method (方法)
3.1 Overall framework:从 retriever-mediated access 到 Direct Corpus Interaction

Figure 2 解读:左侧是传统 retriever-mediated pipeline:corpus 先被离线索引,agent 每轮只能向 retriever 提 query 并读取 top- snippets。右侧 DCI 则把 raw corpus 暴露为 CLI 工作区,agent 直接调用 bash、glob、read、grep、python 等工具。关键变化不是多了一个工具,而是证据的过滤权从 retriever scorer 转移到 agent 的多步搜索策略中。
DCI 的运行循环可以理解为三层:第一层是 corpus workspace,文档以原始文件形式存在;第二层是 terminal/file tools,提供精确匹配、正则匹配、路径导航、局部读取、轻量脚本统计;第三层是 LLM agent,它根据中间 observation 继续生成下一批 tool calls。每次 observation 都可能包含 matched lines、file paths、counts、local spans 或 metadata,而不是固定 schema 的 top- list。
直觉上,DCI 有效是因为很多 deep-search 问题并不缺“语义相似”的文档,而缺“把多个弱条件组合到一起”的操作。例如一个问题可能同时包含人物别名、时间、地点、作品名,单个 query 很难让 embedding retriever 同时满足所有约束;但 rg pipeline 可以先找候选实体,再加第二个关键词过滤,再用 sed/head/tail 查看局部上下文,最后将新实体作为下一跳 query。
3.2 DCI-Agent-Lite 与 DCI-Agent-CC
作者实例化了两个 DCI agent:
- DCI-Agent-Lite:基于 Pi coding agent 的轻量实现,released repo 中入口是
dci-agent-lite,核心 wrapper 在src/dci/benchmark/pi_rpc_runner.py。它默认只启用read,bash,用--cwd指向 corpus directory,不包含 embedding retriever、offline index 或 reranker。 - DCI-Agent-CC:基于 Claude Code 的强 scaffold。论文把它视为 DCI 的强实现,而不是另一类 retrieval method;它仍只通过 terminal tools 操作 raw corpus,只是 prompt、tool orchestration 与上下文处理更稳定。
- Controlled ablations:为了分离“DCI interface”与“unrestricted shell”的贡献,作者还测试了
read + grep这种受限工具组合;即使没有 open bash,DCI-Agent-Lite 也在 BrowseComp-Plus sample-100 上达到 61% accuracy,高于 Qwen3-Embedding-8B retrieval agent 的 45%。
def dci_agent_lite_run(question, corpus_dir, *, model="gpt-5.4-nano", level="level3"):
"""Code-grounded pseudocode from scripts/bcplus_eval/run_bcplus_eval.py and pi_rpc_runner.py."""
prompt = (
"Answer the following question. "
f"The answer is contained in the corpus directory at @{corpus_dir}. "
"Do Not use web search! Use ripgrep (rg) instead of grep for fast searching.\n\n"
f"QUESTION:\n{question}\n"
)
cmd = [
"uv", "run", "dci-agent-lite",
"--provider", "openai",
"--model", model,
"--cwd", str(corpus_dir),
"--tools", "read,bash",
"--max-turns", "300",
"--extra-arg", f"--context-management-level {level}",
"--extra-arg", "--thinking high",
prompt,
]
state = run_rpc_agent_and_record_events(cmd)
return state["final.txt"], state["events.jsonl"], state["latest_model_context.json"]3.3 Runtime Context Management

Figure 3 解读:DCI 会产生大量 tool outputs,因此 runtime 不仅要“找到证据”,还要决定哪些历史仍留在 live context 中。图中三种机制分别对应 Table 1 的 L1–L4:truncation 把单次工具结果截断;compaction 把旧 tool-result turn 清成 placeholder;summarization 在上下文压力更大时把旧历史改写为摘要。这里压缩的是 agent 的 working state,不是 corpus 本身。
论文定义 5 个 context-management levels:L0 无管理;L1 只截断,每个 tool result 上限 50K characters;L2–L4 使用 20K characters 上限;L3 在 accumulated tool-result content 超过 240K characters 后触发 compaction,并保留最近 12 turns;L4 在 compaction 后若估计 context tokens 仍超阈值,则用 model-generated summary 替换 compacted history,同时保留最近 20K tokens,并在连续 3 次 summarization failure 后停止重试。
def apply_runtime_context_management(messages, level):
"""Paper-level policy; released wrapper forwards this as --context-management-level to Pi."""
if level == "level0":
return messages
char_cap = 50_000 if level == "level1" else 20_000
for msg in messages:
if msg.role == "toolResult":
msg.text = msg.text[:char_cap]
msg.context_management = {"truncated_to_chars": char_cap}
if level in {"level3", "level4"} and total_tool_chars(messages) > 240_000:
old_tool_turns = all_tool_result_turns(messages)[:-12]
for turn in old_tool_turns:
turn.text = "[tool result cleared from conversation context]"
turn.context_management = {"status": "cleared", "keep_last": 12}
if level == "level4" and estimated_context_tokens(messages) > CONTEXT_THRESHOLD:
recent = keep_recent_tokens(messages, token_budget=20_000)
summary = summarize_compacted_history(messages, max_failures=3)
messages = [summary] + recent
return messages论文公式与 released code 实现差异:论文 Appendix A.3 写 BrowseComp-Plus / QA 的 accuracy judge 使用 GPT-4.1;released scripts/bcplus_eval/run_bcplus_eval.py 的 DEFAULT_JUDGE_MODEL 是 gpt-5.4-nano。此外,论文 Table 4 的 DCI-Agent-Lite direct interaction row 标注为 L4,而 released benchmark launch scripts(scripts/bcplus_eval/run_L3.sh、scripts/qa/*.sh、scripts/bright/*.sh)默认传入 --runtime-context-level level3。因此本文笔记把实验结论按论文表格记录,把可复现实验配置按 released code 记录。
3.4 Coverage 与 Localization:把“到达文档”和“定位证据”分开
Accuracy 只能说明答案对不对,不能解释 DCI 为什么赢。作者引入两个 trajectory-level metrics:coverage 衡量轨迹是否 surfacing gold documents;localization 衡量在已经到达 gold document 后,agent 暴露的 snippet 是否足够小、足够可用。
设 是问题 的 gold documents, 是 trajectory 中实际 surfaced 的 gold documents: Localization 先把 observation 映射成候选集合 ,其中 是暴露 snippet,。令 是固定字符段长度: 若候选 与 gold document 对齐,则: 对每个 surfaced gold document 取最大 segment score,再对 平均:
def trajectory_metrics(gold_docs, observations, c_seg):
surfaced = align_observations_to_gold_docs(observations, gold_docs)
coverage_any = int(len(surfaced) >= 1)
coverage_mean = len(surfaced) / max(1, len(gold_docs))
coverage_all = int(len(surfaced) == len(gold_docs))
def nu(chars):
return max(1, math.ceil(chars / c_seg))
def psi(a, b):
return 1.0 if b <= 1 else max(1.0 - math.log(a) / math.log(b), 0.0)
per_doc_scores = []
for doc in surfaced:
candidates = snippets_aligned_to_doc(observations, doc)
if not candidates: # path-only surfacing counts for coverage but not useful localization
candidates = [full_document_as_snippet(doc)]
per_doc_scores.append(max(psi(nu(len(s.text)), nu(len(doc.text))) for s in candidates))
localization = sum(per_doc_scores) / max(1, len(per_doc_scores))
return coverage_any, coverage_mean, coverage_all, localization3.5 Prompt / evaluation pipeline in released code
Released code 的 scripts/bcplus_eval/run_bcplus_eval.py 负责把 benchmark row 变成 prompt、启动 dci-agent-lite、收集 artifacts、用 judge 或 NDCG 评分。QA prompt 要求只用指定 corpus、禁止 web search、优先用 rg;IR prompt 进一步要求最多返回 20 个 ranked documents,并强调 recall 与 precision 都影响 NDCG。
async def evaluate_dataset(rows, args):
semaphore = asyncio.Semaphore(args.max_concurrency)
results = []
for row in rows:
async with semaphore:
prompt = build_ir_prompt(row["query"], args.corpus_dir) if args.enable_ir else \
build_benchmark_prompt(row["query"], args.corpus_dir)
output_dir = prepare_query_dir(row["query_id"])
run_cmd = build_run_command(args=args, question_text=prompt, query_output_dir=output_dir, resume_run=False)
await launch_agent(run_cmd, cwd=REPO_ROOT)
final_text = read_text(output_dir / "final.txt")
if args.enable_ir:
score = compute_ndcg_at_k(parse_retrieved_docs(final_text), set(row["gold_docs"]), k=10)
else:
score = await judge_answer_async(question=row["query"], gold_answer=row["answer"], predicted_answer=final_text)
results.append(gather_query_metrics(row, output_dir, score))
return aggregate_results(results)Code reference:
main@208111d3(2026-05-09) — pseudocode and mapping based on this commit
| Paper Concept | Source File | Key Class/Function |
|---|---|---|
| DCI-Agent-Lite CLI / RPC runner | src/dci/benchmark/pi_rpc_runner.py | build_pi_command, PiRpcClient, RunRecorder, prompt_and_wait |
| Tool set and dynamic system prompt | src/dci/benchmark/pi_system_prompt.py, prompts/system_prompt.txt | parse_tools, buildSystemPrompt, selected tools read,bash |
| BrowseComp-Plus / QA / IR evaluation | scripts/bcplus_eval/run_bcplus_eval.py | build_benchmark_prompt, build_ir_prompt, build_run_command, judge_answer_async, compute_ndcg_at_k |
| Released launch configs | scripts/bcplus_eval/run_L3.sh, scripts/qa/*.sh, scripts/bright/*.sh | OpenAI gpt-5.4-nano, --tools read,bash, --max-turns 300, --runtime-context-level level3 |
| Corpus materialization | src/dci/benchmark/export_bc_plus_docs.py, src/dci/benchmark/export_bright_docs.py | domain-first text export, filename sanitization, parquet-to-text conversion |
4. Experimental Setup (实验设置)
4.1 Datasets and corpus scale
| Setting | Dataset / corpus | Scale |
|---|---|---|
| Agentic Search | BrowseComp-Plus | 830 questions; corpus 100,195 docs; avg. 5,179 words/doc |
| Knowledge-Intensive QA | NQ, TriviaQA, Bamboogle, HotpotQA, 2WikiMultiHopQA, MuSiQue | Bamboogle full test set;其余每个 dataset 随机 sample 50 examples |
| IR Ranking | BRIGHT-Biology / Earth Science / Economics / Robotics | 103 / 116 / 103 / 101 queries;corpus docs 分别为 57,359 / 121,249 / 50,220 / 61,961 |
| IR Ranking | BEIR-ArguAna / BEIR-SciFact | ArguAna 1,406 queries sampled 50,8,674 docs;SciFact 300 queries sampled 50,5,183 docs |
| QA corpus | Wikipedia-18 | 21,015,324 docs; avg. 100 words/doc |
BrowseComp-Plus 使用固定、人工验证 supporting documents 与 hard negatives 的 closed corpus;retrieval baseline 使用官方 corpus 构建 BM25 / Qwen3-Embedding-8B FAISS offline search engine;DCI 则在同一个 corpus 目录上直接运行 terminal tools,不建 index。
4.2 Baselines
- Agentic Search baselines:BM25 或 Qwen3-Embedding-8B retriever + GPT-5、o3、GLM-4.7、Claude Sonnet 4.5、Claude Sonnet 4.6、GPT-5.4-nano 等 backbone。
- Knowledge-intensive QA baselines:R1-Searcher-7B、Search-R1-32B、ZeroSearch-7B、Verl-Tool-Search-7B-DAPO、ASearcher-Local-14B。
- IR baselines:BM25、OpenAI-text-embedding-3-large、GTE-Qwen2-7B-Instruct、Rank-R1-14B、Rank1-32B、ReasonRank-32B。
4.3 Metrics
- Accuracy:BrowseComp-Plus 与 QA 使用 LLM judge 判定 final answer 是否与 gold answer 等价;论文说明使用 GPT-4.1 judge。
- NDCG@10:IR ranking 的主指标,惩罚漏掉相关文档和把无关文档排在前面。
- Cost / latency / tool calls:BrowseComp-Plus 上报告 API cost、平均工具调用数与 latency,用于衡量 DCI 的运行开销。
- Coverage / localization:§3.4 的 trajectory metrics,用来解释 DCI 是“更会定位证据”还是“只是更会召回文档”。
4.4 Released-code evaluation config
Released repo 的实际 launch scripts 显示 DCI-Agent-Lite 评测不是 GPU training,而是 API-model inference + benchmark judging:
- BrowseComp-Plus:
scripts/bcplus_eval/run_L3.sh调用run_bcplus_eval.py,dataset 为data/bcplus_qa.jsonl,corpus 为corpus/bc_plus_docs,provideropenai,modelgpt-5.4-nano,toolsread,bash,max-turns=300,max-concurrency=10,runtime-context-level=level3,pi-thinking-level=high,node-max-old-space-size-mb=8192。 - QA:
scripts/qa/run_*_sample50.sh使用corpus/wiki_corpus,同样是gpt-5.4-nano+read,bash+max-turns=300+level3,max-concurrency=5。 - BRIGHT IR:
scripts/bright/run_*.sh开启--enable-ir,corpus 指向各 BRIGHT domain folder,max-concurrency=20,其余核心参数同上。 - DCI-Agent-CC:论文评测使用 Claude Code / Claude Sonnet 4.6 作为强 scaffold;released
DCI-Agent-Literepo 主要提供 Lite wrapper、benchmark scripts 与 corpus/export tooling,没有包含 Claude Code 内部实现。
5. Experimental Results (实验结果)
5.1 BrowseComp-Plus:更高准确率与更低成本的 Pareto frontier

Figure 1 解读:在 BrowseComp-Plus 上,DCI-Agent-CC + Claude Sonnet 4.6 达到 80.0% accuracy、总成本 1,440 降到 424)。DCI-Agent-Lite + GPT-5.4-nano 达到 62.9%、成本 12。图中的绿色区域说明 Lite 版本尤其突出在 low-cost / high-accuracy tradeoff。
作者还指出,DCI-Agent-CC 不仅超过 matched retrieval counterpart,也超过最强 retrieval baseline GPT-5 + Qwen3-Embedding-8B 的 71.7%,高出 +8.3 points。DCI-Agent-Lite 虽然使用轻量 GPT-5.4-nano,仍接近 o3 + Qwen3-Embedding-8B 的 66.0%,但成本减少 $647。
5.2 QA 与 IR ranking 主表结果
Knowledge-Intensive QA (Accuracy):DCI-Agent-CC 平均 83.0%,超过最强 retrieval-agent baseline ASearcher-Local-14B 的 52.3%(+30.7)。DCI-Agent-Lite 平均 68.0%,也排在所有 retrieval baselines 之上。逐项看:NQ 78 / 72,TriviaQA 96 / 84,Bamboogle 80 / 72,HotpotQA 88 / 72,2Wiki 82 / 68,MuSiQue 74 / 40(前者为 DCI-Agent-CC,后者为 DCI-Agent-Lite)。
IR Ranking (NDCG@10):DCI-Agent-CC 平均 68.5,超过 ReasonRank-32B 的 47.0(+21.5);DCI-Agent-Lite 平均 56.7,也比 ReasonRank-32B 高 +9.7。DCI-Agent-CC 在 BRIGHT-Biology / Earth / Economics / Robotics 上分别为 77.1 / 69.0 / 46.8 / 56.8,在 BEIR-ArguAna / SciFact 上为 85.3 / 75.7。
5.3 机制分析:DCI 的优势来自局部定位与组合式搜索
Figure 4 解读:左侧把 830 个 BrowseComp-Plus 问题分为 both correct、both wrong、only retriever correct、only DCI correct。DCI-only correct 有 176 题(21.2%),retriever-only correct 只有 76 题(9.2%)。在 DCI-only 的 176 题中,只有 34 题是 retriever 完全没有召回 gold document;83 题属于 partial-chain failure(召回了一部分但不足以完成下一跳);59 题甚至 recall=100,但没有成功利用已召回证据。右侧显示 DCI-Agent-CC 的 tool calls 主要由 Bash (62.4%) 和 Grep (33.0%) 组成,Bash 内部又集中在 chain search (22.3%)、document peek (18.0%)、regex search (17.0%)、locate file (14.0%),说明 DCI 的核心收益不是简单“多读文档”,而是组合精确约束并在局部证据上迭代。
Trajectory table 给出更直接的证据:在 BrowseComp-Plus sample-100 上,Qwen3-Embedding-8B 的 mean coverage 是 56.7,高于 DCI-Agent-Lite 的 28.0;但 DCI-Agent-Lite 的 localization 是 48.4,显著高于 Qwen3-Embedding-8B 的 21.7,accuracy 也从 45.0 提到 73.0(+28.0)。这支持作者的解释:DCI 不一定召回更多 gold documents,但一旦接近正确区域,它更擅长把证据缩到可操作的片段。
5.4 Corpus scaling:深度可扩展,宽度会变贵

Figure 5 解读:当 corpus 从 100K 扩到 200K、400K documents 时,DCI-Agent-CC 的平均工具调用从 38 增至 87、123;latency 从 360s 增至 783s、4,188s;cost / question 从 2.26、$3.06;accuracy 从 82.7% 降到 69.1%、43.0%。这说明 DCI 在“搜索深度”上很有弹性,但在“搜索宽度”上会快速变贵:raw corpus 越大,agent 需要更多 broad search 与 pruning 才能进入有用区域。
5.5 Runtime 与 tool-profile ablations
Context-management ablation 在 BrowseComp-Plus sample-100 上呈非单调关系:L0 accuracy 72、cost/q 0.0590 但 accuracy 降到 69;L3 accuracy 最高 77,但 cost/q 上升到 $0.1109、latency 8711.81s;L4 accuracy 73。结论是“保留更多原文证据”不等于更好,适度忘记能帮助长程搜索维持工作状态,但过弱或过强压缩都会伤害。
Tool-profile ablation 显示工具表达力有两层贡献:read + grep (L4) 只有 19 average tools、cost/q 0.1021,并把 accuracy 提到 73%。因此,DCI 的基础收益来自直接 corpus interaction;完整 shell 进一步提供 piping、regex、counting、localization 等组合能力。

Figure 6 解读:DCI-Agent-Lite 的 3,168 条 Bash commands 中,rg | head 这类 search+limit 占 56.2%,rg | rg chain search 占 20.6%,wc aggregation/counting 占 7.8%,single keyword search 占 6.3%,ls 占 4.3%,python scripting 占 2.4%,file localization 占 2.1%,full-document cat 只有 0.1%。这进一步说明 agent 大多在做 bounded, compositional, evidence-localizing search,而不是暴力读完整文档。
5.6 Limitations and takeaways
作者没有把 DCI 描述成通用替代所有 retrieval 的免费方案。它的主要限制是运行时开销与 corpus breadth:当 corpus 扩大到 400K documents,accuracy 降到 43.0%,latency 和 cost 都明显上升。DCI 还依赖 agent 是否会写出有效搜索命令;弱模型或错误 prompt 可能产生无效 grep、过早停止、或在 context management 后丢失关键约束。
总体结论是:对 agentic search 来说,retrieval interface 本身是能力瓶颈。DCI 通过直接暴露 raw corpus 和 compositional terminal tools,让 agent 把搜索从“语义相似度 top-”改造成“多轮证据定位过程”;实验显示它在 BrowseComp-Plus、QA 与 IR ranking 上均明显优于强 retrieval baselines,但在大规模宽 corpus 上需要更好的 search planning、index-free pruning 或 hybrid retrieval/DCI 机制来控制成本。