@yixinkj/inquiry-opening-coach-cli 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +528 -0
- package/launcher-core.js +1457 -0
- package/package.json +30 -0
- package/skill/SKILL.md +550 -0
- package/skill/agents/openai.yaml +6 -0
- package/skill/references/country-styles.md +16 -0
- package/skill/references/opening-rules.md +38 -0
- package/skills.json +30 -0
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@yixinkj/inquiry-opening-coach-cli",
|
|
3
|
+
"version": "0.3.1",
|
|
4
|
+
"description": "询盘开场白创意教练独立启动器:只读读取询盘详情页并召回本机记忆库,不发送任何消息。",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"inquiry-opening-coach": "index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"test": "node --test",
|
|
11
|
+
"prepack": "node scripts/assert-launcher-core.mjs && node scripts/sync-skill-assets.mjs",
|
|
12
|
+
"postpack": "node scripts/clean-skill-assets.mjs"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"index.js",
|
|
16
|
+
"launcher-core.js",
|
|
17
|
+
"skills.json",
|
|
18
|
+
"skill"
|
|
19
|
+
],
|
|
20
|
+
"engines": {
|
|
21
|
+
"node": ">=18"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@yixinkj/yixin-bridge-cli": "^1.0.7"
|
|
25
|
+
},
|
|
26
|
+
"license": "UNLICENSED",
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
}
|
|
30
|
+
}
|
package/skill/SKILL.md
ADDED
|
@@ -0,0 +1,550 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: create-inquiry-openers
|
|
3
|
+
description: 为阿里巴巴国际站业务员创作新询盘的首次响应(英文开场白),可直接从询盘详情页读取买家国家、需求卡片和买家原话,也可由用户口述信息生成;结合本机记忆库的行为约束与长期经验,固定生成热情自然、幽默记忆、专业创意三种版本,并沉淀一条经验。同时管理这个本机记忆库和业务档案:通过纯 Rust CLI 写入、查看、修改、停用和删除记忆,并把累积的经验归纳为长期心智模型。Use when 用户给出询盘详情页链接、要求给某条新询盘写第一次回复、要求批量处理首响待办清单或看看有哪些新询盘要回、提到询盘开场白、客户第一句话、开发信开头、根据客户国家和产品写英文开场、修改或优化三套开场白;也 use when 用户说记住这个、保存公司资料、保存产品能力、维护 FAQ、设置禁止承诺、个人记忆点、查看或整理记忆库、把对话附件沉淀为长期资料、归纳历史询盘经验。
|
|
4
|
+
version: "0.3.1"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 询盘开场白创意教练
|
|
8
|
+
|
|
9
|
+
## 运行入口
|
|
10
|
+
|
|
11
|
+
只使用下面这条 npm CLI,不调用 MCP,不启动独立模型,也不使用浏览器生成文案。
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
15
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
16
|
+
<子命令> [选项]
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
- **每一条命令都要带 `--skill-path`**,值是你本次实际读取的这份 `SKILL.md` 的绝对路径。缺了它本次不执行,启动器会直接把该带的参数和路径告诉你——那不是可以重试的错误,原样重跑一万次也不会成功。
|
|
20
|
+
- 不要固定路径、目录名或版本号,也不要去找宿主 PATH 里的 `inquiry-opening-coach`、插件缓存或任何本地二进制。原生运行时由启动器自己下载并校验 SHA256。
|
|
21
|
+
- 返回 `skill_updated` 时说明本机 Skill 刚被同步到新版:**本次不执行**,请重新读一次 SKILL.md 再按新版执行。
|
|
22
|
+
- 返回 `skill_version_conflict` 时说明本机 Skill 版本高于 npm 包,启动器拒绝降级;如实告诉用户,不要绕过。
|
|
23
|
+
|
|
24
|
+
CLI 不含 LLM。它只负责抓取、召回、校验和落盘,文案由你直接创作。
|
|
25
|
+
|
|
26
|
+
## 三个入口
|
|
27
|
+
|
|
28
|
+
**给了询盘链接** → 先走「从询盘页读取」拿到买家国家、需求卡片和买家原话,再进生成流程。
|
|
29
|
+
|
|
30
|
+
**只有口述信息** → 直接进生成流程,按用户说的国家和产品来。
|
|
31
|
+
|
|
32
|
+
**拿到一份待办清单** → 走下面的「批量处理」,逐条串行,最后汇总。
|
|
33
|
+
|
|
34
|
+
## 批量处理
|
|
35
|
+
|
|
36
|
+
用户要求「看看有哪些新询盘要回」,或定时任务把一份首响待办清单交过来时走这条。清单通常来自重点买家预警的首响扫描(`--first-response-scan`);用户没有现成清单就先取一份。
|
|
37
|
+
|
|
38
|
+
**逐条串行处理,不要并发。** 自己开详情页时共用同一个浏览器 Profile,并发会互相干扰。
|
|
39
|
+
|
|
40
|
+
### 优先用哨兵已经取到的数据
|
|
41
|
+
|
|
42
|
+
哨兵为了判断「有没有人回过」本来就进了详情页,卡片它已经取到了。带上清单文件:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
46
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
47
|
+
fetch --detail-url "<完整地址>" --from-scan "<首响清单文件>" --json
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
卡片有内容时**不开浏览器**,毫秒级返回,摘要里 `source` 是 `alert_handoff`。接不住会自动回落自己抓,你不用判断——但要注意回落时仍然要开页面,串行和单轮上限照旧。
|
|
51
|
+
|
|
52
|
+
走交接时 `messageCount`、`buyerMessageCount` 这些是空的:那条路径没读整条会话。**空不等于零**,别把它当成「这条会话没有消息」。
|
|
53
|
+
|
|
54
|
+
### 按会话阶段分流
|
|
55
|
+
|
|
56
|
+
看每条的 `thread_stage`,**不要看 `first_response_pending`**。判据是「这段对话到了哪个阶段」,不是「有没有人回过」。
|
|
57
|
+
|
|
58
|
+
- **`opening`** —— 还在开场,正常写三套开场白。这里包含两种情况:
|
|
59
|
+
- 今天刚进来、消息还不多的新询盘;
|
|
60
|
+
- **买家几个月前问过一次、今天又来问**。中间隔了很久,采购周期甚至对接人都可能换了,上一轮说过什么都不作数——等于重新开场,哪怕当时回过。
|
|
61
|
+
- **`ongoing`** —— 已经聊起来了。**不要写开场白**,那种「感谢您的询盘」业务员一眼就看得出来。告诉用户这条已经在谈了,问他要不要写跟进(跟进话术还在做,暂时只能这样处理)。
|
|
62
|
+
- **`unknown`** —— 没取到详情,**判不出来**。一律跳过,不要因为「顺便也写一版」而放宽:猜成开场会给一条聊了几周的会话写「第一次回复」。
|
|
63
|
+
|
|
64
|
+
`first_response_pending` 仍然在清单里,但它只说明「我方有没有发过真人消息」,**不能用来决定写不写开场白**:全是 AI 自动接待、来回二十条的会话它是 `yes`,那显然不该写开场白;久未联系后重新来问的它是 `no`,那恰恰该写。
|
|
65
|
+
|
|
66
|
+
### 已经起草过的不要重写
|
|
67
|
+
|
|
68
|
+
不需要自己去查记忆库了——CLI 会告诉你。`fetch` 的摘要里有 `alreadyDrafted`:
|
|
69
|
+
|
|
70
|
+
- **`false`** —— 没起草过,正常写第一次回复。
|
|
71
|
+
- **`true`** —— 这条已经起草过开场白了。哨兵之所以又把它推过来,是因为**买家又发了新消息**(推送只在首次和买家追问时发生)。此时**不要再写一遍第一次回复**——那种「感谢您的询盘」业务员一眼就看得出来。
|
|
72
|
+
|
|
73
|
+
`alreadyDrafted` 为 `true` 时:告诉用户这条上次已经起草过(`draftedAt` 是时间),买家现在又来了消息,问他要不要重新起草一版。**不要自动重写。**后续跟进话术还在做,暂时只能这样处理。
|
|
74
|
+
|
|
75
|
+
起草完成后用 `validate --inquiry-id <询盘号>` 提交,CLI 据此记账。**漏了这个参数,下一轮同一条询盘会被当成没起草过重写一遍。**
|
|
76
|
+
|
|
77
|
+
### 单轮上限
|
|
78
|
+
|
|
79
|
+
一轮最多处理 **5 条**。清单超过 5 条时,先报总数和将要处理的条数,问用户要不要继续处理剩下的,不要闷头跑完——每条都要开浏览器抓取加一次完整生成,跑满二十条会占很久。
|
|
80
|
+
|
|
81
|
+
### 中途失败
|
|
82
|
+
|
|
83
|
+
任一条 `fetch` 报出桥或授权类错误(`bridge_offline`、`bridge_outdated`、`extension_outdated`、`authorization_failed`、`login_required`),**整轮立即停止**:这类故障对后面每一条都一样,继续只是把同一个错误重复 N 次。报告已完成几条、因什么停的。
|
|
84
|
+
|
|
85
|
+
单条的内容类失败(`thread_not_loaded`、`invalid_arguments`)只跳过该条,继续下一条,最后在汇总里列出来。
|
|
86
|
+
|
|
87
|
+
### 汇总回复
|
|
88
|
+
|
|
89
|
+
全部处理完给**一条**汇总,不要每条刷一屏:
|
|
90
|
+
|
|
91
|
+
1. 开头一句:处理了几条、跳过几条、跳过的原因分别是什么。
|
|
92
|
+
2. 然后按询盘分节,每节给该条的三版开场白(仍然是 `validate` 返回的 Markdown 原样)。
|
|
93
|
+
3. 结尾提示:用户实际发出哪一版之后,告诉你一声,你会补记结果——这条经验才能进入归纳队列。
|
|
94
|
+
|
|
95
|
+
## 从询盘页读取
|
|
96
|
+
|
|
97
|
+
用户给出询盘详情页地址时:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
101
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
102
|
+
fetch --detail-url "<完整地址>" --json
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
地址必须从浏览器地址栏**完整复制**,只有询盘号打不开会话。CLI 会剥掉埋点参数。
|
|
106
|
+
|
|
107
|
+
stdout 只回一个 manifest,起草常规开场白所需的字段都在里面:`buyerName`、`buyerCountry`、`productName`、`quantity`、`cardType`、`cardHasRequirement`。**买家原话和需求全文只在 `resultFile` 指向的文件里**,需要时再读,不要每次都读。
|
|
108
|
+
|
|
109
|
+
### 先看三个判断字段
|
|
110
|
+
|
|
111
|
+
**`firstResponsePending`**
|
|
112
|
+
|
|
113
|
+
- `true` —— 从没人回过,这就是首响,正常生成
|
|
114
|
+
- `false` —— 已经有人回过了。**先告诉用户这条已经回复过,问要不要仍然写一版新的开场白**,得到确认再生成
|
|
115
|
+
- `null` —— 会话没取全(长会话只加载了最近一段),**无法判断**。如实说明,不要当成首响
|
|
116
|
+
|
|
117
|
+
**`hasCard` / `cardType`**
|
|
118
|
+
|
|
119
|
+
- 有卡片(`rfq` 或 `inquiry`)→ 读 `resultFile` 拿 `card.detail_requirement`(买家自己写的需求原文)、`quantity`、`product_moq`、`product_unit_price`,开场白要**逐条接住这些具体项**
|
|
120
|
+
- 没卡片(TM 纯聊天)→ 需求在买家原话里,能提取多少用多少;提取不到就在开场白里用一两个具体问题把需求问出来,不要泛泛说「请告诉我您的需求」
|
|
121
|
+
- **`cardParseFailed` 为 `true`** → 这条询盘**有卡片,但内容没读出来**。不要当成「没有卡片」去问需求——买家很可能已经把数量、规格写在卡片里了,去问会显得没看。告诉用户卡片解析失败、建议重跑一次 `fetch`;用户不想重跑就照「没卡片」处理,但要说明这次可能漏掉了他填的需求
|
|
122
|
+
- **`apiOk` 为 `false`** → 消息接口没取到,这次是从页面内部状态兜底读的,可能不完整。「没有卡片」这个结论**不可信**,按上一条同样处理:建议重跑一次,不要直接走纯聊天分支
|
|
123
|
+
|
|
124
|
+
**`moreMessagesLikely`** 为 `true` 表示只看到最近一段会话,买家开场可能不在其中。这种情况通常意味着这不是一条新询盘。
|
|
125
|
+
|
|
126
|
+
### 失败怎么办
|
|
127
|
+
|
|
128
|
+
**任何一次 `fetch` 返回错误,立即停止。不得重试、不得轮询、不得改用其他浏览器工具。**
|
|
129
|
+
|
|
130
|
+
CLI 内部已经等过了——`bridge_offline` 是在轮询共享桥 45 秒之后才报出来的,你再跑一次只是把这 45 秒重来一遍,不会有不同结果。看到错误就按错误码提示用户,然后改走口述入口。
|
|
131
|
+
|
|
132
|
+
按 CLI 返回的错误码如实转述,不要自行寻找替代入口:
|
|
133
|
+
|
|
134
|
+
- `authorization_failed` —— 请用户先完成译心授权
|
|
135
|
+
- `bridge_offline` / `bridge_outdated` / `extension_outdated` —— 分别是打开浏览器、升级译心桥、在扩展管理页重新加载插件,三件事不同,不要混说
|
|
136
|
+
- `login_required` —— 请用户在浏览器重新登录后重试
|
|
137
|
+
- `browser_profile_ambiguous` —— 请用户只保留目标 Profile 连接
|
|
138
|
+
- `thread_not_loaded` —— 稍后重试;持续出现说明页面结构可能变了
|
|
139
|
+
- `invalid_arguments` —— 多半是地址不完整,请用户从地址栏重新复制
|
|
140
|
+
|
|
141
|
+
抓取失败时**不要凭询盘号编造买家信息**,改走口述入口,请用户直接告诉你国家和产品。
|
|
142
|
+
|
|
143
|
+
## 生成流程
|
|
144
|
+
|
|
145
|
+
1. 从询盘页结果或用户消息中取客户国家、客户姓名、询问产品、客户需求、偏好风格和补充约束。
|
|
146
|
+
2. 召回上下文:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
150
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
151
|
+
recall \
|
|
152
|
+
--country <国家> \
|
|
153
|
+
--product <产品> \
|
|
154
|
+
--query <客户需求或补充关键词> \
|
|
155
|
+
--json
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
只传递已知字段,不要为了凑完整命令补造信息。
|
|
159
|
+
|
|
160
|
+
3. 拿到 `recall` 结果后立即创作。除了 `fetch` 那一次只读抓取,不再打开任何页面,也不等待或轮询任何状态。
|
|
161
|
+
4. 只有产品和国家都缺失时,才用一句简短问题询问:
|
|
162
|
+
|
|
163
|
+
```text
|
|
164
|
+
你好!请告诉我你的主营产品和客户所在国家。我会为你生成3套热情、幽默又容易被客户记住的英文询盘开场白。如果方便,也可以补充你的英文名、产品优势和客户需求。
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
姓名未知时使用 `[Your Name]`,不要反复追问。
|
|
168
|
+
|
|
169
|
+
## 怎么读 recall 的输出
|
|
170
|
+
|
|
171
|
+
`recall` 返回的内容分几类,处理方式各不相同:
|
|
172
|
+
|
|
173
|
+
- **`directives`** —— 行为约束,**全部必须遵守**,与本次询盘是否相关无关。按 `priority` 从高到低,冲突时高优先级胜出。
|
|
174
|
+
- **`memories` 中 `type` 为 `model`** —— 从历史经验归纳出的规律,可信度高于单条经验,优先参考。
|
|
175
|
+
- **`memories` 中 `type` 为 `fact`** —— 只能作为**已确认事实**使用,不得推演、不得夸大。
|
|
176
|
+
- **`memories` 中 `type` 为 `experience`** —— 只借鉴表达方式和有效角度,**不要复制其中属于其他客户的具体事实**(数量、价格、项目细节)。
|
|
177
|
+
|
|
178
|
+
关于 `matchScore`:它只决定排序位置,**不是相关性判断**。分数低不代表不该用,分数高不代表必须用——相关性由你自己判断。低分记忆经常是有用的通用素材。
|
|
179
|
+
|
|
180
|
+
冲突时的优先级:`directives` > 本次用户明确要求和客户原始询盘 > `model` > `fact` > `experience` > 本 Skill 的通用规则。
|
|
181
|
+
|
|
182
|
+
`directives` 排在最高,本次要求也推翻不了它:里面装的是「不得承诺交期」这类合规红线,业务员临时一句话不该能盖掉。**本次要求与某条 `directive` 冲突时,照 `directive` 执行,并明确告诉用户是哪一条挡住了、为什么**——不要默默照办,也不要默默忽略。
|
|
183
|
+
|
|
184
|
+
`directives` 之外的素材与本次询盘冲突时,以本次明确资料为准,并忽略冲突素材。
|
|
185
|
+
|
|
186
|
+
`profileGaps` 列出会削弱开场白个性的档案空缺。**不要为此打断生成**;可以在交付结果后用一句话提一次。
|
|
187
|
+
|
|
188
|
+
`budget.droppedCount` 大于 0 表示有记忆因预算未注入,`droppedTitles` 列出了前几条。若本次询盘明显需要更多背景,用 `--budget 12000` 重新召回一次。
|
|
189
|
+
|
|
190
|
+
`warnings` 非空表示 `memories.jsonl` 有行损坏、已被跳过。**照常完成本次生成**,交付结果后再用一句话提醒用户哪一行需要修——此时写入类命令会失败,所以生成后的经验沉淀这次会跳过,不要反复重试。
|
|
191
|
+
|
|
192
|
+
## 沟通风格
|
|
193
|
+
|
|
194
|
+
客户国家的表达偏好见 `references/country-styles.md`,创作细则见 `references/opening-rules.md`。CLI 不返回推荐风格,风格判断由你依据这两份参考完成,并写入结果的 `recommendedStyle` 字段。
|
|
195
|
+
|
|
196
|
+
## 对话附件
|
|
197
|
+
|
|
198
|
+
- 图片、PDF、Word 或其他对话附件由当前宿主直接读取,用于本次询盘。
|
|
199
|
+
- 默认不把客户附件写入记忆库。
|
|
200
|
+
- 用户明确要求"保存到记忆库"时,按下面「管理记忆库 › 从附件沉淀」一节的流程沉淀。
|
|
201
|
+
|
|
202
|
+
## 创作门禁
|
|
203
|
+
|
|
204
|
+
- 固定生成 `warm-natural`、`humorous-memorable`、`professional-creative` 三种明显不同的风格。
|
|
205
|
+
- 每个英文版本必须为 40—80 个单词。
|
|
206
|
+
- 前 2—3 句话内说明业务员姓名、公司和主营产品。
|
|
207
|
+
- 公司名称优先使用 `companyEnglishName`,其次 `companyName`;不得自行翻译或编造英文公司名。
|
|
208
|
+
- 优先使用客户姓名,并自然衔接询问产品、规格、数量、设计或其他已知需求。
|
|
209
|
+
- 幽默保持简单、友好、跨文化可理解,不使用复杂双关或敏感话题。
|
|
210
|
+
- 不虚构认证、价格、交期、案例、工厂规模、材料性能或其他产品能力。
|
|
211
|
+
- 非英语母语市场使用短句和常用词。
|
|
212
|
+
|
|
213
|
+
**不要假设用户所在的行业或产品类别。** 本 Skill 服务于任何品类的外贸业务员——机械、五金、纺织、电子、包装、家居都可能。产品信息只有四个合法来源:询盘卡片、本次询盘里客户提到的、档案里的 `mainProducts`、以及召回的 `fact`。都没有时就写得笼统一些,或者问一句,**不要**根据公司名、国家或任何线索推断品类,也不要套用你见过的行业模板。
|
|
214
|
+
|
|
215
|
+
买家公司名抓取端拿不到(联系人对象上没有这个字段),结果里恒为空。**不要编造买家公司名**,也不要从邮箱域名或买家姓名推断。
|
|
216
|
+
|
|
217
|
+
同理,规格、工艺、材料、认证这类术语只能来自上述来源。凭"这类产品一般都有"写出来的参数就是虚构。
|
|
218
|
+
|
|
219
|
+
三种固定风格:
|
|
220
|
+
|
|
221
|
+
- `warm-natural`:像充满活力的新朋友,亲切真诚,不过度夸张。
|
|
222
|
+
- `humorous-memorable`:加入一个容易理解的产品梗、名字梗或简单比喻。
|
|
223
|
+
- `professional-creative`:兼顾可信度与个性,适合正式采购商和大订单客户。
|
|
224
|
+
|
|
225
|
+
## 校验与回复
|
|
226
|
+
|
|
227
|
+
先形成以下结果对象,写入**系统临时目录**下的文件(`$TMPDIR` 或 `/tmp`),**不要写进用户的工作目录**——这份文件带着买家国家和给他的原话,留在项目里会跟着提交或被别人看到:
|
|
228
|
+
|
|
229
|
+
```json
|
|
230
|
+
{
|
|
231
|
+
"customerCountry": "客户国家",
|
|
232
|
+
"recommendedStyle": "中文推荐沟通风格",
|
|
233
|
+
"versions": [
|
|
234
|
+
{ "key": "warm-natural", "english": "...", "chinese": "...", "memoryPoint": "..." },
|
|
235
|
+
{ "key": "humorous-memorable", "english": "...", "chinese": "...", "memoryPoint": "..." },
|
|
236
|
+
{ "key": "professional-creative", "english": "...", "chinese": "...", "memoryPoint": "..." }
|
|
237
|
+
],
|
|
238
|
+
"recommendedVersion": "warm-natural",
|
|
239
|
+
"recommendationReason": "...",
|
|
240
|
+
"optimizationTip": "..."
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
运行:
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
248
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
249
|
+
validate --file "$TMPDIR/inquiry-opening-<询盘号>.json" --inquiry-id "<询盘号>"
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
从询盘页来的一律带 `--inquiry-id`:CLI 据此记下这条已起草过,下一轮才不会重写。
|
|
253
|
+
口述场景没有询盘号,不带即可。
|
|
254
|
+
|
|
255
|
+
校验失败时修正并重试——词数不足或超标必须改写文案,不要试图绕过。成功后把 CLI 返回的 `markdown` 原样回复,不缩写、不再次改写。
|
|
256
|
+
|
|
257
|
+
**校验通过后删掉这个临时文件。** 它已经没有用处,而里面是客户资料。
|
|
258
|
+
|
|
259
|
+
## 沉淀本次尝试
|
|
260
|
+
|
|
261
|
+
`validate` 通过、最终回复已经准备好之后,**在发出最终回复之前**调用一次(发出回复后就没有机会再调用工具了):
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
265
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
266
|
+
retain \
|
|
267
|
+
--type experience \
|
|
268
|
+
--source agent \
|
|
269
|
+
--title "<国家>/<产品>" \
|
|
270
|
+
--content "<本次客户情境、采用的风格、切入角度>" \
|
|
271
|
+
--tags "<国家代码>,<英文品类>,<中文品类>" \
|
|
272
|
+
--json
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
标签口径与「管理记忆库 › 写入」完全一致:国家用 ISO 短代码(`US`、`DE`、`JP`),品类中英文各写一份,这样无论下次询盘用哪种语言描述都能命中。
|
|
276
|
+
|
|
277
|
+
**沉淀失败不得阻断交付。** 记忆库有坏行时写入会被拒绝,此时照常发出开场白,并在回复末尾提一句本次未能记录。不要为此重试或改写文案。
|
|
278
|
+
|
|
279
|
+
从询盘页来的,`--tags` 里带上询盘号,这样后续补记结果时能对上:
|
|
280
|
+
|
|
281
|
+
```text
|
|
282
|
+
--tags "<国家代码>,<英文品类>,<中文品类>,<询盘号>"
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
沉淀规则:
|
|
286
|
+
|
|
287
|
+
- **只记录客观发生的事**:面向哪个国家、什么产品品类、用了什么风格和切入角度。
|
|
288
|
+
- **`title` 和 `content` 里不得出现买家姓名、公司名、数量、单价、金额、交期,也不得出现需求原文或它的转述。** 询盘号只能出现在 `--tags` 里。
|
|
289
|
+
- **不要**写入你对客户偏好的推测。这条记录只能证明"你选了什么",不能证明"客户喜欢什么"。
|
|
290
|
+
- **不要**把产品能力写成 `experience`——那属于 `fact`,必须由用户确认。CLI 会拒绝 `--type fact --source agent`,也会拒绝省略 `--source`,不要尝试绕过。
|
|
291
|
+
|
|
292
|
+
对照一下:
|
|
293
|
+
|
|
294
|
+
```text
|
|
295
|
+
✗ 德国客户询价 500 个可回收自立袋,用 professional-creative 接住了数量和材质
|
|
296
|
+
✓ DE/自立袋:用 professional-creative 开场,先接住卡片里的规格再提一个推进性问题
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
反例里的「500 个」是这一单的一次性事实,留在库里既没有复用价值,又把客户信息带进了长期记忆。归纳规律靠的是「哪种开场角度有效」,不是「上次卖了多少个」。
|
|
300
|
+
|
|
301
|
+
## 拿到真实结果时补记
|
|
302
|
+
|
|
303
|
+
上面写入的只是一次**尝试**(attempt),它不会进入归纳队列。只有当用户告诉你他实际用了哪个版本、或客户有了反应,才补记结果:
|
|
304
|
+
|
|
305
|
+
```bash
|
|
306
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
307
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
308
|
+
outcome --id <经验id> \
|
|
309
|
+
--selected <warm-natural|humorous-memorable|professional-creative> \
|
|
310
|
+
--response "<客户的真实反应>" \
|
|
311
|
+
--json
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
补记之后这条经验才能作为归纳证据。
|
|
315
|
+
|
|
316
|
+
**这个区分不能省。** 一次生成只能证明你选了什么风格,不能证明客户偏好什么风格。把没有结果的尝试拿去归纳,会得到自我强化的结论——你判断德国客户偏专业,于是记录了专业,于是归纳出"德国客户偏专业",于是下次更倾向专业。CLI 会拒绝把无结果的经验用作 model 证据。
|
|
317
|
+
|
|
318
|
+
用户说"这次用第二版发出去了"或"客户回复了"时,主动补记,不用等他要求。
|
|
319
|
+
|
|
320
|
+
## 管理记忆库
|
|
321
|
+
|
|
322
|
+
以上是「写这一条询盘」;这一节是「维护写作时被召回的那些长期资料」。用户说记住这个、保存公司资料、设置禁止承诺、整理记忆库或归纳历史经验时走这里。
|
|
323
|
+
|
|
324
|
+
没有工作台,也没有网页。所有管理操作都通过 CLI 完成。
|
|
325
|
+
|
|
326
|
+
### 这一节的边界
|
|
327
|
+
|
|
328
|
+
- 这一节只管理长期资料,不收集本次客户询盘,也不生成文案;普通询盘创作走上面的「生成流程」。
|
|
329
|
+
- 图片、PDF 和 Word 由当前宿主直接读取;只有用户明确要求长期保存时才写入记忆库。
|
|
330
|
+
- 所有事实和约束必须来自用户资料,**不得推断或补造**。
|
|
331
|
+
|
|
332
|
+
### 四条记忆通路
|
|
333
|
+
|
|
334
|
+
| 通路 | 装什么 | 谁能写 |
|
|
335
|
+
|---|---|---|
|
|
336
|
+
| `fact` | 客观可验证的公司与产品事实:产品线、材料与袋型能力、认证、FAQ 的真实答复依据 | 只能 `--source user` |
|
|
337
|
+
| `experience` | 实际发生过的询盘经历:面向哪个国家、什么产品、用了什么风格 | `user` 或 `agent` |
|
|
338
|
+
| `directive` | 行为约束:禁止承诺、合规限制、表达边界、沟通风格偏好 | 只能 `--source user` |
|
|
339
|
+
| `model` | 从多条经验归纳出的规律 | 只能 `--source reflect`,且 `--evidence` 至少 2 条有结果的 experience |
|
|
340
|
+
|
|
341
|
+
`experience` 另有一个 `outcome` 字段,区分**尝试**和**结果**:刚生成完写入的经验没有 `outcome`,只有用户告知采用了哪个版本、或客户有了反应,用 `outcome` 命令补记之后才算有结果。只有有结果的经验能进归纳队列。
|
|
342
|
+
|
|
343
|
+
`directive` 与 `fact` 的写入门禁由 CLI 强制执行,不是约定。你不能代替用户"顺手"存下一条产品能力或禁令——**必须先取得用户明确确认**,再以 `--source user` 写入。
|
|
344
|
+
|
|
345
|
+
`--source` 是必填的,没有默认值。省略它会直接报错,不会退回成 `user`。
|
|
346
|
+
|
|
347
|
+
`directive` 无条件进入每次生成,不参与相关度排序,因此**不需要**也**不应该**给它加产品或国家标签。
|
|
348
|
+
|
|
349
|
+
它也不参与预算裁剪——把合规红线裁掉比超预算危险得多。代价是总量有硬上限:启用中的约束超过 4000 字符时 `recall` 会直接报错。遇到这个错误,用 `memory list --type directive` 检查重复和过时条目,停用后再试;不要提高预算绕过。
|
|
350
|
+
|
|
351
|
+
### 写入
|
|
352
|
+
|
|
353
|
+
`fact` 与 `experience` 带标签:
|
|
354
|
+
|
|
355
|
+
```bash
|
|
356
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
357
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
358
|
+
retain \
|
|
359
|
+
--type <fact|experience> \
|
|
360
|
+
--source user \
|
|
361
|
+
--title "<简短标题>" \
|
|
362
|
+
--content "<正文>" \
|
|
363
|
+
--tags "<英文品类>,<中文品类>,<国家代码>" \
|
|
364
|
+
--json
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
`directive` **不加 `--tags`**:它无条件进入每次生成、不参与相关度排序,标签对它没有任何作用(理由见上面「四条记忆通路」)。
|
|
368
|
+
|
|
369
|
+
```bash
|
|
370
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
371
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
372
|
+
retain \
|
|
373
|
+
--type directive \
|
|
374
|
+
--source user \
|
|
375
|
+
--title "<简短标题>" \
|
|
376
|
+
--content "<正文>" \
|
|
377
|
+
--json
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
需要标签的只有 `fact`、`experience` 和 `model` 这三条通路。
|
|
381
|
+
|
|
382
|
+
`directive` 可加 `--priority <数字>`,数值越大越先注入、冲突时越优先。
|
|
383
|
+
需要不受相关度影响、每次都注入的记忆,加 `--pinned`。
|
|
384
|
+
|
|
385
|
+
正文含引号、换行或特殊字符时,先写入临时 JSON 文件再用 `--file` 传入,避免命令行转义破坏内容:
|
|
386
|
+
|
|
387
|
+
```json
|
|
388
|
+
{
|
|
389
|
+
"type": "fact",
|
|
390
|
+
"title": "<一句话标题>",
|
|
391
|
+
"content": "<仅填写用户已经确认的真实内容>",
|
|
392
|
+
"tags": ["<英文品类>", "<中文品类>", "<国家代码>"],
|
|
393
|
+
"source": "user"
|
|
394
|
+
}
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
标签把同一个概念的中英文各写一份,这样无论询盘用哪种语言描述都能命中。国家用 ISO 短代码(`US`、`DE`、`JP`),它按整词匹配。
|
|
398
|
+
|
|
399
|
+
标签只影响召回排序,写不全不会导致记忆丢失,但写全能让它排得更靠前。
|
|
400
|
+
|
|
401
|
+
### 查看与修改
|
|
402
|
+
|
|
403
|
+
```bash
|
|
404
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
405
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
406
|
+
memory list --json
|
|
407
|
+
|
|
408
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
409
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
410
|
+
memory list --type directive --json
|
|
411
|
+
|
|
412
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
413
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
414
|
+
memory list --all --json # 含已停用
|
|
415
|
+
|
|
416
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
417
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
418
|
+
memory get --id <id> --json
|
|
419
|
+
|
|
420
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
421
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
422
|
+
memory update --id <id> --active false --json # 停用但保留
|
|
423
|
+
|
|
424
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
425
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
426
|
+
forget --id <id> --json # 永久删除
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
改动 `fact` 或 `directive` 的标题与正文时必须带 `--source user`,和新建时一条规则——否则先写一条无害的 fact 再改正文就成了绕过门禁的后门:
|
|
430
|
+
|
|
431
|
+
```bash
|
|
432
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
433
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
434
|
+
memory update --id <id> --content "<新正文>" --source user --json
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
改 `--active`、`--pinned`、`--tags`、`--priority` 不需要 `--source`,它们不改变事实内容。
|
|
438
|
+
|
|
439
|
+
用户想"先关掉看看效果"时用 `--active false`,不要直接 `forget`。删除前先把该条 `title` 和 `content` 展示给用户确认。
|
|
440
|
+
|
|
441
|
+
删除 `model` 时,它引用过、且没有被其它 model 引用的经验会自动回到待归纳队列,返回值里的 `restoredToReflectQueue` 列出这些 id。可以顺带告诉用户"这批经验可以重新归纳"。
|
|
442
|
+
|
|
443
|
+
### 归纳心智模型
|
|
444
|
+
|
|
445
|
+
经验累积到十几条后,或用户要求"总结一下经验"时:
|
|
446
|
+
|
|
447
|
+
```bash
|
|
448
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
449
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
450
|
+
reflect --json
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
返回三块:
|
|
454
|
+
|
|
455
|
+
- `unreflected` —— **已有真实结果**、尚未归纳的经验,只有这些能当证据
|
|
456
|
+
- `awaitingOutcome` —— 只是尝试过、还没有结果的经验,**不能**当证据
|
|
457
|
+
- `existingModels` —— 已有模型
|
|
458
|
+
|
|
459
|
+
然后:
|
|
460
|
+
|
|
461
|
+
1. 通读 `unreflected`,找出**跨多条经验都成立**的规律——某个国家偏好哪种切入角度、哪种风格反复被选中或从未被选中、哪类产品需要先说什么。
|
|
462
|
+
2. 单条经验的偶然结果**不构成**规律,CLI 强制要求至少 2 条证据。
|
|
463
|
+
3. 与 `existingModels` 重复的不要重复写入;有冲突时先展示给用户,由用户决定保留哪个。
|
|
464
|
+
4. 写入:
|
|
465
|
+
|
|
466
|
+
```bash
|
|
467
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
468
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
469
|
+
retain \
|
|
470
|
+
--type model \
|
|
471
|
+
--source reflect \
|
|
472
|
+
--title "<规律标题>" \
|
|
473
|
+
--content "<规律正文,写明适用范围>" \
|
|
474
|
+
--evidence "<经验id1>,<经验id2>,..." \
|
|
475
|
+
--json
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
`--evidence` 里的经验会自动标记为已归纳并退出 `reflect` 队列,因此**不要**把无关经验塞进 evidence 凑数——那会让它们再也不被归纳。CLI 会拒绝引用非 experience、已停用、或没有结果记录的条目。
|
|
479
|
+
|
|
480
|
+
`awaitingOutcome` 不为空时,告诉用户这些尝试还缺结果,可以用下面的命令补记:
|
|
481
|
+
|
|
482
|
+
```bash
|
|
483
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
484
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
485
|
+
outcome --id <id> --selected <版本key> --response "<客户反应>" --json
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
**为什么要卡这道**:一次生成只能证明 Agent 选了什么风格,不能证明客户偏好什么风格。若把无结果的尝试也算作证据,归纳出的"某国客户偏好"其实只是 Agent 自己选择的回声,而且会自我强化。宁可归纳得慢,也不要归纳出假规律。
|
|
489
|
+
|
|
490
|
+
model 的标题和正文不能用 `memory update` 修改——那等于凭空改结论。要改就 `forget` 掉重新归纳,证据经验会自动回到队列。
|
|
491
|
+
|
|
492
|
+
### 业务档案
|
|
493
|
+
|
|
494
|
+
档案是每次生成都会注入的固定身份信息,与记忆分开存放:
|
|
495
|
+
|
|
496
|
+
```bash
|
|
497
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
498
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
499
|
+
profile show --json
|
|
500
|
+
|
|
501
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
502
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
503
|
+
profile save --file <profile.json> --json
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
字段:`salespersonName`、`companyName`、`companyEnglishName`、`mainProductCategory`、`mainProducts`、`productAdvantage`、`productAdvantageTags`、`personalTraits`、`personalTraitTags`、`memoryHook`。`mainProducts` 必填。
|
|
507
|
+
|
|
508
|
+
`profile show` 会返回 `profileGaps`,指出哪些空缺会削弱开场白的个性。可以据此询问用户,但一次只问一两项,不要做成问卷。
|
|
509
|
+
|
|
510
|
+
### 从附件沉淀
|
|
511
|
+
|
|
512
|
+
1. 使用当前宿主能力读取附件。
|
|
513
|
+
2. 区分一次性客户信息和长期公司资料;客户姓名、数量、项目报价等**默认不保存**。
|
|
514
|
+
3. 用户明确要求保存且资料清晰时,拆成少量单一主题的记忆写入。
|
|
515
|
+
4. 资料含糊、互相冲突,或可能构成产品能力承诺时,先展示拟保存内容并询问一次确认。
|
|
516
|
+
5. 写入后返回新增记忆的 id、标题和通路。
|
|
517
|
+
|
|
518
|
+
### 分区
|
|
519
|
+
|
|
520
|
+
不同产品线或市场需要互不干扰的记忆时才使用分区,默认单分区即可:
|
|
521
|
+
|
|
522
|
+
```bash
|
|
523
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
524
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
525
|
+
bank list --json
|
|
526
|
+
|
|
527
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
528
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
529
|
+
bank create <名称>
|
|
530
|
+
|
|
531
|
+
npx -y @yixinkj/inquiry-opening-coach-cli@latest \
|
|
532
|
+
--skill-path "本次实际读取的 SKILL.md 绝对路径" \
|
|
533
|
+
bank use <名称>
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
任意命令都可用 `--bank <名称>` 临时指定,不改变当前分区。
|
|
537
|
+
|
|
538
|
+
### 存储位置
|
|
539
|
+
|
|
540
|
+
记忆库在 `~/.yixin/inquiry-opening-coach/banks/<分区>/`(可用环境变量 `INQUIRY_OPENING_COACH_DATA_DIR` 改到别处,便于测试隔离、便携运行或临时切到备份副本):`profile.json` 存档案,`memories.jsonl` 每行一条记忆。目录权限 0700、文件 0600。
|
|
541
|
+
|
|
542
|
+
早期版本用的是 `~/.inquiry-opening-coach/`。CLI 启动时会把它整份复制到新位置,原目录不删不改;两边都有数据时会停手并在 stderr 提示,由用户自己决定怎么合并。用户问起旧目录时照此说明,不要替他删。
|
|
543
|
+
|
|
544
|
+
`profile.json` 损坏时不会被当成空档案:`profile show` 会报错,`profile save` 会拒绝覆盖,原文件保持原样等待人工修复。看到这个错误时把路径给用户,不要替他删文件。
|
|
545
|
+
|
|
546
|
+
`memories.jsonl` 鼓励手工维护:用户可以直接用编辑器编辑或追加,最小只需 `{"type":"fact","content":"..."}`,缺失的 id 和时间戳会在下次运行任意命令时自动补齐(手写记录的来源按 `user` 计)。
|
|
547
|
+
|
|
548
|
+
某行损坏时,只读命令(`recall`、`memory list`、`memory get`、`reflect`)会**跳过坏行照常返回**,并在 `warnings` 里给出行号和原因;写入命令(`retain`、`memory update`、`forget`)会**拒绝执行**,因为写入要整份重写文件,跳过坏行等于把用户手写的内容删掉。
|
|
549
|
+
|
|
550
|
+
看到 `warnings` 时,把行号和原因转述给用户,请其修正后再写入。不要替用户猜测那行本来想写什么,也不要直接删掉那行。
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# 客户国家沟通风格参考
|
|
2
|
+
|
|
3
|
+
国家名称和 ISO 短代码按同一规则处理,例如 `US/USA/United States`、`GB/UK/United Kingdom`、`DE/Germany`、`JP/Japan`。短代码必须完整匹配,不能把 `Ukraine` 等名称误判为 `UK`。
|
|
4
|
+
|
|
5
|
+
- 美国、加拿大、澳大利亚:直接、轻松、有活力,可适当使用简短幽默。
|
|
6
|
+
- 英国:自然、克制、机智,避免过度热情和硬推销。
|
|
7
|
+
- 德国、荷兰、北欧:简洁、清晰、重视效率和事实。
|
|
8
|
+
- 法国、意大利、西班牙:友好、有温度,语言可以稍有画面感。
|
|
9
|
+
- 日本、韩国:礼貌、细致、尊重边界,幽默要温和。
|
|
10
|
+
- 中东地区:热情、尊重、重视长期合作,避免宗教和性别相关玩笑。
|
|
11
|
+
- 印度、东南亚:友好、积极、关系感强,同时保持信息清楚。
|
|
12
|
+
- 拉丁美洲:热情、亲切、有感染力,但不使用文化刻板印象。
|
|
13
|
+
- 非英语母语市场:使用短句和常用单词,避免复杂双关语。
|
|
14
|
+
- 无法判断时:采用热情、礼貌、清晰、轻幽默的稳妥风格。
|
|
15
|
+
|
|
16
|
+
这些规则用于调整表达节奏和正式程度,不用于推断客户个性、预算、职位或购买意愿。
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# 英文询盘开场白创作规则
|
|
2
|
+
|
|
3
|
+
## 信息优先级
|
|
4
|
+
|
|
5
|
+
1. 用户在当前消息中明确给出的事实。
|
|
6
|
+
2. 附件中能够明确识别的内容。
|
|
7
|
+
3. 记忆库召回的 `directive`(约束永远生效)。
|
|
8
|
+
4. 记忆库召回的 `model` 与 `fact`。
|
|
9
|
+
5. 已保存的业务员与产品档案。
|
|
10
|
+
|
|
11
|
+
信息冲突时采用更近、更明确的来源。不要把附件中的宣传口号自动当作可验证事实。
|
|
12
|
+
|
|
13
|
+
## 每个版本必须满足
|
|
14
|
+
|
|
15
|
+
- 开头优先使用客户姓名;不知道姓名时使用自然通用称呼。
|
|
16
|
+
- 在前 2—3 句话内介绍业务员姓名和主营产品。
|
|
17
|
+
- 公司名称优先使用 `recall` 返回档案里的 `companyEnglishName`,其次 `companyName`;不得自行翻译或编造英文公司名。
|
|
18
|
+
- 英文自然、像真人业务员,不像广告机器人。
|
|
19
|
+
- 体现客户国家的沟通偏好,但不使用刻板印象。
|
|
20
|
+
- 幽默友好、简单,非英语母语客户也能理解。
|
|
21
|
+
- 围绕产品功能、使用场景、业务员名字或服务态度设计记忆点。
|
|
22
|
+
- 英文正文控制在 40—80 个单词。
|
|
23
|
+
- 结尾自然衔接客户需求或询盘内容。
|
|
24
|
+
- 三个版本不能只是替换少量形容词,必须在节奏、记忆点和正式程度上明显不同。
|
|
25
|
+
|
|
26
|
+
## 禁止事项
|
|
27
|
+
|
|
28
|
+
- 不虚构认证、价格、交期、客户案例、工厂规模或产品能力。
|
|
29
|
+
- 不臆测业务员所在行业或产品品类。品类只能来自档案的 `mainProducts`、本次询盘、或召回的 `fact`;都没有时写得笼统,不要套行业模板。
|
|
30
|
+
- 不使用"这类产品通常"推导出来的规格、材料、工艺或术语。
|
|
31
|
+
- 不使用政治、宗教、战争、种族、性别、外貌、酒精等敏感笑话。
|
|
32
|
+
- 不嘲讽客户国家、口音、文化或生活习惯。
|
|
33
|
+
- 不使用“全网最低价”“全球第一”“保证成功”等浮夸承诺。
|
|
34
|
+
- 不为了幽默使用复杂双关语、生僻俚语或只有英语母语者才理解的梗。
|
|
35
|
+
|
|
36
|
+
## 质量检查
|
|
37
|
+
|
|
38
|
+
生成后逐项检查:姓名与公司是否正确、产品是否明确、是否回应客户需求、英文单词数是否合格、幽默是否安全、是否出现未经输入支持的事实。发现问题后先修正再交给 `validate` 校验。校验通过后必须原样回复 CLI 返回的 Markdown,不要再次改写。
|