📘 **TELUS Agriculture & Consumer Goods** 如何通过 **Haystack Agents** 转变促销交易

Haystack 2.0.0

在 Github 上查看

今天,我们发布了 Haystack 2.0 的稳定版本。这是 Haystack 框架的重写,因此这些发布说明与我们通常突出代码库特定更改的常规发布说明不同。相反,我们将重点介绍 Haystack 2.0 的功能以及它的使用方式。

有关我们对 Haystack 2.0 的动机以及我们的设计选择的更多信息,您可以阅读我们的发布公告文章

要开始使用 Haystack,请遵循我们的快速入门指南

🕺 亮点

📦 新的软件包

Haystack 2.0 分发为 `haystack-ai`,而 Haystack 1.x 将继续使用 `farm-haystack` 提供支持,进行安全更新和错误修复。

注意:将 `haystack-ai` 和 `farm-haystack` 安装到同一个 Python 环境中会导致冲突 - 请为每个包使用单独的虚拟环境。

有关更多信息,请查看安装指南

💪 强大的管道

在 Haystack 2.0 中,管道是动态计算图,支持

  • 🚦 控制流:需要根据另一个组件的输出运行不同的组件?2.0 版本轻松实现。
  • 循环:通过重复执行图的一部分来实现复杂的行为,例如自纠正流程。
  • 🎛️ 数据流:仅在需要时使用。Haystack 2.0 只将数据暴露给需要它的组件 - 有利于速度和透明度。
  • 验证和类型检查:确保您管道中的所有组件在运行之前都是兼容的。
  • 💾 序列化:将管道从不同格式保存和恢复。

可以通过几个简单的步骤构建管道

  1. 创建 `Pipeline` 对象。
  2. 使用 `add_component()` 方法将组件添加到管道。
  3. 使用 `connect()` 方法连接组件。尝试连接类型不兼容的组件将引发错误。
  4. 使用 `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 开始,集成分为两类

有关更多信息,请参阅官方集成网站。

🕵️ 日志记录与跟踪

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 的最新动态

⏳ Haystack 2.0-Beta 历史记录

关注我们在 Beta 测试期间在每次 Beta 版本中取得的进展