这是《LLM 应用开发 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 本章把前面的能力组合成一个企业智能客服知识库。目标是回答政策问题、查询订单状态、处理退款申请草稿,并在信息不足或高风险时转人工。
29.1 需求定义
用户故事:
- 用户可以询问退换货、物流、账号等政策;
- 用户可以查询自己的订单状态;
- 用户可以发起退款申请草稿;
- 客服可以查看引用来源和推荐动作;
- 高风险操作必须人工确认。
非目标:
- 不自动承诺赔付;
- 不自动执行支付;
- 不处理法律和医疗结论;
- 不跨租户共享知识。
29.2 架构
Web / App
-> API Gateway
-> Chat Service
|-- Auth
|-- Session Memory
|-- Intent Router
|-- RAG Pipeline
|-- Tool Gateway
|-- Guardrail
+-- Audit
|-- MySQL
|-- Redis
|-- Vector / Search
+-- Object Storage
29.3 数据模型
CREATE TABLE conversations (
id BIGINT PRIMARY KEY,
tenant_id VARCHAR(64) NOT NULL,
user_id VARCHAR(64) NOT NULL,
status VARCHAR(20) NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE messages (
id BIGINT PRIMARY KEY,
conversation_id BIGINT NOT NULL,
role VARCHAR(20) NOT NULL,
content TEXT NOT NULL,
trace_id VARCHAR(64),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE escalation_tasks (
id BIGINT PRIMARY KEY,
conversation_id BIGINT NOT NULL,
reason VARCHAR(100) NOT NULL,
draft TEXT,
status VARCHAR(20) NOT NULL,
assigned_to VARCHAR(64),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
29.4 意图路由
{
"intent": "query_order",
"confidence": 0.93,
"entities": [{"type": "order_id", "value": "A-10001"}],
"needs_clarification": false
}
路由规则:
| 意图 | 后续 |
|---|---|
| policy_qa | RAG |
| query_order | 查订单工具 |
| refund_request | 查资格并生成草稿 |
| complaint | 安抚并转人工 |
| unsafe | 护栏拒答 |
低置信度先澄清,不要直接猜。
29.5 RAG 管道
async def answer_policy(question, user):
query = await rewrite(question, user.session_id)
candidates = await hybrid_retrieve(query, user)
ranked = await rerank(query, candidates)
context = build_context(ranked, max_tokens=3000)
answer = await generate_answer(question, context)
if not verify_citations(answer, context):
return fallback_template("information_insufficient")
return answer
索引文档包括政策、FAQ、物流说明和客服 SOP,全部带租户、版本和 ACL。
29.6 工具调用
工具:
| 工具 | 权限 | 风险 |
|---|---|---|
| get_order | 本人或归属客服 | 只读 |
| get_refund_policy | 登录用户 | 只读 |
| create_refund_draft | 本人 | 中 |
| submit_refund | 审批人 | 高 |
执行示例:
async def handle_refund(intent, user):
order = await get_order(intent.order_id, user)
policy = await check_refund_policy(order)
if not policy.allowed:
return explain_refund_rejected(order, policy)
draft = await create_refund_draft(order, policy)
return {"draft_id": draft.id, "need_confirm": True}
29.7 安全设计
- 检索时过滤 tenant 和 ACL;
- 订单查询绑定用户;
- 退款提交需二次确认;
- 手机号和地址脱敏;
- 输出必须引用政策;
- 注入用例进入回归;
- 客服界面展示 trace;
- 所有工具调用审计。
29.8 评测
数据集:
政策问答 300 条
订单查询 200 条
退款资格 150 条
多轮澄清 100 条
注入和越权 100 条
边界和坏案例 150 条
上线指标:
| 指标 | 目标 |
|---|---|
| 政策答案正确率 | >= 90% |
| 引用通过率 | >= 98% |
| 订单查询正确率 | >= 99% |
| 越权测试通过率 | 100% |
| p95 总延迟 | < 8s |
| 自动解决率 | 持续提升 |
29.9 部署
API 服务:无状态多实例
Worker:文档索引和异步任务
模型:外部 API 或私有推理服务
存储:MySQL + Redis + 向量库 + 对象存储
观测:日志、指标、trace、告警
发布策略:
- 内部账号验证;
- 1% 用户灰度;
- 按租户扩大;
- 高风险场景继续人工确认;
- 保留旧 Prompt 和索引。
29.10 迭代计划
| 阶段 | 内容 |
|---|---|
| v1 | 政策问答 + 引用 |
| v2 | 订单查询 |
| v3 | 退款草稿 |
| v4 | 多轮澄清 |
| v5 | 客服助手视图 |
| v6 | 语义缓存和成本优化 |
| v7 | Agent 任务恢复 |
本章小结
项目实战的关键是控制范围:先做高价值、低风险的政策问答,再接入实时工具,最后逐步增加工作流和自动化。每一阶段都配套权限、引用、评测、审计和人工兜底。
思考题
- 为什么退款提交不能完全自动化?
- 订单状态为什么不能只依赖 RAG?
- 如何设计客服助手界面?
- 上线前必须通过哪些安全测试?
- 项目 v1 应优先交付什么能力?