在人工智能的世界中,开发者有许多工具和技术可以用来创建基于大型语言模型(LLM)的应用程序。而最近,一款名为 Haystack 的开源框架正在崭露头角,成为构建 AI 应用的强大工具。本文将详细解读 Haystack 的独特优势,并探讨其在 LLM 生态系统中的竞争力。最后,我们将通过一个 RAG(检索增强生成)案例来展示其实际应用。
什么是 Haystack?
Haystack 是一款专为开发 LLM 应用设计的工具包,它特别适用于处理大量文本或文档的场景。Haystack 的特点是代码量少、易于上手,可以快速搭建生产级别的 LLM 应用。正如其名字暗示,Haystack 就像一组可以自由组合的积木,用于创建各种类型的 AI 系统。
以下是一些 Haystack 可实现的功能:
- 构建基于海量文档的问答型聊天机器人
- 开发能够从多个文档中提取特定信息的系统
- 创建可以理解并处理文本、图像等多种数据类型的应用程序
在 Python 3.10 环境中,只需一行代码即可安装:
pip install haystack-ai
Haystack 的核心工作原理
Haystack 的运作基于两个核心概念:
- 组件(Components)
每个组件负责特定的任务。例如,一个组件可能用于检索相关文档,另一个组件则生成文本回答。 - 管道(Pipelines)
管道负责连接这些组件,定义组件间的工作顺序以及数据流动的方式。
通过灵活组合不同的组件,开发者可以创建能够执行复杂任务的 AI 系统。
Haystack 的主要特性
1. 灵活性
Haystack 支持多种 AI 模型(如 OpenAI、HuggingFace)和数据存储系统(如 ChromaDB、Pinecone,甚至是 Neo4j)。
2. 易用性
无需深入了解 AI 复杂细节,即可使用 Haystack 构建应用。
3. 高度可定制
支持通过 Pydantic 结构自定义新组件,满足特定需求。
4. 丰富的应用场景
适用于从问答系统到信息抽取等多种 AI 应用的开发。
用例展示:构建 RAG 管道
接下来,本文将通过一个检索增强生成(RAG)案例,带你动手实现 Haystack 的实战应用。
文档清理与处理管道
首先,为了处理 HTML 文档,我们需要安装以下依赖:
pip install trafilatura lxml_html_clean
导入必要的库文件:
import urllib.request
from haystack import Pipeline
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.retrievers import InMemoryEmbeddingRetriever
from haystack.components.converters import HTMLToDocument
from haystack.components.preprocessors import DocumentCleaner, DocumentSplitter
from haystack.components.embedders import OpenAIDocumentEmbedder
from haystack.components.writers import DocumentWriter
from dotenv import load_dotenv
load_dotenv()
将文档存储到内存中:
document_store = InMemoryDocumentStore()
创建一个 HTML 转换器以处理文档:
text_file_converter = HTMLToDocument()
文档清理组件会移除空行、多余空格等,优化文本的可读性:
cleaner = DocumentCleaner()
然后,使用分割器将长文档拆分为句子块,每块包含5句:
splitter = DocumentSplitter(split_by="sentence", split_length=5)
嵌入器(Embedder)将计算每个文档的嵌入向量:
embedder = OpenAIDocumentEmbedder()
最后,通过 DocumentWriter 将处理后的文档存储到内存中:
writer = DocumentWriter(document_store)
将这些组件连接成一个完整的管道:
indexing_pipeline = Pipeline()
indexing_pipeline.add_component("converter", text_file_converter)
indexing_pipeline.add_component("cleaner", cleaner)
indexing_pipeline.add_component("splitter", splitter)
indexing_pipeline.add_component("embedder", embedder)
indexing_pipeline.add_component("writer", writer)
indexing_pipeline.connect("converter.documents", "cleaner.documents")
indexing_pipeline.connect("cleaner.documents", "splitter.documents")
indexing_pipeline.connect("splitter.documents", "embedder.documents")
indexing_pipeline.connect("embedder.documents", "writer.documents")
运行管道并处理示例文档:
indexing_pipeline.run(data={"sources": ["free_as_in_freedom.html"]})
构建 RAG 管道
在 RAG 部分,我们将加载处理好的文档,并定义检索和生成组件:
retriever = InMemoryEmbeddingRetriever(document_store)
prompt_template = """Given these documents, answer the question.
Documents:
{% for doc in documents %}
{{ doc.content }}
{% endfor %}
Question: {{query}}
Answer:"""
prompt_builder = PromptBuilder(template=prompt_template)
llm = OpenAIGenerator()
同样,通过管道连接这些组件:
rag_pipeline = Pipeline()
rag_pipeline.add_component("retriever", retriever)
rag_pipeline.add_component("prompt_builder", prompt_builder)
rag_pipeline.add_component("llm", llm)
rag_pipeline.connect("retriever.documents", "prompt_builder.documents")
rag_pipeline.connect("prompt_builder", "llm")
最后,输入查询并获取答案:
query = "What is the profession of Richard M. Stallman and where does he work?"
result = rag_pipeline.run(data={"prompt_builder": {"query": query}})
print(result["llm"]["replies"][0])
输出结果
通过简单几步,Haystack 生成了如下答案:
Richard M. Stallman is a software programmer and works at the Massachusetts Institute of Technology’s Artificial Intelligence Laboratory.
总结
Haystack 是一款极具潜力的开源工具,它让开发者能够高效地构建基于 LLM 的 AI 应用。从问答系统到信息抽取,Haystack 提供了灵活且强大的构建能力,帮助更多开发者轻松驾驭 AI 的复杂性。随着其功能不断完善,这一工具将在未来占据更重要的位置。