知识点深化 · LLM 应用工程
LLM 应用工程:Prompt 管理、流式输出、重试降级、成本管控、输出校验
调通一次大模型 API 是 10 行代码,做成生产级应用要 1000 行工程化。这一页讲透 FDE 在客户现场真正要做的:Prompt 配置化版本管理、SSE 流式输出、错误重试与降级、Token 计量与预算熔断、输出健壮解析、评测回归。
① 小白第一课怎么学(5 步走,约 90 分钟)
核心认知:LLM 是"不可靠的外部依赖",工程要围绕这个事实做防御。
1建立生产 vs Demo 认知(15 分钟)
读②③:差别在哪。
2Prompt 配置化(20 分钟)
读④:YAML 模板管理。
3流式+重试降级(25 分钟)
SSE 输出、指数退避。
4成本+输出校验(20 分钟)
Token 计量、JSON 解析。
5刷题巩固(10 分钟)
做⑥⑦⑩。
本课小目标学完你要能:① 说清生产级 LLM 应用和 Demo 的区别;② 把 Prompt 做成配置化模板;③ 实现流式输出和错误重试;④ 做 Token 成本计量和预算熔断。
② 一图看懂:LLM 应用四层架构
读法:请求进来 → Prompt 组装 → 模型网关(重试/限流/成本)→ 输出解析校验,全程可观测。
③ 本质直觉:把 LLM 当成"不可靠的外部员工"
想象你雇了一个聪明但不靠谱的外包员工:
他很聪明:什么都能聊,写文案、总结文档、分析数据都行。
但他不靠谱:可能今天请假(API 挂了)、可能聊到一半断了(超时)、可能回答得驴唇不对马嘴(幻觉)、可能说话特别啰嗦(Token 用超了)。
工程化就是给这个员工配好管理体系:
- 给他清晰的工作指令(Prompt 模板)。
- 他请假了要有人顶(降级兜底)。
- 他说话太久要催(流式输出)。
- 他每次干活要算成本(Token 计量)。
- 他交的活要检查(输出校验)。
核心心法不要假设 LLM 会正确、快速、便宜、稳定。所有这些都要在工程层做兜底和防御。
④ 完整体系:Prompt 管理、流式、重试、成本、校验
生产 vs Demo 对照
| 维度 | Demo 阶段 | 生产阶段 |
| Prompt | 硬编码在代码里 | YAML 配置化、版本化、灰度 |
| 输出方式 | 等全部生成完 | SSE 流式逐字输出 |
| 错误处理 | 报错就挂 | 指数退避重试 + 降级兜底 |
| 成本 | 不关心 | Token 计量 + 月度预算熔断 |
| 输出格式 | 直接用 | 健壮解析 + Pydantic 校验 |
| 测试 | 手动试几句 | 评测集回归,改完必跑 |
Prompt 配置化 YAML 示例
system: |
你是文档摘要助手。请用 3-5 句话概括,
不要添加原文没有的信息。
user_template: "请总结:\n{document}"
model: "gpt-4o-mini"
temperature: 0.1
max_tokens: 500
SSE 流式输出骨架
# FastAPI 流式转发
async def gen():
stream = await openai.chat.completions.create(
model="gpt-4o-mini", messages=msgs, stream=True)
async for chunk in stream:
if chunk.choices[0].delta.content:
yield f"data: {delta}\n\n"
yield "data: [DONE]\n\n"
重试策略
| 错误类型 | 重试? | 策略 |
| 429 限流 | 是 | 指数退避 2s→4s→8s |
| 500 服务端错 | 是 | 同上 |
| 网络超时 | 是 | 同上 |
| 400 参数错 | 否 | 重试也没用,修代码 |
成本计算公式
单次调用成本
成本 = 输入token × 输入单价 + 输出token × 输出单价
每次调用都要记录这两个数字,按月/用户/功能维度统计。
⑤ 用法场景与典型例题
例1(流式输出)用户反馈"AI 要等 10 秒才出字",怎么优化?
感知延迟是关键。
① 上 SSE 流式输出,0.5 秒就开始吐字。
② 换更快的模型(gpt-4o-mini 比 gpt-4o 快)。
③ 缩短 Prompt,控制 RAG 检索片段数量。
④ 设 max_tokens 限制输出长度。
答案:流式输出 + 模型选型 + Prompt 精简三管齐下。
例2(错误处理)调 LLM 时遇到 429 限流,代码怎么写?
要重试,但不能盲目。
① 用 tenacity 等重试库,捕获 RateLimitError。
② 指数退避:等 2s → 4s → 8s,最多 3 次。
③ 重试还失败,返回降级兜底文案。
答案:指数退避重试 3 次,最终失败降级。
例3(成本管控)客户说"上个月 LLM 花了 $5000",你怎么降?
Token 就是钱,从多维度省。
① 查用量分布:哪部分涨得最多。
② 简单任务换小模型:分类/提取用 gpt-4o-mini。
③ 精简 Prompt:RAG 只留 top-3,历史对话做摘要。
④ 加结果缓存:FAQ 类问题命中缓存直接返回。
答案:模型分级 + Prompt 精简 + 结果缓存三板斧。
⑥ 高频错误诊断(4 条)
错误 1:Prompt 硬编码在代码里改一句话要发版,没法灰度没法 A/B。正确做法是把 Prompt 抽成 YAML 配置,启动时加载,改了重启即可。
错误 2:LLM 调用不设超时和重试下游 API 抖动就直接报错给用户。必须设 timeout,加指数退避重试,最终失败要有降级兜底。
错误 3:不做 Token 计量和成本控制账单爆炸了才发现。每次调用记录 token 数,设月度预算阈值,超了自动降级或拒绝。
错误 4:假设模型输出一定是合法 JSON模型会加 markdown、废话、缺字段。代码要做健壮解析:去代码块、抽 JSON、Pydantic 校验,失败降级到纯文本。
⑦ 考点真题演练(4 题)
考点分布
| 考法 | 出题形式 | 应对 |
| 生产 vs Demo | 问区别 | 工程化六件套 |
| 流式输出 | 为什么要用 | 降低感知延迟 |
| 重试策略 | 什么错误该重试 | 限流/5xx/网络错 |
| 成本管控 | 怎么降 LLM 成本 | 模型分级+缓存+精简 |
真题基础1. 生产级 LLM 应用和 Demo 的最大区别是?
真题中档2. LLM API 返回 429 限流,应该怎么处理?
真题中档3. 为什么要做流式输出(SSE)?
真题拔高4. 下面哪个不是 LLM 成本优化的手段?
⑧ 必背知识点卡
Prompt:配置化 YAML 管理,不写死在代码 支持灰度
输出:SSE 流式逐字返回 降低感知延迟
错误:指数退避重试 3 次 + 降级兜底 只重试可恢复错误
成本:每次调用记 token,月度预算熔断 超了就降级
输出:健壮解析 + Pydantic 校验 别假设一定是 JSON
测试:评测集回归,改完 Prompt 必跑 通过率不掉才上线
⑨ 应用输出:设计一个生产级 LLM 问答接口
场景:企业内部知识库问答,用户上传文档后提问
① Prompt 层:写一个 summarize_v1.yaml 模板,包含 system 指令、user 模板、模型参数。
② 接口层:FastAPI 接 GET /ask,鉴权后查 RAG 检索 top-3 片段。
③ 模型层:组装 Prompt 后调 LLM,开 stream=True,用 SSE 逐字返回。
④ 容错:调用加重试(tenacity),3 次失败返回兜底文案;记录每次调用的 token 和成本。
⑤ 输出:如果要 JSON 格式,做健壮解析+Pydantic 校验,失败降级到纯文本。
口述设计思路"Prompt 配置化,接口做流式,调用加重试和成本计量,输出做健壮校验,全程可观测。"
⑩ 分层练习 15 题(基础 5 + 中档 5 + 拔高 5)
▍基础 5 题
基础1Prompt 为什么要配置化?
改 Prompt 不用发版,支持版本灰度和 A/B 测试,出问题能复现用的哪个版本。
基础2流式输出用什么技术?
SSE(Server-Sent Events),后端逐段 yield,前端 onmessage 逐字追加。
基础3429 限流要不要重试?
要。但要指数退避(等 2s→4s→8s),最多 3 次,不能立刻重试打爆。
基础4LLM 调用失败了怎么办?
重试 3 次还失败,返回降级兜底文案(如"系统繁忙请稍后"),不能白屏或报错。
基础5Token 和成本的关系?
大模型按 token 计费,输入和输出分开计价。每次调用记录 token 数才能算成本。
▍中档 5 题
中档6哪些错误不该重试?
400 参数错误(重试也没用)、认证失败(key 错了)、404 模型不存在。重试只针对限流、5xx、网络超时。
中档7怎么降低 LLM 成本?
三板斧:① 简单任务换小模型;② 精简 Prompt 减少冗余 token;③ 结果缓存命中直接返回。批量任务走 Batch API 半价。
中档8为什么模型输出 JSON 要做健壮解析?
模型输出不稳定:可能包 markdown 代码块、前后有废话、字段缺漏。要去包裹、抽 JSON、Pydantic 校验。
中档9预算熔断是什么?为什么要做?
设月度/每日 LLM 预算阈值,超了自动降级到便宜模型或拒绝服务。防止 bug 导致账单爆炸。
中档10改 Prompt 后为什么要跑评测回归?
Prompt 改动可能让某些 case 变差。跑一遍评测集,通过率不下降才能上线。
▍拔高 5 题
拔高11指数退避为什么要加随机抖动?
否则所有客户端同时重试会造成"惊群效应",把下游再次打爆。加随机偏移让重试时间散开。
拔高12LLM 结果缓存适合什么场景?
高频重复问题(FAQ)、确定性任务(分类、提取)。对话类、个性化场景缓存命中率低,意义不大。
拔高13怎么监控 LLM 应用的健康度?
指标:调用量、p50/p99 延迟、错误率、token 消耗量、缓存命中率。异常告警:错误率突增、成本突增。
拔高14为什么 temperature 越低输出越稳定?
temperature 控制采样随机性。低 temperature(0~0.1)输出更确定、更可预测,适合分类、提取、审单等要确定性的场景。
拔高15客户要求私有化部署大模型,工程上有什么不同?
不用调云 API,自己部署 vLLM/Ollama;要管显存、并发、量化;成本是硬件不是 API 调用;数据不出客户内网。
⑪ 记忆口诀 + 7 天复习计划
三句口诀
① Prompt 配置化,不写死在代码里。
② 流式输出降延迟,重试降级保可用。
③ Token 计量控成本,输出校验防幻觉。
| 天 | 任务 | 自检 |
| 第 1 天 | 读②③,画一遍四层架构 | 能说清每层职责 |
| 第 2 天 | 背六件套 + 做基础 1-5 | 基础全对 |
| 第 3 天 | 写一个流式接口代码 | SSE 跑通 |
| 第 4 天 | 做中档 6-10,理解重试策略 | 知道什么错该重试 |
| 第 5 天 | 做拔高 11-15 + 真题 4 题 | 会算成本优化方案 |
| 第 6-7 天 | 口述生产级 LLM 应用设计,默写六件套 | 不看资料全默对 |
← 返回 FDE 培养总览