# AI 客服 / 助理后端：上线前 9 项验收清单

> 免费下载，不用留联系方式。照着打勾即可。
> 维护：AI智工坊 · 2026-10-29。这套清单来自一个真实上线的客服后端（本地开源模型 + 外部工具 + 在线下单），
> 每一项都对应一次真实故障，不是教科书条目。

## 一、输出可靠性（最容易被误判成"模型不行"）

**1. 空回复时先看结束原因，不要先改 prompt。**
把 `finish_reason`、正文长度、思考字段（若模型暴露）一起打出来。
`finish_reason = length` + 正文很短 = 输出预算被思考吃光；`stop` + 正文很短 = 模型提前收尾。两者修法完全不同。

**2. 确认"关思考"的参数真的生效。**
写在顶层字段（如 `enable_thinking: false`）在很多模型上会被静默忽略——不报错、不告警。
必须在 chat template 参数层关闭，并在返回体里验证 `finish_reason` 已变为 `stop`。**没验证过就等于没关。**

**3. 合格判据是合成条件，不是 `if content:`。**
建议：`正文非空 and (finish_reason == "stop" or len(正文) >= 400)`。
只判非空会把「好的，我来帮您」这种半句话当成品交给客户。

**4. 降级阶梯每一级都必须换参数。**
同参数重试两次 ≠ 重试，只是把失败重放一遍。每级要么加预算、要么换关思考方式、要么拆任务。

## 二、成本红线（花错钱比答错话贵）

**5. 跑一遍"问价"用例，确认系统没有真的去执行任务。**
判据：命中价格词（多少钱/价格/报价/收费/费用/便宜/优惠/价位）**且**没有产出动词（写/生成/起草/拟/做一份/出一份/整理/总结/翻译）→ 判定为问价，不进入生成通道。
注意是 **且**：只用一头一定会误伤另一头（「帮我写一份报价方案」是真任务）。

**6. 报价类条目在 FAQ/知识库里排最前。**
否则「你们多少钱」会先命中产品介绍条目，客户问价却收到一段说明书。

## 三、外部依赖与状态（不会报错的那一类）

**7. 所有长期依赖的服务不在临时目录，且有开机自启 + 崩溃重启。**
一次性起的后台进程（nohup/setsid 之类）是定时炸弹：机器重启、临时目录被清，它就静默消失，日志上只看到"查询无结果"。

**8. 关键外部依赖至少有两条路（直连 + 兜底）。**
把唯一通道押在中继/代理上，等于给整条链路加一个单点。至少在兜底切换时写一条日志。

**9. 状态机：承接上一轮的判断必须排在"识别新意图"之后，并带时间窗。**
否则一次没付完的单会变成黑洞，把之后所有新需求都吞掉（症状：客户说"我要买 X"，系统回"请补充上一单需求"，永远建不了新单）。
另外，append-only 台账写盘后要回填内存对象，否则渲染时状态字段仍是空。

## 四、端到端验收

- 真实模型跑一次完整生成要按**分钟**算（我们这边约 100 秒）。测试里的单次等待超时必须累计，**超时要 `continue` 不是 `break`**——一字之差，决定你验证的是"交付成功"还是"没崩"。
- 中文 Windows 下不设 UTF-8 跑测试脚本，打印带 emoji 的日志会抛 `UnicodeEncodeError`，看着像后端崩了，其实只是脚本打印崩了。
- 每次改完跑固定回归集（对话 / 文档 / 出图 / 报价 / 风格），不要只测刚改的那条。

## 五、三条边界（写在前面，省得后面扯皮）

1. **人机验证（滑块/点选/行为风控）自动化越不过**，能过的只有人工。设计时要把这部分明确抛给人，而不是重试到天亮。
2. **"偶发"不是正常**：同一条链路一天里失败 1~2 次，通常说明有成对出现的失败条件（预算临界、超时临界），迟早会变成每天都失败。
3. **换模型是最后手段，不是第一手段**。只有在「关思考 + 足额预算 + 合格判据」都做对之后正文仍然事实错误，才值得换。

---

需要人一起看现场：<https://www.aizhigongfang.com/services/>
标准数字商品（苏州话标准词库 3550 条）：<https://www.aizhigongfang.com/products/suzhou-dialect-lexicon>
