今天,我们发布了 Haystack 2.0 的稳定版本。这是 Haystack 框架的重写,因此这些发布说明与我们通常突出代码库特定更改的常规发布说明不同。相反,我们将重点介绍 Haystack 2.0 的功能以及它的使用方式。
有关我们对 Haystack 2.0 的动机以及我们的设计选择的更多信息,您可以阅读我们的发布公告文章。
要开始使用 Haystack,请遵循我们的快速入门指南。
🕺 亮点
- 🕺 亮点
- 📦 新的软件包
- 💪 强大的管道
- 🔌 可定制的组件
- 🍱 现成的管道模板
- 🗃️ 文档存储
- 🧩 集成
- 🕵️ 日志记录与跟踪
- 🏎️ 设备管理
- 🔐 密钥管理
- 📜 提示模板
- 🚀 开始使用
- 🧡 加入社区
- ⏳ Haystack 2.0-Beta 历史记录
📦 新的软件包
Haystack 2.0 分发为 `haystack-ai`,而 Haystack 1.x 将继续使用 `farm-haystack` 提供支持,进行安全更新和错误修复。
注意:将 `haystack-ai` 和 `farm-haystack` 安装到同一个 Python 环境中会导致冲突 - 请为每个包使用单独的虚拟环境。
有关更多信息,请查看安装指南。
💪 强大的管道
在 Haystack 2.0 中,管道是动态计算图,支持
- 🚦 控制流:需要根据另一个组件的输出运行不同的组件?2.0 版本轻松实现。
- ➿ 循环:通过重复执行图的一部分来实现复杂的行为,例如自纠正流程。
- 🎛️ 数据流:仅在需要时使用。Haystack 2.0 只将数据暴露给需要它的组件 - 有利于速度和透明度。
- ✅ 验证和类型检查:确保您管道中的所有组件在运行之前都是兼容的。
- 💾 序列化:将管道从不同格式保存和恢复。
可以通过几个简单的步骤构建管道
- 创建 `Pipeline` 对象。
- 使用 `add_component()` 方法将组件添加到管道。
- 使用 `connect()` 方法连接组件。尝试连接类型不兼容的组件将引发错误。
- 使用 `run()` 方法执行管道。
示例
以下管道对给定 URL 执行问题回答
import os
from haystack import Pipeline
from haystack.components.fetchers import LinkContentFetcher
from haystack.components.converters import HTMLToDocument
from haystack.components.builders import PromptBuilder
from haystack.components.generators import OpenAIGenerator
from haystack.utils import Secret
os.environ["OPENAI_API_KEY"] = "Your OpenAI API Key"
fetcher = LinkContentFetcher()
converter = HTMLToDocument()
prompt_template = """
According to the contents of this website:
{% for document in documents %}
{{document.content}}
{% endfor %}
Answer the given question: {{query}}
Answer:
"""
prompt_builder = PromptBuilder(template=prompt_template)
llm = OpenAIGenerator(api_key=Secret.from_env_var("OPENAI_API_KEY"))
pipeline = Pipeline()
pipeline.add_component("fetcher", fetcher)
pipeline.add_component("converter", converter)
pipeline.add_component("prompt", prompt_builder)
pipeline.add_component("llm", llm)
# pass the fetchers's `streams` output to the converter using the `sources` parameter
pipeline.connect("fetcher.streams", "converter.sources")
# pass the converted `documents to the prompt_builder using the `documents` parameter
pipeline.connect("converter.documents", "prompt.documents")
# pass the interpolated `prompt to the llm using the `prompt` parameter
pipeline.connect("prompt.prompt", "llm.prompt")
pipeline.run({"fetcher": {"urls": ["https://haystack.com.cn/overview/quick-start"]},
"prompt": {"query": "How should I install Haystack?"}})
print(result["llm"]["replies"][0])
🔌 可定制的组件
以前称为 *Nodes* 的组件已被正式化,具有明确定义的输入和输出,便于扩展和组合。
Haystack 2.0 提供了各种内置组件。以下是非详尽的概述
| 类别 | 描述 | 外部提供商与集成 |
|---|---|---|
| 音频转录器 | 将音频转录为文本 | OpenAI |
| 构建器 | 从模板构建提示和答案 | |
| 分类器 | 根据特定标准对文档进行分类 | |
| 连接器 | 与外部服务交互 | OpenAPI |
| 转换器 | 在不同格式之间转换数据 | Azure, Tika, Unstructured, PyPDF, OpenAPI, Jinja |
| 嵌入器 | 将文本和文档转换为向量表示 | Amazon Bedrock, Azure, Cohere, FastEmbed, Gradient, Hugging Face (Optimum, Sentence Transformers, Text Embedding Inference), Instructor, Jina, Mistral, Nvidia, Ollama, OpenAI |
| 提取器 | 从文档中提取信息 | Hugging Face, spaCy |
| 评估器 | 使用指标评估组件 | Ragas, DeepEval, UpTrain |
| 获取器 | 从远程 URL 获取数据 | |
| 生成器 | 使用生成模型提示和生成文本 | Amazon Bedrock, Amazon Sagemaker, Azure, Cohere, Google AI, Google Vertex, Gradient, Hugging Face, Llama.cpp, Mistral, Nvidia, Ollama, OpenAI |
| 连接器 | 合并来自不同组件的文档 | |
| 预处理器 | 预处理文本和文档 | |
| 排序器 | 根据特定标准对文档进行排序 | Hugging Face |
| 读取器 | 在文档中查找答案 | |
| 检索器 | 根据查询从文档存储中获取文档 | Astra, Chroma, Elasticsearch, MongoDB Atlas, OpenSearch, Pgvector, Pinecone, Qdrant, Weaviate |
| 路由器 | 操纵管道控制流 | |
| 验证器 | 根据模式验证数据 | |
| 网络搜索 | 执行搜索查询 | Search, SerperDev |
| 写入器 | 将数据写入数据源 |
自定义组件
如果 Haystack 缺少您需要的功能,您可以轻松创建自己的组件并将其插入管道。总的来说,编写自定义组件需要
- 使用 `@component` 装饰器创建一个类。
- 提供一个 `run()` 方法。传递给此方法的参数兼作组件的输入。
- 使用 `@component.output_types()` 装饰器定义 `run()` 方法的输出和输出类型。
- 返回一个包含组件输出的字典。
下面是一个接收 `text` 输入并返回随机向量表示作为 `embedding` 的玩具Embedder 组件的示例。
import random
from typing import List
from haystack import component, Pipeline
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever
@component
class MyEmbedder:
def __init__(self, dim: int = 128):
self.dim = dim
@component.output_types(embedding=List[float])
def run(self, text: str):
print(f"Random embedding for text : {text}")
embedding = [random.uniform(1.0, -1.0) for _ in range(self.dim)]
return {"embedding": embedding}
# Using the component directly
my_embedder = MyEmbedder()
my_embedder.run(text="Hi, my name is Tuana")
# Using the component in a pipeline
document_store = InMemoryDocumentStore()
query_pipeline = Pipeline()
query_pipeline.add_component("text_embedder", MyEmbedder())
query_pipeline.add_component("retriever", InMemoryEmbeddingRetriever(document_store=document_store))
query_pipeline.connect("text_embedder.embedding", "retriever.query_embedding")
query_pipeline.run({"text_embedder":{"text": "Who lives in Berlin?"}})
🍱 现成的管道模板
Haystack 2.0 提供了现成的管道模板,适用于常见用例,只需一行代码即可创建。
示例
from haystack import Pipeline, PredefinedPipeline
pipeline = Pipeline.from_template(PredefinedPipeline.CHAT_WITH_WEBSITE)
# and then you can run this pipeline 👇
# pipeline.run({
# "fetcher": {"urls": ["https://haystack.com.cn/overview/quick-start"]},
# "prompt": {"query": "How should I install Haystack?"}}
# )
🗃️ 文档存储
在 Haystack 2.0 中,文档存储提供了一个通用接口,管道组件可以通过该接口读取和操作数据,而无需了解后端技术。此外,文档存储与专门的检索器组件配对,这些组件可用于根据特定查询从特定数据源中检索文档。
这种接口和实现的隔离使我们能够支持多种第三方向量数据库提供商,例如 Weaviate、Chroma、Pinecone、Astra DB、MongoDB、Qdrant、Pgvector、Elasticsearch、OpenSearch、Neo4j 和 Marqo。
示例
#pip install chroma-haystack
from haystack_integrations.document_stores.chroma import ChromaDocumentStore
from haystack_integrations.components.retrievers.chroma import ChromaEmbeddingRetriever
document_store = ChromaDocumentStore()
retriever = ChromaEmbeddingRetriever(document_store)
🧩 集成
得益于 Haystack 2.0 的灵活基础设施,管道可以轻松地以新组件、文档存储等形式扩展外部技术和库,同时保持依赖项的整洁分离。
从 2.0 开始,集成分为两类
- 核心集成 - 这些由 deepset 维护,属于`haystack-core-integrations` GitHub 仓库。
- 社区和合作伙伴集成 - 这些由社区成员和我们的合作伙伴维护。
有关更多信息,请参阅官方集成网站。
🕵️ 日志记录与跟踪
Haystack 2.0 管道在生产环境中的监控由可定制的日志系统(支持开箱即用的结构化日志记录和跟踪相关性)和代码插装(在执行路径的战略点收集 span 和 trace)提供支持,已内置 Open Telemetry 和 Datadog 支持。
🏎️ 设备管理
Haystack 2.0 提供了一个与框架无关的系统,用于在不同平台和提供商之间寻址和使用 GPU 和加速器等设备。
🔐 密钥管理
为了安全地管理需要身份验证的服务凭据,Haystack 2.0 提供了一种类型安全的方法来处理身份验证和 API 密钥,以防止意外泄露。
📜 提示模板
Haystack 2.0 提示模板使用Jinja,并通过 `PromptBuilder`(或高级用例的 `DymanicPromptBuilder`)将提示包含在管道中。提示中 `{{ }}` 中的所有内容都将成为 `PromptBuilder` 的输入。
示例
以下 `prompt_builder` 将期望 `documents` 和 `query` 作为输入。
from haystack.components.builders import PromptBuilder
template = """Given these documents, answer the question.
Documents:
{% for doc in documents %}
{{ doc.content }}
{% endfor %}
Question: {{query}}
Answer:"""
prompt_builder = PromptBuilder(template=template)
🚀 开始使用
与 Haystack 2.0 一同,我们今天还发布了一整套新的教程、文档、资源等,以帮助您入门
- 开始使用:一个快速入门指南,包含可直接运行的代码。
- 文档:关于所有 Haystack 概念和组件的完整技术文档。
- 教程:循序渐进、可运行的 Colab Notebook。从我们的第一个 2.0 教程“使用检索增强创建您的第一个 QA 管道”开始。
- Cookbooks:一组有用的 Notebook,展示了 Haystack 在各种场景下的使用,使用了我们的一些集成。
🧡 加入社区
及时了解 Haystack 的最新动态
⏳ Haystack 2.0-Beta 历史记录
关注我们在 Beta 测试期间在每次 Beta 版本中取得的进展
