Haystack 2.0:可组合的开源 LLM 框架
认识 Haystack 2.0,一个更灵活、更可定制的 LLM 框架
2024 年 3 月 11 日今天,我们很高兴地宣布 Haystack 2.0 正式发布——我们为此付出了很多努力,并且其中一些人自 2023 年 12 月首次发布 beta 版本以来就已经在测试了。
Haystack 是一个开源的 Python 框架,用于构建生产就绪的 LLM 应用程序,集成了几乎所有主流的模型提供商和数据库。
Haystack 2.0 的核心是对前一个版本的重大重构,有一个非常明确的目标:实现可组合的 AI 系统,使其易于使用、定制、扩展、优化、评估并最终部署到生产环境。
我们鼓励您从今天开始使用 Haystack 2.0,无论您以前是否是 Haystack 用户。您可以通过安装 `haystack-ai` 来开始,这是我们用于 Haystack 2.0 的新软件包。
⭐️ 开始使用:
pip install haystack-ai并按照 开始使用 说明,仅需几行代码即可构建您的第一个 LLM 应用。
如果您已经在生产环境中使用 Haystack 1.0,请不用担心!如果您的应用程序依赖于 `farm-haystack` 并且您暂时不准备迁移,您无需采取任何行动:我们将继续支持 Haystack 1.0,发布安全更新和关键错误修复,让每个人都有足够的时间进行迁移。在接下来的几周里,我们还将开始分享一些迁移指南来帮助您。
为什么选择 Haystack 2.0?
Haystack 于 2020 年首次正式发布,那是在 NLP 前沿还是语义搜索、检索和抽取式问答的美好时光。在此期间,我们确立了 Haystack 的核心——组件和管道。这些允许用户通过组合所需的语言模型(嵌入、抽取式问答、排名)与他们选择的数据库来构建端到端应用程序。
2023 年 LLM 的爆发明确了两件事:
- 👍 管道-组件结构是构建具有许多活动部件的可组合 LLM 应用程序的绝佳抽象。
- 👎 Haystack 1.0 通常假设您将对一组文档进行检索和抽取式问答,这在构建 LLM 应用程序时会带来限制,并提供远非理想的开发者体验。
因此,我们决定为 Haystack 和我们的社区做的最好的事情是重写组件和管道架构,以跟上快速发展的 AI 行业。虽然 Haystack 2.0 是一个完全重写,但将组件组合成灵活管道的底层原理保持不变。
现在,让我们看看 Haystack 2.0 的支柱。
- 可组合且可自定义的管道
- 存储数据的通用接口
- 清晰的生产路径
- 检索增强的优化与评估
可组合且可自定义的管道
现代 LLM 应用程序 包含许多活动部件:检索器、排名器、LLM,以及更多,如实体提取器、摘要器、格式转换器和数据清理器。这些“子任务”中的每一个都是 Haystack 中的一个组件。
在 Haystack 的第一个版本中,我们证明了管道是连接所有这些活动部件的一个很好的抽象,但我们在 Haystack 1.0 中做出的一些假设可以追溯到 LLM 之前的时代,需要重新思考。
Haystack 1.0 的一个重要限制是不允许循环,并且管道图必须是无环的。这使得实现例如代理变得困难,代理通常设计有直到任务解决才会循环的推理流程。
在 Haystack 2.0 中,管道图可以有循环。结合决策组件(可以考虑执行流程中的 if-then-else 子句)和路由器(根据输入将执行流程导向特定子图的组件),可以用来构建复杂的循环,以模拟代理行为。
可自定义的组件
我们认为 AI 框架的设计应满足以下要求:
- 技术无关:允许用户灵活地决定每个组件使用什么供应商或技术,并易于将任何组件替换为另一个。
- 显式:使这些组件如何“交谈”变得透明。
- 灵活:在需要自定义行为时,可以创建自定义组件。
- 可扩展:为社区和第三方提供统一且简单的方式来构建自己的组件,并促进围绕 Haystack 的开放生态系统。
Haystack 2.0 中的所有组件(包括 Haystack 集成)都基于通用的“组件”接口构建。原则很简单:
- 组件在一个名为 `run` 的方法中实现某些逻辑。
- `run` 方法接收一个或多个输入值。
- `run` 方法返回一个或多个输出值。
以嵌入器为例:这些组件接收文本作为输入,创建向量表示(嵌入),并将其作为输出返回。另一方面,检索器可能需要嵌入作为输入,并返回文档作为输出。创建新组件时,决定其输入和输出是什么是构思过程的一部分。
虽然 Haystack 内置了许多现成的组件,但我们想强调的是,构建自己的自定义组件也是 Haystack 2.0 的核心功能。
事实上,我们自己也利用了这一点。例如,您可以阅读关于如何在 Haystack 管道中使用最新的优化技术(如 HyDE)以及自定义组件。
共享自定义组件
自 Haystack 2.0-Beta 发布以来,我们已经看到了拥有清晰定义的简单组件接口带来的好处。我们、我们的社区和第三方已经创建了许多组件,可以作为额外的包供您安装。
我们在 Haystack 集成页面上分享这些组件,该页面在过去几个月里已经扩展到包含各种组件(贡献者包括 Assembly AI、Jina AI、mixedbread ai 等)。我们将继续扩展此页面并添加新集成,如果您想与社区分享组件,可以通过在 haystack-integrations 上创建 PR 来帮助我们。要了解有关集成以及如何共享的更多信息,您可以查看我们的“集成简介”文档。
存储数据的通用接口
大多数 NLP 应用程序都在大量数据上运行。一种常见的模式是将您的内部知识库连接到一个大型语言模型(LLM),以便它可以回答问题、总结或翻译文档,并提取特定信息。例如,在检索增强生成管道(RAG)中,您通常会使用 LLM 来回答有关先前检索到的某些数据的问题。
这些数据必须来自某个地方,而 Haystack 2.0 提供了一个通用接口来以一致的方式访问它,无论数据来自哪里。这个接口称为“Document Store”,并且它为许多不同的存储服务实现了,以便可以从 Haystack 管道中轻松访问数据。
今天,我们发布 Haystack 2.0,并提供大量数据库和向量存储集成。这些包括Chroma、Weaviate、Pinecone、Qdrant、Elasticsearch、Open Search、pgvector、MongoDB、AstraDB、Neo4j、Marqo DB,并且列表将不断增长。如果您的存储服务尚未支持,或者您需要对现有服务进行高度定制,请遵循我们的创建自定义文档存储指南,您可以将 Haystack 管道连接到几乎任何存储服务中的数据。
清晰的生产路径
过去几年,我们在使用 Haystack 1.0 和与社区互动时积累的经验教给了我们两件事:
- 对于任何 AI 应用程序框架来说,功能齐全且对开发者友好至关重要。
- 只有在部署阶段之后,基于 AI 的应用程序才能真正产生影响。
在从头重写框架的同时,我们抓住了机会,融入了特定的功能,以简化 Haystack AI 应用程序在生产级环境中的部署。
- 一个可自定义的日志系统,开箱即支持结构化日志记录和跟踪关联。
- 代码插桩,在执行路径的关键点收集跨度(spans)和跟踪(traces),并已支持 Open Telemetry 和 Datadog。
此外,我们决定启动一个专门的项目来简化 Haystack 管道的部署,将其置于 RESTful API 之后:Hayhooks。
Hayhooks 是一个客户端-服务器应用程序,允许您部署 Haystack 管道,通过动态生成的 HTTP 端点提供服务。Haystack 2.0 的两个基础功能使这成为可能:
- 自省管道的能力,在运行时确定其输入和输出。这意味着每个 REST 端点都有明确定义的、动态生成的请求和响应正文的模式,所有这些都取决于特定的管道结构。
- 强大的序列化机制。这允许将 Haystack 管道从 Python 转换为首选的数据序列化格式,反之亦然。默认格式是 YAML,但 Haystack 的设计易于扩展对其他序列化格式的支持。
检索增强的优化与评估
我们已经看到了 Haystack 新设计的优势,管道优化和评估是利用 Haystack 2.0 的一些好例子。如何实现?
- 可以轻松扩展 Haystack 的功能
- 易于实现新集成
实现最新的检索优化
检索是 RAG 管道成功的关键步骤。并且有很多工作来优化这一步。有了 Haystack 2.0,我们能够:
并且我们将来能够添加更多优化技术!
评估
Haystack 2.0 发布时集成了几个评估框架:
以及模型化评估指南。
开始使用 Haystack 2.0
与 Haystack 2.0 一同发布的,今天我们还发布了一整套新的教程、文档、资源等,以帮助您入门:
- 文档:关于所有 Haystack 概念和组件的完整技术文档。
- 教程:分步、可运行的 Colab 笔记本。从我们的第一个 2.0 教程“使用检索增强创建您的第一个 QA 管道”开始。
- 食谱:一组有用的笔记本,展示了 Haystack 在各种场景中的应用,使用了我们的一些集成。
加入社区
随时了解 Haystack 的最新动态
