LLM 到底在做什么?Agent 开发者必须掌握哪些基础
内容摘要:本章为 Agent 开发者建立「够用且准确」的模型心智:概念层级、Transformer 直觉、Token 与 Embedding、注意力、推理与采样。目标不是训练模型,而是理解 Agent 每次调用模型时到底发生了什么、哪些是可控的、哪些是非确定性的。 难度:入门 | 前置知识:无
常见误区
LLM 会像数据库一样保存事实,也会自动记住上一次请求;只要把温度设为 0,输出就一定可以逐字复现。
先给结论
大语言模型(Large Language Model,LLM)的核心任务是根据上下文预测下一个 Token。模型调用本身无状态,记忆、联网、检索和执行动作都来自应用层;Token 预算、Embedding 和采样参数则直接影响 Agent 的成本、召回与稳定性。
带着这三个问题阅读:
- AI、机器学习、深度学习、生成式 AI 与 LLM 分别处在哪一层?
- Token、Embedding 和注意力为什么会影响 Agent 的工程设计?
- 模型输出具有非确定性时,测试为什么不能依赖逐字匹配?
一、概念层级:别把它们混为一谈
许多 Agent 事故源于概念混淆。先把层级理清:
- 人工智能(Artificial Intelligence,AI):最宽泛的目标——让机器完成需要智能的任务。
- 机器学习(Machine Learning,ML):不写死规则,而是从数据中学习。
- 深度学习(Deep Learning,DL):用多层神经网络自动学习特征表示。
- 生成式 AI(Generative AI,GenAI):生成新内容(文本、图像、音频、代码)。
- 大语言模型(Large Language Model,LLM):在海量文本上训练、以「预测下一个 Token」为核心任务的模型。
对 Agent 的意义:Agent 的「大脑」是 LLM,但 LLM 只会生成文本。它不会真正「执行」任何动作——所有动作都由你的应用代码在模型输出之外完成。这条边界是全书的地基,详见 02 Agent 概念。
二、Transformer:为什么是它
现代 LLM 绝大多数基于 Transformer 架构(Vaswani 等,2017,《Attention Is All You Need》)。你不需要能手推反向传播,但需要三个直觉:
- 自回归生成(autoregressive):模型一次预测一个 Token,把它拼回输入,再预测下一个,如此循环。这解释了流式输出、延迟随输出长度增长、以及为什么模型「说错了就顺着错下去」。
- 注意力机制(Attention):生成每个 Token 时,模型会按相关性对上下文中所有 Token 加权。这让它能利用长距离依赖,但也意味着上下文越长,计算越贵。
- 无状态(stateless):模型本身不记忆上一次调用。所谓「记忆」「多轮对话」,都是你的应用把历史重新拼进这次输入。详见 10 记忆。
三、Token:模型的计价与计量单位
模型不按「字」或「词」处理文本,而是按 Token(词元)。分词器(tokenizer)把文本切成 Token,一个英文单词可能是 1 个 Token,一个中文字通常是 1–2 个 Token。
为什么开发者必须关心 Token:
- 上下文窗口(context window) 以 Token 计:输入 + 输出的 Token 总数不能超过上限。
- 计费按输入/输出 Token 数分别计算(见 18 性能与成本)。
- 截断发生在 Token 层面:超限时最早的内容被丢弃,可能悄悄丢失关键指令。
# 粗略估算 Token 数(仅用于容量预估,不用于精确计费)。
# 经验值:英文约 4 字符/Token;中文约 1.5 字符/Token。精确值需用对应模型的分词器。
def rough_token_estimate(text: str) -> int:
"""返回文本 Token 数的粗略上界估计。[非确定性] 不同模型分词器结果不同。"""
ascii_chars = sum(1 for c in text if ord(c) < 128)
cjk_chars = len(text) - ascii_chars
return round(ascii_chars / 4 + cjk_chars / 1.5)
print(rough_token_estimate("MySQL 的回表 back to table 是什么?")) # 约 12~16[待验证]:精确 Token 数请用目标模型官方分词器(如
tiktoken或厂商 SDK)计算。上面的估算仅用于「会不会超窗口」的量级判断。
四、Embedding:把文本变成可比较的向量
嵌入向量(Embedding) 把一段文本映射为一个高维稠密向量(如 1024 维),语义相近的文本向量距离更近。它是 RAG(11)和长期记忆(10)语义检索的基础。
import math
def cosine_similarity(a: list[float], b: list[float]) -> float:
"""余弦相似度:越接近 1 越相似。生产中由向量库计算,这里演示原理。"""
if len(a) != len(b):
raise ValueError("向量维度必须一致")
dot = sum(x * y for x, y in zip(a, b))
na = math.sqrt(sum(x * x for x in a))
nb = math.sqrt(sum(y * y for y in b))
if na == 0 or nb == 0:
raise ValueError("零向量无法计算余弦相似度")
return dot / (na * nb)
# 演示(真实 Embedding 由模型生成,维度通常成百上千)
print(cosine_similarity([1.0, 0.2, 0.0], [0.9, 0.3, 0.1])) # 约 0.98生成文本的 LLM 与生成 Embedding 的模型通常是不同的模型,计费与维度各自不同。
五、推理与采样:哪些参数你能控制
模型「预测下一个 Token」时,实际输出的是一个覆盖全词表的概率分布。采样参数决定如何从分布中选取 Token:
| 参数 | 作用 | 对 Agent 的建议 |
|---|---|---|
temperature | 温度,越高越随机、越有创造性;越低越确定 | Agent 的决策/工具调用建议接近 0,保证可复现 |
top_p | 核采样,只在累计概率前 p 的 Token 中采样 | 与 temperature 二选一调节,通常不同时大改 |
max_tokens | 限制单次输出长度 | 防止失控长输出与超额成本 |
stop | 停止序列,遇到即停 | 用于约束结构化输出边界 |
seed | 随机种子(部分厂商支持) | 提高可复现性,但不保证完全一致 |
关键认知——非确定性(non-determinism):即便
temperature=0,多数厂商也不保证逐字节可复现(受硬件、批处理、版本影响)。因此 Agent 的测试不能以「看起来对」为准,必须用断言、测试集或轨迹检查,见 16 测试与评估。
六、失败路径:基础层面最常见的三个坑
- 把模型当数据库:模型的「知识」是训练时的统计,不是实时事实,会幻觉。需要事实就用 RAG(11)或工具(06)。
- 忽视上下文窗口:历史越堆越长,最终超窗被截断,模型「忘记」系统指令。需要上下文工程(05)。
- 默认高温度:在需要稳定决策的 Agent 里用高
temperature,导致行为飘忽、难以测试。
七、测试与验证
- Token 预算:对典型输入用官方分词器计算,确认不超窗口。
- 确定性检查:同一输入连续调用多次,观察输出差异,据此决定
temperature与测试断言的宽松度。 - Embedding 检索质量:准备「查询→期望命中文档」的小样本,测召回是否正确(见 11)。
八、安全与权限
- 模型输出是文本,本身无害;风险在于你如何使用这段文本(拿去执行、拼 SQL、发消息)。安全边界属于应用层,见 14 安全。
- 输入到模型的一切外部文本都可能携带提示注入,默认不可信。
九、性能与成本
- 成本 ≈ 输入 Token × 输入单价 + 输出 Token × 输出单价。缩短上下文、限制
max_tokens是最直接的降本手段。 - 延迟主要由输出 Token 数驱动(自回归逐 Token 生成),流式输出可改善首字延迟体验,见 18。
十、关联章节
面试复述
LLM 是基于上下文生成 Token 的概率模型,不是数据库、搜索引擎或执行器。Agent 开发者至少要理解 Token 预算、上下文窗口、Embedding、采样和无状态调用,因为记忆、RAG 与工具执行都由应用层补齐。
复述时先给结论,再补机制、适用边界和一个可验证指标;不要只罗列框架名称或产品功能。
迁移练习
选取一次真实模型调用,标出输入与输出 Token、历史消息装配位置、采样参数和外部事实来源;再说明如果移除应用代码,模型还剩下哪些能力。
检索关键词
LLM 原理 Transformer 直觉 Token 计费 Embedding 相似度 采样参数 temperature 模型非确定性
官方来源
- Vaswani et al., "Attention Is All You Need"(论文原文)
- 各模型厂商官方文档的「Tokenizer」「Sampling parameters」章节(使用前请以目标模型文档为准,
verified_at: 2026-09-07)
