Haystack 入门教程
项目介绍
Haystack 是一个端到端的检索增强生成(RAG)框架,专注于构建高质量的问答系统和文档检索应用。它由 deepset 公司开发,提供了一套完整的工具和组件,用于处理从文档处理到检索再到生成的整个流程。
主要功能
- 文档处理:支持多种文档格式的解析和处理
- 检索系统:提供多种检索策略,包括稀疏检索和密集检索
- 生成系统:集成多种大语言模型,用于生成准确的回答
- 管道系统:通过模块化的管道组件构建复杂的RAG系统
- 评估工具:提供评估问答系统性能的工具
- 多语言支持:支持多种语言的文档处理和问答
项目特点
- 模块化设计:通过可组合的组件构建自定义RAG系统
- 高度可扩展:支持多种向量数据库、LLM模型和检索策略
- 生产就绪:提供企业级功能,如缓存、监控和部署工具
- 活跃的社区:持续更新和改进
- 丰富的文档:提供详细的文档和示例
安装与配置
安装步骤
- 安装Haystack核心包
pip install farm-haystack- 安装可选依赖
# 安装文档处理依赖
pip install "farm-haystack[file-conversion]"
# 安装向量数据库依赖(以FAISS为例)
pip install "farm-haystack[faiss]"
# 安装OpenAI依赖(用于使用GPT模型)
pip install "farm-haystack[openai]"
# 安装所有依赖
pip install "farm-haystack[all]"基本配置
from haystack.document_stores import FAISSDocumentStore
from haystack.nodes import EmbeddingRetriever, OpenAIAnswerGenerator
# 配置OpenAI API密钥
import os
os.environ["OPENAI_API_KEY"] = "your-api-key"
# 创建文档存储
document_store = FAISSDocumentStore(
faiss_index_factory_str="Flat",
embedding_dim=768
)核心概念
1. Document(文档)
Document是Haystack中的基本数据单元,代表一个包含文本内容和元数据的文档。
2. DocumentStore(文档存储)
DocumentStore负责存储和管理文档,支持多种后端,如FAISS、Elasticsearch、Milvus等。
3. Retriever(检索器)
Retriever负责从DocumentStore中检索与查询相关的文档。常见的检索器包括:
- EmbeddingRetriever:基于向量相似度的检索
- BM25Retriever:基于BM25算法的稀疏检索
- DensePassageRetriever:使用密集 passage 嵌入的检索
4. Reader(阅读器)
Reader负责从检索到的文档中提取答案,通常使用大语言模型。
5. Generator(生成器)
Generator负责生成回答,通常使用大语言模型。
6. Pipeline(管道)
Pipeline是Haystack的核心概念,通过组合不同的组件(如Retriever、Reader、Generator)构建完整的RAG系统。
基本使用
创建简单的RAG系统
from haystack.document_stores import FAISSDocumentStore
from haystack.nodes import EmbeddingRetriever, OpenAIAnswerGenerator, PromptNode
from haystack.pipelines import ExtractiveQAPipeline, GenerativeQAPipeline
# 创建文档存储
document_store = FAISSDocumentStore(
faiss_index_factory_str="Flat",
embedding_dim=768
)
# 准备文档
documents = [
{
"content": "Haystack是一个端到端的RAG框架,用于构建问答系统。",
"meta": {"name": "haystack_intro.txt"}
},
{
"content": "Haystack支持多种文档格式,包括PDF、Word、Markdown等。",
"meta": {"name": "haystack_features.txt"}
}
]
# 将文档写入存储
document_store.write_documents(documents)
# 创建检索器
retriever = EmbeddingRetriever(
document_store=document_store,
embedding_model="sentence-transformers/multi-qa-mpnet-base-dot-v1"
)
# 更新嵌入
document_store.update_embeddings(retriever)
# 创建生成器
generator = OpenAIAnswerGenerator(model="gpt-3.5-turbo")
# 创建生成式问答管道
pipeline = GenerativeQAPipeline(generator=generator, retriever=retriever)
# 执行查询
result = pipeline.run(
query="Haystack是什么?",
params={"Retriever": {"top_k": 3}}
)
print(result["answers"][0].answer)使用ExtractReader进行抽取式问答
from haystack.document_stores import FAISSDocumentStore
from haystack.nodes import EmbeddingRetriever, FARMReader
from haystack.pipelines import ExtractiveQAPipeline
# 创建文档存储
document_store = FAISSDocumentStore(
faiss_index_factory_str="Flat",
embedding_dim=768
)
# 准备文档(同上)
documents = [
{
"content": "Haystack是一个端到端的RAG框架,用于构建问答系统。",
"meta": {"name": "haystack_intro.txt"}
},
{
"content": "Haystack支持多种文档格式,包括PDF、Word、Markdown等。",
"meta": {"name": "haystack_features.txt"}
}
]
# 将文档写入存储
document_store.write_documents(documents)
# 创建检索器
retriever = EmbeddingRetriever(
document_store=document_store,
embedding_model="sentence-transformers/multi-qa-mpnet-base-dot-v1"
)
# 更新嵌入
document_store.update_embeddings(retriever)
# 创建阅读器
reader = FARMReader(model_name_or_path="deepset/roberta-base-squad2")
# 创建抽取式问答管道
pipeline = ExtractiveQAPipeline(reader=reader, retriever=retriever)
# 执行查询
result = pipeline.run(
query="Haystack是什么?",
params={"Retriever": {"top_k": 3}, "Reader": {"top_k": 1}}
)
print(result["answers"][0].answer)高级特性
1. 自定义管道
from haystack.pipelines import Pipeline
from haystack.nodes import EmbeddingRetriever, OpenAIAnswerGenerator, PromptNode
# 创建自定义管道
pipeline = Pipeline()
# 添加组件
pipeline.add_node(component=retriever, name="Retriever", inputs=["Query"])
pipeline.add_node(component=generator, name="Generator", inputs=["Retriever"])
# 执行查询
result = pipeline.run(
query="Haystack支持哪些文档格式?",
params={"Retriever": {"top_k": 3}}
)
print(result["answers"][0].answer)2. 使用Elasticsearch作为文档存储
from haystack.document_stores import ElasticsearchDocumentStore
# 创建Elasticsearch文档存储
document_store = ElasticsearchDocumentStore(
host="localhost",
port=9200,
index="documents"
)
# 准备文档
documents = [
{
"content": "Haystack是一个端到端的RAG框架,用于构建问答系统。",
"meta": {"name": "haystack_intro.txt"}
}
]
# 将文档写入存储
document_store.write_documents(documents)3. 多模态RAG
from haystack.nodes import MultimodalRetriever
from haystack.pipelines import Pipeline
# 创建多模态检索器
multimodal_retriever = MultimodalRetriever(
document_store=document_store,
query_embedding_model="sentence-transformers/clip-ViT-B-32",
document_embedding_models={
"text": "sentence-transformers/clip-ViT-B-32",
"image": "sentence-transformers/clip-ViT-B-32"
}
)
# 创建管道
pipeline = Pipeline()
pipeline.add_node(component=multimodal_retriever, name="Retriever", inputs=["Query"])
pipeline.add_node(component=generator, name="Generator", inputs=["Retriever"])
# 执行查询
result = pipeline.run(
query="显示关于Haystack的图片",
params={"Retriever": {"top_k": 3}}
)
print(result["answers"][0].answer)实际应用案例
案例1:企业知识问答系统
场景:企业内部知识管理,员工可以通过自然语言查询获取公司政策、产品信息等。
实现步骤:
- 收集和整理企业文档
- 使用Haystack处理和索引文档
- 部署问答系统
- 定期更新文档和索引
示例代码:
from haystack.document_stores import FAISSDocumentStore
from haystack.nodes import EmbeddingRetriever, OpenAIAnswerGenerator
from haystack.pipelines import GenerativeQAPipeline
from haystack.utils import convert_files_to_docs
# 创建文档存储
document_store = FAISSDocumentStore(
faiss_index_factory_str="Flat",
embedding_dim=768
)
# 加载企业文档
documents = convert_files_to_docs(dir_path="./company_docs")
# 将文档写入存储
document_store.write_documents(documents)
# 创建检索器
retriever = EmbeddingRetriever(
document_store=document_store,
embedding_model="sentence-transformers/multi-qa-mpnet-base-dot-v1"
)
# 更新嵌入
document_store.update_embeddings(retriever)
# 创建生成器
generator = OpenAIAnswerGenerator(model="gpt-3.5-turbo")
# 创建管道
pipeline = GenerativeQAPipeline(generator=generator, retriever=retriever)
# 示例查询
queries = [
"公司的休假政策是什么?",
"如何申请加班?",
"产品A的主要功能有哪些?"
]
for query in queries:
result = pipeline.run(
query=query,
params={"Retriever": {"top_k": 3}}
)
print(f"问题: {query}")
print(f"回答: {result['answers'][0].answer}\n")案例2:客户支持聊天机器人
场景:为客户提供24/7的自动问答服务,解决常见问题。
实现步骤:
- 收集客户常见问题和答案
- 使用Haystack构建问答系统
- 集成到网站或聊天平台
- 持续更新知识库
示例代码:
from haystack.document_stores import FAISSDocumentStore
from haystack.nodes import EmbeddingRetriever, OpenAIAnswerGenerator
from haystack.pipelines import GenerativeQAPipeline
# 创建文档存储
document_store = FAISSDocumentStore(
faiss_index_factory_str="Flat",
embedding_dim=768
)
# 准备FAQ文档
faq_documents = [
{
"content": "如何重置密码?您可以通过登录页面的'忘记密码'链接重置密码。",
"meta": {"category": "account"}
},
{
"content": "如何取消订单?您可以在订单页面点击'取消订单'按钮,或者联系客服。",
"meta": {"category": "orders"}
},
{
"content": " shipping费用是多少?订单满99元免运费,否则运费为10元。",
"meta": {"category": "shipping"}
}
]
# 将文档写入存储
document_store.write_documents(faq_documents)
# 创建检索器
retriever = EmbeddingRetriever(
document_store=document_store,
embedding_model="sentence-transformers/multi-qa-mpnet-base-dot-v1"
)
# 更新嵌入
document_store.update_embeddings(retriever)
# 创建生成器
generator = OpenAIAnswerGenerator(model="gpt-3.5-turbo")
# 创建管道
pipeline = GenerativeQAPipeline(generator=generator, retriever=retriever)
# 交互式查询
while True:
query = input("请输入您的问题(输入'退出'结束):")
if query == "退出":
break
result = pipeline.run(
query=query,
params={"Retriever": {"top_k": 3}}
)
print(f"回答: {result['answers'][0].answer}\n")总结与展望
Haystack作为一个端到端的RAG框架,为构建高质量的问答系统和文档检索应用提供了全面的工具和组件。通过本文的介绍,你应该已经了解了Haystack的核心概念、基本使用方法和高级特性。
关键优势
- 模块化设计,易于构建自定义RAG系统
- 支持多种文档格式和存储后端
- 集成多种LLM模型和检索策略
- 提供企业级功能,适合生产环境
- 活跃的社区和丰富的文档
应用前景
- 企业知识管理和内部问答系统
- 客户支持聊天机器人
- 教育和学习辅助工具
- 内容推荐和信息检索
- 法律和医疗文档分析
未来发展
Haystack团队持续改进框架,未来可能会:
- 支持更多的文档格式和数据源
- 集成更多的LLM模型和向量数据库
- 提供更高级的检索和生成能力
- 优化性能,支持更大规模的应用
- 增强与其他AI工具和框架的集成
通过不断学习和实践,你可以利用Haystack构建更加智能、高效的RAG系统,为各种场景提供有价值的AI解决方案。