首页
/ Transformers 对话模型实战指南:transformers chat CLI 与 TextGenerationPipeline 的聊天、配置与性能优化

Transformers 对话模型实战指南:transformers chat CLI 与 TextGenerationPipeline 的聊天、配置与性能优化

2026-09-06 14:12:14作者:平淮齐Percy

本篇指南围绕 Transformers 的官方文档 Chat basics 展开,讲解如何用 transformers chat 命令行直接与大模型对话、如何用 TextGenerationPipeline 以 Python 方式构建并续写多轮对话,以及如何通过精度设置与量化控制内存占用、提升生成速度。读完后,你可以快速在本地搭建一个可交互的模型对话环境,掌握消息格式、生成参数(generate flags)的写法,并理解这些操作在 CLI 实现Pipeline 实现 中的底层调用链。

对话模型(Chat Model)是什么

对话模型(chat model)是"可以接收消息并返回回复"的会话式模型。2023 年中之后的主流语言模型大多是对话模型,常被称为 "instruct"(指令)或 "instruction-tuned"(指令微调)模型;不支持对话的模型则通常被称为 "base"(基座)或 "pretrained"(预训练)模型。

模型选型上,更大、更新的模型通常能力更强,但在特定领域(医疗、法律文本、非英语语言等)专门化的小模型也常常胜过更大模型。文档建议借助公开排行榜(如 OpenLLM Leaderboard 或 LMSys Chatbot Arena)来为自己的使用场景挑选模型,此处不展开外链,实际选型时按领域需求搜索对应榜单即可。

命令行直接对话:transformers chat

启动交互式聊天会话

安装 Transformers 之后,可以直接从命令行与模型对话。以下命令会启动一个交互式会话,会话开始时会先打印一组基础命令提示:

transformers chat Qwen/Qwen2.5-0.5B-Instruct

前提:这些命令依赖 transformers serve 服务在后台运行(参见 Serving 文档)。安装 serving 依赖的方式为 pip install "transformers[serving]"

CLI 支持以 arg_1=value_1 arg_2=value_2 ... 的形式在启动时附加任意 generate 参数:

transformers chat Qwen/Qwen2.5-0.5B-Instruct do_sample=False max_new_tokens=10

查看全部可选项:

transformers chat -h

会话内命令(!命令)

从源码 src/transformers/cli/chat.py 可以看到,会话开场会打印最小帮助信息(HELP_STRING_MINIMAL),在会话中输入 !help 可看到完整命令列表。核心命令如下:

命令 作用
!help 显示全部可用命令
!clear 清空当前对话,重新开始(若设置了系统提示词,会重新保留)
!status 显示当前模型与生成参数状态
!example {NAME} 载入内置示例作为用户输入,内置示例名见下
!set {ARG_1}={VALUE_1} ... 运行中修改系统提示或生成参数,格式与启动时的 generate_flags 一致
!save [SAVE_NAME] 将当前对话与设置保存到 ./chat_history/{MODEL_ID}/chat_{时间戳}.json,或保存到指定路径
!exit 退出界面

内置示例(DEFAULT_EXAMPLES,见 chat.py 第 58-71 行)包括 llamacodehelicopternumbersbirdssocksnumbers2 等,可用 --examples_path 指向自己的 YAML 文件替换内置示例。

底层实现:Chat 类如何工作

文档指出该 CLI "构建在 AutoClass 之上,使用文本生成与聊天模板工具,底层调用 transformers serve"。对应到源码 Chat 类,可以确认几个关键行为:

  1. 默认连接本地服务base_url 默认为 http://localhost:8000DEFAULT_HTTP_ENDPOINTchat.py 第 52 行)。当连接的是这个默认地址时,构造阶段会先调用 check_health 请求服务根路径下的 /health 端点,连接不上会明确提示"请在另一个终端先运行 transformers serve"——这就是文档中"请确保 transformers serve 正在运行"的硬性来源。
  2. 生成参数默认值与优先级:构造时先加载 --generation_config 指定的配置文件(本地 generation_config.json 文件或 Hub 仓库),然后叠加默认值 do_sample=True, max_new_tokens=256,最后用命令行传入的 generate_flags 覆盖(chat.py 第 359-363 行)。也就是说命令行参数优先级最高。
  3. flags 的类型解析arg=value 形式的参数由 parse_generate_flags 转成 JSON 再解析为 Python 对象,支持布尔(True/False,大小写不敏感)、None(转 null)、数字、字符串(自动加引号)以及整型列表(如 eos_token_id=[1,2])。帮助文案中也明确说明"目前只接受整型列表"。
  4. 流式渲染与统计:每轮对话通过 AsyncInferenceClient.chat_completion(chat, stream=True, ...) 以 OpenAI 兼容的 chat completion 协议流式拉取 token(_inner_run),RichInterface.stream_output 用 rich 的 Live 视图按 Markdown 渲染累积文本,并在结束时打印 N tokens in X s (Y tok/s) 的吞吐统计;若因达到 token 上限(finish_reason == "length")而截断,界面会询问是否以 "Please continue" 续写。
  5. 多模态/服务进程load_model 端点会按 processor → config → download → weights 四个阶段以进度条形式显示模型加载状态,加载完成后提示 "model is warm",说明模型常驻在 serve 进程内存中,后续轮次无需重复加载。

对应的测试用例位于 tests/cli/test_chat.py,可参考其对 flags 解析与会话行为的验证方式。

Python 对话:TextGenerationPipeline 的 chat 模式

TextGenerationPipeline(实现于 src/transformers/pipelines/text_generation.py)是高层文本生成类,具备"chat 模式":当检测到对话模型且聊天提示已正确格式化时,chat 模式即被激活。任务标识符为 "text-generation"

消息格式:role 与 content

对话模型接受一个消息列表(即聊天历史)作为输入,每条消息是带 rolecontent 两个键的字典。发起对话只需一条 user 消息;可选地再加一条 system 消息来指导模型的行为:

chat = [
    {"role": "system", "content": "You are a helpful science assistant."},
    {"role": "user", "content": "Hey, can you explain gravity to me?"}
]

创建 Pipeline 并发起第一轮对话

import torch
from transformers import pipeline

pipeline = pipeline(task="text-generation", model="HuggingFaceTB/SmolLM2-1.7B-Instruct", dtype="auto", device_map="auto")
response = pipeline(chat, max_new_tokens=512)
print(response[0]["generated_text"][-1]["content"])

要点说明:

  • device_map="auto" 对大模型尤其有用,可加速加载并自动把权重放到最快可用设备上,详见 Big Model Inference 一节;
  • dtype="auto" 会依据模型自身配置选择数据类型,节省内存并提升速度;
  • 若成功运行,你就能看到模型的回复。

默认生成参数:在 text_generation.py 第 93-97 行 可以看到,模型未在配置文件中显式设置时,该 pipeline 使用 max_new_tokens=256do_sample=Truetemperature=0.7 作为默认值。

chat 模式的触发与模板渲染:在 preprocess 中,当输入是 Chat 对象时,pipeline 调用 tokenizer.apply_chat_template(...),把消息列表按模型自带的聊天模板渲染成 prompt(return_dict=True, return_tensors="pt"),即文档中所谓"properly formatted"的具体实现。更深入的模板参数(add_generation_promptcontinue_final_message)见 Chat templates 文档

多轮对话:更新聊天历史

要延续对话,需要用模型回复更新聊天历史:既可以把回复(以 assistant 角色)追加到 chat,也可以直接读取 response[0]["generated_text"]——它包含完整聊天历史(含最新回复)。从 postprocess 可以确认:chat 输入下返回的 generated_text 就是"原消息列表 + 新生成的 assistant 消息"拼接后的完整消息列表,因此可以安全地整体接回下一轮调用。

拿到回复后,向聊天历史追加一条新的 user 消息即可继续:

chat = response[0]["generated_text"]
chat.append(
    {"role": "user", "content": "Woah! But can it be reconciled with quantum mechanics?"}
)
response = pipeline(chat, max_new_tokens=512)
print(response[0]["generated_text"][-1]["content"])

不断重复这一过程,就可以一直聊下去——至少到模型上下文窗口用尽或显存耗尽为止。

补充一个源码细节:如果聊天最后一条消息是 assistant 角色,pipeline 默认视为"预填充"(prefill),即让模型续写该条消息而非新起一条(continue_final_message 的默认推断逻辑见 preprocess 第 328-331 行),可用 continue_final_message 参数手动覆盖该行为。

性能与内存占用

数据类型:避免全 float32

Transformers 默认以全精度 float32 加载模型,一个 8B 模型大约需要 32GB 内存。请使用 torch_dtype="auto"(在 pipeline 中为 dtype="auto")参数:对于以 bfloat16 训练的模型,它会自动使用 bfloat16,从而显著降低内存占用。

量化:8-bit / 4-bit

要进一步降低内存,可用 bitsandbytes 把模型量化到 8-bit 或 4-bit。创建 BitsAndBytesConfig 设置量化配置,并通过 pipeline 的 model_kwargs 参数传入。下面示例把模型量化到 8-bit:

from transformers import pipeline, BitsAndBytesConfig

quantization_config = BitsAndBytesConfig(load_in_8bit=True)
pipeline = pipeline(task="text-generation", model="meta-llama/Meta-Llama-3-8B-Instruct", device_map="auto", model_kwargs={"quantization_config": quantization_config})

更多量化后端(GPTQ、AWQ、bitsandbytes、compressed-tensors 等)参见 量化总览文档

为什么大模型更慢:内存带宽瓶颈

一般而言,模型规模与性能正相关。更大的模型除了占用更多内存外速度也更慢,因为每生成一个 token 都要把每个激活参数从内存读一次。这正是 LLM 文本生成的瓶颈,改善生成速度的主要手段是量化模型使用内存带宽更高的硬件;单纯增加算力意义不大。

投机解码(speculative decoding)

还可以尝试投机解码等技术:由一个小模型生成候选 token,再交给大模型校验;若候选 token 正确,大模型一次可"跳过"多个 token,显著缓解带宽瓶颈、提升生成速度。相关机制见 Text generation strategies 中的 speculative decoding 章节;在 pipeline 层面也可通过 assistant_model 参数传入校验模型(见 text_generation.py 第 197-201 行 中向 generate 透传 assistant_model 的逻辑)。

MoE 模型的特殊性

Mixtral、Qwen2MoE、GPT-OSS 等混合专家(MoE)模型(分别参见 Mixtral 模型文档Qwen2MoE 模型文档GPT-OSS 模型文档)参数很多,但每个 token 只"激活"其中一小部分。因此 MoE 模型的内存带宽需求通常远低于同等规模的稠密 LLM,速度可以更快。但需注意:投机解码这类技术对 MoE 模型不奏效——因为每多推测一个 token,被激活的参数会进一步增加。

小结与延伸阅读

登录后查看全文
热门项目推荐
相关项目推荐