选择合适的生成器
本页面提供有关选择合适的生成器以与 Haystack 中的生成语言模型进行交互的信息。它解释了生成器和聊天生成器之间的区别,讨论了使用来自不同提供商的专有和开源模型,并探讨了在本地使用开源模型的选项。
在 Haystack 中,生成器是与生成语言模型交互的主要接口。
本指南旨在简化根据您的偏好和计算资源选择合适的生成器的过程。本指南不侧重于选择特定的模型本身,而是侧重于选择模型类型和 Haystack 生成器:正如您将看到的,在许多情况下,您有不同的选项来使用相同的模型。
生成器 vs 聊天生成器
我们首先要区分生成器(Generators)和聊天生成器(ChatGenerators),例如 OpenAIGenerator 和 OpenAIChatGenerator,HuggingFaceAPIGenerator 和 HuggingFaceAPIChatGenerator,等等。
- 生成器是期望一个提示(字符串)并以“回复”形式返回生成文本的组件。
- 聊天生成器开箱即用地支持 ChatMessage 数据类。它们期望一个消息列表,并以 ChatMessage 的形式返回“回复”。
在生成器和聊天生成器之间进行选择取决于您的用例和底层模型。如果您预计在聊天场景中与语言模型进行多轮交互,那么选择聊天生成器通常更好。
要了解有关此比较的更多信息,请查看我们的 生成器 vs 聊天生成器 指南。
流式支持
流式传输是指逐字输出 LLM 的响应,而不是等待整个响应生成完毕后一次性全部输出。
您可以在 生成器概览页面 上查看哪些生成器支持流式传输。
启用流式传输时,生成器会为每个StreamingChunk 调用您的streaming_callback。每个块代表以下内容中的一个
- 工具调用:模型正在构建一个工具/函数调用。读取
chunk.tool_calls. - 工具结果:一个工具已完成并返回输出。读取
chunk.tool_call_result. - 文本标记:普通的助手文本。读取
chunk.content.
每个块只有一个这些字段。使用chunk.start 和chunk.finish_reason 来检测边界。使用chunk.index 和chunk.component_info 进行跟踪。
对于支持多个候选的提供商,请将n=1 设置为流式传输。
参数详细信息
有关参数的详细信息,请参阅我们 关于 StreamingChunk 的 API 参考。
最简单的方法是使用内置的print_streaming_chunk 函数。它处理工具调用、工具结果和文本标记。
from haystack.components.generators.utils import print_streaming_chunk
generator = SomeGenerator(streaming_callback=print_streaming_chunk)
# For ChatGenerators, pass a list[ChatMessage]. For text generators, pass a prompt string.
自定义回调
如果您需要自定义渲染,可以创建自己的回调。
请按以下顺序处理三种块类型:工具调用、工具结果和文本。
from haystack.dataclasses import StreamingChunk
def my_stream(chunk: StreamingChunk):
if chunk.start:
on_start() # e.g., open an SSE stream
# 1) Tool calls: name and JSON args arrive as deltas
if chunk.tool_calls:
for t in chunk.tool_calls:
on_tool_call_delta(index=t.index, name=t.tool_name, args_delta=t.arguments)
# 2) Tool result: final output from the tool
if chunk.tool_call_result is not None:
on_tool_result(chunk.tool_call_result)
# 3) Text tokens
if chunk.content:
on_text_delta(chunk.content)
if chunk.finish_reason:
on_finish(chunk.finish_reason)
代理和工具
代理和ToolInvoker 会将您的streaming_callback 转发。它们还会发出一个带有finish_reason 的最终工具结果块,以便 UI 可以在助手文本恢复之前干净地关闭“工具阶段”。默认的print_streaming_chunk 会为您格式化此内容。
专有模型
使用专有模型是开始使用生成语言模型的快捷方式。典型方法是使用 API 密钥调用这些托管模型。您的付费基于发送和生成的 token 数量。
您不需要在本地机器上投入大量资源,因为计算是在提供商的基础设施上执行的。使用这些模型时,您的数据将离开您的机器并传输到模型提供商。
Haystack 支持各种提供商提供的模型:OpenAI、Azure、Google VertexAI 和 Makersuite、Cohere 和 Mistral,并且不断增加更多模型。
我们还支持 Amazon Bedrock:它提供对 Amazon Titan 系列、AI21 Labs、Anthropic、Cohere 的专有模型的访问,以及 Llama(来自 Meta)等各种开源模型。
开源模型
当我们讨论开源(权重)模型时,我们指的是具有公共权重、任何人都可以部署在自己基础设施上的模型。用于训练的数据集则较少共享。出于多种原因,人们可以选择使用开源模型,包括提高模型透明度和控制力。
商业用途
并非所有开源模型都适合商业用途。我们建议在考虑采用它们之前,仔细审查许可证(通常在 Hugging Face 上提供)。
即使模型是开源的,您可能仍然希望依赖模型提供商来使用它,主要是因为您希望其他人托管模型并处理基础设施方面的问题。在这些情况下,您的数据将从您的机器转移到提供模型的提供商。
这些解决方案的成本可能有所不同。根据您选择的解决方案,您将按消耗的 token(发送和生成)付费,或按模型托管(通常按小时计费)付费。
在 Haystack 中,有几个生成器通过私有托管或共享托管模型支持这些解决方案。
共享托管模型
在这种类型下,您会利用一个与其他用户共享的模型实例,通常按发送和生成的 token 付费。
以下是 Haystack 中支持共享托管模型的组件
- Hugging Face API 生成器,在查询 免费的 Hugging Face 推理 API 时。免费的推理 API 提供对某些流行模型的访问,用于快速实验,但它有速率限制,不适用于生产环境。
- 各种云提供商提供与 OpenAI 生成器兼容的接口。这些包括 Anyscale、Deep Infra、Fireworks、Lemonfox.ai、OctoAI、Together AI 等等。
以下是使用 OctoAI 和OpenAIChatGenerator的示例
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.utils import Secret
from haystack.dataclasses import ChatMessage
generator = OpenAIChatGenerator(api_key=Secret.from_env_var("ENVVAR_WITH_API_KEY"),
api_base_url="https://text.octoai.run/v1",
model="mixtral-8x7b-instruct-fp16")
generator.run(messages=[ChatMessage.from_user("What is the best French cheese?")])
私有托管模型
在这种情况下,模型由提供商部署私有实例,您通常按小时付费。
以下是 Haystack 中支持私有托管模型的组件
- Amazon SagemakerGenerator
- HuggingFace API 生成器,在查询 HuggingFace 推理端点 时。
共享托管模型 vs 私有托管模型
为什么选择共享托管模型
- 成本节约:获取经济高效的解决方案,特别适合具有不同使用模式或预算有限的用户。
- 易于使用:设置和维护得到简化,因为提供商负责管理基础设施和更新,使其易于使用。
为什么选择私有托管模型
- 专用资源:通过专用实例资源确保一致的性能,并避免其他用户的任何影响。
- 可扩展性:根据需求扩展资源,同时确保高峰时段的最佳性能和非高峰时段的成本节约。
- 可预测的成本:按小时计费可实现更可预测的成本,尤其是在清楚了解使用模式的情况下。
本地部署的开源模型
本地部署模型意味着您在自己的机器/基础设施上托管开源模型。
此选择非常适合本地实验。
在数据隐私问题促使您不将数据传输到外部提供商,并且您拥有充足计算资源的情况下,它适用于生产场景。
本地实验
- GPU:
HuggingFaceLocalGenerator基于 Hugging Face Transformers 库。这对于拥有一些 GPU 资源(例如在 Colab 中)的实验很有用。如果 GPU 资源有限,则支持 bitsandbytes、GPTQ 和 AWQ 等替代量化选项。对于生产用例中性能更高的解决方案,请参考以下选项。 - CPU(+ 可选 GPU):
LlamaCppGenerator使用 Llama.cpp 库 – 一个用 C/C++ 编写的用于高效 LLM 推理的项目。特别是,它采用了量化的 GGUF 格式,适用于在标准机器(即使没有 GPU)上运行这些模型。如果可用 GPU 资源,可以将某些模型层卸载到 GPU 以提高速度。 - CPU(+ 可选 GPU):
OllamaGenerator基于 Ollama 项目,作用类似于 LLM 的 Docker。它提供了一种打包和部署这些模型的简单方法。它内部基于 Llama.cpp 库,为在各种平台上运行提供了更简化的流程。
生产环境中的 LLM 服务
如果您想在生产环境中运行语言模型并且拥有 GPU 资源,以下解决方案非常合适。它们采用创新的技术来实现快速推理和高效处理大量并发请求。
- vLLM 是一个高吞吐量、内存高效的 LLM 推理和提供引擎。Haystack 通过 OpenAI 生成器支持 vLLM。
- Hugging Face API 生成器,在查询本地部署的 TGI 实例时。Hugging Face Text Generation Inference 是一个用于高效部署和提供 LLM 的工具包。
更新于 2 个月前
