LLM Basics
理解大模型应用开发,需要先掌握几个核心概念。你不需要一开始就深入 Transformer 细节,但必须知道模型能做什么、不能做什么,以及为什么它有时会不稳定。
核心概念
| 概念 | 解释 |
|---|---|
| Token | 模型处理文本的基本单位,影响上下文长度和费用 |
| Context Window | 一次请求中模型能看到的最大内容范围 |
| Temperature | 控制输出随机性,越高越发散 |
| System Prompt | 定义模型角色、边界、输出规范和安全要求 |
| Structured Output | 要求模型按 JSON、表格或 schema 输出 |
| Hallucination | 模型生成看似合理但不真实的信息 |
| Tool Calling | 模型根据上下文选择并调用外部工具 |
大模型到底在做什么
从应用开发视角看,你可以先把大模型理解成一个“基于上下文生成下一个合理输出”的系统。它不会像数据库一样存储你的私有资料,也不会像普通函数一样保证同样输入永远得到完全相同输出。
这带来两个重要后果:
- 你给它什么上下文,会极大影响它的回答。
- 你不能只依赖模型自觉正确,必须用代码、检索、工具和评测约束它。
学习 LLM Basics 的重点不是背模型原理,而是理解模型在产品系统里的行为特点。
Token 为什么重要
Token 会同时影响三件事:
| 影响 | 说明 |
|---|---|
| 成本 | 输入和输出 token 都可能计费 |
| 延迟 | 上下文越长,通常响应越慢 |
| 质量 | 上下文过短信息不足,过长又可能稀释重点 |
新手常犯的错误是把所有历史对话、全部文档、所有规则都塞进 prompt。更好的方式是:只放当前任务真正需要的内容,并用检索、摘要、记忆和缓存管理上下文。
Context Window 不是记忆
上下文窗口只是“一次请求中模型能看到的内容”。它不是长期记忆,也不是数据库。
如果你要让系统记住用户偏好、历史记录或业务状态,应该把这些信息存到数据库里,在需要时取出相关部分放入上下文。这样做有三个好处:
- 可控:你知道模型看到了什么。
- 可审计:可以记录和复现一次回答。
- 可更新:用户资料变更后不会依赖模型模糊记忆。
消息角色怎么分工
常见对话接口会区分不同消息角色:
| 角色 | 放什么 |
|---|---|
| system | 稳定身份、边界、安全规则、输出原则 |
| developer | 应用层规则、工具使用方式、格式要求 |
| user | 用户当前问题和用户提供的内容 |
| assistant | 历史回答或模型中间响应 |
| tool | 工具执行结果 |
好的消息分层能让系统更稳定。不要把所有规则都混在用户问题里,也不要把用户可控内容当成高优先级指令。
LLM 应用的基本架构
一个最小 LLM 应用通常包含:
前端页面
-> 后端 API
-> Prompt 构造
-> 模型调用
-> 输出解析
-> 日志和错误处理
复杂一点的系统会加入:
- RAG 检索
- 工具调用
- 用户权限
- 对话记忆
- 评测系统
- 成本统计
- 监控告警
开发者应该理解的能力边界
大模型擅长:
- 文本理解、改写、总结、分类
- 代码生成和解释
- 多步骤推理的辅助
- 从上下文中抽取结构化信息
- 根据工具结果组织答案
大模型不天然擅长:
- 记住你的私有数据
- 保证事实永远正确
- 长链路稳定执行
- 理解实时状态
- 替代权限、审计和业务规则
模型选择的基本思路
不要只按“最强模型”选择。真实项目里通常要在质量、速度、成本和稳定性之间取舍。
| 任务 | 选择建议 |
|---|---|
| 分类、打标签、简单抽取 | 优先小模型,低 temperature |
| 复杂推理、代码分析、长文档综合 | 使用更强模型 |
| 批量离线处理 | 关注成本和吞吐 |
| 用户实时对话 | 关注延迟和流式输出 |
| 高风险答案 | 更强模型 + 检索 + 人工复核 |
一个成熟系统可能不会只用一个模型,而是根据任务路由到不同模型。
学习检查点
- 能解释 Token 和上下文窗口对成本的影响
- 能说明为什么 RAG 可以缓解幻觉,但不能彻底消灭幻觉
- 能用 system prompt、developer instruction 和 user message 分层设计请求
- 能让模型输出稳定 JSON,并处理解析失败
模型参数怎么选
| 参数 | 建议 |
|---|---|
| temperature | 分类、抽取、JSON 输出用低温度;创意写作用高一点 |
| max output tokens | 给足空间,但不要无限制 |
| system prompt | 放稳定角色、边界和规则 |
| user message | 放用户当前任务 |
| tools | 只暴露当前任务需要的工具 |
Temperature、Top-p 和稳定性
对新手来说,先记住一个简单规则:越需要稳定和可复现,temperature 越低;越需要创意和多样性,可以适当提高。
典型选择:
- JSON 抽取、分类、路由:0 到 0.3
- 总结、改写、客服回答:0.2 到 0.7
- 创意写作、头脑风暴:0.7 以上
但参数不是万能的。如果 prompt 含糊、上下文缺失、输出没有 schema,temperature 再低也可能不稳定。
幻觉从哪里来
常见来源:
- 用户问题本身信息不足
- Prompt 要求模型必须回答
- RAG 检索到的上下文不相关
- 上下文太长,关键信息被稀释
- 模型没有实时数据,却被问实时问题
- 没有引用来源和拒答策略
缓解方式:
- 要求模型只基于上下文回答
- 信息不足时明确说不知道
- 回答中附引用
- 对高风险答案做人工复核
- 建立评测集持续回归
结构化输出为什么重要
只给用户看的回答可以是自然语言,但给程序继续处理的结果应该尽量结构化。比如分类、抽取、评分、路由、工具参数,都适合用 JSON 或 schema。
结构化输出的好处:
- 代码更容易解析。
- 可以做字段校验。
- 失败时能自动重试或降级。
- 更容易写评测用例。
常见失败处理:
- JSON 解析失败时重试一次。
- 字段缺失时返回明确错误。
- 枚举值非法时映射到
unknown。 - 高风险字段交给人工复核。
隐私和安全边界
调用模型时要特别注意:
- 不把 API Key、cookie、私钥放进 prompt。
- 不把用户无权访问的数据放进上下文。
- 对日志做脱敏,避免记录完整敏感信息。
- 对模型输出做安全检查,尤其是医疗、法律、金融、权限和代码执行场景。
- 对工具调用做后端权限校验,不要相信模型自己判断权限。
模型可以参与判断,但最终权限和安全策略应该由系统代码控制。
实战练习
- 写一个脚本,比较不同 temperature 下同一个问题的回答差异。
- 让模型把一段非结构化招聘 JD 转成 JSON。
- 给模型一个过长文档,尝试设计摘要和分块策略。
- 设计一个 system prompt、user message、tool result 分层示例。
- 记录 20 次调用的 token、延迟和输出稳定性,观察成本来自哪里。