Haystack 入门教程

项目介绍

Haystack 是一个端到端的检索增强生成(RAG)框架,专注于构建高质量的问答系统和文档检索应用。它由 deepset 公司开发,提供了一套完整的工具和组件,用于处理从文档处理到检索再到生成的整个流程。

主要功能

  • 文档处理:支持多种文档格式的解析和处理
  • 检索系统:提供多种检索策略,包括稀疏检索和密集检索
  • 生成系统:集成多种大语言模型,用于生成准确的回答
  • 管道系统:通过模块化的管道组件构建复杂的RAG系统
  • 评估工具:提供评估问答系统性能的工具
  • 多语言支持:支持多种语言的文档处理和问答

项目特点

  • 模块化设计:通过可组合的组件构建自定义RAG系统
  • 高度可扩展:支持多种向量数据库、LLM模型和检索策略
  • 生产就绪:提供企业级功能,如缓存、监控和部署工具
  • 活跃的社区:持续更新和改进
  • 丰富的文档:提供详细的文档和示例

安装与配置

安装步骤

  1. 安装Haystack核心包
pip install farm-haystack
  1. 安装可选依赖
# 安装文档处理依赖
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:企业知识问答系统

场景:企业内部知识管理,员工可以通过自然语言查询获取公司政策、产品信息等。

实现步骤

  1. 收集和整理企业文档
  2. 使用Haystack处理和索引文档
  3. 部署问答系统
  4. 定期更新文档和索引

示例代码

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的自动问答服务,解决常见问题。

实现步骤

  1. 收集客户常见问题和答案
  2. 使用Haystack构建问答系统
  3. 集成到网站或聊天平台
  4. 持续更新知识库

示例代码

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解决方案。