Haystack 2.0-Beta 和 Haystack 的 Advent 简介
来看看我们对最终将成为 Haystack 2.0 的第一个承诺
2023年12月4日今天,我们非常高兴地宣布,我们发布了 Haystack 2.0-Beta,以及我们有史以来的第一个 Haystack 的 Advent:我们将发布一系列 10 个挑战,在整个 12 月份公布,每个挑战都将介绍 Haystack 2.0-Beta 的特性和设计。
这次发布对我意味着什么?
自我们开始构建 Haystack 2.0 的第一天起,我们就让社区参与到我们的设计决策中,并且我们在 GitHub 和通过我们的 Discord 社区上收到的反馈被证明是非常有价值的。虽然这还不是 Haystack 2.0 的完整稳定版本,但我们希望让这个新设计的第一个官方承诺可供您测试并真正体验 Haystack 的改进之处。我们致力于重新设计我们的 LLM 框架,并且我们需要您的帮助来塑造它。要参与,请完成并提交挑战,并就您的体验给我们提供任何反馈。
那么,您现在应该迁移您的 Haystack 管道吗?不。这还不是 Haystack 2.0 的稳定版本,并且在 2.0.0 发布时,将有一套迁移指南来帮助您完成这项任务。好消息是,Haystack 2.0-Beta 将以全新的 `haystack-ai` 包的形式提供给您,因此您无需更改您现有的依赖于 `farm-haystack` 的 Haystack 部署。我们将继续维护 Haystack 1.x(目前为 1.22.1),它将继续在 `farm-haystack` 下发布。
但是您应该使用 Haystack 2.0-Beta 吗?是的!因为 Haystack 2.0-Beta 在构建和自定义生产就绪的 LLM 应用程序方面引入了一些重大改进。最好的方法是参与 Haystack 的 Advent 并查看 2.0-Beta 文档。
开始使用:pip install haystack-ai 🎉
Haystack 2.0-Beta 尚未实现与 Haystack 1.x 的功能对等。一旦实现更高程度的功能对等,Haystack 2.0 的稳定版本将发布。要查看此 Beta 版本中可用功能的完整列表,请查看我们的 发布说明。
在过去的几个月里,我们还与一些合作伙伴和社区成员合作,将 Haystack 集成扩展到兼容 Haystack 2.0 的集成。今天,您也可以从这个 Beta 版本开始使用它们。
为什么 Haystack 会改变
当 Haystack 的第一个正式版本在 2020 年问世时,许多设计都围绕着检索、嵌入创建、索引、语义搜索和抽取式 QA。正如您可能已经看到的,在过去的(近)两年里,这种情况已经完全改变了。随着 LLM 的兴起,我们希望构建更多利用检索增强生成 (RAG)、代理和不断扩展的 LLM 功能的应用程序。
虽然 Haystack 1.x 的设计——尤其是管道架构——非常适合这些用例,但开发者体验有时不太直观且难以自定义,尤其是在偏离标准语义搜索用例时。这主要是由于 1.x 设计中的一些主要假设。例如,如果您使用过 Haystack,您就会知道一个管道必须以“Query”或“File”输入开始,即使最终您不想使用它们。通过在 Haystack 1.12.1 中添加 `PromptNode`,Haystack 1.x 仍然可以成为许多 LLM 应用程序构建的基础。然而,我们框架的设计常常使得导航它实际提供的巨大可选性变得困难,许多模型提供商和功能似乎“隐藏”在更大的概念中,如 PromptNode,甚至 `EmbeddingRetriever`。
有了 Haystack 2.0,我们的目标是更明确地说明每个组件的作用,并且(可能要利用一个过度使用的术语)使代码具有自解释性,同时使 Pipeline 和 Component 架构更加灵活、可扩展、可自定义,同时保持我们在生产就绪性方面的高标准。
Haystack 如何改变
尽管 Haystack 2.0 是对框架的完全重新设计,但它仍然根植于对其先前成功做出贡献的基本抽象:用户可以继续使用管道、文档存储和节点,这些现在已被重命名为“组件”。
在这里,我们将简要介绍一些主要的变化,特别是关于开发者体验。要了解我们在功能对等性方面与 Haystack 1.x 的差距,请查看我们 发布说明中的表格。
组件
节点一直被认为是 Haystack 管道的构建块,但这种类比并不完全准确。如果有人给了你积木,他们会认为你可以随意组合它们,但对于节点来说并非如此:例如,你只能把 Document Store 类型的节点放在管道的最后。如果你想知道为什么会这样,想象一下用乐高积木搭建东西,只是砖块的凸起和管子尺寸各不相同,你必须尝试哪块可能适合另一块。
我们在 Haystack 2.0 中决定将 Node 的名称更改为 Component,以强调新设计的不同之处。组件仍然是 Pipeline 的构建块,但这次类比是真的。
- 每个组件都声明其输入和输出类型,清楚地表明它可以连接到哪个其他组件。因此,连接可以在构建 Pipeline 时进行验证。
- 每个组件都是独立的,并实现特定的目的:我们认为一个好的组件应该只有一个工作。
- 每个组件必须遵守严格的合同才能在 Pipeline 中使用,但其他一切都留给开发者提供最大的灵活性。您可以将这种灵活性扩展到“独立”运行单个组件,而无需 Pipeline。
例如,下面是一个组件,它接收一个 `query` 并返回一个文档列表作为 `documents`。
from typing import List
from haystack import component, Document
@component
class MyCustomComponent():
@component.output_types(documents=List[Document])
def run(self, query: str):
# do something
return {'documents': docs}
要查看完整示例,您可以查看 Tuana 构建的一个自定义组件,该组件 获取最新的 Hacker News 文章。
您可以在 这里找到 Haystack 2.0-Beta 组件的完整文档。
管道
管道是 Haystack 的核心产品,这一点没有改变。不同之处在于管道可以做什么以及如何组装。事实上,Haystack Advent 的第一个挑战将向您展示最明显的改变。
连接
连接管道组件变得更加灵活。我们正在摒弃需要“Query”或“File”作为第一个输入的严格合同,并且每个组件都可以连接到任何其他兼容的组件(甚至更多),明确指出哪个输出连接到哪个输入。因此,Pipeline 运行的最终输入和输出将完全取决于组件的布局方式。
在 Haystack 1.x 中
from haystack import Pipeline
pipeline = Pipeline()
pipeline.add_node(component=my_component_1, name="My_Component_1", inputs=["Query"])
pipeline.add_node(component=my_component_2, name="My_Component_2", inputs=["My_Component_1"])
在 Haystack 2.0-Beta 中
from haystack import Pipeline
pipeline = Pipeline()
pipeline.add_component(instance=my_component_1, name="my_component_1")
pipeline.add_component(instance=my_component_2, name="my_component_2")
pipeline.connect("my_component_1.output_1", "my_component_2.input_4")
pipeline.connect("my_component_1.output_3", "my_component_2.input_1")
有向(多)图(淘汰了无环图)
Haystack 1.x 管道实现为有向无环图 (DAG)。Massi 的类比是,在 Haystack 1.x 中使用管道就像从滑水道滑下。一个可以从平台分支出来并在主泳池汇合的强大架构,在 Haystack 1.x 中构建管道就是将您需要的节点串联起来以构建您想要实现的 NLP 应用程序。但它总是单向的,有清晰的开始和结束。
在 Haystack 2.0 中,我们取消了 DAG 中的“A”(即无环),这意味着我们可以拥有可以分支、汇合,甚至循环回另一个组件的管道。这使我们能够为可以重试、循环回、甚至可能永远作为服务的管道设置 Haystack 框架。我们尝试构建的第一件事是“retry”组件,它允许 Pipeline 在认为输出不够好时循环回。
这些新管道在技术上也属于多图,意味着一个具有多个输出的组件可以连接到另一个具有多个输入的组件。
序列化
序列化是指将管道转换为可以在磁盘上保存或通过网络发送以便稍后加载的格式。在 Haystack 1.x 和 Haystack 2.0-beta 中,我们都使用 YAML 进行此操作,尽管我们将为 Haystack 2.0 扩展对其他格式的支持。
然而,在序列化方面,Haystack 的主要变化之一是向核心项目添加了“Marshallers”。Marshallers 是我们提供不同序列化格式给管道的方式,它们可以用来添加 Haystack 本身不支持的任何格式。例如,如果您想用 TOML 表示管道,您可以创建一个 TOML Marshaller,然后将其传递给序列化 API。
您可以在 这里找到 Haystack 2.0-Beta 管道的完整文档。您可以在 这里找到 Haystack 2.0-Beta 管道序列化的完整文档。
提示模板
另一个令我们兴奋的变化是 Haystack 2.0 中提示模板的变化,这在此 Beta 版本中已经可用。我们现在使用 Jinja 模板进行提示,使其非常清晰易读,可以构建包含循环并且甚至可以在提示中使用函数的提示。例如,下面是一个 Haystack 2.0 中简单的提示模板,它遍历文档并还从这些文档中添加一些元信息到提示中。
from haystack.builders import PromptBuilder
prompt_template = """ Answer the question based on the context. Refer to the URL
in the generated answer.
Context:
{% for doc in documents %}
{{doc.content}}
URL: {{article.meta['url']}}
{% endfor %}
Question: {{question}}
"""
prompt_builder = PromptBuilder(template=prompt_template)
加入我们测试 Haystack 2.0-Beta
Haystack 2.0-Beta 的发布标志着 Haystack 框架演进的重要里程碑。这次公告还有一个额外的奖励——首届 Haystack Advent,在整个 12 月份提供 10 个挑战,为您提供了探索最新版本特性和设计的实践机会。Haystack 2.0 的开发是与社区合作的成果,虽然还不是稳定版本,但这个 Beta 版本邀请您测试并参与塑造 Haystack 的未来。
为 Haystack 的演进和未来的激动人心的发展干杯!🎉
