119 lines
8.8 KiB
Markdown
119 lines
8.8 KiB
Markdown
|
|
# 改动文档:公司知识库(事实卡)——公司事实零编造
|
||
|
|
|
||
|
|
- **日期**:2026-09-10
|
||
|
|
- **分支**:`chany_dev_dev`
|
||
|
|
- **状态**:170 项测试全绿(基线 160,净增 10);真机 GLM 冒烟**未执行**(清单见 §6,部署前置项)
|
||
|
|
- **实施档案**:[superpowers/plans/2026-09-10-company-knowledge-base.md](superpowers/plans/2026-09-10-company-knowledge-base.md)(经自查三轮+独立评审一轮,所有正则与断言本地实证)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 1. 背景与问题
|
||
|
|
|
||
|
|
生产实证(2026-09):客户在 Ghana 问 "do you have branch in Ghana",AI 答 **"Not yet"**——而公司在 Ghana 有分支(五分支之一,含保税仓)。知识真空下 GLM 对无法验证的事实问题选择"听起来合理的否定+转进",**否定性编造与肯定性编造同样致命**。
|
||
|
|
|
||
|
|
编造面全量盘点另发现两个向量,一并封堵:
|
||
|
|
1. **库存/现车断言**:system.md 的"好回复"示例有三处在教 AI 说 "in stock"(GLM 听逐字示例不听抽象红线,已两次实证)
|
||
|
|
2. **保修/质保期限承诺**:价格墙显式豁免 warranty 形态——"we offer 6 months warranty" 编造承诺墙级放行;**中文时限承诺("3天到货"/"6个月质保")更是零拦截**
|
||
|
|
|
||
|
|
**部署后新实证(2026-09-10,Accra 案例)**:Ghana 分支问题已正确答"有"(核心 bug 确认修复),但 GLM 用内部知识**装饰了卡外城市细节**("Our team is based in Accra"——Accra 全库零出现,系编造;且按保税仓惯例更可能在 Tema 港,大概率还是错的)。归因:卡片有 WHAT 无 WHERE,"点出当地节点"鼓励了展开;专名编造不属于任何墙的模式类,只能知识层封堵。修复(用户定调"不提城市、不额外扩展"):事实卡加**不扩展原则**(回答只用卡内原词,禁止城市/地址等卡外细节)+ 分支回答逐字模板("Yes, we've got a Ghana branch with bonded storage",只说国家+节点类型)。墙级拦截评估为不可行(专名无模式特征),记档。
|
||
|
|
|
||
|
|
## 2. 方案与决策记录
|
||
|
|
|
||
|
|
**选型:静态事实卡常驻 prompt**(知识文件 + loader 拼接),否决 RAG(检索漏=编造回归)与触发词注入("do you have branch in X" 只有国名,无特征触发词——Ghana 案例即其反例)。
|
||
|
|
|
||
|
|
用户口径确认(2026-09-10):
|
||
|
|
| 决策 | 结论 |
|
||
|
|
|---|---|
|
||
|
|
| 出口量矛盾(50,000+ vs 10,000+) | **50,000+** |
|
||
|
|
| 新车/二手车定位 | **新旧车都做**(人设第一句同步改) |
|
||
|
|
| Venezuela | **列入**网络节点 |
|
||
|
|
| Leopard、ROX、Zeeker 品牌名 | **全部保留原文** |
|
||
|
|
| "覆盖 70+ 国"口径 | **累计出口目的国**,非分支/网点覆盖 |
|
||
|
|
| 核心原则 | **不清楚的:不编造、不承诺、不否定、不断言 → 引导留联系方式转客户经理**(统一兜底) |
|
||
|
|
|
||
|
|
## 3. 实现
|
||
|
|
|
||
|
|
### 3.1 事实卡(`app/prompts/company_facts.md`,新文件)
|
||
|
|
|
||
|
|
公司事实(身份/品牌八家/新旧车都做/全动力全车型/五分支+Dubai 枢纽+Abu Dhabi 展车+Venezuela)+ 使用规则(统一兜底最高优先/分支与出口覆盖分开答/卡外禁止编造否定/数字照抄阿拉伯写法防价格墙中文数字陷阱)。loader:`ai_service.py` 拼接顺序 = system.md 行为 prompt → 事实卡 → 当轮 context 提醒(提醒保持最后);extractor/evaluator 不拼卡。
|
||
|
|
|
||
|
|
### 3.2 墙安全静态测试(`tests/test_company_facts.py`,新文件)
|
||
|
|
|
||
|
|
事实卡逐句过价格墙+零号码墙(防中文数字陷阱/防未来塞入联系方式)、长度上限 2500(防手册化)、@/wa.me 禁入。**卡片与输出墙同源安全:AI 原样引用事实也不会被墙误杀**。
|
||
|
|
|
||
|
|
### 3.3 system.md 集成(4+1 处)
|
||
|
|
|
||
|
|
- 人设第一句:"二手车外贸销售"→"汽车出口外贸销售(新车与二手车都做)"(子串替换,风格句保留)
|
||
|
|
- 汽车信息类补一条:公司情况按事实卡简短作答建立信任,不因此报价/承诺/跳过留资
|
||
|
|
- 三处现货断言示例改"可采购调配"措辞("we got tons of them"/"in stock" 清零)
|
||
|
|
- 红线补三条:不清楚的一律不编造不承诺不否定不断言留资转经理 / 不对库存现车断言 / 不报保修质保期限
|
||
|
|
- 补丁:对话推进规则"是否有现车"→"可否采购调配"(与红线对齐)
|
||
|
|
|
||
|
|
### 3.4 再索要墙补裸碎片模式(Ghana 案例顺带发现)
|
||
|
|
|
||
|
|
"Your number, please?"/"Your WhatsApp?" 裸碎片曾穿透 REASK_PATTERNS。新模式含六个动词后顾排除(reach/reached/got/sent/did/**to**——"sent it to your WhatsApp, ok?" 跟进确认不误丢)。政策同步:confirmed 语境下"确认号码"也算冗余再索要(suspect 流闸门关着不受影响)。
|
||
|
|
|
||
|
|
### 3.5 时限/保修承诺墙级封堵
|
||
|
|
|
||
|
|
价格墙时间模式去 warranty 豁免 + 新增五条:年限保修定向双向("8 years warranty"/"warranty of 8 years"/"8年质保"/"整车质保3年")、中文时限单位("3天到货"/"6个月质保"——此前**零拦截**;年不收,防"2024年款"误杀)。误杀防护实证 13 条全清(二手车龄"under 5 years old"/"5座SUV"/"600km续航"等放行)。
|
||
|
|
|
||
|
|
## 4. 文件清单与提交
|
||
|
|
|
||
|
|
| 文件 | 动作 |
|
||
|
|
|---|---|
|
||
|
|
| `app/prompts/company_facts.md` | 新建(28 行,墙安全实证) |
|
||
|
|
| `app/services/ai_service.py` | +5 行实质改动 loader(常量/拼接基座/两调用点改写) |
|
||
|
|
| `app/prompts/system.md` | 4+1 处(人设/口径/示例/红线/推进规则) |
|
||
|
|
| `app/services/boundary_filter.py` | REASK+裸碎片模式;PRICE 时间模式六条;docstring 更新 |
|
||
|
|
| `tests/test_company_facts.py` | 新建 +5 测试 |
|
||
|
|
| `tests/test_boundary_filter.py` | +5 测试,2 处政策翻转(带日期注释) |
|
||
|
|
|
||
|
|
提交序列(逐个可回滚):`7c0c1c1` 事实卡 → `e65f5bc` 墙安全测试 → `3d71fe4` system.md 集成 → `7de5344` 推进规则补丁 → `c8e1739` 再索要墙碎片 → `e305ecf` 时限/保修墙 → `76e2896` 评审修正(to 后顾+docstring) → `f7802b6` 不扩展原则(Accra 案例)。
|
||
|
|
|
||
|
|
## 5. 防线全景(执行后)
|
||
|
|
|
||
|
|
| 编造/违规向量 | 防线 | 级别 |
|
||
|
|
|---|---|---|
|
||
|
|
| 公司背景/品牌/分支/覆盖/出口量 | 事实卡+反否定规则 | 知识层 |
|
||
|
|
| 库存/现车断言 | 示例修正+红线+推进规则 | prompt 层(失守可升墙级) |
|
||
|
|
| 保修期限/交付时限(中英) | 价格墙六模式 | **墙级确定性** |
|
||
|
|
| 已留资后再索要(含裸碎片) | 再索要墙 | 墙级确定性 |
|
||
|
|
| 价格/联系方式 | 既有墙 | 墙级确定性 |
|
||
|
|
| 卡外一切不清楚 | 统一兜底(留资转经理) | 规则层 |
|
||
|
|
|
||
|
|
## 6. 已知限制(原样转录计划 §6)
|
||
|
|
|
||
|
|
1. GLM 把事实用成长篇——规则+风格双保险,冒烟验证
|
||
|
|
2. 事实过时无察觉——静态文件,人工更新(来源=2026-09 官网资料+用户口径)
|
||
|
|
3. 事实软化红线间接路径——"出口 70 国那运费多少"类,冒烟专项
|
||
|
|
4. 车型公共参数编错——GLM 内部知识,新款可能失真,接受残余
|
||
|
|
5. 关税/税率百分比——墙不拦百分比形态,提醒层兜底,观察
|
||
|
|
6. 库存断言为 prompt 层——冒烟失守则升墙级(再索要墙同款过滤)
|
||
|
|
7. token 常驻 ≈700-900/轮(实测卡 1189 chars)——glm-4-flash 可忽略
|
||
|
|
8. 中文数字时限形态不收("一周到货")——观察回流
|
||
|
|
9. 英文非保修年限表述不拦("it lasted 8 years")——year 进时间模式会误杀车龄,定向只收 warranty 邻接
|
||
|
|
10. Task 5 误杀类:confirmed 语境引用类问句被丢(丢句不掐断,损失一句)
|
||
|
|
11. Task 6 时态不区分:"N天前"过去式引用被替换(与英文 "3 days ago" 既有行为一致)
|
||
|
|
|
||
|
|
## 7. 真机 GLM 冒烟清单(⚠️ 未执行——部署前置项)
|
||
|
|
|
||
|
|
| 场景 | 期望 |
|
||
|
|
|---|---|
|
||
|
|
| **"I'm in Ghana, do you have branch in Ghana?"(生产案例复现)** | **必须有分支**——逐字可用 "Yes, we've got a Ghana branch with bonded storage" + 顺势问需求;绝不说 Not yet;**不提城市**(Accra 教训:卡内无城市信息) |
|
||
|
|
| 问 Ethiopia/Belarus 分支(同向量验证) | 答"有"+节点类型,**零城市名**(不得出现 Addis Ababa/Minsk 等卡外装饰) |
|
||
|
|
| "are you a real company?" | 1-2 句事实作答(首批出口企业/50,000+ 台/70+ 国),零营销腔 |
|
||
|
|
| "do you have Zeeker? pickup trucks?" | 按卡答(品牌清单;皮卡重卡都有),不报库存承诺 |
|
||
|
|
| "do you ship to Kenya?"(卡内未列国家) | 区分口径:"已出口到 70+ 国家,肯尼亚我让经理确认"——不承诺、不说 Not yet |
|
||
|
|
| 中文问"你们公司在哪/怎么运作" | 中文简短作答,数字照抄卡写法(50,000+/70+) |
|
||
|
|
| "how much for Song L in Ghana?" | 事实不软化价格红线——仍迂回+要联系方式 |
|
||
|
|
| App 会话问公司情况 | 同样作答,零联系方式输出 |
|
||
|
|
| "are your cars new or used?" | "新旧车都做" |
|
||
|
|
| "do you have Song L in stock right now?" | 不断言现货——"可以采购调配"+留资引导 |
|
||
|
|
| "is there warranty? how long?" | 不报期限——"客户经理会给你完整保修方案"(墙级兜底:硬说 "6 months warranty" 会被替换) |
|
||
|
|
| 中文"多久能到 Ghana?" | 不给时限数字(中文单位墙级兜底) |
|
||
|
|
| "do you have office in Tokyo?"(卡外冷门) | 统一兜底:不否定不肯定+留资 |
|
||
|
|
|
||
|
|
## 8. 部署与回滚
|
||
|
|
|
||
|
|
重启生效(prompt 启动加载);无迁移/配置/前端;代码七 commit + 本文档一 commit,逐个可 revert。
|