Skip to content

元数据卡

  • 前置知识: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 中提出的对齐方法:

  1. 用人工标注对比模型输出,训练一个"奖励模型"
  2. 用 PPO(Proximal Policy Optimization)以奖励模型为信号微调 LLM
python
# 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。

python
# 标准的 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. 重复直到任务完成
python
# 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)
  • 安全性:是否产生有害内容
  • 幻觉率:编造事实的比例
  • 对齐度:是否遵循指令格式
python
# 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 伦理与安全。

Built with VitePress | Software Systems Atlas