API 设计与服务化
本节定位
做 LLM 应用时,很多人能写出一个本地脚本,但一到服务化就开始混乱。
真正的问题不是“会不会写接口”,而是:
这个接口能不能长期稳定地被别人调用。
这一节就是在回答这个问题。
学习目标
- 理解一个 LLM 服务 API 最基本应该定义哪些内容
- 学会设计清晰的请求和响应结构
- 理解幂等性、错误返回、trace_id、版本管理这些服务化关键概念
- 看懂一个最小 API 处理闭环
一、为什么 API 设计不是“随便包个 JSON”?
1.1 一个差的接口长什么样?
bad_request = {
"msg": "退款政策是什么"
}
bad_response = {
"text": "7 天内可退款"
}
问题在哪?
msg是什么?用户消息?系统消息?- 没有 trace_id
- 没有错误结 构
- 没有版本信息
- 没有上下文字段
1.2 一个好的 API 设计在做什么?
本质上它在回答:
- 输入长什么样
- 输出长什么样
- 错了时怎么表示
- 调一次和调十万次还能不能稳定
也就是说,API 设计不是“写个入口”,而是在定义:
系统和外部世界的契约。
二、先设计请求结构
2.1 最小请求结构通常至少要有这些
queryuser_id(可选)session_id(多轮时)metadata(可选)
2.2 一个更清楚的请求对象
request = {
"query": "退款政策是什么?",
"user_id": 1,
"session_id": "sess_001",
"metadata": {
"channel": "web"
}
}
print(request)
这里你已经能感受到:
- 查询内容是什么
- 谁发来的
- 属于哪个会话
- 额外上下文是什么
这就比“只传一段字符串”强很多。
三、再设计响应结构
3.1 为什么响应也必须规范?
因为真实调用方往往不只是人,还有:
- 前端
- 其他服务
- 日志系统
- 评估系统
它们都需要稳定消费返回结果。
3.2 一个更稳的响应结构
response = {
"trace_id": "trace_001",
"answer": "课程购买后 7 天内且学习进度低于 20% 可申请退款。",
"sources": [
{"id": "doc_001", "section": "退款政策"}
],
"usage": {
"prompt_tokens": 120,
"completion_tokens": 35
}
}
print(response)