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 直接调用 bashglobreadgreppython 等工具。关键变化不是多了一个工具,而是证据的过滤权从 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.pyDEFAULT_JUDGE_MODELgpt-5.4-nano。此外,论文 Table 4 的 DCI-Agent-Lite direct interaction row 标注为 L4,而 released benchmark launch scripts(scripts/bcplus_eval/run_L3.shscripts/qa/*.shscripts/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, localization

3.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 ConceptSource FileKey Class/Function
DCI-Agent-Lite CLI / RPC runnersrc/dci/benchmark/pi_rpc_runner.pybuild_pi_command, PiRpcClient, RunRecorder, prompt_and_wait
Tool set and dynamic system promptsrc/dci/benchmark/pi_system_prompt.py, prompts/system_prompt.txtparse_tools, buildSystemPrompt, selected tools read,bash
BrowseComp-Plus / QA / IR evaluationscripts/bcplus_eval/run_bcplus_eval.pybuild_benchmark_prompt, build_ir_prompt, build_run_command, judge_answer_async, compute_ndcg_at_k
Released launch configsscripts/bcplus_eval/run_L3.sh, scripts/qa/*.sh, scripts/bright/*.shOpenAI gpt-5.4-nano, --tools read,bash, --max-turns 300, --runtime-context-level level3
Corpus materializationsrc/dci/benchmark/export_bc_plus_docs.py, src/dci/benchmark/export_bright_docs.pydomain-first text export, filename sanitization, parquet-to-text conversion

4. Experimental Setup (实验设置)

4.1 Datasets and corpus scale

SettingDataset / corpusScale
Agentic SearchBrowseComp-Plus830 questions; corpus 100,195 docs; avg. 5,179 words/doc
Knowledge-Intensive QANQ, TriviaQA, Bamboogle, HotpotQA, 2WikiMultiHopQA, MuSiQueBamboogle full test set;其余每个 dataset 随机 sample 50 examples
IR RankingBRIGHT-Biology / Earth Science / Economics / Robotics103 / 116 / 103 / 101 queries;corpus docs 分别为 57,359 / 121,249 / 50,220 / 61,961
IR RankingBEIR-ArguAna / BEIR-SciFactArguAna 1,406 queries sampled 50,8,674 docs;SciFact 300 queries sampled 50,5,183 docs
QA corpusWikipedia-1821,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-Plusscripts/bcplus_eval/run_L3.sh 调用 run_bcplus_eval.py,dataset 为 data/bcplus_qa.jsonl,corpus 为 corpus/bc_plus_docs,provider openai,model gpt-5.4-nano,tools read,bashmax-turns=300max-concurrency=10runtime-context-level=level3pi-thinking-level=highnode-max-old-space-size-mb=8192
  • QAscripts/qa/run_*_sample50.sh 使用 corpus/wiki_corpus,同样是 gpt-5.4-nano + read,bash + max-turns=300 + level3max-concurrency=5
  • BRIGHT IRscripts/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-Lite repo 主要提供 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 机制来控制成本。