AI应用开发 - LLM及其相关概念
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
- 预训练: 在大规模通用数据上训练
- 微调: 针对特定任务(如问答、翻译)进行调整
- 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 生态集成 | |
| Claude | Anthropic | 长上下文,安全性高 |
| Llama | Meta | 开源标杆,社区活跃 |
| Copilot | Microsoft/GitHub | 代码辅助 |
| Mistral 7B | Mistral AI | 高效开源 |
七、学习路径建议
- 入门: 理解 LLM 基本原理(本文档)
- Agent 开发: 掌握 Prompt Engineering、CoT、ReAct
- 能力扩展: RAG(检索增强生成)、Fine-tuning
- 工具链: LangChain、向量数据库、Function Calling
- 深入: 阅读原论文(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
原始输入 ↓自动转换为向量 ↓基于向量处理 ↓推荐/分类
关键点
- 隐藏层自动处理:不需要人工定义每个维度
- 维度由模型定义:模型决定需要多少维度
- 可训练:通过反向传播不断优化
Embedding 在 NLP 中的应用
词 Embedding(Word Embedding)
| 方法 | 说明 | 代表模型 |
|---|---|---|
| Word2Vec | 预测词上下文 | Mikolov et al. |
| GloVe | 共现矩阵分解 | Pennington et al. |
| FastText | 子词 Embedding |
上下文 Embedding(Contextual Embedding)
| 方法 | 说明 | 代表模型 |
|---|---|---|
| ELMo | 双向 LSTM | Allen Institute |
| BERT | Transformer 编码 | |
| 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) | 迭代调整权重直到损失最小化的过程 |
训练流程
输入数据 → 算法处理 → 计算损失 → 调整权重 → 重复直到收敛
关键步骤
- 数据准备: 清洗、格式化、特征选择
- 数据划分: 训练集 / 验证集 / 测试集
- 初始化: 随机初始化权重
- 迭代训练: 前向传播 → 计算损失 → 反向传播 → 更新权重
- 评估: 在验证集上评估性能
- 测试: 在测试集上最终评估
训练数据划分
为什么不能在同一数据上训练和测试?
如果用同一数据测试,无法检测过拟合:
- 过拟合:训练数据上表现好,测试数据上表现差
- 需要未见过的数据来真实评估泛化能力
常用划分比例
| 场景 | 训练 | 验证 | 测试 |
|---|---|---|---|
| 小数据 | 70% | 15% | 15% |
| 大数据 | 98% | 1% | 1% |
| 交叉验证 | - | K折 | - |
交叉验证
K 折交叉验证:
- 将数据分成 K 份(通常 10 折)
- 每次用 K-1 份训练,1 份测试
- 重复 K 次
- 取平均性能作为最终评估
过拟合与欠拟合
| 问题 | 表现 | 原因 | 解决方案 |
|---|---|---|---|
| 过拟合 | 训练好,测试差 | 模型太复杂 | 正则化、增加数据、Dropout |
| 欠拟合 | 训练和测试都差 | 模型太简单 | 增加模型复杂度、增加特征 |
诊断方法
观察训练集和验证集的损失曲线:
- 如果训练损失下降,验证损失上升 → 过拟合
- 如果两者都高 → 欠拟合
监督学习 vs 无监督学习
| 维度 | 监督学习 | 无监督学习 |
|---|---|---|
| 训练数据 | 输入+输出配对 | 只有输入,无输出 |
| 学习目标 | 预测未知数据的输出 | 发现数据中的模式 |
| 典型任务 | 分类、回归 | 聚类、降维 |
| 常见算法 | 逻辑回归、SVM、神经网络 | k-means、PCA |
监督学习
训练数据包含输入和期望输出(标签)。模型学习输入到输出的映射关系。
分类问题:预测离散类别(垃圾邮件/正常邮件)
回归问题:预测连续值(房价、工资)
无监督学习
训练数据没有标签。模型需要自己发现数据中的结构。
聚类:将相似样本分组(用户细分、主题分组)
降维:减少特征数量(PCA、t-SNE)
超参数调优
参数 vs 超参数
| 类型 | 说明 | 例子 |
|---|---|---|
| 参数 | 模型从数据中学习得到 | 回归系数、神经网络权重 |
| 超参数 | 人为设置,控制模型行为 | 学习率、树的深度 |
调优方法
| 方法 | 说明 |
|---|---|
| 网格搜索 | 穷举所有组合 |
| 随机搜索 | 随机采样组合(通常更高效) |
| 贝叶斯优化 | 用概率模型指导搜索 |
参考资料
What is Inference?
什么是模型推理?
推理(Inference) 是经过训练的机器学习模型从全新数据中得出结论或预测的过程。简言之,推理就是模型的"运行"阶段。
推理 vs 训练
| 维度 | 训练 (Training) | 推理 (Inference) |
|---|---|---|
| 阶段 | 学习 | 应用 |
| 数据 | 历史数据,学习用 | 新数据,预测用 |
| 计算 | 高,但一次性 | 持续消耗 |
| 更新 | 权重在变化 | 权重固定 |
| 目的 | 让模型学会 | 应用模型所学 |
训练阶段
- 向模型展示海量数据(数以百万计的停车标志图像)
- 运行并从试验和错误中学习
- 微调输出结果
- 最终具备自主识别能力
推理阶段
将训练所得应用于新数据:
- 自动驾驶汽车识别陌生道路上的停车标志
- 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避免 OOMper_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 置信度评分 |
关键技巧
- 使用清晰分隔符:用
##分隔各部分,使提示可扫描 - 指令放在数据之前:用三引号包装上下文
- 具体明确:说"返回 Python 列表"而非"给我一些代码"
- 温度控制:任务需要一致输出时保持低温度 (≤0.3),创意任务可提高
- 成本优化:先用便宜模型快速获取想法,再用高级模型打磨
核心技术
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):
- LLM 根据 schema 提出新转换
- 用下游模型测试候选特征
- 保留、优化或组合最有前景的特征
时间序列分解:
## 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
参考资料
- What is Prompt Engineering? - AWS
- Advanced Prompt Engineering for Data Science Projects - Towards Data Science
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 处理大型数据库的方式:
- 不预加载全部数据
- 维护文件路径、存储查询等轻量引用
- 用工具(
head、tail、SQL 查询)按需获取 - 模仿人类:不背整本手册,用索引和书签按需查找
元数据也是信号:文件夹层级、命名约定、时间戳都提供重要线索。
Progressive Disclosure(渐进式发现)
让 Agent 通过探索逐步获取上下文:
- 文件大小暗示复杂度
- 命名约定暗示用途
- 时间戳可能是相关性的代理
- 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(指令层核心)
- 工具定义与错误处理
- 记忆与上下文管理
- 上下文缩短与压缩
参考资料
更多推荐



所有评论(0)