LlamaParse Retrieval Harness:面向 Agent 的大规模文档遍历框架 · 干货攻略

  • 链接: https://www.llamaindex.ai/blog/announcing-retrieval-harness
  • 分类: x-tips
  • 来源: X @jerryjliu0
  • 作者: Jay
  • 更新: 2026-07-24
  • 仓库: run-llama/llama_index

这是什么

LlamaParse Retrieval Harness 是 LlamaIndex(LlamaParse 平台)在 2026 年 6 月 29 日正式上线的一套面向 Agent 的文档遍历工具集,被定位为"2026 版 RAG"。它不再将文档检索视为一次性的语义搜索,而是把整个文档语料库暴露为一组类文件系统工具,让 Agent 能在单次推理循环内自由交替调用,穿越 chunk 边界、跨越百万级文档规模。

核心四工具:

工具 底层 API 功能
retrieve beta.retrieval.retrieve 混合检索(向量 + 关键词)+ 可选重排
findFiles beta.retrieval.find 按文件名精确/模糊搜索文件列表
readFile beta.retrieval.read 按 file_id 读取文件原文,支持 offset/max_length 窗口
grepFile beta.retrieval.grep 在单个文件内执行正则匹配,返回字符位置

官方博客明确指出:这些工具以"轻量 API schema"形式暴露,可直接接入任意 LLM 编排框架(LangChain、LangGraph、Vercel AI SDK 等)的 tool-calling 循环。


为什么值得关注

谁分享的

Jerry Liu(LlamaIndex 联合创始人/Head of Product)在 X 和 LinkedIn 同步发布,LlamaIndex 官方账号随后转推。官方配套了一场 2026 年 6 月 30 日的线上 webinar,由 LlamaIndex Head of Engineering George He 讲解架构细节。

解决什么问题

传统 RAG 的死穴: 将数据访问视为"一次性预处理步骤",拉几个 top-k chunk 塞进 prompt 然后"盲目希望得到正确答案"。当答案跨越任意 chunk 边界时,纯语义搜索立刻失效;让 Agent 逐文件暴力遍历则完全烧爆 token 预算和延迟。

核心矛盾: 语义搜索在大语料上快速初筛精确;grep + 文件读取提供精度来验证、深挖、在 top-k chunk 截断时恢复上下文。但把 grep 和语义搜索缝合到一个 harness 里,在多租户文档语料、索引新鲜度、权限边界、复杂文件格式的规模下,比看起来难得多。

** Retrieval Harness 的答案:** 把整个语料库作为文件系统风格工具暴露给 Agent,Agent 可以在一次推理循环中任意交错调用这四个工具,完成从简单问答到复杂多步调研的任何任务。


核验过程

官方来源

  1. LlamaIndex 官方博客(2026-06-29)llamaindex.ai/blog/announcing-retrieval-harness — 核心介绍,含工具定义、设计动机、Visual Layout Preservation、Managed Indexes、Pipeline Observability 四大模块,声明"beta 在所有付费 tier 可用"。

  2. LlamaIndex GitHub READMErun-llama/llama_index)— 确认 LlamaParse 是独立平台,含 Parse(130+ 格式解析)、Extract、Index(摄取和 RAG pipeline)、Agents 等子模块,Retrieval Harness 属于 Index 部分。

  3. LlamaIndex 官方线上 webinar 预告页landing.llamaindex.ai/retrieval-harness)— George He 主讲,确认"grep-vs-embeddings 是伪二分",benchmark 显示两者结合最优;展示端到端架构:grep + 目录列表 + 直接文件读取作为一等公民工具,与混合搜索 + 重排组合。

  4. MarkTechPost 报道(2026-07-05)marktechpost.com/2026/07/05/llamaindex-legal-kb-agentic-retrieval-over-index-v2-with-retrieve-find-read-and-grep-tools — 获取 legal-kb 参考应用的详细工具表和代码示例,含四工具的具体 API 参数、Zod schema、ToolLoopAgent 集成方式、Vercel AI SDK 6 集成示例。

交叉验证

  • X @llama_index 官方转推(2026-06-29):确认发布时间与工具集中列出的功能(Hybrid Retrieval、List Files、File Grep、File Read)一致,提及 18.9K 浏览量。

  • LlamaIndex 官方 Hybrid Search Alpha 博客llamaindex.ai/blog/llamaindex-enhancing-retrieval-performance-with-alpha-tuning-in-hybrid-search-in-rag-135d0c9b8a00):交叉验证 alpha 参数含义——alpha=1.0 为纯向量、alpha=0.0 为纯关键词,0.5 为等权混合;以及重排对 retrieval 指标的提升效果有据可查。

  • 原帖 run-llama/legacy 仓库不存在(404) — 该引用信息有误;实际仓库为 run-llama/llama_index,参考应用在 run-llama/legal-kb。已在文中注明。

无法核验(需自行确认)

  • "130+ 格式":来自 GitHub README 原生描述,LlamaIndex 博客正文未提及具体数字,标注为原帖/文档主张,未逐一核验格式清单
  • Beta 具体在哪些付费 tier 可用:官方博客仅称"available in beta across all paid tiers",未披露 Starter/Growth/Enterprise 层级差异。
  • legal-kb 参考应用的公开 GitHub 链接在 MarkTechPost 报道中提及(github.com/run-llama/legal-kb),未单独访问验证其当前内容。

上手步骤

1. 注册 LlamaParse 并获取 API Key

前往 cloud.llamaindex.ai 创建账户,在 Dashboard 获取 API Key。

2. 安装 SDK

pip install llama-index llama-index-agent-tool-call
# 或使用 Node.js
npm install @llamaindex/llama-cloud

3. 上传文件并创建 Managed Index(Python 示例)

from llama_index.llama_cloud import LlamaCloud

client = LlamaCloud(api_key="your-api-key")

# 创建项目与索引(平台自动托管基础设施)
project = client.projects.create(name="my-knowledge-base")
index = client.indices.create(
    project_id=project.id,
    name="docs-index",
    # 文档将自动增量同步,无需手动维护
)

4. 构建 Agent 工具集(基于 Vercel AI SDK + TypeScript 示例)

import { LlamaCloud } from '@llamaindex/llama-cloud'
import { tool } from 'ai'
import { z } from 'zod'

function createLlamaParseTools(apiKey: string, projectId: string, indexId: string) {
  const client = new LlamaCloud({ apiKey })

  // 工具1: 混合检索
  const retrieve = tool({
    description: 'Run hybrid semantic + keyword retrieval against an index.',
    inputSchema: z.object({
      query: z.string(),
      top_k: z.number().nullable().optional(),
      score_threshold: z.number().nullable().optional(),
      rerank_top_n: z.number().nullable().optional(), // 设置以启用重排
      file_name: z.string().nullable().optional(),    // 元数据过滤
      file_version: z.number().nullable().optional(),
    }),
    execute: async ({ query, top_k, rerank_top_n, file_name }) => {
      const response = await client.beta.retrieval.retrieve({
        index_id: indexId,
        project_id: projectId,
        query,
        top_k,
        rerank: rerank_top_n != null
          ? { enabled: true, top_n: rerank_top_n }
          : undefined,
        custom_filters: file_name
          ? { file_name: { operator: 'eq', value: file_name } }
          : undefined,
      })
      return response.results.map(r => ({
        fileName: r.metadata?.file_name,
        preview: r.content.slice(0, 500),
        score: r.rerank_score ?? r.score,
      }))
    },
  })

  // 工具2: 搜索文件
  const findFiles = tool({
    description: 'Search for files by exact name or substring.',
    inputSchema: z.object({
      file_name: z.string().optional(),
      file_name_contains: z.string().optional(),
    }),
    execute: async ({ file_name, file_name_contains }) => {
      const response = await client.beta.retrieval.find({
        index_id: indexId,
        project_id: projectId,
        file_name,
        file_name_contains,
      })
      return response.files
    },
  })

  // 工具3: 读取文件原文
  const readFile = tool({
    description: 'Read raw file content with byte offset and length windows.',
    inputSchema: z.object({
      file_id: z.string(),
      offset: z.number().optional(),
      max_length: z.number().optional(),
    }),
    execute: async ({ file_id, offset, max_length }) => {
      return await client.beta.retrieval.read({
        index_id: indexId,
        project_id: projectId,
        file_id,
        offset,
        max_length,
      })
    },
  })

  // 工具4: 文件内正则搜索
  const grepFile = tool({
    description: 'Run regex search within a single file.',
    inputSchema: z.object({
      file_id: z.string(),
      pattern: z.string(),
      context_chars: z.number().optional(),  // 上下文字符数
      limit: z.number().optional(),
    }),
    execute: async ({ file_id, pattern, context_chars, limit }) => {
      return await client.beta.retrieval.grep({
        index_id: indexId,
        project_id: projectId,
        file_id,
        pattern,
        context_chars,
        limit,
      })
    },
  })

  return { retrieve, findFiles, readFile, grepFile }
}

5. 组装 Agent 并强制执行工具顺序

import { ToolLoopAgent } from 'ai'

// 强制要求 Agent 优先调用 findFiles 建立文档清单
const agent = new ToolLoopAgent({
  model: 'claude-sonnet-4-20250514',
  tools: createLlamaParseTools(apiKey, projectId, indexId),
  instructions: (
    'Always call findFiles first to establish the document inventory. ' +
    'Ground every answer in the documents. ' +
    'Cite file ids inline as cite:<id>. ' +
    'Confirm exact wording with readFile or grepFile before citing.'
  ),
})
# alpha=1.0 → 纯向量;alpha=0.0 → 纯关键词;alpha=0.5 → 等权混合
retriever = VectorIndexRetriever(
    index=index,
    similarity_top_k=10,
    vector_store_query_mode="hybrid",
    alpha=0.5,  # 可让 Agent 自行设置以在语义/关键词之间切换
)

坑与适用边界

⚠️ 关键坑

  1. 原帖仓库名有误:Jerry Liu 原帖提到 run-llama/legacy,此仓库不存在(404)。实际相关仓库为 run-llama/llama_index(主框架)和 run-llama/legal-kb(参考应用)。不要基于错误仓库名去做开发。

  2. Beta 限制未披露细节:官方仅称"all paid tiers",未说明 Starter/Growth/Enterprise 的具体功能差异,正式生产使用前需确认合同条款。

  3. 增量同步有前提:文档变更后需触发 sync 才能更新索引;如果 sync 流程配置不当,可能出现"A sync completes but the chunks that should have made it into the index didn't"的情况,需关注 Pipeline Observability 中的 stage-by-stage 状态。

  4. Visual Layout 的 token 成本:页面截图与 bounding-box 渲染会额外消耗上下文窗口,适合dense tables/多列文档的场景,但普通文本问答无需开启。

  5. ToolLoopAgent 默认 prompt 约束:参考应用强制 findFiles 优先调用,适用于严格溯源场景(如法务/合规),但若业务流程不需要如此严苛,可放松约束以提升灵活度。

适用边界

维度 适合 不适合
文档规模 10 docs ~ 1m+ docs(官方口径) 极少量文档(Overkill)
任务类型 跨文件多步调研、合同审查、Due Diligence、版本追踪 简单单句问答(普通 RAG 更经济)
Agent 架构 支持工具循环调用的 Agent(LangChain LangGraph / Vercel AI SDK / 自建) 纯 LLM call 无工具循环的简单 RAG
格式 130+ 格式(需确认),含复杂布局 PDF、多列文档、财务表格 纯文本文件(浪费平台能力)
数据新鲜度 需增量同步配置;变更频繁的语料需确保 sync 逻辑健壮 数据完全静态、从不更新

一句话结论

LlamaParse Retrieval Harness 把文档语料库变成 Agent 的"可遍历文件系统"——混合检索初筛、文件 grep 精确锁定、原文窗口读取三者自由交替,穿透传统 RAG 的 chunk 边界天花板,适合百万级文档的多步 Agent 调研场景;但要注意 Beta 功能边界、sync 可靠性,以及 alpha 参数调优带来的向量/关键词权重权衡。