问题与目标
因果语言模型最初学习的是“根据已有 Token 预测下一个 Token”,这并不等于它天然知道怎样遵循指令、拒绝危险请求或保持对话角色。对话能力是在基础预训练之上,通过指令数据、偏好数据和消息模板逐步形成的。
本篇从预训练、监督指令微调和偏好对齐解释能力来源,区分系统、用户和助手消息,并说明幻觉、知识边界和输出不稳定性。讨论停留在机制和使用边界,不展开具体训练框架。

三个阶段解决的问题不同:预训练获得语言与知识模式,指令微调学习任务和回答形式,偏好对齐让候选回答更接近人类偏好与安全要求。
核心概念
预训练:学会语言分布
模型从大规模语料中学习 Token 之间的统计关系、语言结构和部分世界知识。它能续写文本,却未必把一句命令理解成需要完成的任务。基础模型可能继续模仿提示文本,也可能生成多个角色的内容。
预训练知识不是数据库记录:
- 内容被压缩在参数中,无法保证逐条准确回忆;
- 训练数据存在时间边界和覆盖差异;
- 相似语言模式可能产生听起来合理但事实错误的内容;
- 参数规模增加不会自动提供来源引用。
监督指令微调:学会按任务回答
监督指令微调使用“指令—回答”或多轮消息样本继续训练。模型学习常见任务格式、回答风格、角色边界和停止位置。数据的覆盖、质量与一致性会直接影响结果。
指令微调不是把所有新知识写入模型的最佳方式。频繁变化的事实、私有文档和需要引用来源的内容通常更适合由检索或工具在运行时提供。
偏好对齐:从多个可行回答中选择
同一个问题可能有多个语法正确的回答。偏好数据表达哪些回答更有帮助、清晰、安全或符合规范。常见路线包括基于奖励模型的强化学习以及直接偏好优化等,但具体算法不是应用调用的前提。
对齐也不是“保证正确”。它更多影响回答倾向、风格与拒答行为,事实核验仍需要外部数据和评价流程。
消息角色与 Chat Template
对话 API 常见三个角色:
system:定义长期规则、身份和回答边界;user:提供当前请求与输入;assistant:保存历史回答或作为训练目标。
模型最终仍接收 Token 序列。Chat Template 会把角色消息转换为模型训练时使用的特殊格式。不同模型模板不同,不能手工套用另一种模型的标记。
可运行实现
下面用纯 Python 显式渲染一组消息,观察角色、分隔符和生成起始标记怎样组成最终文本。真实模型应优先调用其 Tokenizer 提供的 Chat Template。
from dataclasses import dataclass
@dataclass
class Message:
role: str
content: str
ALLOWED_ROLES = {"system", "user", "assistant"}
def render_chat(messages: list[Message], add_generation_prompt: bool = True) -> str:
parts = []
for message in messages:
if message.role not in ALLOWED_ROLES:
raise ValueError(f"unsupported role: {message.role}")
content = message.content.strip()
if not content:
raise ValueError(f"empty content for role: {message.role}")
parts.append(f"<|{message.role}|>\n{content}\n")
if add_generation_prompt:
parts.append("<|assistant|>\n")
return "".join(parts)
conversation = [
Message("system", "只根据输入说明整理故障信息;信息不足时明确指出。"),
Message("user", "节点 NX-8 从 10:20 开始超时,目前没有恢复记录。"),
]
print(render_chat(conversation))
这个模板只是说明角色序列,不能直接替代具体模型的官方模板。使用 Transformers 时通常应调用:
text = tokenizer.apply_chat_template(
[message.__dict__ for message in conversation],
tokenize=False,
add_generation_prompt=True,
)
如果基础模型没有经过对应 Chat Template 训练,加入角色标记也不会自动获得稳定对话能力。
常见问题与排查
System 消息写了规则,模型仍然违反
系统消息影响概率,不是代码级权限控制。关键约束必须在应用层校验,例如字段白名单、数据权限、最大长度和危险操作确认。
多轮对话越长,回答越差
历史消息会占用上下文窗口,旧指令、错误回答和无关内容还可能互相干扰。保存完整历史不等于有效记忆,需要选择、压缩或重建上下文。
模型自信地给出不存在的事实
这是生成目标与事实查询目标不一致的典型表现。提示模型“不知道就说不知道”只能降低部分风险;高风险事实需要检索、工具或权威数据验证。
本地模型输出角色标记或继续编写用户消息
检查是否使用正确 Chat Template、是否添加生成起始标记、停止 Token 是否配置,以及加载的是基础模型还是指令模型。
小结
对话模型不是单靠 Transformer 结构产生的。预训练提供语言能力,指令微调建立任务响应方式,偏好对齐改变回答倾向,Chat Template 则把应用消息转换为模型熟悉的序列。理解这些层次后,才能正确判断 Prompt 能解决什么、应用代码必须控制什么。
License: CC BY-NC 4.0
Updated 2 hours ago
Was this article helpful? Give it a like.
0 comments


