实用笔记:从下一个词预测到ChatGPT <> 自行构建大语言模型
《实用笔记》操作指南:从下一个标记预测到ChatGPT <> 构建大语言模型——为采用该模式的团队提供代码模板、检查清单及可直接使用的代码片段。
可将此内容视为《从下一个标记预测到ChatGPT <> 从头构建大语言模型[6]》中理念面向操作员的简化版:清晰的阶段划分、有序的代码模块,以及便于交接时参考的恢复说明。 在“概览”阶段,若能将其视为可量化的界面来使用效果最佳。在扩大范围之前,先记录一份理想的对话转录、一个失败案例以及对应的回滚说明。 应将配置信息与应用程序代码分开。环境文件、密钥存储和功能开关应集中存放于一个位置,这样操作员无需查看整个系统结构即可进行审核。
第一幕:预训练教会的是内容生成能力,而非服从指令
在第一步的预训练阶段,应在修改代码之前明确输入内容、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 需同时记录正常流程和异常恢复路径。重试机制、人工审核环节以及错误处理都属于产品功能的一部分,而非后续需要补充的内容。 当下一步操作为编写代码或调用工具时,应优先使用具有结构化格式且经过模式验证的输出,而非自由形式的文字描述。
Explain why the sky appears blue.
Explain why the sky appears blue.
The following questions are commonly asked in introductory physics...
The sky appears blue because Earth's atmosphere scatters
shorter wavelengths of sunlight more strongly than longer
wavelengths...
What text probably comes next?
When the text looks like an instruction,
what kind of continuation should I produce?
第二步:将对话转化为训练样本
在第二幕“对话转换”阶段,修改代码之前需明确输入内容、该步骤的负责人以及退出标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 相较于冗长的脚本,应优先选择小型且可测试的单元。当某个步骤失败时,故障原因应能指向单一责任点,而非复杂的流程链。 如果后续步骤是代码或工具调用,应优先使用具有结构化格式且经过模式验证的输出,而非自由形式的文字描述。
example = {
"instruction": "Convert the following sentence to passive voice.",
"input": "The developer fixed the bug.",
"output": "The bug was fixed by the developer."
}
Below is an instruction that describes a task.
### Instruction:
Convert the following sentence to passive voice.
### Input:
The developer fixed the bug.
### Response:
The bug was fixed by the developer.
instruction
↓
optional context
↓
response
模型实际看到的内容
在修改代码之前,需为“模型实际执行阶段”明确输入参数、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测其中的隐藏状态。 应将此阶段视为输入与验证后输出之间的契约。为相关成果命名,设定成功检测标准,并拒绝默许的半完成状态。 当下一步操作为代码编写或工具调用时,优先采用具有结构化格式且经过模式验证的输出,而非自由形式的文字描述。 在修改代码之前,需为“模型实际执行阶段”明确输入参数、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测其中的隐藏状态。 应将配置信息置于应用程序代码之外。环境文件、密钥存储以及功能开关应集中存放于一个位置,以便操作人员无需查看整个系统结构即可进行审核。
[21106, 318, 281, 12064, ... 4435, 257, 3126, ...]
Tokens:
[A, B, C, D, E]
Input:
[A, B, C, D]
Labels:
[B, C, D, E]
instruction → useful response
填充值需要特殊处理
在处理“填充值需要特殊处理”这一阶段时,首先需记录下相关约定:所需的输入参数、成功信号以及部分失败时的处理方式。这样的清单能确保后续的代码修改保持一致性。 同时记录正常流程和异常恢复流程。重试机制、人工审核环节以及错误消息处理都是产品功能的一部分,而非后续需要补充的内容。 缓存系统中稳定的指令和工具结构。重复发送相同的开头信息是导致资源浪费的常见原因。
Example 1:
[10, 20, 30, 40]
Example 2:
[11, 21]
Example 1:
[10, 20, 30, 40]
Example 2:
[11, 21, PAD, PAD]
PAD → PAD → PAD → PAD
ignore_index = -100
loss = cross_entropy(
logits.reshape(-1, vocab_size),
targets.reshape(-1),
ignore_index=-100,
)
第三阶段:微调行为表现
在第三阶段进行微调时,首先写下相关契约:所需的输入参数、成功标志以及部分失败时的处理方式。这样的清单能确保后续的代码修改保持一致性。 优先选择小型、可测试的单元,而非庞大的脚本。当某个步骤失败时,故障应指向单一的责任模块,而非复杂的流程链。 缓存系统中稳定的指令和工具结构。重复发送相同的开头信息是导致资源浪费的常见原因。
for batch in train_loader:
optimizer.zero_grad()
input_ids = batch[:, :-1]
targets = batch[:, 1:]
logits = model(input_ids)
loss = cross_entropy(
logits.flatten(0, 1),
targets.flatten(),
ignore_index=-100,
)
loss.backward()
optimizer.step()
model.learn_to_be_helpful()
### Instruction:
Summarize this paragraph.
### Response:
<clear concise summary>
### Instruction:
Write Python code that reverses a string.
### Response:
def reverse_string(s):
return s[::-1]
The CPU cache is...
### Instruction:
Explain CPU caching to a beginner.
### Response:
A CPU cache is...
第四阶段:评估变得棘手
在进入“第4阶段:评估转化”时,首先需写下相关契约:所需的输入参数、成功标志以及部分失败时的处理方式。这份清单能确保后续的代码修改始终符合约定。 将此阶段视为输入与验证后输出之间的契约。为相关产物命名,明确成功判定标准,杜绝默许的部分完成情况。 缓存系统中稳定的指令及工具结构。重复发送相同的开头信息是导致资源浪费的常见原因。 在进入“第4阶段:评估转化”时,首先需写下相关契约:所需的输入参数、成功标志以及部分失败时的处理方式。这份清单能确保后续的代码修改始终符合约定。 将配置信息置于应用程序代码之外。环境文件、密钥存储以及功能开关应集中存放于一处,以便操作人员无需查看整个系统结构即可进行审计。
Prediction: SPAM
Label: SPAM
Correct.
Recursion is when a function solves a problem by calling
itself on a smaller version of the same problem.
Recursion is a technique where a problem is reduced into
smaller instances of itself until a stopping condition is reached.
参考答案依然有用。
将“参考答案依然有用”阶段视为可度量的指标时效果最佳。在扩大范围之前,先记录一个成功的案例、一个失败案例以及回滚说明。 同时记录正常流程和恢复流程。重试机制、人工审核环节以及错误处理都是产品的一部分,而非后续需要补充的内容。 为每轮对话和每次会话设定token预算。智能工具会大量消耗上下文资源,设置上限可避免演示过程变成意外的费用账单。
{
"instruction": "Explain recursion simply.",
"reference": "Recursion solves a problem by repeatedly reducing it...",
"model_response": "A recursive function calls itself..."
}
让另一款大语言模型来评估答案
将“让另一款大语言模型执行任务”这一方法视为可衡量的操作界面来使用效果最佳。在扩大范围之前,先记录一份成功的示例、一个失败案例以及回滚说明。 优先选择小型且可测试的单元,而非庞大的脚本。当某个步骤失败时,故障应能指向单一责任主体,而非复杂的流程链。 为每轮对话和每次会话设定token预算。智能代理工具会大量消耗上下文资源,设置上限可避免演示过程变成意外的费用账单。
Instruction:
Explain recursion simply.
Reference answer:
...
Model answer:
...
Rate the model answer from 0 to 100 based on correctness,
relevance, and clarity.
1. Inspect representative outputs manually
2. Compare against reference answers where useful
3. Use an LLM judge for aggregate comparison
第五幕:我们遇到了更棘手的问题 <> 偏好设置
将“Act 5 Then We stage”视为可度量的工作面时,其效果最佳。在扩大范围之前,需记录一份理想案例、一个失败案例以及回滚说明。 应将此阶段视为输入与已验证输出之间的契约。为相关成果命名,明确成功标准,杜绝默许的半完成状态。 需为每轮及每次会话设定预算额度。智能工具往往会过度扩展上下文,设置上限可避免演示过程变成意外的费用账单。 将“Act 5 Then We stage”视为可度量的工作面时,其效果最佳。在扩大范围之前,需记录一份理想案例、一个失败案例以及回滚说明。 应将配置信息置于应用程序代码之外。环境文件、密钥存储及功能开关应集中存放于一处,以便操作人员无需查看整个系统结构即可进行审计。
响应A
在“响应A”阶段,应在修改代码之前明确输入参数、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 需同时记录正常流程和异常恢复流程。重试机制、人工审核环节以及错误处理都是产品本身的组成部分,而非后续需要补充的功能。 当下一步操作为代码编写或工具调用时,应优先使用具有结构化格式且经过模式验证的输出,而非自由形式的文字描述。
Recursion is when a function calls itself.
响应B
在响应B阶段,应在修改代码之前明确输入参数、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 相比冗长的脚本,更应采用小型、可测试的单元。当某个步骤失败时,故障原因应能指向单一责任点,而非复杂的流程链。 如果后续步骤是代码或工具调用,相比自由形式的文本,更应使用具有结构化格式且经过模式验证的输出。
Recursion is a technique where a function solves a problem
by calling itself on a smaller version of that problem.
The process stops when it reaches a base case.
correct vs incorrect
chosen vs rejected
{
"prompt": "Explain recursion simply.",
"chosen": """
Recursion solves a problem by repeatedly reducing it
until reaching a base case.
""",
"rejected": """
Recursion is when recursion happens recursively.
"""
}
Prompt
↓
Chosen response ─────┐
├── preference objective
Rejected response ───┘
↓
model update
Pretraining
↓
learn language patterns
------------------------------
Instruction fine-tuning
↓
learn instruction → response behavior
------------------------------
Preference tuning
↓
learn which acceptable responses we prefer
究竟发生了什么变化?
在“实际发生了什么变化”阶段,应在修改代码之前明确输入参数、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 将此阶段视为输入与已验证输出之间的契约。为相关成果命名,定义成功判定条件,并拒绝默许的半完成状态。 当下一步操作是编写代码或调用工具时,优先采用具有架构验证的结构化输出,而非自由形式的文字描述。 在“实际发生了什么变化”阶段,应在修改代码之前明确输入参数、该步骤的负责人以及终止标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 将配置信息置于应用程序代码之外。环境文件、密钥存储以及功能开关应集中存放于一个操作人员可审核的位置,无需阅读整个系统结构。
### Instruction:
Pretraining:
What token should come next?
Instruction tuning:
What does a good answer look like after an instruction?
Preference tuning:
Of several reasonable answers, which behavior should we prefer?
总结
在进入总结阶段时,首先写下相关契约:所需的输入参数、成功信号以及部分失败时的处理方式。这样的清单能确保后续的代码修改保持一致性。 同时记录正常流程和异常恢复流程。重试机制、人工审核环节以及死信处理都是产品本身的一部分,而非后续需要补充的功能。 缓存系统中稳定的指令和工具结构。重复发送相同的开头信息是导致资源浪费的常见原因。
如果本指南对您有帮助……
在处理“如果本指南有帮助”这一阶段时,首先需明确合同条款:所需的输入参数、成功信号以及部分失败时的处理方式。这样的清单能确保后续的代码修改保持一致性。
操作检查清单
在执行操作检查清单阶段时,同样要首先明确合同条款:所需的输入参数、成功信号以及部分失败时的处理方式。这样的清单能确保后续的代码修改保持一致性。
在记录功能结果的同时,还需标注执行时间以及令牌或查询的成本。提前了解成本情况,可避免在从演示环境过渡到共享环境时出现意外费用。
缓存稳定的系统指令和工具架构。重复发送相同的前置数据是导致系统故障的常见原因。
尽量降低渲染成本,只有在经过评估后才将耗时的计算操作放入缓存中。过早使用缓存可能会掩盖过时属性带来的错误。
只要预算允许,就在持续集成过程中使用测试用例而非真实的付费 API 来对关键路径进行压力测试。
优先选择小型且易于测试的模块,而非结构复杂的脚本。当某个步骤出错时,错误应能指向具体的责任模块,而非整个混乱的流程。
在推广新技术栈之前,先锁定各版本,为关键路径记录标准操作流程,并确认回滚步骤。共享环境需要设置速率限制、租户验证机制,以及明确的密钥轮换负责人。与其追求华丽的临时演示,不如注重扎实的可靠性。
关于6748f099cda4的批处理说明:不要将提供者密钥放入代码仓库,为每个会话设置令牌上限,并将转录内容存储在评估测试用例的旁边,以便后续模型更换时仍能保持可比性。