原文链接:https://haystack.deepset.ai/blog/haystack-2-release
今天,我们很高兴地宣布Haystack 2.0的稳定版本发布了[1] - 我们已经为此工作了一段时间,自2023年12月首次发布以来,已经有人用过测试版[2]了。
Haystack是一个开源的Python框架,用于构建可投入生产的LLM应用程序,并与几乎所有主要的模型提供商和数据库集成。
Haystack 2.0版本的核心是对先前版本的重大改进,其明确目标是:实现易于使用、定制、扩展、优化、评估并最终部署到生产环境的可组合 AI 系统。
无论您之前是否使用过Haystack,我们都鼓励您从今天开始使用Haystack 2.0。您可以通过安装haystack-ai
(我们为2.0版本提供的新安装包)来开始使用
❝⭐️ 入门:
pip install haystack-ai
并按照入门[3]说明,只需几行代码即可构建您的第一个LLM应用程序。
如果您已经在生产环境中使用Haystack 1.0,请不要担心!如果您的应用程序依赖于farm-haystack
,并且您还没有准备好迁移,也无需采取任何行动:我们将继续支持Haystack 1.0,发布安全更新和关键错误修复,让每个人有足够的时间进行迁移。在接下来的几周内,我们还将开始分享一些迁移指南,以帮助您完成迁移。
为什么选择Haystack 2.0?
Haystack最初于2020年正式发布[4],那时NLP的前沿是语义搜索、检索和抽取式问答。在此期间,我们确立了使Haystack成为_Haystack_的核心:组件[5]和流水线[6]。这使用户能够通过将他们想要的语言模型(嵌入、抽取式QA、排序)与他们选择的数据库相结合来构建端到端应用程序。
2023年LLM的蓬勃发展,使得两件事情变得更加显而易见:
👍 流水线-组件结构是用于构建具有许多部件的可组合LLM应用程序的绝佳范式。 👎 Haystack 1.0经常假设您将对一组文档进行检索和抽取式QA,在构建LLM应用程序时,这会施加限制并且使得开发人员的体验远远达不到理想状态。
因此,我们能为Haystack及其社区所能做的最好的事情就是重写组件和流水线架构,以跟上快节奏的AI行业的发展。虽然Haystack 2.0是完全重写的,但将组件组合成灵活流水线的基本原则保持不变。
让我们来看看Haystack 2.0的支柱:
可组合和可定制的流水线 用于存储数据的通用接口 清晰的生产路径 用于检索增强的优化和评估
可组合和可定制的流水线
现代LLM应用程序包含许多组件[7]:检索器、排序器、LLM等,还有实体提取器、摘要生成器、格式转换器和数据清理器等。这些"子任务"中的每一个都是Haystack中的一个组件。
通过Haystack的第一个版本,我们证明了流水线是连接所有这些移动部件的很好的范式,但我们在Haystack 1.0中做出的一些假设建立在LLM出现之前的基础上的,这些假设需要重新考虑。
在Haystack 1.0中的一个重要限制是不允许循环,并且流水线图必须是非循环的。这使得实现例如代理这样的应用变得困难,因为代理通常设计为一个推理流程,直到任务解决为止。
而在Haystack 2.0中,流水线图可以包含循环。结合决策组件(类似执行流程中的if-then-else语句)和路由器(根据输入将执行流程定向到特定子图的组件),这使得可以构建出复杂的循环结构,来模拟代理的行为。
可定制的组件
我们认为,AI框架的设计应满足以下要求:
与技术无关: 允许用户灵活地决定每个组件的供应商或技术,并且轻松地切换任何组件以适应不同需求。 明确: 确保组件之间的通信方式透明清晰。 灵活: 在需要自定义行为时,可以创建自定义组件。 可扩展性: 为社区和第三方提供统一且简单的方式来构建自己的组件,以促进Haystack周边的开放生态系统。
Haystack 2.0中的所有组件(包括Haystack集成[8])都是使用通用的"组件"接口构建的。原则很简单:
组件在名为 run
的方法中实现一些逻辑run
方法接收一个或多个输入值run
方法返回一个或多个输出值
以嵌入器[9]为例:这些组件期望文本作为输入并创建它们作为输出返回的向量表示(嵌入)。另一方面,检索器[10]可能需要嵌入作为输入并返回文档作为输出。在创建新组件时,决定其应该具有哪些输入和输出是构思过程的一部分。
虽然Haystack中内置了许多现成的组件,但我们要强调,构建自己的自定义组件[11]也是Haystack 2.0的核心功能。
❝事实上,我们自己也使用了这个功能。例如,您可以了解有关如何在Haystack流水线中使用最新优化技术(如HyDE) [12]的信息,使用自定义组件。
共享自定义组件
自Haystack 2.0-Beta发布以来,我们已经看到为组件提供定义明确的简单接口的好处。我们、我们的社区和第三方已经创建了许多组件,可作为附加软件包供您安装。
我们在Haystack Integrations[13]页面上分享这些内容,在过去几个月中,该页面已扩展为包括各种组件(包括来自Assembly AI[14]、Jina AI[15]、mixedbread ai[16]等的贡献)。我们将继续使用新的集成扩展此页面,如果您想与社区共享组件,可以通过在haystack-integrations上提交PR来帮助我们。要了解有关集成以及如何共享它们的更多信息,您可以查看我们的**"集成简介"文档**[17]。
用于存储数据的通用接口
大多数NLP应用程序都处理大量数据。一个常见的设计模式是将内部知识库连接到大型语言模型(LLM),以便它可以回答问题、总结或翻译文档以及提取特定信息。例如,在检索增强生成流水线(RAG)中,您通常使用LLM来回答有关先前检索到的某些数据的问题。
这些数据必须来自某个地方,Haystack 2.0提供了一个通用接口,以一致的方式访问它,与数据来自何处无关。此接口称为"文档存储",它针对许多不同的存储服务实现,使数据可以从Haystack流水线中轻松获得。
今天,我们发布了带有大量数据库和向量存储集成[18]的Haystack 2.0。包括Chroma[19]、Weaviate[20]、Pinecone[21]、Qdrant[22]、Elasticsearch[23]、Open Search[24]、pgvector[25]、MongoDB[26]、 AstraDB[27]、Neo4j[28]、Marqo DB[29],集成的数据库还在不断增加。如果您的存储服务尚不支持,或者您需要在现有存储服务之上进行高度定制,请遵循我们的创建自定义文档存储指南[30],您可以将Haystack流水线连接到几乎任何存储服务的数据。
清晰的生产路径
在过去几年中,我们在Haystack 1.0上的工作以及与其社区的互动教会了我们两件事:
对于任何AI应用程序框架来说,功能完整且对开发人员友好至关重要。 只有在部署阶段之后,基于AI的应用程序才能真正产生影响。
在从头重写框架时,我们借此机会纳入了特定功能,以简化在生产环境中部署基于 Haystack 的 AI 应用程序:
支持结构化日志记录和开箱即用的跟踪关联的可自定义日志系统[31]。 代码检测,收集执行路径中的跨度和跟踪[32],支持Open Telemetry和Datadog。
此外,我们决定启动一个专门的项目,以简化在RESTful API后面部署Haystack流水线:Hayhooks[33]。
Hayhooks是一个客户端-服务器应用程序,允许您部署Haystack流水线,通过动态生成的HTTP端点为它们提供服务。Haystack 2.0的两个基本功能使这成为可能:
在运行时检查流水线的能力,确定其输入和输出[34]。这意味着每个REST端点都有明确定义的、根据特定流水线结构动态生成的请求和响应主体模式。 强大的序列化机制[35]。这允许将Haystack流水线从Python转换为首选的数据序列化格式,反之亦然。默认格式是YAML,但Haystack旨在轻松扩展对其他序列化格式的支持。
检索增强的优化和评估
我们已经看到了新的Haystack设计的好处,流水线优化和评估就是我们如何利用Haystack 2.0的好例子。如何做到的?:
更容易扩展Haystack的功能 易于实现新的集成
实现最新的检索优化
检索是成功的RAG流水线的关键步骤。为优化此步骤已经做了大量工作。使用Haystack 2.0,我们能够:
轻松实现假设文档嵌入(HyDE),我们已经发布了HyDE指南[36]以及示例演练[37] 为Hugging Face的Optimum嵌入器[38]添加了集成
在此过程中,我们将能够添加更多优化技术!
评估
Haystack 2.0发布时,其中包含了一些评估框架集成:
Ragas[39] DeepEval[40] UpTrain[41]
以及基于模型的评估指南[42]。
开始使用Haystack 2.0
除了Haystack 2.0,今天我们还发布了一整套新的教程、文档、资源等,以帮助您入门:
文档[43]:Haystack所有概念和组件的完整技术文档 教程[44]:循序渐进的可运行Colab笔记本。从我们的第一个2.0教程**"使用检索增强创建您的第一个QA流水线"**[45]开始 Cookbooks[46]:展示各种场景下Haystack的有用笔记本集合,使用我们的许多集成。
一如既往,请关注我们的博客[47]和与其他平台的集成[48]以获取更新和新内容。
了解Haystack的最新动态:
Discord[49] 订阅我们的新闻通讯[50] Twitter[51] GitHub[52]
参考链接
[1] https://haystack.deepset.ai/release-notes/2.0.0
[2] https://haystack.deepset.ai/blog/introducing-haystack-2-beta-and-advent
[3] https://haystack.deepset.ai/overview/quick-start
[4] https://github.com/deepset-ai/haystack/releases/tag/0.2.1
[5] https://docs.haystack.deepset.ai/docs/nodes_overview
[6] https://docs.haystack.deepset.ai/docs/pipelines
[7] https://bair.berkeley.edu/blog/2024/02/18/compound-ai-systems/
[8] https://docs.haystack.deepset.ai/v2.0/docs/integrations
[9] https://docs.haystack.deepset.ai/v2.0/docs/embedders
[10] https://docs.haystack.deepset.ai/v2.0/docs/retrievers
[11] https://docs.haystack.deepset.ai/v2.0/docs/custom-components
[12] https://haystack.deepset.ai/blog/optimizing-retrieval-with-hyde
[13] https://haystack.deepset.ai/integrations
[14] https://haystack.deepset.ai/integrations/assemblyai
[15] https://haystack.deepset.ai/integrations/jina
[16] https://haystack.deepset.ai/integrations/mixedbread-ai
[17] https://docs.haystack.deepset.ai/v2.0/docs/integrations
[18] https://haystack.deepset.ai/integrations?type=Document+Store
[19] https://haystack.deepset.ai/integrations/chroma-documentstore
[20] https://haystack.deepset.ai/integrations/weaviate-document-store
[21] https://haystack.deepset.ai/integrations/pinecone-document-store
[22] https://haystack.deepset.ai/integrations/qdrant-document-store
[23] https://haystack.deepset.ai/integrations/elasticsearch-document-store
[24] https://haystack.deepset.ai/integrations/opensearch-document-store
[25] https://haystack.deepset.ai/integrations/pgvector-documentstore
[26] https://haystack.deepset.ai/integrations/mongodb
[27] https://haystack.deepset.ai/integrations/astradb
[28] https://haystack.deepset.ai/integrations/neo4j-document-store
[29] https://haystack.deepset.ai/integrations/marqo-document-store
[30] https://docs.haystack.deepset.ai/v2.0/docs/creating-custom-document-stores
[31] https://docs.haystack.deepset.ai/v2.0/docs/logging
[32] https://docs.haystack.deepset.ai/v2.0/docs/tracing
[33] https://docs.haystack.deepset.ai/v2.0/docs/hayhooks
[34] https://docs.haystack.deepset.ai/v2.0/reference/pipeline-api#pipelineinputs
[35] https://docs.haystack.deepset.ai/v2.0/docs/serialization
[36] https://docs.haystack.deepset.ai/v2.0/docs/hypothetical-document-embeddings-hyde
[37] https://haystack.deepset.ai/blog/optimizing-retrieval-with-hyde
[38] https://haystack.deepset.ai/integrations/optimum
[39] https://haystack.deepset.ai/integrations/ragas
[40] https://haystack.deepset.ai/integrations/deepeval
[41] https://haystack.deepset.ai/integrations/uptrain
[42] https://docs.haystack.deepset.ai/v2.0/docs/model-based-evaluation
[43] https://docs.haystack.deepset.ai/docs
[44] https://haystack.deepset.ai/tutorials
[45] https://haystack.deepset.ai/tutorials/27_first_rag_pipeline
[46] https://github.com/deepset-ai/haystack-cookbook
[47] https://haystack.deepset.ai/blog
[48] https://haystack.deepset.ai/integrations
[49] https://discord.com/invite/VBpFzsgRVF
[50] https://landing.deepset.ai/haystack-community-updates?utm-campaign=developer-relations&utm-source=blog&utm-medium=release
[51] https://twitter.com/Haystack_AI
[52] https://github.com/deepset-ai/haystack




