跳转到内容

聊天模板是什么?

本地化,大型语言模型只知道如何完成纯文本,不知道它们输入和输出的区别。为了支持与人的聊天,LLM 被设计为使用模板,以特定的格式将对话转换为纯文本。

对于给定的模型,使用适当的聊天模板非常重要,因为每个模型都是设计为与特定的格式最佳配合。内置模型中包含的聊天模板应该足以满足大多数需求。

你想要更改聊天模板的原因有两个:

  • 你正在侧载模型,并且没有聊天模板可用,
  • 你希望比系统消息提供更大的对 LLM 输入的控制。

系统消息是什么?

系统消息是一种控制 LLM 响应的方式,这种方式会影响整个对话的消息。系统消息可以简短,例如“像海盗一样说话。”,也可以很长,包含很多上下文供 LLM 保留。

并非所有模型都设计为使用系统消息,因此它们与某些模型配合得更好。

我如何自定义聊天模板或系统消息?

要自定义聊天模板或系统消息,请转到设置 > 模型。确保在顶部选择了正确的模型。如果你克隆了一个模型,你可以使用来自基础模型的不同聊天模板或系统消息,从而为每个对话使用不同的设置。

这些设置会立即生效。更改它们后,你可以在聊天视图中点击“重做上次响应”,响应将考虑新的设置。

我是否需要编写聊天模板?

你通常不需要编写自己的聊天模板。例外是那些不在官方模型列表中并且没有内置聊天模板的模型。这些模型在模型设置页面上的聊天模板字段上方会显示“清除”选项,而不是“重置”选项。请参阅关于查找创建聊天模板的部分。

GPT4All v3.5 中有什么变化?

GPT4All v3.5 全面改革了聊天模板系统。有三个关键区别:

  • 聊天模板现在格式化整个对话,而不是一对消息,
  • 聊天模板现在使用 Jinja 语法,而不是%1%2占位符,
  • 并且系统消息不应再包含控制标记或尾随空格。

如果你使用的是在升级到 GPT4All v3.5 或更高版本之前已添加或更改的任何聊天模板或系统消息,这些将不再工作。请参阅下面关于升级后可能看到的常见错误如何解决。

错误/警告:系统消息不是纯文本。

这很容易修复。转到模型的设置并查看系统提示。有三个东西要查找:

  • 控制标记,例如<|im_start|>, <|start_header_id|>, 或<|system|>
  • 前缀,例如### SystemSYSTEM:
  • 尾随空格,例如空格字符或空行。

如果你看到任何这些,请删除它们。例如,这个旧系统提示:

<|start_header_id|>system<|end_header_id|>
You are a helpful assistant.<|eot_id|>

应该变成这样:

You are a helpful assistant.

如果你看不到任何需要更改的内容,可以通过对消息进行微小修改然后恢复它来忽略错误。

如果你看到警告,你的系统消息似乎不是纯文本。如果你认为这个警告是错误的,可以安全地忽略它。如有疑问,请在Discord.

错误:旧系统提示需要在设置中更新。

这与上面相同

错误/警告:聊天模板不是 Jinja 格式。

这是尝试在 GPT4All 3.5+ 中使用旧式模板(可能来自以前的版本)的结果。

转到模型设置页面并选择受影响的模型。如果你看到一个“重置”按钮,并且你没有故意修改提示模板,你可以点击“重置”。否则,你可以这样做:

  1. 通过安全地复制到文本文件并保存来备份你的聊天模板。在下一步中,它将从 GPT4All 中删除。
  2. 点击“重置”或“清除”。
  3. 如果你点击了“清除”,聊天模板现在不见了。按照以下步骤查找创建为你的模型创建一个基本的聊天模板。
  4. 自定义聊天模板以满足你的需求。如需帮助,请阅读关于创建聊天模板的部分。

错误:旧提示模板需要在设置中更新。

这与上面相同

聊天模板有语法错误。

如果在编辑聊天模板时出现语法错误,详细信息将显示在输入框上方的错误消息中。这可能是因为聊天模板实际上不是 Jinja 格式(见上面).

否则,你要么正确地输入了某些内容,要么模型的模板与 GPT4All 不兼容。请参阅下面部分关于创建聊天模板,并确保一切正确。如有疑问,请在Discord.

错误:未配置聊天模板。

这可能出现在不在官方模型列表中并且不包含聊天模板的模型上。GPT4All 的旧版本在这种情况下选择了一个较差的默认值。如果你按照以下步骤查找创建为你的模型创建聊天模板,你会得到更好的结果。

错误:聊天模板不能为空。

如果模型设置页面上聊天模板上方的按钮显示为“清除”,请参见上面。如果你看到“重置”,请点击该按钮以恢复一个合理的默认值。另请参阅关于语法错误.

我如何找到聊天模板?

如有疑问,你可以随时向Discord社区寻求帮助。下面是你在自己找到它的说明。

模型聊天模板的权威来源是原始(非 GGUF)模型来自的 HuggingFace 仓库。首先,你应该找到这个页面。如果你只有一个模型文件,你可以尝试用模型的名称进行谷歌搜索。如果你知道你下载 GGUF 模型的页面,它的 README 通常会链接到原始的非 GGUF 模型。

找到原始模型后,你可以使用两种方法来提取它的聊天模板。选择你最熟悉的一种。

使用 CLI(所有模型)

  1. 使用你喜欢的 Python 包管理器安装jq例如 Chocolatey(Windows)、Homebrew(macOS)或 apt(Ubuntu)。
  2. 下载tokenizer_config.json从模型的“文件和版本”选项卡中。
  3. 在你下载模型文件的目录中打开命令提示符。
  4. 运行jq -r ".chat_template" tokenizer_config.json这以人类可读的形式显示了聊天模板。你可以复制它并将其粘贴到设置页面。
  5. (可选)你可以像这样将输出保存到文本文件:jq -r ".chat_template" tokenizer_config.json >chat_template.txt

如果输出是“null”,则该模型不提供聊天模板。请参阅下面说明关于创建聊天模板。

Python(开放模型)

  1. 使用你喜欢的 Python 包管理器安装transformers例如pip install transformers确保它是至少 v4.43.0 版本。
  2. 复制 HuggingFace 模型的 ID,使用名称旁边剪贴板图标。例如,如果 URL 是https://huggingface.co/NousResearch/Hermes-2-Pro-Llama-3-8B,则 ID 是NousResearch/Hermes-2-Pro-Llama-3-8B.
  3. 打开 Python 解释器python并运行以下命令。将示例中的模型 ID 更改为你所复制的一个。
    >>> from transformers import AutoTokenizer
    >>> tokenizer = AutoTokenizer.from_pretrained('NousResearch/Hermes-2-Pro-Llama-3-8B')
    >>> print(tokenizer.get_chat_template())
    
    你可以复制输出并将其粘贴到设置页面。
  4. (可选)你可以像这样将输出保存到文本文件:
    >>> open('chat_template.txt', 'w').write(tokenizer.get_chat_template())
    

如果你得到 ValueError 异常,则该模型不提供聊天模板。请参阅下面说明关于创建聊天模板。

Python(受控模型)

一些模型,如 Llama 和 Mistral,不允许公开访问它们的聊天模板。你必须使用上面提到的 CLI 方法,或者按照以下说明使用 Python:

  1. 对于这些步骤,你必须安装 git 和 git-lfs。
  2. 你必须有一个 HuggingFace 账户并登录。
  3. 你必须已经可以访问受控模型。否则,请求访问。
  4. 你必须为 git 访问 HuggingFace 配置一个 SSH 密钥。
  5. git clone使用 SSH 克隆 URL 克隆模型的 HuggingFace 仓库。没有必要下载整个模型,它非常大。在 Linux 上,一个好的做法是:
    $ GIT_LFS_SKIP_SMUDGE=1 git clone hf.co:meta-llama/Llama-3.1-8B-Instruct.git
    $ cd Llama-3.1-8B-Instruct
    $ git lfs pull -I "tokenizer.*"
    
  6. 按照上面关于开放模型的说明操作,但将模型 ID 替换为包含tokenizer\_config.json:
    >>> tokenizer = AutoTokenizer.from_pretrained('.')
    

高级:聊天模板是如何工作的?

聊天模板应用于你在聊天窗口中看到的整个对话。模板会遍历消息列表,每个消息都包含rolecontent字段。roleuser, assistant, 或system.

GPT4All 还支持特殊变量bos_token, eos_token,和add_generation_prompt。请参阅HuggingFace 文档了解它们的作用。

高级:我如何制作聊天模板?

创建聊天模板的最佳方法是从一个现有的模板开始作为参考。然后,修改它以使用为给定模型记录的格式。它的 README 页面可能会明确给出其模板的示例。或者,它可能会提到一个众所周知的标准模板,如 ChatML、Alpaca、Vicuna。GPT4All 尚未包括这些模板的预设,因此它们必须在其他模型中找到或来自社区。

更多信息,请参阅非常有帮助的HuggingFace 指南。其中一些内容不适用,例如关于工具调用和 RAG 的信息 - GPT4All 以不同的方式实现这些功能。

一些模型使用一个提示模板,它不能直观地映射到多轮聊天,因为它更适用于单条指令。这些模板的 FastChatFastChat实现是正确扩展它们到多条消息的有用参考。

高级:GPT4All v1 模板是什么?

GPT4All 支持自己的模板语法,这不是标准的,但提供了完全控制 LocalDocs 源和文件附件如何插入对话的方式。这些模板以{# gpt4all v1 #}开头,并类似于下面的示例。

对于标准模板,GPT4All 将用户消息、源和附件组合到content字段中。对于 GPT4All v1 模板,这不是这样做的,因此它们必须直接在模板中使用,以便这些功能正常工作。

{# gpt4all v1 #}
{%- for message in messages %}
    {{- '<|start_header_id|>' + message['role'] + '<|end_header_id|>\n\n' }}
    {%- if message['role'] == 'user' %}
        {%- for source in message['sources'] %}
            {%- if loop.first %}
                {{- '### Context:\n' }}
            {%- endif %}
            {{- 'Collection: ' + source['collection'] + '\n'   +
                'Path: '       + source['path']       + '\n'   +
                'Excerpt: '    + source['text']       + '\n\n' }}
        {%- endfor %}
    {%- endif %}
    {%- for attachment in message['prompt_attachments'] %}
        {{- attachment['processed_content'] + '\n\n' }}
    {%- endfor %}
    {{- message['content'] | trim }}
    {{- '<|eot_id|>' }}
{%- endfor %}
{%- if add_generation_prompt %}
    {{- '<|start_header_id|>assistant<|end_header_id|>\n\n' }}
{%- endif %}