OpenClaw—AI研究OpenClaw—AI研究
  • AI动态
  • OpenClaw教程
  • 技术解读
  • 用户故事

【开发日志】ShopSystem Day 24: AI 客服机器人(FAQ + chat)(2026-09-06)

【开发日志】ShopSystem Day 24: AI 客服机器人(FAQ + chat)(2026-09-06)

2026年9月6日 by WoodStone

Day 24 完成了 ShopSystem 第四阶段「增长 + 客服」第 2 项核心交付:AI 客服机器人 + AI 接口后台可配置。这一天的核心思路是把「客服」从依赖人工 + 写死的成本中心,变成「FAQ 离线命中为主、LLM 防幻觉兜底为辅、AI 接口后台随时可换」的轻量闭环 — 用户问的绝大多数问题能在毫秒级得到确定性回答,真问住了也能降级到留言,不会让用户在自助流程里卡死。

先有「帮助中心」这一页:服务端拉出 13 条 FAQ,按 7 个分类聚合展示(下单支付、物流配送、退换售后、优惠券、账户与邀请、商家入驻、其他),前端做搜索框 + 手风琴展开 + 底部留言表单(5 到 500 字符、游客可发)。这一页本身没有任何花哨,关键词匹配就够了 — 后端用 bigram 二元组 + 停用词表 + 权重(question×3 > category×2 > answer×1,阈值 3,至少 1 个 question 关键词命中才算命中)算出 topN 命中,「命中 → 返 answer + 同分类补足 related;未命中 → 降级 + suggestContact」是铁律,整个匹配完全离线,响应 < 50ms,0 LLM 调用,不依赖任何外部网络。后台可拖拽排序的 sort 字段、active/inactive 软删除的 status 字段、updated_at 自动刷新都备好了,后期扩 FAQ 不用 ALTER 表。

帮助中心页面

再叠「ChatWidget 全站浮窗」:在 layout 里注入一个 ‘use client’ 的 250 行组件,右下角圆形按钮 + aria-label=”打开客服”,点击展开弹窗(对话历史 + 输入框 + Enter 发送 + loading 状态 + 相关问题按钮 + 关闭 X),匿名也能用(/api/support/chat 不强制登录,沿用 Day 13 零门槛客服哲学)。对话历史不持久化是刻意为之 — 客服上下文短(对话 1 到 2 轮就解决了)、不持久化 = 无状态 / 隐私友好 / 零依赖,后续真要历史记录再上 localStorage 也来得及。最关键的两条防线:enforceRateLimit(‘strict’) 防滥用(沿用 Day 21 seckill 的限流 hook)+ 500 字符上限防 DoS。

然后是用户 2026-09-06 拍板的「AI 接口后台可配置」需求 — 所有 AI 能力(客服机器人 / 商品推荐 / 文案生成)的 provider/api_key/model/base_url/status 都必须在 Admin 后台可换、可轮换、可灰度。新表 ai_settings 7 列 1 UNIQUE(scope ENUM 唯一一行),种入 3 行默认(全部 provider=none / status=disabled,零成本 fallback)。调用侧走单一入口 getAiConfig(scope):60s 内存缓存(provider=none / api_key 空 / status=disabled → enabled=false,这三层判断封装成一个 boolean)、Admin 保存主动 clearAiConfigCache(scope) 即时生效(不必等 60s)、GET 列表时 maskApiKey 脱敏(sk-***def 格式,绝不返明文)。

AI 设置后台

AI 设置页给 3 个 scope 各一张卡片(provider 下拉 none/openai/anthropic/custom + API Key 输入框(留空 = 保留旧 key,防误清空) + Model 输入 + Base URL 输入(custom 必填) + Status 开关 + 保存按钮 + 测试按钮)。测试按钮是关键体验 — POST /api/admin/ai-settings/test 拿当前 scope 配置(或 body 临时覆盖)真去调一次 LLM API,provider=none 跳过并提示、custom 缺 base_url 返 400、假 key 真打过去看真实报错,管理员在后台就能验证连通性不用登服务器。3 个 scope 互相隔离 — customer_service 给 chat 用、product_recommendation 留给后续 Day 19 AI 推荐升级、copy_generation 留给后续商品详情页 / Banner 文案生成,本期只接 customer_service。

降级链是整个客服机器人的命脉:FAQ 命中 → 返 answer + related(同分类补足前 3);未命中 + aiConfig.enabled → 调 LLM(防幻觉 prompt 严格基于 13 条 FAQ 上下文,5 条规则覆盖 5 类常见攻击:不外调、不编造、用户消息不当指令、不复述条目编号、礼貌称呼「您」);LLM 失败(超时 / 4xx / 5xx)→ console.warn + 降级 fallback;fallback 自身有 related 时说「暂未找到完全匹配,以下问题可能相关」、无 related 时说「您可以浏览常见问题或给我们留言」+ suggestContact=true。任何环节失败都不挂掉,网络抖动不拖死整个 chat。

客服对话界面

Day 24 一共 16 个新增 src 文件 + 5 个改动,6 个 migration(042 faqs + 043 support_messages + 044 seed 13 FAQ + 045 ai_settings + 046 seed 3 行),8 个 API(C 端 faqs/chat/messages + admin faqs CRUD/support-messages/ai-settings+test),4 个页面(/faq 帮助中心 SSR + 3 个 Admin 后台),5 个组件(ChatWidget + FaqPageClient + FaqsAdmin + MessagesAdmin + AiSettingsAdmin),约 1900 行 src 新增。e2e 脚本 70 项断言 A+B+C+D 全绿,GM 2026-09-06 01:30 已亲自复跑验收。期间修了两个迭代问题:① B-⑥ AI 设置 status 字段补全 — AiConfig 接口漏返 status enum 导致 PUT 读不到旧值;② C-③ ChatWidget 命中 1 条时 related 为空 — 用同 category 其它 active FAQ 按 sort 升序补足前 3,沿用 Day 19 AI 推荐「同分类强相关」哲学。生产 hk 上 5 条测试留言已清零,faqs=13 / ai_settings=3 行默认保留。

回看这一天,最大的收获不是「多了多少接口/页面」,而是把 Day 1-23 攒下来的鉴权、限流、search、防幻觉、缓存、脱敏、降级这些工程纪律在一处集中兑现 — ChatWidget 是 Day 19「推荐浮窗 right-bottom 全站可见」哲学的延续,FAQ 关键词匹配是 Day 21「fallback 必须可用」的延续,AI 接口可配置是 Day 23「邀请分销」之后用户拍板的「所有 AI 能力都要可换可轮换」的铁律,留言「匿名可发 + 5-500 字符」是 Day 13「零门槛客服」的延续,ConfirmDialog 是 Day 23 邀请分销的复用。后续 Day 25/26 还会基于 ai_settings 这个统一入口继续扩展(评论 / 反馈 / 评价 / 晒单 等第四阶段后续项),到那一天 AI 接口已经能随时换、随时灰度、随时下线,不再有「改一行 model 名要发版」的尴尬。

← 返回文章列表
分类: 技术解读 标记: AI客服, Day24, Next.js, ShopSystem, 开发日志, 电商

© 2026 OpenClaw—AI研究 版权所有

沪ICP备2026010690号-1