AI教程

Haystack 是什么?RAG Pipeline、检索评测与生产部署指南

Haystack是deepset维护的开源AI编排框架。本文解释组件、Pipeline、DocumentStore、Retriever、Ranker与Agent的边界,并提供RAG双链路、可运行检索示例、评测指标和生产上线清单。

Haystack RAG 系统由离线索引 Pipeline 与在线查询 Pipeline 组成,二者通过 Document Store 连接
本页目录
  1. Haystack 的核心对象分别做什么?
  2. Haystack 2.27—2.31 的能力变化,哪些值得用,哪些边界不能忽略?
  3. 一套 RAG 为什么要拆成索引和查询两条 Pipeline?
  4. 离线索引 Pipeline
  5. 在线查询 Pipeline
  6. 最小可运行示例:先验证检索,不急着接大模型
  7. 检索效果怎么评测,不能只看“回答像不像”?
  8. 怎样做一次能归因的 Haystack RAG 对照实验?
  9. 结果变差时,先查哪一层?
  10. Haystack 上生产前的六道闸门
  11. Haystack、LangChain 与 LlamaIndex 怎么选?
  12. Agent 能力和 RAG 不是一回事
  13. 常见问题
  14. Haystack 是向量数据库吗?
  15. 用了 Haystack 就能消除幻觉吗?
  16. Haystack 能保证企业级并发吗?
  17. 升级 Haystack 只改版本号就行吗?
  18. 编辑说明与修订记录

一句话答案:Haystack 是由 deepset 维护的开源 AI 编排框架,用组件和 Pipeline 组织文档处理、检索、重排序、提示构建、模型生成、工具调用与评测。它能帮助开发者搭建 RAG、搜索和 Agent 应用,但不会自动保证答案正确、检索效果、并发能力或企业合规。

Haystack RAG 系统由离线索引 Pipeline 与在线查询 Pipeline 组成,二者通过 Document Store 连接
Haystack RAG 的两条主链:先建立可追踪的索引,再对查询执行检索、重排序、生成与引用。原创图:兰塞 AI 编辑部。

截至 2026 年 7 月 16 日,Haystack 官方将项目描述为可用于生产型 Agent、RAG 和多模态搜索的开源框架;GitHub 仓库使用 Apache-2.0 许可证。官方 PyPI 发布历史显示当前稳定版为 v2.31.0,于 2026 年 7 月 8 日上传,并通过 deepset-ai/haystack 的可信发布流程关联到 v2.31.0 标签;本文可运行示例则明确固定在 2.29.0,不能把“测试版本”和“当前最新版”混为一谈。版本会继续变化,安装和迁移前应重新查看 haystack-ai 发布历史Haystack Releases,不要使用“Haystack 2026”这种不存在的固定产品代号。

本文纠正旧页中的三类错误:Haystack 不是 DeepL 旗下项目;官方资料没有所谓“防倦怠机制”或“认知负载监控器”;没有统一环境、数据集和配置,就不能声称固定的 10,000 并发、200ms 延迟、准确率提升 40% 或事实错误下降 65%。

Haystack 的核心对象分别做什么?

对象 职责 需要开发者决定的内容
Component 完成转换、切分、嵌入、检索、路由、生成或评测等单项工作 输入输出契约、版本、错误处理和资源限制
Pipeline 把组件连接成有向多重图,可包含分支、并行路径和循环 执行路径、停止条件、超时、失败策略和可观测性
Document 保存文本或其他内容、元数据与文档 ID 来源、权限、版本、删除和更新策略
Document Store 保存文档,并向 Retriever 提供检索接口 数据库选型、索引结构、备份、隔离和容量
Retriever / Ranker 召回候选文档并重新排序 检索策略、top_k、过滤、评测集与延迟预算
Agent / Tool 让模型在受控循环中选择并调用工具 权限、参数校验、人工确认、审计和回滚

官方的 Haystack 介绍把 Components、Pipelines、Document Stores、Agents、Tools 和 Integrations 列为基础组成;Pipeline 文档说明 Pipeline 是由组件组成的有向多重图,而不是只能从左到右执行的一条链。

Haystack 2.27—2.31 的能力变化,哪些值得用,哪些边界不能忽略?

Haystack 的价值正在从“串起一个 RAG 演示”转向可控制的检索、并行、恢复和 Agent 编排,但新增能力不是自动优化开关。版本 2.29.0 的发布说明新增 MultiRetrieverTextEmbeddingRetriever,支持并行组合多个检索器并以倒数排序融合(RRF)去重排序;同一版本也包含输入行为变化和升级说明。生产项目应固定版本并保留回归集,而不是看到同为 2.x 就假设无行为变化。

能力 适合解决什么 必须自己控制的边界
Pipeline 按显式依赖组织串行、分支、路由和循环 循环上限、组件输入输出、超时、重试与失败补偿
AsyncPipeline 在依赖允许时并行运行多个 Retriever、LLM 调用或 I/O 分支 concurrency_limit 只是组件并发上限;模型、数据库和外部 API 仍有各自限流
MultiRetriever / 混合检索 组合关键词、dense 或多个 embedding 排名,减少单一路线盲区 RRF 也需要同一查询集评测;不能把“多路”直接等同于“更准”
Breakpoint 与 Snapshot 在组件或工具调用前暂停,检查状态,并从快照恢复失败流程 快照可能含查询、上下文、工具参数和中间输出,需要加密、权限、保留期与脱敏
Agent / Tool 让模型在受控循环中选择工具并处理多步任务 模型选择不等于授权;写操作仍需参数校验、幂等、人工确认和审计

AsyncPipeline 只有在分支彼此独立且组件真正支持异步或 I/O 等待时才可能缩短总时长;CPU/GPU 已饱和时盲目提高并发反而会增加排队和错误。Breakpoint 自动保存的快照适合诊断与恢复,但恢复前还要判断上游副作用是否已经发生,支付、发信、写库等工具不能因为“从快照继续”而重复执行。

一套 RAG 为什么要拆成索引和查询两条 Pipeline?

离线索引 Pipeline

  1. 接入来源:记录原始 URL、文件、业务系统、访问范围和采集时间。
  2. 转换与清洗:解析正文、标题、表格和元数据,保留页码或段落定位。
  3. 切分:按内容结构和任务需求生成 chunk,并保留 `document_id`、`chunk_id` 与版本。
  4. 嵌入:只在需要向量检索时生成 embedding;嵌入模型更换后要有重建索引计划。
  5. 写入:使用 Document Store 保存文档,明确重复文档、更新与删除的处理方式。

Haystack 的 Document Store 文档明确指出 Document Store 是数据库接口而不是普通 Pipeline Component,常由 Retriever 在查询时访问。Document ID 不能只依赖随机值,否则来源更新后难以覆盖旧版本,也难以执行“删除我的数据”。

在线查询 Pipeline

  1. 理解和约束查询:识别语言、租户、权限、时间范围与是否允许回答。
  2. 检索:根据任务选用 BM25、dense embedding、hybrid retrieval 或元数据过滤。
  3. 重排序:在延迟预算允许时,用 Ranker 改善候选顺序,而不是盲目增加 top_k。
  4. 构造上下文:限制文档数量和长度,附带稳定的来源标识。
  5. 生成与引用:要求模型只依据提供的上下文回答;证据不足时返回不知道或转人工。

Retriever 文档区分关键词、dense embedding、sparse embedding 和混合检索;Ranker 文档说明重排序可以改善初始候选顺序,但通常会增加计算和延迟。站内的 Embedding 原理说明重排序指南可用于补充理解,但具体模型仍应在自己的语料和查询集上测试。

最小可运行示例:先验证检索,不急着接大模型

安装官方包使用 pip install haystack-ai。官方特别提醒,不要在同一个 Python 环境混装旧的 farm-haystack 和新的 haystack-ai,详见 安装文档。下面代码由本站在隔离环境中使用 haystack-ai==2.29.0 实际执行通过;生产环境应把版本写入锁定文件,并在升级后重跑。

from haystack import Document, Pipeline
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.retrievers.in_memory import InMemoryBM25Retriever

store = InMemoryDocumentStore()
store.write_documents([
    Document(
        content="退款 申请 需要 订单号 签收 七天 提交",
        meta={"source": "refund-policy-v3", "acl": "public"},
    ),
    Document(
        content="企业 账户 退款 需要 管理员 确认",
        meta={"source": "enterprise-policy-v2", "acl": "enterprise"},
    ),
])

query = Pipeline()
query.add_component(
    "retriever",
    InMemoryBM25Retriever(document_store=store, top_k=2),
)

result = query.run({
    "retriever": {
        "query": "退款 需要 什么 资料 订单号",
        "filters": {"field": "meta.acl", "operator": "==", "value": "public"},
    }
})
for doc in result["retriever"]["documents"]:
    print(doc.meta["source"], doc.score, doc.content)

该运行只返回 acl=public 的退款规则,说明过滤条件确实进入检索调用。示例故意用空格分隔中文检索词,因为 InMemory BM25 的默认正则分词不是生产级中文分词器;即使 2.27.0 调整了默认 token 正则,也不等于自动解决中文词边界、同义词和专名召回。正式项目应使用支持中文分析器的搜索后端或经过评测的稀疏/向量检索方案。

这个例子仍只验证检索链路,不是完整 RAG:它没有生成器、身份到 ACL 的可信映射、引用渲染和线上评测。客户端传入 public 不构成授权,真实过滤值必须由服务端根据已认证用户和租户生成。先观察候选文档是否正确,再接 Prompt Builder 和 Generator,更容易定位问题。需要从零理解完整流程,可参阅站内 RAG 入门教程

检索效果怎么评测,不能只看“回答像不像”?

层级 建议记录 常见误判
语料 来源覆盖率、过期率、重复率、权限标签、解析失败率 文档数量多就等于知识完整
召回 Recall@k、MRR、nDCG、无结果率、过滤正确率 只检查最终答案,不知道相关文档是否被召回
生成 答案正确性、引用支持率、拒答正确率、敏感信息泄漏 语言流畅就算正确
系统 P50/P95 延迟、错误率、超时率、每个成功任务成本 只报平均延迟或单次演示速度
业务 任务完成率、转人工率、返工率、用户确认和事故数 把模型分数直接当商业收益

Haystack 的 Evaluation 文档支持组件级和端到端评测。组件级评测适合定位 Retriever、Ranker 或 Prompt 的瓶颈;端到端评测反映最终输出。可靠做法是保留一套带相关文档和期望答案的版本化测试集,模型、embedding、切分、索引或 prompt 变化后重放,而不是用五个演示问题下结论。

怎样做一次能归因的 Haystack RAG 对照实验?

不要同时更换切分、embedding、Retriever、Ranker、Prompt 和模型。先冻结语料快照、权限、查询集、相关文档标签、生成模型和运行预算,只改变一层。下面的四步路线能回答“改进来自哪里”,也能在复杂方案变差时退回简单基线。

实验 唯一主要变化 重点指标 进入下一步的条件
B0 关键词基线 BM25 + 固定 top_k Recall@k、MRR/nDCG、无结果率、过滤正确率、P95 专名、编号、精确短语有可接受召回,权限无泄漏
B1 Dense 基线 同一语料改为单一路向量检索 同义改写、长问题、跨语言分组召回与成本 明确在哪些查询组优于 B0,而非只看总平均
B2 Hybrid 并行 B0/B1 后用 RRF 或指定融合 去重后 Recall@k、排序、延迟、数据库/API 调用量 质量增益超过并发、成本和维护开销
B3 Ranker 对固定候选集增加重排序 nDCG/MRR、上下文相关性、P95、单位成功任务成本 前排证据改善,且 SLO 和成本仍在预算内

Haystack 同时提供需要标签的 DocumentRecallEvaluatorDocumentMRREvaluatorDocumentNDCGEvaluator 等统计评测,以及不要求标准答案但依赖模型判断的 FaithfulnessEvaluator 等组件。后者的分数受评审模型、提示和版本影响,不能替代人工抽检;“答案能由上下文推出”也不证明上下文本身最新、完整或有权限展示。

结果变差时,先查哪一层?

症状 先保留的证据 优先排查 不要先做什么
相关文档完全没出现 query、filters、top_k、索引版本、候选文档 ID 采集/解析、切分、中文分词、embedding、权限过滤 只改 Prompt 或换更大生成模型
文档出现但排位很后 各 Retriever 原始排名与分数、融合方式 query 改写、RRF/Joiner、Ranker 和候选数量 只扩大最终上下文把噪声全塞给模型
证据正确但回答错误 最终上下文、Prompt、模型参数、原始响应与引用映射 上下文冲突、指令、截断、生成模型和拒答条件 把问题归咎于向量库后重建全部索引
某租户看到别人的文档 服务端身份、过滤条件、文档 ACL、Trace 与请求 ID 授权映射、过滤下推、缓存键和测试隔离 仅在前端隐藏来源或依赖模型拒答
升级后结果漂移 锁文件、Release Notes、Pipeline YAML、组件配置和基线输出 默认参数、tokenization、输入契约、集成和模型版本 在生产上继续滚动升级后再找原因
异步后错误与超时增加 组件级开始/结束时间、并发、限流、重试和外部状态码 concurrency_limit、连接池、供应商限流和背压 继续增加 worker 掩盖下游瓶颈
Haystack RAG 上线前需要通过语料、检索、生成、安全、运行和变更六道生产闸门
Haystack 只是编排层;生产可靠性来自数据、评测、安全、可观测性和变更治理。原创图:兰塞 AI 编辑部。

Haystack 上生产前的六道闸门

  1. 语料闸门:每段内容可追溯来源、版本、权限和删除路径;解析失败与过期内容可监控。
  2. 检索闸门:使用真实查询集测量召回与排序,并对缩写、数字、专有名词、模糊查询和无答案问题分组分析。
  3. 生成闸门:回答必须带可定位引用;证据不足、来源冲突或超出时效时能够拒答或提示边界。
  4. 安全闸门:服务端执行租户和文档权限过滤;把外部文档视为不可信数据,测试提示注入和敏感信息泄漏。
  5. 运行闸门:记录组件执行、延迟、错误、token、检索结果和模型版本;对内容 Trace 默认脱敏。
  6. 变更闸门:固定依赖版本,保存 Pipeline 配置,升级前回放评测集,准备索引与应用回滚。

官方 Tracing 文档说明 Haystack 可接 OpenTelemetry、Datadog 等后端,也明确内容追踪默认关闭,以避免敏感输入输出被发送到追踪系统。日志中应保存请求 ID、组件、版本、耗时和错误类型;正文、个人信息、密钥和完整提示只在获得授权且完成脱敏时记录。

Pipeline 可以按官方 序列化文档保存为 YAML,但 YAML 不是完整的生产发布物:环境变量、密钥、模型端点、Document Store schema、索引版本和评测基线还需要独立管理。部署没有唯一方式,官方 Deployment 指南列出 Docker、Kubernetes、OpenShift 和 Hayhooks 等路线,选型应依据团队已有平台,而不是框架名称。

一次可回滚发布至少应绑定:Git 提交与依赖锁、Pipeline 配置哈希、组件/模型 ID、语料与索引版本、权限策略版本、评测集版本、阈值、镜像摘要和数据库迁移号。只有 YAML 相同仍可能因为远端模型别名、Document Store 索引、环境变量或集成包变化而产生不同输出。

Haystack、LangChain 与 LlamaIndex 怎么选?

问题 更有用的判断方法
哪个框架“最好”? 没有脱离团队、任务和版本的统一答案;用同一语料、查询集和模型做最小实现
何时考虑 Haystack? 希望显式组织索引、检索、路由、生成和评测组件,并重视可观察的 Pipeline
何时不需要框架? 只有一个检索调用和一个模型调用,团队能用少量代码清楚维护时
如何比较迁移成本? 统计自定义组件、集成依赖、数据模型、评测资产、追踪和运维接口,而非只比较示例行数

可以对照站内的 LangChain 框架说明LlamaIndex RAG 教程建立候选清单。真正的选型 PoC 至少要实现同一组数据接入、权限过滤、检索评测、引用、超时、追踪和部署;只跑“你好世界”无法比较维护成本。

Agent 能力和 RAG 不是一回事

Haystack 也提供 Agent、Tool、ComponentTool 和 ToolInvoker 等能力,官方 Agent 文档说明模型可产生工具调用,ToolInvoker 负责执行。但引入 Agent 不会自动改善检索,也不会自动获得权限。读取与写入工具应分开,高风险操作需要服务端授权、参数校验、人工确认、幂等和审计。整体治理可以结合站内 AI 安全生命周期指南

常见问题

Haystack 是向量数据库吗?

不是。Haystack 提供 Document Store 协议和多种集成,实际存储可以是内存实现或外部数据库。容量、备份、隔离和高可用由具体后端与部署负责。

用了 Haystack 就能消除幻觉吗?

不能。RAG 可以给模型提供证据,但切分错误、召回失败、权限过滤错误、来源过期和生成偏离仍会造成错误。必须分别评测检索与生成,并保留拒答路径。

Haystack 能保证企业级并发吗?

不能给出脱离环境的固定保证。并发由组件、外部 API、Document Store、模型服务、网络、缓存、请求大小和部署架构共同决定。应在目标硬件与真实负载下测量吞吐、P95/P99 延迟、错误率和成本。

升级 Haystack 只改版本号就行吗?

不建议。Release Notes 可能包含 API、输入参数和行为变化。升级前固定旧环境、阅读迁移说明、重放测试与评测集、检查序列化配置,并准备回滚。

编辑说明与修订记录

编辑主体:兰塞 AI 编辑部;事实复核:2026 年 7 月 16 日;写作目的:回答中文用户对 Haystack 定义、RAG 架构、评测和生产部署的真实问题,而不是制造版本新闻或性能排名。

  • 删除“DeepL 旗下”“Haystack 2026”“防倦怠机制”“认知负载监控器”等错误或不存在的描述。
  • 删除无测试环境的并发、延迟、准确率和错误率数字。
  • 依据 Haystack 官方文档与 deepset-ai/haystack 仓库重建组件、双 Pipeline、评测、追踪、部署和升级边界。
  • 新增并实际运行 Haystack 2.29.0 的中文 BM25 + 服务端 ACL 过滤示例,公开默认正则分词不等于生产中文分词的限制。
  • 新增 Pipeline/AsyncPipeline/MultiRetriever/Breakpoint 边界、四组可归因检索实验、故障定位矩阵、发布指纹与两张原创信息图。

如果发现版本变化、代码失效或事实错误,可通过站点“关于我们与编辑规范”页面所列渠道反馈;复核时将保留更正原因和日期。