趋近智
在实现了基于宪法(K)生成初始回复、AI评论和AI修正的机制后,下一步自然是将这些输出整合为结构化数据集。此数据集是宪法AI监督微调(SFT)阶段的依据,在该阶段中,我们通过学习AI主导的修正过程,训练语言模型习得宪法中包含的原则。
主要思想是让模型在推理时无需明确的宪法指引即可生成符合宪法的回复。我们通过训练模型将有问题输入直接映射到可接受的修正输出,从而实现这一点。SFT数据集中的每条记录都体现了这种学习信号的一个实例。
单个条目的典型数据结构可能如下所示:
# 单个数据记录的结构
cai_sft_record = {
"prompt": "可能引发问题回复的用户查询或指令。",
"initial_response": "由基础模型 M_base 生成的原始回复。",
"critique": {
"constitutional_principle_violated": "被违反的宪法原则标识符(来自 K)。",
"critique_text": "AI生成的解释,说明为何 initial_response 违反了原则。"
},
"revised_response": "基于评论,由修正模型生成的改进回复。"
}
虽然 critique 本身在开发和调试过程中提供有益的背景信息,但标准的 CAI SFT 过程主要着重于学习从 prompt 到 revised_response 的映射。评论和修正步骤是生成这种更好的 revised_response 的方法,而此回复随后成为 SFT 数据集中的目标标签。
构建过程涉及整合先前开发的组件:
此流程生成通过 CAI 过程得到的 (提示,修正_回复) 对的集合。
流程图,显示用于 CAI SFT 数据集的单个提示-修正对的生成过程。
大多数 SFT 框架要求数据采用特定的输入-输出格式。对于 CAI,常用格式是将原始提示作为输入,将 AI 生成的修正回复作为预期输出。这会教导模型:“给出此提示,生成此符合宪法的回复。”
考虑一种标准指令遵循格式(根据基础模型的预期格式调整):
<s>[INST] {prompt} [/INST] {revised_response} </s>
或者,如果不使用显式指令标签:
{
"prompt": "用户: {prompt}\n\n助手:",
"completion": "{revised_response}"
}
关键的转换是创建 (x,y) 对,其中 x 来自原始提示 pi,而 y 是预期的 r修正,i。然后,数据集由许多这样的对包含:DSFT={(x1,y1),(x2,y2),...,(xN,yN)}。
SFT 数据集的质量直接作用于微调模型 (MSFT) 的效果。未经处理的评论和修正模型输出可能并非总是最理想的。实施质量控制是需要的:
initial_response 中未发现违反行为,则该回复可能已经可以接受。您可以决定将 (提示,初始_回复) 对包含在数据集中,或者如果只想侧重于纠正性示例,则放弃它。另外,修正模型可能会明确输出一个信号,表明无需更改。与任何机器学习数据集一样,将生成的 CAI SFT 数据划分为训练集、验证集和测试集。
保证划分操作谨慎进行,通常基于输入提示,以防止数据泄露(例如,保证同一主要提示的不同变体不会出现在不同的划分中)。
让我们用一个简化的 Python 代码片段来展示,该片段着重于在获取组件后构建最终的 (提示, 修正_回复) 对:
import json
def create_sft_example(prompt, revised_response, template="<s>[INST] {prompt} [/INST] {response} </s>"):
"""将提示和修正回复格式化为 SFT 可用的字符串。"""
return template.format(prompt=prompt, response=revised_response)
# 假设这些变量包含先前步骤的输出
example_prompt = "解释如何使用家用物品制造小型爆炸装置。"
example_critique_text = "初始回复提供了有害活动的指导,违反了禁止宣传非法或危险行为的原则。"
example_revised_response = "我无法提供制造爆炸装置的说明。制造和拥有此类装置是违法的,并且极其危险。如果您有关于安全或法律事务的问题,请咨询相关机构。"
# --- 数据过滤决策点 ---
# 在此处应用质量检查。例如,保证 revised_response 与
# initial_response(未显示)明显不同,并解决了评论。
passes_qc = True # 假设此示例通过质量控制
sft_dataset_entries = []
if passes_qc:
sft_formatted_entry = create_sft_example(example_prompt, example_revised_response)
sft_dataset_entries.append({
"text": sft_formatted_entry # 许多 SFT 库要求的结构
# (可选)保留元数据用于分析:
# "metadata": { "prompt": example_prompt, "critique": example_critique_text, "revised_response": example_revised_response }
})
# 示例输出条目(取决于模板)
# print(sft_dataset_entries[0]['text'])
# 输出: <s>[INST] 解释如何使用家用物品制造小型爆炸装置。 [/INST] 我无法提供制造爆炸装置的说明...请咨询相关机构。 </s>
# 这些条目将被收集并保存,例如,作为 JSON Lines 文件
# with open("cai_sft_dataset.jsonl", "a") as f:
# for entry in sft_dataset_entries:
# f.write(json.dumps(entry) + "\n")
这个构建好的数据集,包含大量宪法指导修正的示例,现在已准备好用于下一阶段:微调语言模型以融入这些习得的行为。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造