☰
Haystack 3.x 开源 AI 编排框架实战指南:用 Python 构建生产级 RAG 与 Agent 应用
2026/9/28 3:35:52 网站建设 项目流程

Haystack 3.x 开源 AI 编排框架实战指南:用 Python 构建生产级 RAG 与 Agent 应用

【免费下载链接】haystackOpen-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, memory, and generation. Built for scalable agents, RAG, multimodal applications, semantic search, and conversational systems.项目地址: https://gitcode.com/GitHub_Trending/ha/haystack

Haystack 是 deepset 团队开源的 AI 编排框架(Apache-2.0 协议),用于在 Python 中构建生产就绪的 LLM 应用。它以"组件 + 流水线 + Agent"为核心理念,让开发者对检索(retrieval)、路由(routing)、记忆(memory)与生成(generation)拥有显式控制,本文将从安装、核心特性、源码机制到首个 RAG 与 Agent 应用,带你完整掌握这一框架的使用方法。读完本文,你将能够搭建可扩展的 RAG 系统、多模态应用、语义搜索与自主 Agent 工作流,并理解其底层的组件契约、生命周期钩子与遥测机制。

项目定位与整体架构

Haystack 是一个开源 AI 编排框架,核心理念是"透明架构":检索、排序、过滤、组合、结构化与路由都在信息到达模型之前被显式控制,流水线与 Agent 工作流中的每一步都清晰可追溯(README.md)。

从仓库结构看,Haystack 3.x 的核心分层非常清晰:

  • 核心层(haystack/core):包含组件契约(component装饰器)、Pipeline 图执行引擎、序列化与错误处理;
  • 数据层(haystack/dataclasses):Document、ChatMessage、Answer等核心数据结构;
  • 组件层(haystack/components):检索器、生成器、嵌入器、转换器、Agent 等 100+ 内置组件;
  • 工具层(haystack/tools):Tool、Toolset、ComponentTool、PipelineTool等工具抽象;
  • 钩子层(haystack/hooks):Agent 生命周期钩子(预算控制、上下文压缩、人工介入、工具结果卸载等)。

当前仓库对应版本为3.2.0-rc0(见 VERSION.txt),包名为haystack-ai,要求 Python >= 3.10(pyproject.toml)。

安装 Haystack

基础安装

最简单的安装方式是通过 pip:

pip install haystack-ai

若想抢先体验最新特性,可以安装 nightly 预发布版本:

pip install --pre haystack-ai

其他包管理器

根据官方安装文档(docs-website/docs/overview/installation.mdx),还支持以下方式:

# 使用 uv uv pip install haystack-ai # 或作为项目依赖添加 uv add haystack-ai # 使用 conda conda install conda-forge::haystack-ai

可选依赖与 Docker

Haystack 采用轻量安装策略:默认只安装核心依赖,部分组件依赖的可选包不会自动安装。如果使用了未安装可选依赖的功能,会抛出类似ImportError: "Haystack failed to import the optional dependency 'pypdf'. Run 'pip install pypdf'."的提示,按提示安装即可。从 pyproject.toml 的依赖声明可以看到,核心依赖包括openai、pydantic、Jinja2、networkx(用于流水线图)、httpx、numpy等,而pypdf、pdfminer.six、trafilatura、python-docx等属于测试/可选环境。

此外,仓库提供了 Docker 构建支持,docker/Dockerfile.base 与 docker/docker-bake.hcl 中定义了基础镜像的多平台构建配置,适合在容器化环境中部署。

核心特性与源码级解读

为生产而生的 Agent

Agent 是 Haystack 3.x 的重头戏。在 haystack/components/agents/agent.py 中,Agent被实现为一个标准的 Haystack 组件(@component),由 LLM 驱动、可调用工具,并持续处理消息直到满足退出条件。

Agent.__init__的关键参数包括:

参数默认值说明
chat_generator必填聊天生成器实例,必须支持工具调用
toolsNoneTool和/或Toolset列表,或单个Toolset
system_prompt/user_promptNone系统/用户提示词,支持字符串模板或 Jinja2 消息模板
required_variables"*"提示词中必须提供的变量;"*"表示全部必填,None表示全部可选
exit_conditions["text"]退出条件,可包含"text"(生成无工具调用的消息即返回)或工具名(执行完指定工具即返回)
state_schemaNone定义运行时状态的字典,工具可通过inputs_from_state/outputs_to_state读写状态
max_agent_steps100最大步数,一步 = 一次 chat-generator 调用 + 该次请求的所有工具调用
raise_on_tool_invocation_failureFalse工具调用失败是否抛异常;为False时失败会转为聊天消息回传给 LLM
tool_concurrency_limit4并行执行工具调用的上限,设为1可禁用并行
hooksNone钩子点 → 钩子列表的映射,见下文生命周期钩子

agent.run()的返回结果中内置了生产级监控字段(agent.py):

  • messages:本次运行交换的全部消息;
  • last_message:最后一条消息;
  • step_count:实际运行的步数;
  • token_usage:每次 LLM 调用的 token 用量聚合(从各消息的meta["usage"]累加而来);
  • tool_call_counts:每个工具被调用的次数映射;
  • exit_reason:退出原因,包括"text"、"length"、"content_filter"、满足退出条件的工具名、"max_agent_steps",或钩子通过stop_run状态键提供的自定义原因——该字段非常适合配合ConditionalRouter做下游路由。
生命周期钩子(Hooks)

Agent 支持通过钩子扩展行为,用于护栏(guardrails)与自定义逻辑。钩子点定义在 haystack/hooks/protocol.py:

HookPoint = Literal["before_run", "before_llm", "before_tool", "after_tool", "on_exit", "after_run"]

各钩子点的语义(依据 agent.py 与 haystack/hooks 目录下的实现):

  • before_run:每次运行开始后、首次 LLM 调用前执行一次,适合改写初始消息或初始化状态;
  • before_llm:每次 chat-generator 调用前执行,是上下文压缩、预算检查等高频钩子的挂载点;
  • before_tool:模型请求工具调用后、工具执行前执行,人工审批(Human-in-the-Loop)钩子挂在这里;
  • after_tool:工具执行后执行,工具结果卸载钩子挂在这里;
  • on_exit:Agent 退出时执行,适合强制校验(例如必须保存结果);
  • after_run:整个运行结束后执行。

仓库中已内置多种开箱即用的钩子实现:

  • Token 预算控制:haystack/hooks/budget/hooks.py 中的TokenBudgetHook,在before_llm检查 Agent 状态中累计的 token 用量,可设置max_total_tokens;
  • 上下文压缩:haystack/hooks/compaction 目录提供滑动窗口压缩(SlidingWindowCompactor)、摘要压缩(SummarizationCompactor)与工具结果裁剪(ToolResultPruningCompactor);
  • 人工介入:haystack/hooks/human_in_the_loop/hooks.py 的确认钩子,在before_tool对待执行的工具调用施加人工确认策略;
  • 工具结果卸载:haystack/hooks/tool_result_offloading/hooks.py 在after_tool将大段工具结果写入外部存储,让下一次 LLM 调用只看到引用。

钩子函数遵循统一签名def my_hook(state: State) -> None,并通过 haystack/hooks/from_function.py 的FunctionHook包装为可序列化的Hook,支持同步与异步(async_function)双实现。

技能渐进发现:SkillToolset 与 SearchableToolset

README 提到可以通过SkillToolset实现"技能描述按需进入上下文"。在 haystack/tools/searchable_toolset.py 中,SearchableToolset正是这一机制的实现:它继承Toolset,为大量工具自动生成一个引导(bootstrap)搜索工具,让 Agent 先用关键词检索工具名/描述(每个工具的Document(content=f"{tool.name} {tool.description}")被索引进内存文档存储),再决定调用哪些工具,从而避免把全部技能描述塞进上下文。

上下文工程(Context Engineering)

README 强调 Haystack "Built for context engineering":在信息到达模型之前,你可以显式控制信息如何被检索、排序、过滤、组合、结构化与路由。这一设计体现在组件生态上——haystack/components 下按职责划分了检索器(retrievers)、排序器(rankers)、路由器(routers)、连接器(joiners)、预处理器(preprocessors)、构建器(builders)等 20 余个类别,配合 Pipeline 的循环(loops)、分支(branches)与条件逻辑(conditional logic),可以精确控制上下文在流水线中的流动方式。

原生异步支持

同一个Pipeline既可以同步运行也可以异步运行,并支持逐 token 流式输出(streaming);Agent支持并发工具调用(默认tool_concurrency_limit=4)。同步接口是run(),异步接口是run_async(),这在 haystack/core/pipeline/base.py 与 agent.py 的run/run_async双实现中均有体现。

模块化与可定制:组件契约

Haystack 的组件契约定义在 haystack/core/component/component.py,这是整个框架扩展性的根基:

  • 任何类只要被@component装饰即可被 Pipeline 使用;
  • __init__只接收基础 Python 类型(对象、函数等需序列化为字符串),且必须保持轻量——重型状态(模型、后端)应放在warm_up()中延迟加载;
  • 组件可声明输入/输出 socket,Pipeline 据此进行类型检查与连接校验;
  • 组件通过to_dict()/from_dict()实现序列化,配合 haystack/core/serialization.py 的default_to_dict/default_from_dict即可支持流水线保存与加载。

顶层入口 haystack/init.py 直接导出了Pipeline、component、Document、ChatMessage、Answer等最常用的 API。

模型与厂商无关

Haystack 通过统一接口集成 OpenAI、Mistral、Anthropic、Cohere、Hugging Face、Google、Azure OpenAI、AWS Bedrock 以及本地模型,切换模型或基础设施组件时无需重写系统。这得益于统一的ChatGenerator协议与 haystack/utils/secret 管理 等抽象层——例如在快速上手示例中,OpenAI、Hugging Face、Anthropic、Bedrock、Gemini 的接入代码结构完全一致。

可扩展生态

一致的组件接口让社区和第三方可以轻松扩展 Haystack。集成代码托管在独立的 haystack-core-integrations 仓库(本仓库不包含),同时 haystack/testing/sample_components 中提供了 17 个示例组件,可作为自定义组件的参考实现。

快速上手:构建第一个 RAG 流水线

下面基于官方快速入门(docs-website/docs/overview/get-started.mdx)演示如何用 10 分钟构建一个检索增强生成(RAG)应用。

from haystack import Pipeline, Document from haystack.components.generators.chat import OpenAIChatGenerator from haystack.components.retrievers import InMemoryBM25Retriever from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack.components.builders import ChatPromptBuilder from haystack.utils import Secret from haystack.dataclasses import ChatMessage # 1. 准备内存文档存储并写入文档 document_store = InMemoryDocumentStore() document_store.write_documents( [ Document(content="My name is Jean and I live in Paris."), Document(content="My name is Mark and I live in Berlin."), Document(content="My name is Giorgio and I live in Rome."), ], ) # 2. 定义提示模板(Jinja2 语法) prompt_template = [ ChatMessage.from_system( """ Given these documents, answer the question. Documents: {% for doc in documents %} {{ doc.content }} {% endfor %} """, ), ChatMessage.from_user("{{question}}"), ] # 3. 组装组件 retriever = InMemoryBM25Retriever(document_store=document_store) prompt_builder = ChatPromptBuilder(template=prompt_template, required_variables="*") llm = OpenAIChatGenerator( api_key=Secret.from_env_var("OPENAI_API_KEY"), model="gpt-4o-mini", ) # 4. 构建流水线并连接组件 rag_pipeline = Pipeline() rag_pipeline.add_component("retriever", retriever) rag_pipeline.add_component("prompt_builder", prompt_builder) rag_pipeline.add_component("llm", llm) rag_pipeline.connect("retriever", "prompt_builder.documents") rag_pipeline.connect("prompt_builder", "llm") # 5. 运行 question = "Who lives in Paris?" results = rag_pipeline.run( { "retriever": {"query": question}, "prompt_builder": {"question": question}, }, ) print(results["llm"]["replies"])

这段代码展示了 Haystack 的三个核心模式:

  1. 组件即插即用:InMemoryDocumentStore、InMemoryBM25Retriever、ChatPromptBuilder、OpenAIChatGenerator都是独立组件,通过Pipeline.add_component注册、connect连接;
  2. 显式数据流:connect("retriever", "prompt_builder.documents")精确指定了检索结果流向提示构建器的documents输入;
  3. 密钥管理:Secret.from_env_var("OPENAI_API_KEY")从环境变量读取 API Key,避免硬编码。

切换模型供应商也非常简单:把OpenAIChatGenerator换成HuggingFaceAPIChatGenerator(pip install huggingface-api-haystack)、AnthropicChatGenerator(pip install anthropic-haystack)、AmazonBedrockChatGenerator(pip install amazon-bedrock-haystack)或GoogleGenAIChatGenerator(pip install google-genai-haystack),流水线结构完全不变,详见 get-started.mdx 中的多供应商 Tabs 示例。

构建第一个工具调用 Agent

接下来构建一个能联网搜索并回答问题的 Agent:

from haystack.components.agents import Agent from haystack.components.generators.chat import OpenAIChatGenerator from haystack.dataclasses import ChatMessage from haystack.tools import ComponentTool from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch from haystack.utils import Secret # 将 Web 搜索组件包装为工具 search_tool = ComponentTool(component=SerperDevWebSearch()) agent = Agent( chat_generator=OpenAIChatGenerator( api_key=Secret.from_env_var("OPENAI_API_KEY"), model="gpt-4o-mini", ), tools=[search_tool], system_prompt="You are a helpful assistant that can search the web for information.", ) result = agent.run(messages=[ChatMessage.from_user("What is Haystack AI?")]) print(result["last_message"].text)

要点说明:

  • 需要先执行pip install serperdev-haystack并设置SERPERDEV_API_KEY环境变量;
  • ComponentTool可以把任意 Haystack 组件包装成 Agent 可调用的工具(haystack/tools/component_tool.py),这是"组件即工具"的关键桥梁;
  • 除了ComponentTool,haystack/tools 还提供@tool装饰器(从普通函数创建工具)、PipelineTool(把整个流水线变成工具)和Toolset(工具分组),完整的工具抽象层次可参考 haystack/tools/toolset.py。

用钩子为 Agent 加上护栏与成本控制

将 Agent 部署到生产环境时,token 成本与上下文失控是首要问题。借助内置的TokenBudgetHook可以做到按预算停机:

from haystack.components.agents import Agent from haystack.hooks.budget.hooks import TokenBudgetHook agent = Agent( chat_generator=..., tools=[...], hooks={"before_llm": [TokenBudgetHook(max_total_tokens=100_000)]}, )

自定义钩子同样简单——只需定义一个接收State参数的函数:

from haystack.hooks.from_function import hook @hook def require_save(state) -> None: if not state.data["saved"]: raise RuntimeError("The agent must save the result before exiting.") agent = Agent( chat_generator=..., tools=[...], hooks={"on_exit": [require_save]}, )

钩子可以直接变更State数据来影响运行流程(例如通过stop_run键强制提前退出),从而实现预算控制、人工审批、上下文压缩、工具结果卸载等生产级能力,相关实现均可在 haystack/hooks 目录下找到。

部署与运维

REST API 与 MCP 服务

README 特别推荐了 Hayhooks:它可以把流水线和 Agent 包装成带自定义逻辑的REST API或MCP server对外暴露,并支持 OpenAI 兼容的 chat completion 端点,可配合 open-webui 等聊天界面使用。

遥测与隐私

Haystack 会收集匿名的组件使用统计:每次组件初始化时发送一次事件,用于了解哪些组件对社区最有价值。具体机制在 haystack/telemetry/_telemetry.py 中实现:

  • 默认启用(HAYSTACK_TELEMETRY_ENABLED未设置或为true/1时创建Telemetry实例);
  • 事件通过 PostHog 发送,每次运行流水线至少间隔 60 秒才发送一次(MIN_SECONDS_BETWEEN_EVENTS = 60);
  • 用户 ID 保存在~/.haystack/config.yaml中,首次运行自动生成;
  • 即使遥测发送失败也不会影响业务(所有异常均被捕获并降级为 debug 日志,"Never let telemetry break things")。

关闭遥测:设置环境变量HAYSTACK_TELEMETRY_ENABLED=false即可,例如:

export HAYSTACK_TELEMETRY_ENABLED=false

企业级支持

如需团队级支持与部署保障,deepset 提供Haystack Enterprise Starter(企业级模板、云端与本地部署指南)与Haystack Enterprise Platform(带可观测性、协作、治理与访问控制的托管/自托管平台),相关内容在 README 的 Haystack Enterprise 一节中有详细介绍,这里不展开。

社区与贡献

Haystack 的贡献指南见仓库根目录的 CONTRIBUTING.md,贡献方式包括:

  1. 贡献主项目(本仓库);
  2. 在 haystack-core-integrations 仓库贡献集成;
  3. 在 docs-website 目录贡献文档。

releasenotes/notes 目录保存了全部变更说明(release notes),可作为了解功能演进的一手资料;AGENTS.md 与 CLAUDE.md 则为 AI 编码代理提供了仓库协作约定。

总结

Haystack 3.x 的核心价值可以概括为三点:

  1. 透明可控:组件 + Pipeline 的显式数据流设计,让检索、路由、记忆、生成每一步都可观察、可调试、可替换;
  2. 生产就绪:Agent 生命周期钩子、step_count/token_usage/tool_call_counts内置监控、原生异步、流式输出,覆盖了从原型到上线的完整路径;
  3. 生态开放:统一组件契约 + 多模型供应商接入 + 可扩展的工具/工具集抽象(Tool、ComponentTool、PipelineTool、Toolset、SearchableToolset),让团队可以按需组合最合适的模型与基础设施。

想深入掌握,推荐依次阅读仓库内的 组件契约定义、Pipeline 实现、Agent 实现 与 钩子协议,再结合 官方文档目录 中的概念与组件文档进行实战练习。

【免费下载链接】haystackOpen-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, memory, and generation. Built for scalable agents, RAG, multimodal applications, semantic search, and conversational systems.项目地址: https://gitcode.com/GitHub_Trending/ha/haystack

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询