LLMNotes

第 29 章:项目实战

zjc 于 2026-01-29 发布

这是《LLM 应用开发 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 本章把前面的能力组合成一个企业智能客服知识库。目标是回答政策问题、查询订单状态、处理退款申请草稿,并在信息不足或高风险时转人工。

29.1 需求定义

用户故事:

  1. 用户可以询问退换货、物流、账号等政策;
  2. 用户可以查询自己的订单状态;
  3. 用户可以发起退款申请草稿;
  4. 客服可以查看引用来源和推荐动作;
  5. 高风险操作必须人工确认。

非目标:

  1. 不自动承诺赔付;
  2. 不自动执行支付;
  3. 不处理法律和医疗结论;
  4. 不跨租户共享知识。

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 安全设计

  1. 检索时过滤 tenant 和 ACL;
  2. 订单查询绑定用户;
  3. 退款提交需二次确认;
  4. 手机号和地址脱敏;
  5. 输出必须引用政策;
  6. 注入用例进入回归;
  7. 客服界面展示 trace;
  8. 所有工具调用审计。

29.8 评测

数据集:

政策问答 300 条
订单查询 200 条
退款资格 150 条
多轮澄清 100 条
注入和越权 100 条
边界和坏案例 150 条

上线指标:

指标 目标
政策答案正确率 >= 90%
引用通过率 >= 98%
订单查询正确率 >= 99%
越权测试通过率 100%
p95 总延迟 < 8s
自动解决率 持续提升

29.9 部署

API 服务:无状态多实例
Worker:文档索引和异步任务
模型:外部 API 或私有推理服务
存储:MySQL + Redis + 向量库 + 对象存储
观测:日志、指标、trace、告警

发布策略:

  1. 内部账号验证;
  2. 1% 用户灰度;
  3. 按租户扩大;
  4. 高风险场景继续人工确认;
  5. 保留旧 Prompt 和索引。

29.10 迭代计划

阶段 内容
v1 政策问答 + 引用
v2 订单查询
v3 退款草稿
v4 多轮澄清
v5 客服助手视图
v6 语义缓存和成本优化
v7 Agent 任务恢复

本章小结

项目实战的关键是控制范围:先做高价值、低风险的政策问答,再接入实时工具,最后逐步增加工作流和自动化。每一阶段都配套权限、引用、评测、审计和人工兜底。

思考题

  1. 为什么退款提交不能完全自动化?
  2. 订单状态为什么不能只依赖 RAG?
  3. 如何设计客服助手界面?
  4. 上线前必须通过哪些安全测试?
  5. 项目 v1 应优先交付什么能力?