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

生成器与聊天生成器

本页面解释了 Haystack 中生成器 (Generators) 和聊天生成器 (Chat Generators) 之间的区别。它强调了根据用例和模型选择正确的生成器。

输入/输出

Generators (生成器)聊天生成器
输入字符串(一个提示)一系列 ChatMessages
输出文本聊天消息(在“回复”中)

选择正确的类

概述

在(文本)生成器和聊天生成器之间进行选择取决于您的用例和底层模型。

正如上面不同的输入和输出特性所强调的,生成器和聊天生成器是不同的,它们通常通过调用不同的 API 与不同的模型进行交互。因此,它们不能自动互换。

👍

多轮交互

如果您期望在聊天场景中与语言模型进行双向交互,那么选择聊天生成器通常更好。这个选择可以确保与语言模型进行更结构化、更直接的交互。

聊天生成器使用聊天消息 (Chat Messages)。它们可以容纳“system”、“user”、“assistant”甚至“function”等角色,从而能够与语言模型进行更结构化、更细致的交互。聊天生成器可以处理许多交互,包括复杂的查询、使用工具进行混合对话、从自由文本中解析函数名称和参数等等。聊天消息的格式也有助于减少偏离主题的响应。聊天生成器通过提供一致的上下文,更能让对话保持在正轨上。

函数调用

一些聊天生成器允许通过传递工具/函数定义来利用模型的函数调用能力。

如果您想了解更多信息,请阅读我们文档中关于 函数调用 的介绍。

或者,您可以在相关提供商的文档中找到更多信息

兼容性例外

在这种情况下,选择聊天生成器可以简化流程,因为 Haystack 会处理将聊天消息转换为适合所选模型的提示。

没有对应的聊天生成器

如果一个生成器没有对应的聊天生成器,这并不意味着该生成器不能用于聊天场景。

例如,LlamaCppGenerator 可以同时用于聊天模型和非聊天模型。
但是,如果没有ChatMessage 数据类,您需要密切关注模型的提示模板并遵守它。

聊天(提示)模板

对于开源语言模型,聊天模板可能以人类可读的形式提供在 Hugging Face 的模型卡片上。
请参阅 Hugging Face 上 argilla/notus-7b-v1 模型的 示例

通常,它也以 Jinja 模板的形式存在于 tokenizer_config.json 文件中。
以下是 argilla/notus-7b-v1示例

{% for message in messages %}\n{% if message['role'] == 'user' %}\n{{ '<|user|>\n' + message['content'] + eos_token }}\n{% elif message['role'] == 'system' %}\n{{ '<|system|>\n' + message['content'] + eos_token }}\n{% elif message['role'] == 'assistant' %}\n{{ '<|assistant|>\n'  + message['content'] + eos_token }}\n{% endif %}\n{% if loop.last and add_generation_prompt %}\n{{ '<|assistant|>' }}\n{% endif %}\n{% endfor %}

不同类型的语言模型

📘

主题探索

这个领域还很年轻,不断发展,区分并不总是清晰和准确的。

生成式语言模型的训练涉及多个阶段,会产生不同的模型。

从预训练到基础语言模型

在预训练阶段,模型以无监督的方式在大量的原始文本上进行训练。在这个阶段,模型获得了生成统计上合理的文本补全的能力。

例如,给定提示“What is music...” ,预训练模型可以生成各种合理的补全

  • 添加更多上下文:“...to your ears?”
  • 添加后续问题:“? What is sound? What is harmony?”
  • 提供答案:“Music is a form of artistic expression…”

从预训练中产生的模型通常被称为**基础语言模型**。
示例包括 meta-llama/Llama-2-70bmistralai/Mistral-7B-v0.1

基础语言模型在实际应用中很少使用,因为它们无法遵循指令或进行对话。

如果您想尝试它们,请使用 Haystack 的文本生成器。

监督微调 (SFT) 和与人类偏好对齐

为了使语言模型在实际应用中有用,通常还会进行两个额外的训练步骤。

  • 监督微调:语言模型会根据包含指令-响应对或多轮交互的数据集进行进一步训练。根据数据集的不同,模型可以获得遵循指令或进行聊天的能力。
    如果模型训练在此停止,它可能在某些基准测试中表现良好,但其行为可能与人类用户的偏好不符。
  • 与人类偏好对齐:这一关键步骤确保语言模型与人类意图对齐。可以使用各种技术,如 RLHF 和 DPO。
    要了解有关这些技术以及这个不断发展的领域的更多信息,您可以阅读 这篇博文

完成这些阶段后,即可获得适合实际应用的语言模型。
示例包括 meta-llama/Llama-2-70b-chat-hfmistralai/Mistral-7B-Instruct-v0.2

指令模型与聊天模型

指令模型经过训练以遵循指令,而聊天模型则经过训练以进行多轮对话。

此信息有时在模型名称(meta-llama/Llama-2-70b-chat-hf,mistralai/Mistral-7B-Instruct-v0.2)或随附的模型卡片中可见。

  • 对于聊天模型,使用聊天生成器是最自然的选择。
  • 如果您选择使用指令模型进行单轮交互,建议转向文本生成器。

值得注意的是,许多最新的指令模型都配备了 聊天模板。例如,mistralai/Mistral-7B-Instruct-v0.2聊天模板

如果模型具有聊天模板并且您打算在聊天场景中使用它,那么使用聊天生成器是最佳选择。在这些情况下,您可以获得对聊天消息的开箱即用支持,并且无需手动应用上述模板。

🚧

注意

指令模型和聊天模型之间的区别并非严格的二分法。

  • 在预训练之后,可以使用不同的数据集多次执行监督微调 (SFT) 和与人类偏好对齐。在某些情况下,指令模型和聊天模型之间的区分可能没有特别意义。
  • Hugging Face 上的一些开源语言模型缺乏对其性质的明确指示。