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

集成:OpenAI

在 Haystack 中使用 OpenAI 模型

作者
deepset

目录

概述

您可以在 Haystack 管道中使用 OpenAI 模型,配合 GeneratorsEmbeddersLocalWhisperTranscriberRemoteWhisperTranscriber

安装

pip install haystack-ai

使用

您可以使用多种方式使用 OpenAI 模型

Embedding 模型

您可以通过两个组件利用 OpenAI 的嵌入模型:OpenAITextEmbedderOpenAIDocumentEmbedder

要为文档创建语义嵌入,请在您的索引管道中使用 `OpenAIDocumentEmbedder`。要生成查询的嵌入,请使用 `OpenAITextEmbedder`。在选择了适合您特定用例的组件后,使用模型名称和 OpenAI API 密钥初始化组件。

以下是使用 `InMemoryDocumentStore`、`OpenAIDocumentEmbedder` 和 `DocumentWriter` 的示例索引管道

from haystack import Document, Pipeline
from haystack.utils import Secret
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.embedders import OpenAIDocumentEmbedder
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", OpenAIDocumentEmbedder(api_key=Secret.from_token("YOUR_OPENAI_API_KEY"), model="text-embedding-ada-002"))
indexing_pipeline.add_component("writer", DocumentWriter(document_store=document_store))
indexing_pipeline.connect("embedder", "writer")

indexing_pipeline.run({"embedder": {"documents": documents}})

生成模型(LLMs)

您可以通过两个组件利用 OpenAI 模型:OpenAIGeneratorOpenAIChatGenerator

要使用 OpenAI 的 GPT 模型进行文本生成,请使用模型名称和 OpenAI API 密钥初始化 `OpenAIGenerator`。然后,您可以在 `PromptBuilder` 之后的问答管道中使用 `OpenAIGenerator` 实例。

以下是使用 RAG、`PromptBuilder` 和 `OpenAIGenerator` 的生成式问答管道示例

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 OpenAIGenerator
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack import Document

docstore = InMemoryDocumentStore()
docstore.write_documents([Document(content="Rome is the capital of Italy"), Document(content="Paris is the capital of France")])

query = "What is the capital of France?"

template = """
Given the following information, answer the question.

Context: 
{% for document in documents %}
    {{ document.content }}
{% endfor %}

Question: {{ query }}?
"""
pipe = Pipeline()

pipe.add_component("retriever", InMemoryBM25Retriever(document_store=docstore))
pipe.add_component("prompt_builder", PromptBuilder(template=template))
pipe.add_component("llm", OpenAIGenerator(api_key=Secret.from_token("YOUR_OPENAI_API_KEY")))
pipe.connect("retriever", "prompt_builder.documents")
pipe.connect("prompt_builder", "llm")

res=pipe.run({
    "prompt_builder": {
        "query": query
    },
    "retriever": {
        "query": query
    }
})

print(res)   

转录器模型

要使用 OpenAI 的 Whisper 模型,请根据托管选项初始化 `LocalWhisperTranscriber` 或 `RemoteWhisperTranscriber`。要本地使用 Whisper,请按照 Whisper GitHub 仓库上的说明进行安装。要使用 OpenAI API,请提供 API 密钥。然后,您可以使用合适的组件来转录音频文件。

以下是使用 `LocalWhisperTranscriber` 的索引管道示例。如果您想在本地运行 Whisper 模型,需要安装两个额外的包

pip install transformers[torch]
pip install -U openai-whisper
from pathlib import Path
from haystack import Pipeline
from haystack.components.audio import LocalWhisperTranscriber
from haystack.components.preprocessors import DocumentSplitter, DocumentCleaner
from haystack.components.writers import DocumentWriter
from haystack.document_stores.in_memory import InMemoryDocumentStore

document_store = InMemoryDocumentStore()
pipeline = Pipeline()
pipeline.add_component(instance=LocalWhisperTranscriber(model="small"), name="transcriber")
pipeline.add_component(instance=DocumentCleaner(), name="cleaner")
pipeline.add_component(instance=DocumentSplitter(), name="splitter")
pipeline.add_component(instance=DocumentWriter(document_store=document_store), name="writer")

pipeline.connect("transcriber.documents", "cleaner.documents")
pipeline.connect("cleaner.documents", "splitter.documents")
pipeline.connect("splitter.documents", "writer.documents")

pipeline.run({"transcriber": {"audio_files": list(Path("path/to/audio/folder").iterdir())}})