What is LLM?

一、LLM 定义

LLM(Large Language Model,大语言模型)是一种能理解并生成人类语言文本的机器学习模型,基于 Transformer 架构,通过深度学习分析海量无结构数据。

核心特征

  • 大规模: 训练数据可达数千GB(来自互联网、书籍、代码等)
  • 自注意力机制: 能够理解上下文关系,捕捉句子各部分之间的关联
  • 概率生成: 基于训练数据中的统计规律生成文本

二、工作原理

2.1 深度学习与神经网络

LLM 底层基于人工神经网络

  • 输入层 → 隐藏层(多个)→ 输出层
  • 层与层之间通过权重连接传递信息
  • 使用概率分析学习语言规律(如字母 “e” 和 “o” 在英文中最常见)

2.2 Transformer 与 Self-Attention

Transformer 是 LLM 的核心架构:

  • Self-Attention(自注意力): 能检测序列中各元素之间的关联方式
  • 理解 “The end of a sentence connects to the beginning” 的上下文关系
  • 比传统机器学习更好地处理歧义和未见过的新组合

2.3 训练与微调

预训练(Pre-training)→ 微调(Fine-tuning)→ Prompt Tuning
  1. 预训练: 在大规模通用数据上训练
  2. 微调: 针对特定任务(如问答、翻译)进行调整
  3. Prompt Tuning: 通过输入提示词引导模型输出

三、LLM 的能力与局限

3.1 核心能力

能力 说明
文本生成 文章、代码、诗歌、对话等
问答理解 理解自然语言问题并回答
上下文学习 从对话历史中提取信息
代码辅助 补全、生成、调试代码
多语言 支持翻译和跨语言理解

3.2 主要局限

问题 说明
幻觉 (Hallucination) 在无法准确回答时,模型会编造看似合理但错误的信息
数据依赖 输出质量依赖训练数据的质量,存在过时知识问题
幻觉危害 例:2022 年 ChatGPT 被问及特斯拉财务数据时,编造了完整新闻文章
安全风险 用户可能泄露机密信息;模型可能通过输入被操纵

四、关键概念区分

4.1 Agent vs Model

方面 Model Agent
本质 组件 系统
能力 仅预测响应 自主规划 + 工具调用
决策 基于训练数据 动态决定下一步行动
记忆 可有(短期/长期)

“An agent is an application that attempts to achieve a goal by observing the world and acting upon it using the tools that it has at its disposal.” — Google

4.2 LLM vs SLM

指标 LLM SLM
参数规模 百亿~万亿 < 100亿
训练数据 超大规模 特定领域
资源消耗
适用场景 复杂通用任务 轻量级专用任务
示例 GPT-4o、Gemini Pro Llama 3.1 8B、Gemma 2 9B

4.3 开源 vs 闭源

类型 特点 代表
闭源 代码不公开,通过 API 访问 GPT-4o、Gemini、Claude
开源 代码/权重公开,可自由部署 Llama、Gemma、Mistral

五、Agent 的三大核心组件

Agent = Model + Instructions/Orchestration + Tools

5.1 Instructions(指令层)

定义 Agent 的角色、行为规则和约束:

system_prompt = """
You are a friendly programming tutor.
Always explain concepts in simple terms with examples.
If the user asks about non-programming topics, politely redirect.
"""

5.2 Orchestration(编排层)

处理推理和记忆的循环过程:

推理技术:

  • Chain-of-Thought (CoT): 逐步推理,避免跳过中间步骤
    Step 1: <reasoning>
    Step 2: <reasoning>
    Step 3: <reasoning>
    Response: <final answer>
    
  • ReAct: 结合推理与行动,通过工具调用获取外部信息

Memory 类型:

  • Short-term: 当前对话上下文,受限于模型的 context window
  • Long-term: 外部存储(如向量数据库),通过 RAG 检索

5.3 Tools(工具层)

扩展模型能力,调用外部函数访问实时数据或执行操作:

# Function Calling 示例
tools = {
    "CurrencyAPI": {"input": "USD, CNY", "returns": "exchange rate"},
    "Calculator": {"input": "arithmetic expression", "returns": "result"}
}

模型不执行函数,而是判断何时调用、传什么参数


六、代表模型一览

模型 公司 特点
ChatGPT / GPT-4o OpenAI 通用能力强,生态完善
Gemini Google 多模态,Google 生态集成
Claude Anthropic 长上下文,安全性高
Llama Meta 开源标杆,社区活跃
Copilot Microsoft/GitHub 代码辅助
Mistral 7B Mistral AI 高效开源

七、学习路径建议

  1. 入门: 理解 LLM 基本原理(本文档)
  2. Agent 开发: 掌握 Prompt Engineering、CoT、ReAct
  3. 能力扩展: RAG(检索增强生成)、Fine-tuning
  4. 工具链: LangChain、向量数据库、Function Calling
  5. 深入: 阅读原论文(Attention is All You Need、CoT、ReAct)

参考资料

Embeddings

什么是 Embedding?

Embedding(嵌入)是将真实世界对象(文本、图片、视频等)转换为连续向量空间中的点的技术,使机器学习模型能够理解和处理这些对象。

为什么需要 Embedding?

传统方式 Embedding
离散符号 连续向量
无语义关系 语义相似性可计算
维度高且稀疏 维度可控,密集
难以比较 通过向量距离衡量相似度

向量的直观理解

二维例子:地理位置

经纬度是天然的二维向量:

温哥华: {49°15'40"N, 123°06'50"W}
本拿比: {49°16'N, 122°58'W}  ← 接近温哥华
西雅图: {47°36'35"N, 122°19'59"W, 749,256} ← 人口也接近

向量搜索的核心思想:如果两个向量的值接近,它们就是相似的。

多维例子:电视剧相似度

维度 说明
Genre 类型(Sitcom, Horror…)
Year 首播年份
Episode length 单集时长
Seasons 季数
Episodes 总集数
Seinfeld: {[Sitcom], 1989, 22-24, 9, 180}
Cheers: {[Sitcom], 1982, 21-25, 11, 275}  ← 相似!(同一类型)
Wednesday: {[Horror], 2022, 46-57, 1, 8}  ← 远离 Seinfeld(不同类型)

Embedding 的数学原理

向量基础

向量是 n 维空间中的一个点:

# 简单向量示例
v1 = [0.2, -0.5, 0.8, ...]  # 通常 256~3072 维
v2 = [0.1, -0.3, 0.9, ...]

# 相似度计算:余弦相似度
cosine_similarity(v1, v2) = (v1 · v2) / (|v1| × |v2|)
# 值范围 [-1, 1],1 表示完全相同

维度选择

  • 太低维度:无法捕捉足够信息
  • 太高维度:计算成本高,可能过拟合
  • 常见维度:256、512、768、1536、3072

神经网络如何创建 Embedding

Input Layer → Hidden Layer (Embedding) → Hidden Layers → Output Layer
   原始输入      ↓自动转换为向量          ↓基于向量处理    ↓推荐/分类

关键点

  1. 隐藏层自动处理:不需要人工定义每个维度
  2. 维度由模型定义:模型决定需要多少维度
  3. 可训练:通过反向传播不断优化

Embedding 在 NLP 中的应用

词 Embedding(Word Embedding)

方法 说明 代表模型
Word2Vec 预测词上下文 Mikolov et al.
GloVe 共现矩阵分解 Pennington et al.
FastText 子词 Embedding Facebook

上下文 Embedding(Contextual Embedding)

方法 说明 代表模型
ELMo 双向 LSTM Allen Institute
BERT Transformer 编码 Google
GPT Transformer 解码 OpenAI

关键区别

  • Word2Vec:同一个词永远相同向量
  • BERT:同一个词在不同上下文向量不同

示例

"The bank is by the river" 
- Word2Vec: bank → 固定向量(可能是银行或河岸)
- BERT: bank + 上下文 → 准确理解 bank=河岸

Embedding 在 LLM 中的扩展

LLM 不仅 Embedding 单词,还 Embedding 单词的上下文:

  • 可以搜索和分析整个句子、段落、文章的含义
  • 大幅提升语义理解能力

相似度搜索

相似度度量

度量 公式 适用场景
余弦相似度 cos(θ) 方向相似性,文本
欧氏距离 √Σ(ai-bi)² 绝对距离,图像
点积 a·b 绝对值重要时

搜索流程

# 1. 用户提问
query = "什么是 Embedding?"

# 2. 向量化问题
query_embedding = embed_model.encode(query)

# 3. 向量数据库搜索
results = vector_db.search(
    vector=query_embedding,
    top_k=5
)

# 4. 检索结果用于 RAG
context = "\n".join([r.content for r in results])

常见 Embedding 模型

模型 维度 特点
OpenAI text-embedding-3-large 3072 高质量,闭源
Google text-embedding-gecko 768 性价比
sentence-transformers 可配置 开源多场景
BGE 1024 国产开源

参考资料

Model Training

什么是模型训练?

模型训练是将机器学习算法与训练数据结合,调整权重以最小化损失函数的过程。

核心概念

概念 说明
损失函数 (Loss Function) 衡量预测值与真实值差距的函数
权重 (Weights) 算法中需要学习的参数
偏置 (Bias) 调整输出基准线的参数
拟合 (Fitting) 迭代调整权重直到损失最小化的过程

训练流程

输入数据 → 算法处理 → 计算损失 → 调整权重 → 重复直到收敛

关键步骤

  1. 数据准备: 清洗、格式化、特征选择
  2. 数据划分: 训练集 / 验证集 / 测试集
  3. 初始化: 随机初始化权重
  4. 迭代训练: 前向传播 → 计算损失 → 反向传播 → 更新权重
  5. 评估: 在验证集上评估性能
  6. 测试: 在测试集上最终评估

训练数据划分

为什么不能在同一数据上训练和测试?

如果用同一数据测试,无法检测过拟合

  • 过拟合:训练数据上表现好,测试数据上表现差
  • 需要未见过的数据来真实评估泛化能力

常用划分比例

场景 训练 验证 测试
小数据 70% 15% 15%
大数据 98% 1% 1%
交叉验证 - K折 -

交叉验证

K 折交叉验证

  1. 将数据分成 K 份(通常 10 折)
  2. 每次用 K-1 份训练,1 份测试
  3. 重复 K 次
  4. 取平均性能作为最终评估

过拟合与欠拟合

问题 表现 原因 解决方案
过拟合 训练好,测试差 模型太复杂 正则化、增加数据、Dropout
欠拟合 训练和测试都差 模型太简单 增加模型复杂度、增加特征

诊断方法

观察训练集和验证集的损失曲线:

  • 如果训练损失下降,验证损失上升 → 过拟合
  • 如果两者都高 → 欠拟合

监督学习 vs 无监督学习

维度 监督学习 无监督学习
训练数据 输入+输出配对 只有输入,无输出
学习目标 预测未知数据的输出 发现数据中的模式
典型任务 分类、回归 聚类、降维
常见算法 逻辑回归、SVM、神经网络 k-means、PCA

监督学习

训练数据包含输入和期望输出(标签)。模型学习输入到输出的映射关系。

分类问题:预测离散类别(垃圾邮件/正常邮件)
回归问题:预测连续值(房价、工资)

无监督学习

训练数据没有标签。模型需要自己发现数据中的结构。

聚类:将相似样本分组(用户细分、主题分组)
降维:减少特征数量(PCA、t-SNE)


超参数调优

参数 vs 超参数

类型 说明 例子
参数 模型从数据中学习得到 回归系数、神经网络权重
超参数 人为设置,控制模型行为 学习率、树的深度

调优方法

方法 说明
网格搜索 穷举所有组合
随机搜索 随机采样组合(通常更高效)
贝叶斯优化 用概率模型指导搜索

参考资料

What is Inference?

什么是模型推理?

推理(Inference) 是经过训练的机器学习模型从全新数据中得出结论或预测的过程。简言之,推理就是模型的"运行"阶段。

推理 vs 训练

维度 训练 (Training) 推理 (Inference)
阶段 学习 应用
数据 历史数据,学习用 新数据,预测用
计算 高,但一次性 持续消耗
更新 权重在变化 权重固定
目的 让模型学会 应用模型所学

训练阶段

  1. 向模型展示海量数据(数以百万计的停车标志图像)
  2. 运行并从试验和错误中学习
  3. 微调输出结果
  4. 最终具备自主识别能力

推理阶段

将训练所得应用于新数据:

  • 自动驾驶汽车识别陌生道路上的停车标志
  • LLM 根据用户提问生成回答

推理的典型例子

应用 推理内容
LLM 根据用户提问生成回答
自动驾驶 在新环境中识别交通标志
垃圾邮件检测 判断新邮件是否为垃圾邮件
预测分析 基于历史数据预测未来趋势
金融 预测市场表现

计算成本对比

训练成本:一次性(但很高)
- 需要大量 GPU/TPU
- 数天到数周
- 完成后模型可重复使用

推理成本:持续性
- 用户每次请求都消耗算力
- 云服务按调用计费
- 可能比训练总成本更高

推理优化技术

由于推理是持续运行的,优化很重要:

技术 说明 效果
量化 FP32 → INT8 → INT4 2-8x 提速
剪枝 移除不重要的权重 减少参数量
知识蒸馏 大模型教小模型 保持性能同时压缩
GPU/TPU 加速 专用硬件加速 大幅提升吞吐

量化精度对比

精度 内存占用 速度 适用场景
FP32 4 bytes 基准 训练
FP16 2 bytes ~2x 推理
INT8 1 byte ~4x 高效推理
INT4 0.5 byte ~8x 极致压缩

推理框架

框架 特点
ONNX Runtime 跨平台,高性能
TensorRT NVIDIA GPU 深度优化
vLLM LLM 高吞吐量推理
TensorRT-LLM NVIDIA 官方 LLM 优化

参考资料

Vector DB

什么是向量数据库?

向量数据库 (Vector Database) 存储、检索和搜索以高维空间向量表示的数据。通过比较向量嵌入而非精确匹配实现高效相似性搜索。

向量数据库 vs 传统数据库

维度 传统数据库 向量数据库
存储内容 结构化数据 高维向量
查询方式 精确匹配 相似度搜索
索引 B-tree, Hash HNSW, IVF
适用场景 CRUD 语义搜索

向量 vs Embedding

概念 说明
向量 有序数字列表,表示数据特征
Embedding 由 ML 模型生成的向量,表示复杂数据(文本/图像/音频)

向量数据库工作原理

核心原理

数据 → 向量化模型 → 向量嵌入 → 索引 → 相似度搜索 → 返回结果

在高维向量空间中,相似属性的数据点彼此接近,形成聚类

向量化示例

图像可提取以下特征转为向量:

  • 平均颜色
  • 颜色直方图
  • 纹理直方图
  • 耳朵/胡须/尾巴特征

相似度度量

度量 公式 说明
余弦相似度 cos(θ) 方向相似性
欧氏距离 √Σ(ai-bi)² 绝对距离,越小越相似
点积 a·b 归一化后等价余弦

索引算法

ANN 近似最近邻

算法 说明
HNSW 分层可导航小世界图,最流行
IVF 倒排索引,聚类后搜索
PQ 乘积量化,大幅压缩

HNSW 特点

  • 图索引算法
  • 高搜索质量
  • 高内存消耗
  • 支持百万级向量

MongoDB Vector Search

MongoDB Atlas 提供原生向量搜索能力:

特性 说明
HNSW 索引 高效近似最近邻搜索
混合搜索 向量 + 全文 + 结构化过滤
统一存储 向量与原始数据共存

混合搜索示例

# 语义搜索 + 关键词搜索
results = vector_search(
    query="ice cream",  # 自动理解"ice cream" ≈ "sundae"
    filter={"category": "dessert"},
    hybrid=True
)

向量数据库用例

场景 说明
图像/视频识别 相似图像搜索、人脸识别
NLP 和文本搜索 语义搜索,理解同义词
推荐系统 基于用户偏好的个性化推荐
LLM 长记忆 为 LLM 提供外部知识库
异常检测 金融欺诈检测

主流向量数据库

数据库 特点 适用场景
Pinecone 云原生托管 快速原型
Milvus 开源可扩展 大规模生产
Weaviate 混合搜索 知识图谱
Qdrant Rust 高性能 低延迟
Chroma 轻量嵌入式 快速开发
MongoDB Atlas 统一平台 已有 MongoDB
FAISS Facebook 高性能 超大规模

参考资料

AI Agent

什么是 AI Agent?

AI Agent 是使用 AI 完成任务的系统,无需人类提示或干预。它们依靠 ML 和 NLP 分析环境、收集信息、解决问题并确定采取哪些行动。

AI Agent vs 聊天机器人

维度 聊天机器人 AI Agent
交互方式 脚本、用户请求 自主决策
响应方式 即时响应 规划后执行
主动性 被动等待用户 主动执行任务
能力 对话 任务自动化

AI Agent 四大组件

组件 说明
Profiling 模块 数据收集
Memory 模块 知识管理
Planning 模块 决策和规划
Action 模块 执行动作

七种 Agent 类型

类型 说明 特点
简单反射 Agent 基于预定义规则响应 快速但不灵活
基于模型的反射 Agent 维护世界模型 处理部分可观察环境
基于目标的 Agent 目标导向规划 搜索和规划算法
学习 Agent 从经验中学习 持续改进
基于效用的 Agent 最大化效用函数 多目标权衡
分层 Agent 多层抽象 复杂任务分解
多智能体系统 多 Agent 协作 分布式问题解决

1. 简单反射 Agent

基于预定义 if-then 规则对感知直接响应。

# 伪代码示例
if 感知 == "停车标志":
    执行(刹车)
elif 感知 == "绿灯":
    执行(前进)

2. 基于模型的反射 Agent

维护一个内部世界模型,跟踪不可见的部分状态。

3. 基于目标的 Agent

使用搜索和规划算法找到达成目标的行动序列。

4. 学习 Agent

从经验/反馈中学习,逐步改进性能。(强化学习等)

5. 基于效用的 Agent

最大化效用函数,多目标权衡。

  • 自动驾驶:安全 vs 速度
  • 推荐系统:用户满意度 vs 商业目标

6. 分层 Agent

多层抽象,高层分解任务,低层执行。

高层抽象 → 分解 → 中层子目标 → 分解 → 低层具体动作

7. 多智能体系统

多个 Agent 协作解决问题。

类型 关系
合作 共同目标,协作完成
竞争 各自目标,博弈
混合 既有合作也有竞争

AI Agent 优势

优势 说明
效率提升 自动化重复任务
准确性提高 数据驱动决策
个性化 基于用户偏好定制
学习和适应 从反馈中更新

AI Agent 挑战

挑战 说明
计算成本 需要大量算力、存储和内存
人工培训 需要训练和监督
集成困难 不同 Agent 类型可能不兼容
无限循环 Action 可能导致无限循环

RAG Agent 开发

RAG vs 普通 RAG Chain

维度 普通 RAG Chain RAG Agent
LLM 调用 每次查询固定调用 按需调用工具
灵活性 固定流程 动态决策
适用场景 简单问答 复杂多步推理

LangChain 实现流程

# 1. 加载文档
loader = WebBaseLoader(web_paths=("https://...",))
docs = loader.load()

# 2. 分块
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
all_splits = text_splitter.split_documents(docs)

# 3. 向量化和索引
vector_store.add_documents(documents=all_splits)

# 4. 定义检索工具
@tool(response_format="content_and_artifact")
def retrieve_context(query: str):
    retrieved_docs = vector_store.similarity_search(query, k=2)
    return serialized, retrieved_docs

# 5. 创建 Agent
agent = create_agent(model, tools, system_prompt=prompt)

# 6. 运行
for step in agent.stream({"messages": [{"role": "user", "content": query}]}):
    step["messages"][-1].pretty_print()

核心组件

组件 说明
Document Loader 加载文档
Text Splitter 分块处理
Embeddings 向量化
Vector Store 向量存储和检索
Agent 决策和编排

Agent 工作流程

感知输入 → 决策规划 → 知识管理 → 执行动作 → 持续更新

参考资料

What is RAG?

什么是 RAG?

RAG (Retrieval-Augmented Generation) 是结合信息检索系统和生成式 LLM 的 AI 框架,通过外部知识库增强 LLM 的输出。

RAG vs 传统 LLM

维度 传统 LLM RAG
知识来源 训练数据 外部知识库 + 实时检索
时效性 受限于训练数据 可访问最新信息
事实准确性 可能幻觉 通过 grounding 减少幻觉
可控性 黑盒 白盒,可追溯来源

RAG 工作流程

用户查询 → 检索 → 预处理 → Grounded Generation → 回答

1. 检索 (Retrieval)

从外部知识库检索相关信息:

  • 向量数据库语义搜索
  • 关键词搜索
  • 混合搜索

2. 预处理 (Pre-processing)

  • 分词 (Tokenization)
  • 词干提取 (Stemming)
  • 停用词移除

3. Grounded Generation

将检索结果加入 LLM 上下文,生成基于事实的回答。

Embedding 原理

Embedding 本质

Embedding 是文本的向量表示,捕捉语义含义:

  • 相似语义 → 向量空间接近
  • 保留语义关系

Embedding 代数示例

king  = [0.25, 0.75]
man   = [0.15, 0.80]
woman = [0.13, 0.82]

# 语义关系 preserved
king - man + woman ≈ queen

Embedding 类型

类型 说明 代表模型
Word Embeddings 每个词固定向量,无上下文 Word2Vec, GloVe
Contextual Embeddings 考虑词的上下文 BERT, GPT
Sentence Embeddings 整句嵌入 Sentence-BERT

相似度度量

余弦相似度 (Cosine Similarity)

cosine(A, B) = (A · B) / (|A| × |B|)
含义
1 完全相同
0 无关系
-1 完全相反

欧氏距离 (L2 Distance)

  • 更相似的向量 → 距离更小

点积 (Dot Product)

  • 归一化后等价于余弦相似度
  • 值越大越相似

Top-K 检索

# 1. 查询向量化
query_embedding = embed(user_query)

# 2. 计算相似度
D, I = vector_db.search(query_embedding, k=4)
# D: 相似度分数
# I: 对应索引

# 3. 取出 Top K 文档
relevant_docs = [docstore[i] for i in I]

ANN 近似最近邻

精确搜索在海量数据下太慢,ANN 提供近似最优解:

索引类型 度量 特点
IndexFlatL2 L2 距离 精确但慢
IndexFlatIP 内积 归一化后等价余弦

RAG 最佳实践

1. 混合搜索

语义搜索 + 关键词搜索结合,提高召回率。

2. 重排序 (Reranking)

# 粗筛
initial = vector_db.search(query, k=20)
# 精排
reranked = reranker.rerank(initial, query, top_k=5)

3. 分块策略

参数 说明 建议值
chunk_size 块大小 1000 左右
chunk_overlap 块重叠 100-200

4. 查询预处理

  • 拼写纠正
  • 查询扩展(同义词)
  • 查询改写

RAG vs 长上下文

场景 推荐方案
小规模数据 长上下文(简单)
大规模数据 RAG(可扩展)
需要最新信息 RAG(可更新)
成本敏感 RAG(节省 token)

评估指标

指标 说明
Coherence 答案连贯性
Fluency 语言流畅性
Groundedness 基于检索内容
Safety 安全性
Q/A Quality 问答质量

RAG 与 Agent 集成

RAG 是 Agent 的重要工具:

Agent → 决策是否检索 → RAG 工具 → 获取上下文 → 生成回答

参考资料

Fine-tuning

什么是 Fine-tuning(微调)?

Fine-tuning (微调) 是在 Pre-trained Model(预训练模型)基础上,针对特定任务进行调整的过程。是 Transfer Learning(迁移学习) 的子集。

为什么需要 Fine-tuning?

对比 从头训练 (Train from Scratch) Fine-tuning(微调)
算力需求 极高 较低
数据需求 海量 任务相关小数据集
风险 过拟合风险大 继承预训练知识

Pre-training vs Fine-tuning

阶段 起点 数据量 目标
Pre-training(预训练) 随机初始化 超大规模 学习通用能力
Fine-tuning(微调) 预训练权重 任务相关 适应特定任务

Pre-training 方法

方法 说明 例子
Self-supervised Learning (SSL) 自监督学习,从数据本身学习 MLM, NTP
Contrastive Learning(对比学习) 相似样本近,不同样本远 CLIP

Fine-tuning 方法分类

Fine-tuning
├── Full Fine-tuning(全量微调)
└── PEFT(Parameter-Efficient Fine-Tuning,参数高效微调)
    ├── Partial Fine-tuning(选择性微调)
    ├── Additive Fine-tuning(添加式微调)
    └── Reparameterization(重参数化)

1. Full Fine-tuning(全量微调)

更新所有模型权重:

  • 与预训练过程类似
  • 需要更小的 Learning Rate(学习率) 避免 Catastrophic Forgetting

2. PEFT(参数高效微调)

Partial Fine-tuning(选择性微调)

只更新最关键的参数,其他冻结:

# 只更新最后一层
for param in model.parameters():
    param.requires_grad = False
model.layer[-1].requires_grad = True

Additive Fine-tuning(添加式微调)

添加新参数/层,冻结原始权重:

方法 说明
Prompt Tuning(提示微调) 添加可学习的 Soft Prompt
Adapters(适配器) 注入新任务特定层

Reparameterization(重参数化)

核心思想:将权重更新表示为低秩矩阵

LoRA (Low-Rank Adaptation,低秩适配)

核心原理

对于预训练权重矩阵 W ∈ R^(d×k),LoRA 不直接更新 W:

W' = W + ΔW
ΔW = A × B  (低秩分解)
其中 A ∈ R^(d×r), B ∈ R^(r×k), r << min(d, k)

参数量对比

方法 参数量 示例 (d=4096, k=4096, r=16)
Full Fine-tuning d × k 16M 参数
LoRA r × (d + k) 131K 参数

LoRA 配置参数

from peft import LoraConfig

config = LoraConfig(
    r=16,                      # 低秩维度 rank
    lora_alpha=32,             # 缩放因子
    lora_dropout=0.1,          # Dropout 防止过拟合
    target_modules=[            # 目标层
        "q_proj", "v_proj",
        "k_proj", "o_proj"
    ],
    bias="none",
    task_type="CAUSAL_LM"
)
参数 说明 建议值
r (rank) 低秩维度,越大越接近全量微调 4-64
lora_alpha 缩放因子,通常 2×r -
lora_dropout Dropout 防止过拟合 0.05-0.1
target_modules 要应用 LoRA 的层 q_proj, v_proj

LoRA 变体

变体 说明
QLoRA 量化 + LoRA,4-bit 量化预训练模型
DoRA Weight-Decomposed LoRA,分解为 magnitude 和 direction
# DoRA 配置
config = LoraConfig(
    r=16,
    use_dora=True,  # 启用 DoRA
    ...
)

DoRA 优势

  • 更好模拟 Full Fine-tuning 能力
  • 训练更稳定
  • 不增加推理开销

LoRA 实战流程

from peft import get_peft_model, LoraConfig
from transformers import AutoModelForCausalLM

# 1. 加载基础模型
base_model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b")

# 2. 配置 LoRA
config = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules=["q_proj", "v_proj"],
    ...
)

# 3. 创建 LoRA 模型
model = get_peft_model(base_model, config)
model.print_trainable_parameters()
# "trainable params: 4,194,304 || all params: 6,738,415,616 || trainable%: 0.0622"

# 4. 训练...

# 5. 合并权重(推理加速)
merged_model = model.merge_and_unload()

LoRA 优势

优势 说明
参数量大减 通常只训练 0.1-1% 的参数
内存效率 梯度+优化器状态大幅减少
可切换 不同任务可加载不同 LoRA Adapter
不改变原模型 原始权重保持不变

常见问题与解决

问题 原因 解决方案
Catastrophic Forgetting 学习率太大 降低 Learning Rate
OOM (Out of Memory) 序列太长/Batch 太大 max_seq_length、流式加载
性能不佳 数据质量/量不足 增加数据、调优超参数

LoRA 实战案例

任务:表格图片 → HTML 代码
模型:Granite-Vision 2B(20亿参数)
硬件:NVIDIA RTX 4070 Ti Super(16GB VRAM)
结果:2B 模型超越 90B 模型

关键配置

# LoRA 配置
peft_config = LoraConfig(
    r=16,
    lora_alpha=32,
    lora_dropout=0.1,
    use_dora=True
)

# 训练配置
training_args = SFTConfig(
    per_device_train_batch_size=1,
    gradient_accumulation_steps=8,
    max_seq_length=1024,
    learning_rate=3e-4,
    bf16=True,
    optim="adamw_torch_fused"
)

经验教训

  • max_seq_length=1024 避免 OOM
  • per_device_train_batch_size=1 节省内存
  • gradient_accumulation_steps=8 模拟更大 Batch
  • Adapter 合并后推理速度大幅提升

Fine-tuning LLM 应用场景

场景 示例
特定风格 小说风格、金融文本
特定任务 客服对话、代码生成
多任务 每个任务一个 LoRA Adapter

参考资料

Prompt Engineering

什么是 Prompt Engineering?

Prompt Engineering(提示工程) 是引导生成式 AI 产生期望输出的过程,涉及选择最合适的格式、短语、词汇和符号来与 AI 更有效地交互。

为什么 Prompt Engineering 重要?

价值 说明
更大的开发者控制 有效的提示提供意图并建立上下文,帮助 AI 精炼输出并以所需格式呈现
改善用户体验 用户无需反复试错即可获得连贯、准确、相关的响应
提高灵活性 领域无关的指令可以跨企业快速复用
降低成本 通过精确提示减少 token 消耗,提高 API 调用效率

Prompt 的核心构成

高质量提示的四要素

要素 说明 示例
角色与任务 (Role & Task) 告诉 LLM 它的身份和需要做什么 “You are a senior data scientist with experience in feature engineering”
上下文与约束 (Context & Constraints) 尽可能多地添加细节和上下文 数据类型、格式、输出格式、语气风格、token 限制
示例或测试 (Examples or Tests) 提供遵循的示例或检查输出的单元测试 Input/Output 对照示例
评估钩子 (Evaluation Hook) 要求模型评估自己的响应、解释推理或输出置信度分数 Self-check, 0-1 置信度评分

关键技巧

  1. 使用清晰分隔符:用 ## 分隔各部分,使提示可扫描
  2. 指令放在数据之前:用三引号包装上下文
  3. 具体明确:说"返回 Python 列表"而非"给我一些代码"
  4. 温度控制:任务需要一致输出时保持低温度 (≤0.3),创意任务可提高
  5. 成本优化:先用便宜模型快速获取想法,再用高级模型打磨

核心技术

1. Chain-of-Thought (CoT) Prompting

将复杂问题分解为更小的逻辑部分,模仿思维过程。

问题:What is the capital of France?
Chain-of-Thought rollouts:
- "Paris" → "The capital of France is Paris"
- "Paris" → "Paris is the capital of France"
结论:Paris

适用场景:数学问题、逻辑推理、多步骤分析

2. Tree-of-Thought (ToT) Prompting

CoT 的扩展,通过树搜索探索多条推理路径。

问题:What are the effects of climate change?
第一层分支:
- "List the environmental effects"
- "List the social effects"
第二层:对每个分支继续展开

3. Self-Refine Prompting

迭代改进:解决 → 批评 → 重新解决 → 重复直到满意。

1. 初始回答:Write a short essay on literature.
2. 批评:Lacks specific examples
3. 改进:Write a short essay on literature with specific book examples
4. 重复直到满意或达到停止条件

4. Least-to-Most Prompting

先分解子问题,再按顺序解决。

问题:Solve for x in equation 2x + 3 = 11
分解:
1. Subtract 3 from both sides
2. Divide by 2
解决:
1. 2x = 8
2. x = 4

5. Generated Knowledge Prompting

先让模型生成相关事实,再生成最终答案。

输入:Write an essay on deforestation
步骤1 - 生成相关事实:
- "Deforestation contributes to climate change"
- "Deforestation leads to loss of biodiversity"
步骤2 - 基于这些事实写文章

6. Directional-Stimulus Prompting

通过关键词引导输出方向。

Prompt: Write a poem about love that includes the words "heart", "passion", and "eternal"

数据科学场景应用

特征工程

文本特征头脑风暴

## Instructions
Role: You are a feature-engineering assistant.
Task: Propose 10 candidate features to predict {target}.

## Context
Text source: """{doc_snippet}"""
Constraints: Use only pandas & scikit-learn. Avoid duplicates.

## Output
Markdown table: [FeatureName | FeatureType | PythonSnippet | NoveltyScore(0–1)]

## Self-check
Rate your confidence in coverage (0–1) and explain in ≤30 words.

表格特征进化优化 (LLM-FE)

  1. LLM 根据 schema 提出新转换
  2. 用下游模型测试候选特征
  3. 保留、优化或组合最有前景的特征

时间序列分解

## Instructions
System: You are a temporal data scientist.
Task: Decompose time series {y_t} into components.

## Output
Dict with keys: ["trend", "seasonal", "residual"]

## Extra
Explain detected change-points in ≤60 words.
Self-check: Confirm decomposition sums ≈ y_t (tolerance 1e-6).

代码生成与 AutoML

模型选择提示

## Instructions
System: You are a senior ML engineer.
Task: Analyze preview data + metric = {metric}.

## Steps
1. Rank top 5 candidate models.
2. Write scikit-learn Pipeline for the best one.
3. Propose 3 hyperparameter grids.

## Output
Markdown with sections: [Ranking], [Code], [Grids]

## Self-check
Justify top model choice in ≤30 words.

模型评估

单样本评估

## Instructions
System: Evaluation assistant.
User: Ground truth = {truth}; Prediction = {pred}.

## Criteria
- factual_accuracy ∈ [0,1]: 1 if semantically equivalent; 0 if contradictory
- completeness ∈ [0,1]: fraction of required facts present

## Output
JSON: { "accuracy": <float>, "completeness": <float>, "explanation": "<≤40 words>" }

回归 Judge

## Rules
abs_error = mean absolute error over all points
R = max(y_true) - min(y_true)
Category:
- "Excellent" if abs_error ≤ 0.05 * R
- "Acceptable" if 0.05 * R < abs_error ≤ 0.15 * R
- "Poor" if abs_error > 0.15 * R

参考资料

Context Engineering

什么是 Context Engineering?

Context Engineering(上下文工程) 是 Prompt Engineering 的进化阶段。随着 LLM 能力增强,简单调优单个 Prompt 已不够——需要优化输入 LLM 的所有数据,以完成复杂任务。

Context Engineering vs Prompt Engineering

维度 Prompt Engineering Context Engineering
焦点 写好单个 Prompt 优化整个上下文窗口
范围 指令文本 指令 + 工具 + 记忆 + 历史消息 + 外部数据
性质 一次性静态任务 迭代式动态过程
目标 优化单次输出 在有限注意力预算下最大化效果

核心定义

Context Engineering 是**设计、优化和维护 LLM 推理时所需 tokens(信息)**的艺术与科学。

LLM 的上下文窗口是有限资源,具有边际收益递减特性:

  • Transformer 架构使每个 token 能 attend 到其他所有 token(n² 关系)
  • 上下文越长,模型准确检索信息的能力越弱(Context Rot
  • 类比人类有限的工作记忆,LLM 也有"注意力预算"

Context Engineering 包含的内容

  • Prompt 链设计(Prompt Chaining)
  • System Prompt 调优
  • 动态元素管理(用户输入、时间等)
  • RAG(检索增强生成)
  • 查询增强(Query Augmentation)
  • 工具定义与指令(Agentic 场景)
  • Few-shot 示例准备
  • 输入输出结构化(分隔符、JSON Schema)
  • 短期记忆(对话历史)和长期记忆(向量存储)
  • 上下文压缩与缩短

有效上下文的构成

System Prompt 最佳实践

System Prompt 应达到"正确的高度"——在两个极端之间取得平衡:

极端 问题
过度复杂 硬编码 if-else 逻辑,脆弱且难以维护
过于模糊 缺乏具体信号,假设共享上下文

最佳实践

  • 分节组织:<background_information><instructions>## Tool guidance## Output description
  • 使用 XML 标签或 Markdown 分隔各部分
  • 从最小化 Prompt 开始,用最佳模型测试,再根据失败案例添加
  • 最小化不等于短——而是提供足够信息确保行为正确

工具(Tools)设计原则

工具是 Agent 与环境交互的契约,定义必须清晰:

1. 描述清晰

# 差
def calculator(a, b):
    return a+b

# 好
def add_numbers(a: float, b: float) -> float:
    """将两个数字相加。当需要加法时使用此函数。
    参数:
      a: float 第一个加数
      b: float 第二个加数
    返回:float 和
    """
    return a + b

判断标准:从未见过工具的人能否仅通过定义理解它?

2. 保持专一

  • 避免定义模糊的通用工具
  • 提供具体的小工具,而非一个大工具
从数据库获取信息 按客户 ID 获取该客户按日期排序的文档列表
获取过去 24 小时所有用户操作聚合列表

3. 避免信息膨胀

  • 返回结构化输出
  • 支持 max_results 等参数限制返回数量
def keyword_search(search_term: str, max_results: int) -> str:
    # 结构化组织搜索结果,只返回必要信息
    organized = _organize_keyword_output(results, max_results)
    return organized

4. 只展示相关工具

  • 不相关工具会干扰决策
  • 人类都无法明确判断时,Agent 更不可能

5. 错误处理要信息丰富

except requests.exceptions.RateLimitError as e:
    return f"Rate limit error: {e}. 应该执行 time.sleep(10) 后重试。"
except requests.exceptions.ConnectionError as e:
    return f"连接错误: {e}. 网络可能断开,请使用 inform_user 通知用户。"

三大核心技巧

1. Few-shot Learning

提供相似任务的示例,帮助模型理解任务格式。

# Zero-shot
prompt = "123+150等于多少?"

# Few-shot(带结构化)
prompt = """
<example>"10+20=?" -> "先加个位数:0+0=0,再加十位数:2+1=3。答案:30"</example>
<example>"120+70=?" -> "从后往前加:0+0=0,2+7=9,1+0=1。答案:190"</example>
123+150等于多少?
"""

要点

  • 示例比文字说明更有效(“一图抵千言”)
  • 提供多样化的典型示例,而非穷举所有边界情况
  • 示例帮助模型理解格式一致性

2. Structured Prompts

结构化使 Prompt 更易扫描和理解:

  • 使用 XML 标签:<instructions><examples><output_format>
  • 使用 Markdown 分级标题
  • 先写大纲,再用 LLM 优化结构
  • 描述当前 Prompt 表现不好的场景,针对性改进

3. Step-by-Step Reasoning

先让模型逐步思考,再给出答案:

问题:分析这段代码的时间复杂度
步骤1:识别循环结构
步骤2:确定每层循环的执行次数
步骤3:计算总体复杂度
答案:[最终分析]

三者结合效果最佳(见上面的 Few-shot 示例)


上下文缩短(Shortening)

Agent 运行多步后,上下文会迅速膨胀。在达到上下文限制前必须缩短。

缩短策略

1. 判断是否可整体删除

  • 之前获取的文档,结果已使用 → 删除原文档
  • 关键词搜索结果已被 Agent 总结 → 删除原始输出
  • 保留决策依据,删除中间过程

2. 压缩优先原则

  • 第一阶段:最大化 Recall(不遗漏重要信息)
  • 第二阶段:优化 Precision(去除不相关内容)

先确保所有相关上下文都保留,再开始精简。

3. Prompt-tuned Shortening LLM

专门训练的 LLM 来压缩上下文:

  • 准备真实用户交互的上下文样本
  • 创建理想的压缩版本
  • 用这些例子微调 Shortening LLM
  • 针对任务特定优化

Compaction(压缩)

对于长对话,将历史消息总结后放入新的上下文窗口:

# Claude Code 的做法
summary = model.summarize(message_history)
# 保留:架构决策、未解决 bug、实现细节
# 丢弃:冗余工具输出、重复消息
new_context = summary + 最近访问的5个文件

最佳实践

  • 最轻量形式:清除工具调用结果(结果用过即可丢弃)
  • 迭代调优:从最大化 Recall 开始,再优化 Precision
  • 警惕过度压缩导致微妙但关键的信息丢失

上下文检索策略

Pre-inference vs Just-in-Time

策略 做法 适用场景
Pre-inference 推理前检索所有相关数据 数据量可控
Just-in-Time 维护轻量标识符,按需动态加载 数据量大、动态性强
混合 前置基础数据 + Agent 自主探索 复杂任务

Just-in-Time 的优势

Claude Code 处理大型数据库的方式:

  • 不预加载全部数据
  • 维护文件路径、存储查询等轻量引用
  • 用工具(headtail、SQL 查询)按需获取
  • 模仿人类:不背整本手册,用索引和书签按需查找

元数据也是信号:文件夹层级、命名约定、时间戳都提供重要线索。

Progressive Disclosure(渐进式发现)

让 Agent 通过探索逐步获取上下文:

  1. 文件大小暗示复杂度
  2. 命名约定暗示用途
  3. 时间戳可能是相关性的代理
  4. Agent 逐层组装理解,只在 Working Memory 保留必要信息

长时任务的三种架构

架构 做法 适用场景
Compaction 周期性总结压缩 需要频繁来回对话的任务
Structured Note-taking Agent 写笔记持久化到外部 迭代开发、有明确里程碑
Sub-agent 主 agent 协调 + 子 agent 并行探索 复杂研究分析任务

Sub-agent 架构

主 Agent(高层规划)
    ├── 子 Agent 1(深度技术调研,10万+ tokens)
    ├── 子 Agent 2(并行探索,返回精简总结 1-2k tokens)
    └── 子 Agent 3(...)

主 Agent 只收到各子 agent 的 distilled summary

优势:详细搜索上下文隔离在子 agent 内,主 agent 专注综合分析。


记忆管理

短期记忆(Short-term Memory)

  • 当前对话上下文
  • 受限于模型 context window
  • 需要通过 Compaction 防止溢出

长期记忆(Long-term Memory)

  • 外部向量存储
  • 通过 RAG 检索
  • Sub-agent 的 distilled results

Agentic Memory 示例

Claude 玩 Pokémon 展示了记忆如何转变 Agent 能力:

  • 精确记录:“过去 1234 步我一直在 1 号道路训练皮卡丘,已升 8 级,目标 10 级”
  • 无需提示自行构建:探索区域地图、已解锁成就、战斗策略笔记
  • Context 重置后读取笔记继续:继续数小时训练或地牢探索

上下文工程的系统性方法

核心原则

找到最小的高信号 tokens 集合,以最大化期望结果的概率。

开发流程

1. 定义任务目标
2. 搭建最小化基线(最佳模型 + 最简 Prompt)
3. 通过失败案例迭代添加上下文
4. 系统性测量效果(建立 Eval Pipeline)
5. 优化:增加/删除/重组上下文元素

评估重要性

Context Engineering 是迭代过程,需要:

  • Eval Pipeline:测量策略是否有效
  • A/B 测试:对比不同上下文配置
  • 真实交互数据:从用户反馈中学习

与 Agent 开发的关系

Agent = Model + Instructions/Orchestration + Tools
  • Model:基础能力
  • Instructions/Orchestration:指令层 + 推理循环(ReAct/CoT)
  • Tools:扩展能力的外部函数

Context Engineering 贯穿所有三层面:

  • System Prompt(指令层核心)
  • 工具定义与错误处理
  • 记忆与上下文管理
  • 上下文缩短与压缩

参考资料

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐