元数据卡
- 前置知识:ch11 预训练与微调
- 预计时间:50 分钟
- 核心难度:进阶/深入
- 阅读模式:高度专注
- 完成标志:能解释 RLHF 和 DPO 的区别、搭建一个基础的 RAG 系统、理解 Agent 的工作循环
你的进度
模型工坊里,你的 Transformer 在大量文本上完成了预训练。它能续写句子、回答问题、甚至写代码。但你发现一个问题——它“不听话”。
你让它用 JSON 格式输出,它给你写了一段散文。你让它不要编造事实,它自信地给出了错误答案。
模型工坊的最后几台机器上写着:对齐、检索增强、Agent 循环——让模型不仅是知识渊博,而且是可用的。
你的任务
LLM 从预训练到可用,需要跨越三个关卡:对齐(让模型说人话、不说假话)、知识更新(模型训练完就冻结了,但知识会过时——RAG 解决这个)、能力扩展(让模型能调用工具、查数据库、规划多步任务——Agent)。本章逐一拆解。
本章分层
- 必读:RLHF/DPO 对齐原理、RAG 检索增强生成、Agent 循环
- 选读:LLM Evaluation 基准、幻觉检测
- 进阶:RLHF 的 reward hacking 问题
破局 · 溯源
你有一个强大的语言模型。你问它:"西藏首府是哪里?"它回答:"日喀则。"——错了。你再问:"1+1 等于几?"它回答:"等于无数种可能性,取决于你在什么进制下计算。"
不是模型不够"聪明",而是它没被"对齐"到人类的交流规范:它不知道要准确回答事实问题,不知道要给出简洁答案。预训练只教会了它语言,没教会它"如何与人对话"。
对齐:RLHF 与 DPO
RLHF(Reinforcement Learning from Human Feedback)是 OpenAI 在 InstructGPT 中提出的对齐方法:
- 用人工标注对比模型输出,训练一个"奖励模型"
- 用 PPO(Proximal Policy Optimization)以奖励模型为信号微调 LLM
# RLHF 的伪代码示意
def rlhf_training(policy_model, reward_model, ref_model, prompts):
"""单步 PPO 训练"""
for prompt in prompts:
response = policy_model.generate(prompt)
reward = reward_model.score(prompt, response)
# PPO 约束:新策略不能偏离参考策略太远(KL 惩罚)
kl_div = kl_divergence(policy_model(prompt), ref_model(prompt))
loss = -reward + beta * kl_div
loss.backward()
optimizer.step()DPO(Direct Preference Optimization)简化了这个过程:不显式训练奖励模型,直接用人偏好数据训练 LLM。
两者核心区别:RLHF 先学奖励函数再用策略梯度优化,DPO 用偏好数据直接优化策略。
# DPO 损失函数直觉:
# 如果人类更喜欢 A 超过 B,就把 P(A) 升高、P(B) 降低
# 同时不偏离原始模型太远RAG:检索增强生成
预训练模型的知识截止于训练数据采集时刻。RAG 在生成时从外部知识库检索相关文档,把结果作为上下文注入 prompt。
# 标准的 RAG 流程
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.llms import OpenAI
from langchain.chains import RetrievalQA
# 1. 构建向量数据库
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(documents, embeddings)
# 2. 查询时:检索 + 生成
qa_chain = RetrievalQA.from_chain_type(
llm=OpenAI(temperature=0),
retriever=vectorstore.as_retriever(search_k=3)
)
query = "根据我们最新的销售数据,Q3 表现如何?"
answer = qa_chain.run(query)
print(answer)RAG 的流程:
用户输入 → 向量化 → 检索 Top-K 相关文档
↓
将文档 + 用户输入拼成增强 Prompt
↓
LLM 基于增强上下文生成答案RAG 解决了 LLM 的三个刚需:知识更新(不上传重新训练)、来源可追溯(可以看到引用了哪些文档)、领域适配(企业私域数据)。
Agent
Agent 让 LLM 不只是"回答问题",而是能主动执行多步任务。核心是 ReAct(Reasoning + Acting)模式:
循环:
1. 思考(Thought):当前状态,下一步该做什么
2. 行动(Action):调用工具(搜索、计算、读文件)
3. 观察(Observation):看工具返回什么
4. 重复直到任务完成# Agent 的简化循环
class SimpleAgent:
def __init__(self, llm, tools):
self.llm = llm
self.tools = {t.name: t for t in tools}
def run(self, task, max_steps=10):
messages = [{"role": "user", "content": task}]
for step in range(max_steps):
response = self.llm(messages)
if response.finished: # 模型决定输出最终答案
return response.content
# 解析工具调用
tool_calls = self.parse_tool_calls(response)
for call in tool_calls:
tool = self.tools[call.name]
result = tool.run(**call.args)
messages.append({"role": "tool",
"content": str(result),
"name": call.name})
return "Max steps reached"Agent 的关键能力:
- 工具使用:模型需要学会什么时候调用工具、传什么参数
- 规划:把复杂任务分解成子步骤
- 记忆:对话历史/长期记忆(可以用向量数据库存)
- 错误恢复:工具调用失败后重新规划
Evaluation
LLM 评估比传统 ML 更困难——正确答案往往不是唯一的。评估维度:
- 实用性:回答是否满足用户需求(人工打分、LLM-as-judge)
- 安全性:是否产生有害内容
- 幻觉率:编造事实的比例
- 对齐度:是否遵循指令格式
# LLM-as-judge:用另一个 LLM 评估生成质量
eval_prompt = f"""
Task: Evaluate if the assistant's response is helpful, accurate, and follows instructions.
User query: {query}
Assistant response: {response}
Score 1-5 for: helpfulness, accuracy, instruction-following.
"""
score = eval_llm(eval_prompt)常见陷阱
- RLHF 中的 reward hacking:模型学到讨好评委的表面策略而不是实际做好任务。需要不停更新奖励模型。
- RAG 的检索质量决定一切——如果 Top-K 中没有正确答案,LLM 要么翻但乱猜、要么承认不知道。
- Agent 的循环容易陷入死循环:LLM 反复调用同一个工具。需要设置 max_steps 和终止条件。
- Token 消耗:Agent 在多步交互中消耗大量 tokens(每一步都重复历史),需要精打细算。
- 幻觉不是"bug"是"特性"——预训练的语言建模目标本身鼓励模型填充最可能的词,而不是事实核查。
通关挑战
- 热身(10 分钟):用 HuggingFace 的 transformers 加载一个对话模型(如 microsoft/DialoGPT 或 LLaMA 变体),测试同一问题的 3 次回答——观察随机性带来的差异。
- 挑战(45 分钟):使用 LangChain + Chroma 搭建一个 RAG 系统。把一份本地文档(PDF 或 Markdown)拆分成段落、建索引、问答。
- 观察:构造一个需要多步推理的问题(如"小明从北京到上海再到广州,最后一站是哪里?"),比较 zero-shot 和 CoT prompting 的回答质量。
旅人笔记
预训练给了 LLM 知识,对齐给了它"怎么说话",RAG 给了它"获取新知识的能力",Agent 给了它"主动做事的能力"。四个环节组合,LLM 从互联网聊天机器人变成真正的工作助手。
-> 下一站预告
能力越强,责任越大。LLM 可能产生偏见、泄露隐私、被恶意利用——下一章讨论 AI 伦理与安全。