集成:Hugging Face
在 Haystack 中使用 Hugging Face 上的模型
目录
概述
您可以在 Haystack 管道中使用 Generators、Embedders、Rankers 和 Readers 中的 Hugging Face 模型。
安装
pip install haystack-ai
使用
您可以通过多种方式使用 Hugging Face 上的模型
Embedding 模型
您可以通过四个组件利用 Hugging Face 的 embedding 模型:SentenceTransformersTextEmbedder、SentenceTransformersDocumentEmbedder、HuggingFaceAPITextEmbedder 和 HuggingFaceAPIDocumentEmbedder。
要为文档创建语义 embedding,请在索引管道中使用 Document Embedder。要为查询生成 embedding,请使用 Text Embedder。
根据托管选项(本地 Sentence Transformers 模型、Serverless Inference API、Inference Endpoints 或自托管 Text Embeddings Inference),选择合适的 Hugging Face Embedder 组件并使用模型名称进行初始化。
以下是使用 InMemoryDocumentStore、DocumentWriter 和 SentenceTransformersDocumentEmbedder 的示例索引管道
from haystack import Document
from haystack import Pipeline
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.embedders import SentenceTransformersDocumentEmbedder
from haystack.components.writers import DocumentWriter
document_store = InMemoryDocumentStore(embedding_similarity_function="cosine")
documents = [Document(content="My name is Wolfgang and I live in Berlin"),
Document(content="I saw a black horse running"),
Document(content="Germany has many big cities")]
indexing_pipeline = Pipeline()
indexing_pipeline.add_component("embedder", SentenceTransformersDocumentEmbedder(model="sentence-transformers/all-MiniLM-L6-v2"))
indexing_pipeline.add_component("writer", DocumentWriter(document_store=document_store))
indexing_pipeline.connect("embedder", "writer")
indexing_pipeline.run({
"embedder":{"documents":documents}
})
生成模型(LLMs)
您可以通过三个组件利用 Hugging Face 的文本生成模型:HuggingFaceLocalGenerator、HuggingFaceAPIGenerator 和 HuggingFaceAPIChatGenerator。
根据模型类型(聊天或文本补全)和托管选项(本地 Transformer 模型、Serverless Inference API、Inference Endpoints 或自托管 Text Generation Inference),选择合适的 Hugging Face Generator 组件并使用模型名称进行初始化。
以下是使用托管在 Serverless Inference API 上的 HuggingFaceH4/zephyr-7b-beta 和 HuggingFaceAPIGenerator 的示例查询管道
from haystack import Pipeline
from haystack.utils import Secret
from haystack.components.retrievers.in_memory import InMemoryBM25Retriever
from haystack.components.builders.prompt_builder import PromptBuilder
from haystack.components.generators import HuggingFaceAPIGenerator
template = """
Given the following information, answer the question.
Context:
{% for document in documents %}
{{ document.text }}
{% endfor %}
Question: What's the official language of {{ country }}?
"""
pipe = Pipeline()
generator = HuggingFaceAPIGenerator(api_type="serverless_inference_api",
api_params={"model": "HuggingFaceH4/zephyr-7b-beta"},
token=Secret.from_token("YOUR_HF_API_TOKEN"))
pipe.add_component("retriever", InMemoryBM25Retriever(document_store=docstore))
pipe.add_component("prompt_builder", PromptBuilder(template=template))
pipe.add_component("llm", generator)
pipe.connect("retriever", "prompt_builder.documents")
pipe.connect("prompt_builder", "llm")
pipe.run({
"prompt_builder": {
"country": "France"
}
})
Ranker 模型
要使用 Hugging Face 上的 cross encoder 模型,请使用模型名称初始化 SentenceTransformersRanker。然后,您可以使用此 SentenceTransformersRanker 根据文档与查询的相关性对文档进行排序。
以下是使用 InMemoryBM25Retriever 和 SentenceTransformersRanker 的文档检索示例管道
from haystack import Document, Pipeline
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.retrievers.in_memory import InMemoryBM25Retriever
from haystack.components.rankers import TransformersSimilarityRanker
docs = [Document(content="Paris is in France"),
Document(content="Berlin is in Germany"),
Document(content="Lyon is in France")]
document_store = InMemoryDocumentStore()
document_store.write_documents(docs)
retriever = InMemoryBM25Retriever(document_store = document_store)
ranker = TransformersSimilarityRanker(model="cross-encoder/ms-marco-MiniLM-L-6-v2")
document_ranker_pipeline = Pipeline()
document_ranker_pipeline.add_component(instance=retriever, name="retriever")
document_ranker_pipeline.add_component(instance=ranker, name="ranker")
document_ranker_pipeline.connect("retriever.documents", "ranker.documents")
query = "Cities in France"
document_ranker_pipeline.run(data={"retriever": {"query": query, "top_k": 3},
"ranker": {"query": query, "top_k": 2}})
Reader 模型
要使用 Hugging Face 上的问答模型,请使用模型名称初始化 ExtractiveReader。然后,您可以使用此 ExtractiveReader 从相关上下文中提取答案。
以下是使用 InMemoryBM25Retriever 和 ExtractiveReader 的抽取式问答示例管道
from haystack import Document, Pipeline
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.retrievers.in_memory import InMemoryBM25Retriever
from haystack.components.readers import ExtractiveReader
docs = [Document(content="Paris is the capital of France."),
Document(content="Berlin is the capital of Germany."),
Document(content="Rome is the capital of Italy."),
Document(content="Madrid is the capital of Spain.")]
document_store = InMemoryDocumentStore()
document_store.write_documents(docs)
retriever = InMemoryBM25Retriever(document_store = document_store)
reader = ExtractiveReader(model="deepset/roberta-base-squad2-distilled")
extractive_qa_pipeline = Pipeline()
extractive_qa_pipeline.add_component(instance=retriever, name="retriever")
extractive_qa_pipeline.add_component(instance=reader, name="reader")
extractive_qa_pipeline.connect("retriever.documents", "reader.documents")
query = "What is the capital of France?"
extractive_qa_pipeline.run(data={"retriever": {"query": query, "top_k": 3},
"reader": {"query": query, "top_k": 2}})
