嘴替鸭小程序是怎么看懂一句话的:本地规则 + 大模型的混合引擎拆解

1 阅读6分钟

嘴替鸭小程序是怎么看懂一句话的:本地规则 + 大模型的混合引擎拆解

参赛赛道:全链路开发实战

#TRAE双端融合 #全新 TRAE 实战体验 #TRAE 全链路实战

程序代码我已经放在了github上,你可以自己跑跑看:github.com/beverlyLee/…

前面那篇我们搭建了一个嘴替鸭微信小程序,来解决社交场景下的接话尴尬场景,讲了嘴替鸭能干什么、我用 TRAE 怎么把它做出来。这一篇专讲它是怎么运作的,从问题进来,到回话出去,中间每一层怎么判、怎么打分、怎么兜底。

一、整体架构

先看一张完整架构图,建立全局视角。 整个项目拆成四层:前端 Taro 一份代码编译到微信、支付宝、抖音小程序和 H5; Python 后端 FastAPI启动起来,每天爬社区话术,排序后存进本机,给前端当每日语录数据源; Node 配置后台起来,浏览器打开就能可视化增删改意图、语录、话题、提示词,改完导出贴回小程序即生效; 微信云开发作为备用链路留着,主链路不依赖它。

系统架构图如下,采用小程序+python后端来实现的。

嘴替鸭-系统架构图-2026-10-21.png

二、拆招功能:为什么不全交给大模型

一开始我确实想全交给大模型,但想到了几个场景:

第一,饭桌上等两三秒出结果,话头已经过去了,这时候你似乎没有机会再回答了。 第二,每次调用都花钱,在社交密集的场合,一场别有用心饭局或者谈话,似乎得烧一大堆token。 第三,如果是在家庭聚会或者人流密集处,没网或者没配 key 的时候,纯大模型方案直接无法使用。

所以最后定下的架构是本地规则打底,大模型只做L3层兜底。

下面这张图是整个意图判定的主链路。 嘴替鸭-意图识别规则过滤流程图-2026-10-21.png

2.1 固定规则怎么匹配

入口函数 analyzeUtterance 进来后,先做第一层固定意图规则的匹配。这一层的逻辑很朴素,就是字面扫描,不是语义理解。

每条意图规则(IntentRule)带一组关键词和权重。引擎对每条规则逐词检查,用 text.includes(kw) 判断原话里有没有这个词,命中几个就记几个 hits。只有 hits 大于 0 的规则才进入候选,空关键词的万能兜底永远不进候选。下面这张图把匹配和筛选的全过程画了出来。

嘴替鸭-规则匹配逻辑图-2026-10-22.png

2.2打分:权重乘命中数

打分逻辑主要用在命中多个意图标签的时候,命中多的意图打分高。 进了候选的规则怎么排座次,公式计算权重:

score = weight * hits

按 score 从高到低排候选的意图标签,分数相同则命中词多的胜出。取分数最高的那条当主意图。下面这张图给了一个真实例子,也把当前 14 个具体意图的权重列了出来。

嘴替鸭-意图打分逻辑图-2026-10-22.png

2.3 大模型兜底

第一层和第二层都没命中、且用户配了模型,才交给第三层大模型处理。大模型要是没配或者调用失败,自动降级回万能兜底模板。 喂给大模型的 system prompt 是意图识别和话术生成一次完成的,前半段识别意图,后半段直接出四套回话。原文是这样的:

你是「嘴替鸭」,一位专帮内向者(i人)应对社交压力的资深话术教练,精通中国式人情世故。
【输入】别人对用户说的一句原话。说话人可能是亲戚、领导、同事、朋友或陌生人;语气可能委婉、阴阳怪气,也可能直接施压,注意听出弦外之音。
【任务】
1. 意图识别:看穿这句话背后的真实目的,可能同时命中多个意图(如:催婚催生、打探隐私、贬低比较、职场画饼、职场打压、甩锅推责、道德绑架、情感勒索、劝酒逼酒、玩笑越界、越界指挥、开口借钱、服务维权、拒绝邀约、PUA、正常交流等;也可自拟更贴切的名称),按相关度从高到低排列,最多 5 个
2. 强度评估:low=无恶意随口一说;medium=让人不适;high=明显冒犯或施压
3. 处境概括:用户当下的处境与应对要点,40字以内
4. 生成 4 套可直接照着说的回话,顺序和风格固定:
   - gentle(温和化解):表面接住话、四两拨千斤,不撕破脸
   - humor(幽默带过):用玩笑或自嘲轻松岔开,气氛不僵
   - direct(直接拒绝):清晰表明立场和边界,不卑不亢
   - counter(反将一军):把问题礼貌抛回给对方,可带锋芒但留余地
【要求】
- 口语化,像日常说话,禁止书面腔;每句15~60字
- 得体不憋屈:不委屈自己,也不激化矛盾;理解对方可能是长辈/上级,回话要留情面但不退让底线
- 结合中国式人情场景(饭桌、酒局、家族聚会、办公室),让回话接地气、能自然出口
- 如果对方只是正常交流(问好、关心、闲聊),四套回话都应是友好自然的回应,不要强行树敌
- reason 用一句话解释这句话为什么有效,30字以内
【输出】严格只输出一个 JSON 对象,禁止 markdown 代码块、禁止任何解释或前后缀文字。格式:
{"intents":["意图名称1","意图名称2","意图名称3"],"intensity":"low|medium|high","situation":"处境与应对要点","responses":[{"style":"gentle","text":"回话内容","reason":"有效原因"},{"style":"humor","text":"回话内容","reason":"有效原因"},{"style":"direct","text":"回话内容","reason":"有效原因"},{"style":"counter","text":"回话内容","reason":"有效原因"}]}

配套的 user 消息极简,只传原话:别人对我说的话:「<用户输入>」。这条 prompt 也能在设置里被覆盖,不用改代码。

三、每日语录池

语录池也是有两层的,这样用户可以看到新的语录,及时更新自己的社交语料库。 第一层零命中时,引擎下钻到第二层每日语录池。这一层拿后端每天从社区抓来的热话,和当前输入做匹配。命中就按语录打的意图标签归类,套通用模板回话,把回话追加到末尾。

嘴替鸭-语录逻辑图-2026-10-22.png

一点反思

做这个项目让我想清楚一件事:个人开发者做AI小工具,价值不是开发本身,也不是用一些多么前沿的新技术,而是让用户真正能用得上,方便、低成本的解决用户的问题。规则引擎解决的是确定性和成本,大模型解决的是不确定性和智能,两者不是谁替代谁,而是漏斗式分工。先把八成明确场景用零成本处理,剩下一些不常见的场景或者重要场景,才动用需要成本的大模型。当然,工具只是工具,更多的是帮助人在社交场合下更加游刃有余,提升社交能力才是目的。

#TRAE双端融合 #全新TRAE实战体验 #TRAE 全链路实战