很多人接 DeepSeek 的流程是这样:本地写个脚本跑通,提示词调得也还行,一放进真实服务就出问题——首字慢、并发一上来就报错、上游抖一下整条链路跟着挂,日志里还看不出是谁的锅。这篇不重复协议怎么拼、客户端怎么配,只按上线顺序把工程侧的活拆开:提示词怎么定形、调用层怎么设超时和重试、并发怎么控、坏了怎么降、日志记什么、怎么验收。
很多人接 DeepSeek 的流程是这样:本地写个脚本跑通,提示词调得也还行,一放进真实服务就出问题——首字慢、并发一上来就报错、上游抖一下整条链路跟着挂,日志里还看不出是谁的锅。问题多半不在模型本身,而在提示词没定形、调用层没护栏、并发没闸门、降级没预案。
这篇不重复协议怎么拼、客户端怎么配,只按上线顺序把工程侧的活拆开:提示词怎么变成可验收的契约、调用层怎么设超时和重试、并发怎么控、坏了怎么降、日志记什么、上线前怎么验收。整个过程建议你在本地先跑通一遍,再搬进服务,别边写边直连线上。
第一步:把提示词定成可验收的契约
提示词在本地调试时是「一段话」,接入服务后必须变成「一份契约」:输入字段有哪些、输出必须是哪种结构、哪些字段必填、异常时返回什么。先把这些定死,上层代码才有稳定的解析对象。你可以参考站内 /prompt-structured 的思路,但这里只关心它落进代码后的形态:一个带版本号的提示词模板加一份 JSON Schema 校验。
- 固定输入输出字段列出调用方会传的字段(用户问题、上下文、语言等)和必须返回的字段;返回结构用 schema 校验,解析失败直接判为一次失败调用,而不是让脏数据流到业务层。
- 配一组回归用例准备十几条覆盖典型场景和边界情况的固定用例,每次改提示词跑一遍,看的是结构合规率和稳定性,不是单次答得多漂亮。具体写用例的方法可看站内提示词回归相关文章。
- 给提示词打版本标记把提示词文本、温度等参数、模型标识一起打成一个版本号,随请求一起记进日志。出现效果回退时,能直接定位到是哪次改动带进来的,而不是靠猜。
调用层:超时、重试与流式怎么设
调用层最容易犯的错,是抄一个示例配置就上线:一个全局超时管所有请求,出错就无脑重试。结果流式请求被读超时掐断,重试又把并发顶穿。正确做法是先量出自己的基线,再按基线定数字。
| 环节 | 怎么设 | 怎么验证 |
|---|---|---|
| 连接超时 | 设短一些,只用于建立连接阶段 | 本机到上游的连通性测试能否快速失败 |
| 读取超时 | 流式请求按你的首字延迟基线放大留余量,非流式按完整返回耗时定 | 用 /tools/speed-test 量一条自己的基线再定数字 |
| 重试 | 只对幂等且明确可重试的错误做,退避要有上限和总预算 | 看日志里重试次数分布,是否出现集中重试 |
- 连接超时和读取超时要分开设,别用一个全局值糊过去。
- 记录耗时拆成三段:排队等待、首字返回、完整返回,分别统计。
- 区分「上游慢」和「我这边解析慢」,两者的排查方向完全不同。
- 重试加总预算,避免一次上游抖动触发雪崩式重试。
并发控制与降级:别让一次抖动拖垮服务
并发不是「能发多少发多少」,而是「按账号或密钥维度设一个闸门」。超过阈值就排队或快速失败,让请求在可控范围内等待,而不是靠无限重试去扛。分档思路可以看站内并发相关文章,但落地时你要先量出自己账号的稳定并发上限,再留一档余量。
降级要提前写好顺序,而不是等出事再临时想:换同能力模型、关掉非必要功能(改写、二次校验等)、最后才是返回兜底文案。每一步都要在配置里可开关,出事时改配置而不是改代码。
- 并发闸门
- 按密钥维度限制同时在途请求数,超出部分排队或快速失败。
- 降级开关
- 每个降级动作独立可配,出问题先关功能而不是回滚整个版本。
- 错误码分类
- 鉴权、限流、参数、服务端错误分别处理,别统一当异常抛出。
- 手动兜底
- 低流量场景至少留一个一键切模型的手动开关。
日志与评测:出问题能复盘,上线前有依据
日志不是「有就行」,而是「出问题时能复盘」。每次请求至少记下请求标识、模型标识、提示词版本、耗时分段、返回状态和输入输出规模,脱敏后再落盘。这样当错误率上升时,你能快速判断是某次提示词改动、某个模型切换,还是上游整体抖动。
上线前用固定用例集做验证,发版后再跑一遍回归。看的关键指标通常是错误率、超时率、降级触发次数和结构合规率,具体阈值可以到站内的评测或价格追踪页面核对当时的数字,别抄一个固定值当标准。
- 给关键指标设观察窗,超过阈值先回滚配置而不是改代码。
- 评测看稳定性与结构合规率,不要只看单次回答漂不漂亮。
- 本地实验性部署可以简化日志,但上线接口的最小字段集不能省。
- 每次改动都留一份对照记录,方便判断是哪次改动带来的变化。
常见问题
提示词在本地测着挺好,一上线就不行,先查哪?
先别改提示词,按顺序排:一看是不是并发上来了被限流或排队,二看流式是否被中间层缓冲导致首字变慢,三看上线后拼进去的上下文变长没有。把耗时分段和返回状态记全,一般这三步就能定位到是调用层问题还是提示词问题。
DeepSeek 部署到底选本地上还是走接口?
看你的约束条件:数据不能出内网、调用量大到按量计费不划算,就倾向本地;只是前期验证、访问量不稳定,走接口更快。两边成本口径不一样,先到 /models/deploy 按你的模型规模和并发算一遍,再判断,别拍脑袋。
并发一高就报错,是加机器还是改代码?
多数情况是代码层没做闸门,先加并发上限和排队,再考虑扩容。上游限流是硬约束,加机器不解决被限的问题。把并发按密钥维度控制住、失败做退避,配合能切模型的降级开关,通常就够用了。