文档API 参考📓 教程🧑‍🍳 食谱🤝 集成💜 Discord🎨 Studio
文档

选择合适的生成器

本页面提供有关选择合适的生成器以与 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.startchunk.finish_reason 来检测边界。使用chunk.indexchunk.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 中支持私有托管模型的组件

共享托管模型 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 的工具包。