📘 **TELUS Agriculture & Consumer Goods** 如何通过 **Haystack Agents** 转变促销交易
由 deepset 维护

集成:Hugging Face

在 Haystack 中使用 Hugging Face 上的模型

作者
deepset

目录

概述

您可以在 Haystack 管道中使用 GeneratorsEmbeddersRankersReaders 中的 Hugging Face 模型。

安装

pip install haystack-ai

使用

您可以通过多种方式使用 Hugging Face 上的模型

Embedding 模型

您可以通过四个组件利用 Hugging Face 的 embedding 模型:SentenceTransformersTextEmbedderSentenceTransformersDocumentEmbedderHuggingFaceAPITextEmbedderHuggingFaceAPIDocumentEmbedder

要为文档创建语义 embedding,请在索引管道中使用 Document Embedder。要为查询生成 embedding,请使用 Text Embedder。

根据托管选项(本地 Sentence Transformers 模型、Serverless Inference API、Inference Endpoints 或自托管 Text Embeddings Inference),选择合适的 Hugging Face Embedder 组件并使用模型名称进行初始化。

以下是使用 InMemoryDocumentStoreDocumentWriterSentenceTransformersDocumentEmbedder 的示例索引管道

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 的文本生成模型:HuggingFaceLocalGeneratorHuggingFaceAPIGeneratorHuggingFaceAPIChatGenerator

根据模型类型(聊天或文本补全)和托管选项(本地 Transformer 模型、Serverless Inference API、Inference Endpoints 或自托管 Text Generation Inference),选择合适的 Hugging Face Generator 组件并使用模型名称进行初始化。

以下是使用托管在 Serverless Inference API 上的 HuggingFaceH4/zephyr-7b-betaHuggingFaceAPIGenerator 的示例查询管道

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 根据文档与查询的相关性对文档进行排序。

以下是使用 InMemoryBM25RetrieverSentenceTransformersRanker 的文档检索示例管道

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 从相关上下文中提取答案。

以下是使用 InMemoryBM25RetrieverExtractiveReader 的抽取式问答示例管道

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}})