
1. 关键词匹配撑不起智能客服的意图识别问题到底出在哪如果你正在用 Claude Code 搭智能客服系统大概率会经历这样一个阶段知识库能检索、FAQ 能命中但一到「我要退款太不满意了」这种一句话里带两种情绪的输入意图识别就开始乱。要么被 COMPLAINT 规则先吃掉要么直接掉进 UNKNOWN 兜底回复驴唇不对马嘴。我试过照抄网上那套knowledge_engine.py的关键词 TF-IDF 方案IntentClassifier里INTENT_RULES给关键词 0.3、正则 0.5 的权重单看规则没问题但「退款」和「投诉」的触发词高度重叠max(scores, keyscores.get)取最高分时谁先命中谁赢结果就是 refund 被 complaint 抢走。很多人第一反应是「代码写错了」其实规则本身没错是权重和词表边界没拆干净。更隐蔽的坑在通道层。Claude Code 默认走官方端点如果你没在~/.claude/settings.json里把ANTHROPIC_BASE_URL和ANTHROPIC_AUTH_TOKEN配通它连模型都调不动你改半天规则也看不到真实推理结果只能靠本地uv run python硬跑效率极低。这篇就按「先通通道、再调规则、最后验证」的顺序把智能客服的意图识别从「关键词匹配」拉到「能真正理解语义」的水平。适合正在做知识库 意图识别 多轮对话的开发者尤其是被 UNKNOWN 兜底折磨过的人。2. 前置把 Claude Code 的 Token 通道配通在动knowledge_engine.py之前先把消耗 Token 的 Claude Code 通道弄通。这一步不做后面所有「让 Claude Code 帮我核对规则」的操作都是空谈。打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册账号进控制台创建一个 API Key。拿到 Key 之后编辑~/.claude/settings.json在env字段里填两个变量{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: sk-你的Key } }这里有两个细节必须注意。第一ANTHROPIC_BASE_URL结尾不要加/v1也不要带任何 UTM 参数就填https://taotoken.net/api多一个字符都会导致 404。第二ANTHROPIC_AUTH_TOKEN填的是刚创建的那把 Key不是账号密码。配完之后回到smart-support项目目录跑一次claude命令如果能看到正常的对话响应说明通道通了。这一步的验证很关键因为后面让 Claude Code 逐条核对INTENT_RULES的权重、拆分「投诉」和「退款」规则全靠这条通道。如果你还想在浏览器里直接验证模型输出可以走模型对话入口 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 把同一句话丢进去看模型怎么理解意图和本地IntentClassifier的结果做对照。长期做编码和 Agent 的话Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 会更划算Token 同样走这把 Key。3. 可复制配置拆开「投诉」和「退款」的规则边界通道通了之后回到knowledge_engine.py。原文的INTENT_RULES里COMPLAINT 的关键词是[投诉, 差评, 不满意, 太差, 骗人, 吃土, 问题]REFUND 是[退款, 退货, 退钱, 取消订单, 不要了, 退回]。问题出在「不满意」「太差」这类词既像投诉又像退款前置情绪而「退款」本身在投诉语境里也高频出现。让 Claude Code 对着原文INTENT_RULES逐条核对重点做三件事第一把纯情绪词从 COMPLAINT 里剥离出来单独作为情感信号不参与意图打分。SentimentAnalyzer已经在做这件事IntentClassifier不该再抢它的活。第二给 REFUND 加一条高优先级正则明确「退款」动作词优先于情绪词Intent.REFUND: { keywords: [退款, 退货, 退钱, 取消订单, 不要了, 退回], patterns: [ r(退款|退货|退钱|取消订单), r(我要|我想|申请).{0,4}(退款|退货|退钱) ] },第三把 COMPLAINT 的权重从 0.3 / 0.5 调整为情绪词 0.2、明确投诉动作词 0.5避免情绪词压过退款动作Intent.COMPLAINT: { keywords: [投诉, 差评, 骗人, 吃土], patterns: [r(投诉|差评|骗人|吃土)] },改完之后classify里的max(scores, keyscores.get)逻辑不用动但因为 REFUND 的正则命中会拿到 0.5而 COMPLAINT 的情绪词只拿 0.2我要退款太不满意了就会正确落到 refund。这里有个参数对照表方便你核对改动前后的差异意图改动前关键词权重改动后关键词权重改动前正则权重改动后正则权重REFUND0.30.30.50.5新增动作正则COMPLAINT0.30.20.50.5仅动作词UNKNOWN兜底兜底--注意不要为了追求「退款」永远赢就把 COMPLAINT 权重压到 0。真实投诉场景里「我要投诉你们退款太慢」应该走 complaint 转人工而不是 refund。权重调整的目标是让动作词决定意图情绪词只做辅助。4. 验证请求重跑三行测试确认意图落回 refund改完规则重跑原文那段三行测试from knowledge_engine import IntentClassifier intent, conf IntentClassifier.classify(我要退款太不满意了) print(f意图: {intent.value} (置信度: {conf:.2f}))预期输出应该是意图: refund (置信度: 0.50)如果还是 complaint 或者 unknown按下面顺序排查。先确认INTENT_RULES里 REFUND 的正则有没有写错r(退款|退货|退钱|取消订单)里的竖线是正则或不是字符串。再确认classify里re.search(pattern, text)用的是search不是matchmatch只从开头匹配我要退款开头是「我」会漏掉。置信度 0.50 是因为只命中了正则的 0.5没命中关键词。如果你希望置信度更高可以在 REFUND 关键词里补上「退款」——但注意「退款」已经在关键词列表里了if keyword in text会命中所以实际置信度应该是 0.3 0.5 0.8。如果跑出来只有 0.5检查关键词列表是不是被误删了。确认意图识别正确后再让 Claude Code 生成dialogue_manager.py的多轮对话与转人工逻辑。原文的SLOT_REQUIREMENTS里 refund 需要收集order_no转人工判断是negative_count 3或intent COMPLAINT and confidence 0.7。这部分 Token 同样走~/.claude/settings.json里那把 Key不用额外配置。跑通对话管理器后按原文继续做槽位收集和 Web 聊天界面。app.py里的/api/chat接口会调用dm.process_message整条链路就串起来了。5. 本篇常见错排查报错一ANTHROPIC_BASE_URL配了但 Claude Code 仍报 401。检查 Key 是不是复制时带了空格或者settings.json的 JSON 格式有误比如多了逗号。用cat ~/.claude/settings.json | python -m json.tool验证格式。报错二意图识别跑出来还是 UNKNOWN。先打印scores字典看有没有命中任何规则。如果scores为空说明关键词和正则都没匹配上检查text是不是被strip()处理过、有没有全角半角混用。报错三IntentClassifier.classify返回的置信度超过 1.0。原文有min(score, 1.0)兜底如果你改代码时删了这行多个关键词叠加会超过 1.0。加回去即可。报错四dialogue_manager.py里negative_count不累加。检查process_message里if sentiment[sentiment] negative的判断SentimentAnalyzer.analyze返回的sentiment是字符串negative不是枚举。报错五Web 界面发消息没反应。打开浏览器控制台看/api/chat请求的响应大概率是session_id为空。/api/session是异步创建的确保sendMessage在sessionId赋值之后再调用。提示排障时优先看 Claude Code 的原始输出不要只看本地print。通道通了之后让 Claude Code 直接读knowledge_engine.py和dialogue_manager.py它能帮你定位到具体哪一行规则冲突。6. 接入文档与后续通道配通、规则拆干净、意图落回 refund 之后剩下的槽位收集、多轮对话、Web 界面都是顺水推舟。如果你在接入过程中遇到 Key 配置或端点报错直接看接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有settings.json的完整字段说明和常见错误码。需要管理多把 Key 或查看用量走 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。智能客服的意图识别不是靠堆关键词堆出来的而是靠「动作词定意图、情绪词做辅助、通道保证推理真实」这三层配合。把 Claude Code 的通道先弄通再回头调规则你会发现 UNKNOWN 兜底少了一大半。