集成:OpenAI
在 Haystack 中使用 OpenAI 模型
目录
概述
您可以在 Haystack 管道中使用 OpenAI 模型,配合 Generators、Embedders、LocalWhisperTranscriber 和 RemoteWhisperTranscriber。
安装
pip install haystack-ai
使用
您可以使用多种方式使用 OpenAI 模型
Embedding 模型
您可以通过两个组件利用 OpenAI 的嵌入模型:OpenAITextEmbedder 和 OpenAIDocumentEmbedder。
要为文档创建语义嵌入,请在您的索引管道中使用 `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 模型:OpenAIGenerator 和 OpenAIChatGenerator。
要使用 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())}})
