Commit af291464 by luoqi

docs(站点): 分配助手按「拿去讲」的标准全面校订 —— 修编号撞车、去内部黑话、拆代价三档

拿这份去做产品介绍前的一次完整审校,改动分三类:

一、会当场被问住的(3 处)
- 编号撞车:①②③④ 同时指四步、四个引导节点、五层提示词。
  原第 71 行「从②『这批多大』改」,而 ② 在同一页刚被定义成「分人」。
  ⇒ 圈码只留给四步;引导节点本来就有名字,一律改用「名字」引用。
- 「格」仍在用且从未定义:产品早已定过不用这个说法。
  ⇒ 全部改为「候选人群 / 这批候选」,并在四问表之后补一句它是什么
    (治疗 × 多久没来 交叉出来的那批人)—— 后面所有平均、门槛都以它为准。
- 代价表自相矛盾:表称「分人环 = 就地改」,下一句就承认「换无专属的补上」
  走重排。实际是三档(就地改 / 重排 / 重出),只写了两档。
  ⇒ 新表按三档写,并点明中间那档是唯一「长在分人环、代价却偏向选人环」的。

二、结构与重复
- §1 原「三处例外」摆在《召回策略》之前,却引用尚未定义的引导节点 ⇒ 下沉。
- 原「两条闭合的环」与开篇「两个环的代价不一样」讲同一件事 ⇒ 合并,
  与「红色菱形」一起收成《代价不对称:什么时候重来,什么时候就地改》。
- 原「后三步」里 ② 分人是上一节的重复 ⇒ 删节,唯一新信息(主管可微调)
  并入分人那节;该节改名《③ 确认 · ④ 确认之后》。
- §2 原名「提示词怎么搭的」盖住了它更重要的第一节(登录时装配、无对象实例)
  ⇒ 改名《这个助手是怎么装出来的》,下分「装配」「提示词分层」。

三、文风与用词(要拿出去讲)
- 术语统一:「自由患者」⇒「无专属患者」(全文其余处一直用后者)。
- 去口语/网络语:层层套娃、甩锅、白付上下文、旋钮、拖一下、桶名、一刀切光。
- 去代码术语:「按客服 id 打破平局」⇒「按固定顺序打破平局」。
- 代词歧义:开篇「助手…出确认单。他只要看一眼」的「他」紧跟「助手」;
  §5 标题「要他定的事」无先行词;§8 结句「他在做的那件事就是它存在的理由」。
- 引号统一为「」;mermaid 标签内的半角标点改全角(已在浏览器验证可渲染)。
-  由 40+ 降到 26 —— 只留红线表与真禁令,句中当「不」用的去掉。

事实层复核(未改动,均与代码一致):
  DAILY_CALLS_PER_AGENT=15、NARROW.MIN_COHORT=50 / MIN_COUNT=10、
  工具 9 通用(MCP 8 + render_artifact)/ 12 主管(MCP 6 + 助手侧 6)= 21。

验证:pnpm --filter pac-docs build 通过;本地 3102 实测两张 mermaid
均渲染(680×1582、680×158),零 syntax error。
parent 64f7f351
......@@ -4,13 +4,13 @@ description: 銝餌恣霂港霂活 犖
icon: Bot
---
主管说清这一批要召回谁,助挑人、排客服、出确认单。**他只要看一眼、点确认。**
主管说清这一批要召回谁,助手挑人、排客服、出确认单,**主管只要看一眼、点确认**。
功能本身见 [召回分配](./batch-assignment)。本文讲**那个助手**:它怎么走、谁做决定、哪些事它绝对不做。
---
## 一分配决策树
## 一、一批召回是怎么走完的
整条线只有四步:**① 选人 → ② 分人 → ③ 确认 → ④ 确认之后**。
......@@ -20,22 +20,22 @@ icon: Bot
flowchart TD
S(["召回策略<br/>一批召回要回答的四个问题"]) --> A1
A1["① 选人 · 主管初选<br/>1 做哪一类还没启动的治疗<br/>2 找多久没来的人<br/>—— 凭运营经验,他张口就来"] --> A2
A1["① 选人 · 主管初选<br/>1 做哪一类还没启动的治疗<br/>2 找多久没来的人<br/>—— 凭运营经验,他张口就来"] --> A2
A2["① 选人 · 助手精选<br/>3 要不要只挑高价值的 —— 先摆这批人的全景<br/>4 团队还吃得下多少 —— 先摆在岗人手与在手量<br/>—— · —— · —— · —— · —— · ——<br/>不等他给全,先按这几条默认出一版:<br/>没联系过的排前面,其余按优先级<br/>每人每天 15 通 · 时效 1 天<br/>这批多大 = 在岗人数 × 15 × 时效"]
A2["① 选人 · 助手精选<br/>3 要不要只挑高价值的 —— 先摆这批人的全景<br/>4 团队还吃得下多少 —— 先摆在岗人手与在手量<br/>—— · —— · —— · —— · —— · ——<br/>不等他给全,先按这几条默认出一版:<br/>没联系过的排前面,其余按优先级<br/>每人每天 15 通 · 时效 1 天<br/>这批多大 = 在岗人数 × 15 × 时效"]
A2 --> D1{"这批人对吗?"}
D1 --> G1["助手摆出的引导 —— 满足条件才出现<br/>① 能加个条件:这一格 ≥50 人 · 他还没加过 · 切完还剩 ≥10 人<br/>  消费高于本格平均 / 转介绍达人 / 权益身份 / 获客渠道<br/>② 这批多大:人数是系统估的(他没自己指定过)<br/>  可改 每人每天几通 · 时效几天"]
D1 --> G1["助手摆出的引导 —— 满足条件才出现<br/>「能加个条件」:候选 ≥50 人 · 他还没加过 · 切完还剩 ≥10 人<br/>  消费高于本批平均 / 转介绍达人 / 权益身份 / 获客渠道<br/>「这批多大」:人数是系统估的(他没自己指定过)<br/>  可改 每人每天几通 · 时效几天"]
G1 --> R1["重新选一版<br/>⚠️ 已经排好的分法一并作废"]
R1 --> A2
D1 ==>|"人定了 —— 这一关过了才谈怎么分"| B
B["② 分人 —— 谁去打<br/>先算目标水位 = (团队在手 + 本批人数) ÷ 在岗人数<br/>一趟:有专属的回自己人,到水位为止<br/>二趟:无专属的补给当前手上最少的<br/>三趟:专属这轮排满的单列成一组,交他定"]
B["② 分人 —— 谁去打<br/>先算目标水位 =(团队在手 + 本批人数)÷ 在岗人数<br/>一趟:有专属的回自己人,到水位为止<br/>二趟:无专属的补给当前手上最少的<br/>三趟:专属这轮排满的单列成一组,交他定"]
B --> D2{"这么分行吗?"}
D2 --> G2["助手摆出的引导 —— 满足条件才出现<br/>③ 专属排满了:第三趟真有人排不进去<br/>  换无专属的补上(池子还有人时才给,走重排)<br/>  铺平给在岗 / 各自归专属 / 移出本批<br/>④ 最忙的那位:分完后的量 > 每天通数 × 时效<br/>  报最忙那位 + 另有几位也超<br/>  整批时效改成 N 天(一个算好的数)"]
G2 --> R2["就在这一版上改<br/>人不变,不重出"]
D2 --> G2["助手摆出的引导 —— 满足条件才出现<br/>「专属排满了」:第三趟真有人排不进去<br/>  换无专属的补上(池子还有人时才给)<br/>  铺平给在岗 / 各自归专属 / 移出本批<br/>「最忙的那位」:分完后的量 > 每天通数 × 时效<br/>  报最忙那位 + 另有几位也超<br/>  整批时效改成 N 天(一个算好的数)"]
G2 --> R2["不重新选人<br/>人不变,只动这一版的分法"]
R2 --> D2
D2 ==>|"行"| K["③ 确认<br/>点下去,这一刻才真的分下去"]
......@@ -55,21 +55,9 @@ flowchart TD
style L fill:#d1fae5,stroke:#10b981
```
**两个环的代价不一样,这是全图最要紧的一点:**
图上有两个环,**代价差一个数量级** —— 红环(改人群)要重新选一版,几十秒,已经排好的分法一并作废;紫环(改分法)人不变,秒级返回。
| | 引导节点 | 代价 |
|---|---|---|
| **选人环**(红) | ① 能加个条件 ② 这批多大 | **重新选一版**(几十秒)—— 人变了,已经排好的分法一并作废 |
| **分人环**(紫) | ③ 专属排满了 ④ 最忙的那位 | **就地改**(同步)—— 人不变,只动这一版的分法 |
所以顺序不能颠倒:**人先定下来,才谈怎么分**。先排分法再让他改人群,前面那趟排班就白做了。
⚠️ 三处例外和细节,都是实际会绊人的:
- **图里只画了引导节点。** 主管随口说的(「换成正畸」「改成 200 人」「只要今年来过的」)同样能触发重出 —— 那条路不走按钮,靠助手听懂 + 调工具,⛔ 不在这张图上。
- **「换无专属客服的患者补上」挂在③下面,但它换的是人** —— 走重排(几秒),不是就地改。它是四个节点里唯一一个"长在分人环、代价却在选人环"的选项。
- **「改时效」有两条路,代价不一样**:从②「这批多大」改,会连人数一起重估(**重出**);从④「最忙的那位」改,只延长这一批的期限、人不变(**就地改**)。
- **符合条件的人比这批还少时,②照样给他**:往上调确实不会更多,但**往下调可以少发一些** —— 那句话据实写清方向,⛔ 不把入口藏起来。
所以顺序不能颠倒:**人先定下来,才谈怎么分**。先排分法再让他改人群,前面那趟排班就白做了。两个环各自的触发条件见下文《引导什么时候才冒出来》,代价的完整分档见本章最后一节。
### 召回策略:一批召回要回答的四个问题
......@@ -80,10 +68,12 @@ flowchart TD
| **1** | 做哪一类还没启动的治疗(种植 / 正畸 / 拔牙…) | **主管** | 这是诊所这个季度的经营重点 —— 医生排期、设备耗材、话术准备都围着它转。**这件事只有他知道**,系统里没有任何数据能推出来 |
| **2** | 找多久没来的人(三个月内 … 三年以上) | **主管** | **他能从这个时间估出大概能回来多少** —— 见下,这一条是整套策略里最值钱的判断 |
| **3** | 要不要只挑高价值的(消费额、商保、意向) | 主管定,**助手先摆数据** | **他答不了**:不看数据,他不知道这批里有多少是高价值的,也不知道切完还剩几个 —— 可能一刀下去只剩三个人 |
| **4** | 团队还吃得下多少、几天内打完 | 主管定,**助手先摆数据** | **捞太多打不完,到期回池等于白发一轮**。而"还吃得下多少"要看在岗几人、各自手上压着多少 —— 这些数在系统里,不在他脑子里 |
| **4** | 团队还吃得下多少、几天内打完 | 主管定,**助手先摆数据** | **捞太多打不完,到期回池等于白发一轮**。而「还吃得下多少」要看在岗几人、各自手上压着多少 —— 这些数在系统里,不在他脑子里 |
**1、2 是运营意图,问他就有;3、4 问他他也说不出**,得先把全景摆到他面前。这就是为什么选人要拆成两半。
1 和 2 交叉出来的那批人,下文一律称**候选人群**(比如「种植 · 一到两年没来」这一批)—— 助手后面所有的比较、平均、门槛,算的都是这一批人自己的数,不是全库的数。
{/* ⚠️ 多段落的 Callout:开闭标签必须**各自独占一行**,且与正文之间留空行。
写成 `<Callout>正文…` 再空行,MDX 会把它当成段落内的行内 JSX,
要求在同一段里闭合 → Build Error: Expected a closing tag before the end of `paragraph`。 */}
......@@ -95,7 +85,7 @@ flowchart TD
而这个估算往下游走一步,就是**诊所的排班**:预计能回来多少人、其中多少要做种植,医生和科室要不要提前留出位置。**捞回来了却没人接诊,比没捞更伤客户。**
⇒ 所以这一项必须由主管拍,⛔ 系统不代劳、也不推荐 —— 它算得出人数,算不出诊所那边接得住多少。
⇒ 所以这一项必须由主管拍板,系统不代劳、也不推荐 —— 它算得出人数,算不出诊所那边接得住多少。
</Callout>
......@@ -108,7 +98,7 @@ flowchart TD
| **助手给的是** | —— | **全景数据 + 一版已经分好的方案** |
| **结果** | 一批候选人 | 一批确定的人 + 谁打给谁 |
助手在这一步不是"等他再下一个指令",而是**先把该看的摆出来、顺手把方案做出来**:这批人的画像构成、消费分布、在岗几人、各自手上压着多少、这批发下去谁最忙。主管看着这些改,或者直接确认。
助手在这一步不是等他再下一个指令,而是**先把该看的摆出来、顺手把方案做出来**:这批人的画像构成、消费分布、在岗几人、各自手上压着多少、这批发下去谁最忙。主管看着这些改,或者直接确认。
### 主管只说了 1 和 2,剩下的助手拿默认值先跑通
......@@ -121,32 +111,32 @@ flowchart TD
<Callout type="warn">**默认值一个都不许藏。** 出方案时式子摊开写:「本批 405 人 = 在岗 27 人 × 每天 15 通 × 1 天」。
一个他看不见的默认值,等于系统替他做了一个他不知道的决定 —— 而这批人是真发下去了。
⇒ 摆出来他才有得改;⛔ 不摆,他连"原来还能改这个"都不知道。</Callout>
⇒ 摆出来他才有得改;不摆,他连「原来还能改这个」都不知道。</Callout>
⚠️ 人手这件事在**两个地方**主动摆给他看,⛔ 不用他去找:
人手这件事在**两个地方**主动摆给他看,不用他去找:
| 什么时候 | 他看到什么 |
|---|---|
| **出方案时** | 「本批 405 人 = 在岗 27 人 × 每天 15 通 × 1 天」—— 式子和每个数都摊开,他改哪个都行 |
| **确认单上** | 每位客服一行「约 3 天」,算的是**分完之后他手上的总量**(在手 + 本批),⛔ 不只是本批那几条 |
| **确认单上** | 每位客服一行「约 3 天」,算的是**分完之后他手上的总量**(在手 + 本批),不只是本批那几条 |
超出本批时效的用**颜色**提示,⛔ 不写「打不完 / 超了 / 过载」—— 几乎每批都会有人超,说成故障主管就会开始怀疑系统,而不是做他该做的判断。
### 能加哪几个条件
助手只在**这批人还值得再切一刀**时才提,一次给四条,每条都直接写清切完还剩多少人:
助手只在**这批人还值得再收窄一层**时才提,一次给四条,每条都直接写清切完还剩多少人:
| 加什么条件 | 门槛怎么来的 | 这条什么时候不给 |
| 加什么条件 | 门槛怎么来的 | 这一条什么时候不给 |
|---|---|---|
| **只选消费高于这一格平均的** | 门槛是**这一格自己的平均**,⛔ 不是全库分位 —— 全库平均 ¥4,442,而某一格实测 ¥0 起,用全库的数会一刀切光 | 高于平均的不足 10 人 |
| **只选转介绍达人** | 推荐过 ≥3 人**且带来成交**(家庭型和社交型合并成一条 —— 主管要的是"有没有这个能力",不是哪一型) | 不足 10 人 |
| **只选某个权益身份的** | 取这一格里**人最多的那一项** | 最多的那项不足 10 人 |
| **只选消费高于本批平均的** | 门槛是**这批候选自己的平均**,⛔ 不是全库分位 —全库平均 ¥4,442,而某一批实测 ¥0 起,用全库的数会把人几乎筛空 | 高于平均的不足 10 人 |
| **只选转介绍达人** | 推荐过 ≥3 人**且带来成交**(家庭型和社交型合并成一条 —— 主管要的是「有没有这个能力」,不是哪一型) | 不足 10 人 |
| **只选某个权益身份的** | 取这批候选里**人最多的那一项** | 最多的那项不足 10 人 |
| **只选某个获客渠道的** | 同上 | 同上 |
| + **按别的条件选** | 兜底:助手把其余十几个维度各多少人报一遍,他再挑 | 始终给 |
<Callout type="warn">**加条件 = 重新选一版**,⛔ 不是在已经排好的那些人里再挑一遍。
点下去之后这一格重新选进来多少人、这批发多大,都会跟着重算。
按钮上那个数字是**换完之后这一格还剩多少**,不是"从本批里筛掉几个"。</Callout>
点下去之后这批候选重新选进来多少人、这批发多大,都会跟着重算。
按钮上那个数字是**换完之后还剩多少人**,不是「从本批里筛掉几个」。</Callout>
### 引导什么时候才冒出来
......@@ -155,88 +145,89 @@ flowchart TD
| 引导 | 满足什么才出 | 为什么卡这个条件 |
|---|---|---|
| **专属排满了** | 这一版真有人排不进去 | 它是唯一「不处理就真的有人被漏掉」的一条 |
| **能加个条件** | 这一格 ≥ 50 人 · 他还没加过条件 · 切完至少还剩 10 人 | 人太少时「平均数」「最多的那一项」本身就是噪音;已经加过就不再层层套娃 |
| **这批多大** | 人数是系统估的(他没自己指定过) | 他自己说过「就发 200 人」就不必再解释这个数哪来的 |
| **能加个条件** | 候选 ≥ 50 人 · 他还没加过条件 · 切完至少还剩 10 人 | 人太少时「平均数」「最多的那一项」本身就是噪音;已经加过就不再一层层往下切 |
| **这批多大** | 人数是系统估的(他没自己指定过) | 他自己说过「就发 200 人」,就不必再解释这个数哪来的 |
| **最忙的那位** | 最忙的人分完之后的量 > 每天通数 × 时效 | 没超就不提,⛔ 不制造无谓的告警 |
⚠️ **图里只画了引导节点。** 主管随口说的(「换成正畸」「改成 200 人」「只要今年来过的」)同样能触发重出 —— 那条路不走按钮,靠助手听懂 + 调工具,⛔ 不在这张图上。
⚠️ **符合条件的人比这批还少时,「这批多大」照样给他**:往上调确实不会更多,但**往下调可以少发一些** —— 那句话据实写清方向,⛔ 不把入口藏起来。
### ② 分人怎么分:又满又平,三趟走完
不是简单的"谁空给谁"。先算一条**目标水位**,再走三趟:
不是简单的「谁空给谁」。先算一条**目标水位**,再走三趟:
```
目标水位 = ⌈ (团队现有在手总量 + 本批人数) ÷ 在岗人数 ⌉ 至少 1
目标水位 = ⌈(团队现有在手总量 + 本批人数)÷ 在岗人数 ⌉ 至少 1
```
⭐ 水位**不是新旋钮** —— 完全由「这批多大」推出来。它存在的唯一理由是**给第一趟封顶**。
⭐ 水位**不是一个新的可调项** —— 完全由「这批多大」推出来。它存在的唯一理由是**给第一趟封顶**。
| 趟 | 分给谁 | 为什么是这个顺序 |
|---|---|---|
| **一趟** | 有专属客服的**回自己人手上**,但他手上(在手 + 本批已给)**到了水位就不再给** | 不封顶的话,专属集中的诊所会「一个人吃掉整批」 |
| **二趟** | 无专属的,**当前手上最少的**那个 | 无专属患者没有关系要顾,拿他们填坑**零代价** —— 用完了才轮到去动有主的 |
| **三趟** | 专属这轮排满的,**单列成一组交主管定** —— 这一组就是引导③「专属排满了」 | ⛔ 不自动改派 |
| **二趟** | 无专属的,**当前手上最少的**那位 | 无专属患者没有关系要顾,拿他们填坑**零代价** —— 用完了才轮到去动有主的 |
| **三趟** | 专属这轮排满的,**单列成一组交主管定** —— 这一组就是引导「专属排满了」 | ⛔ 不自动改派 |
<Callout type="warn">
**为什么必须三趟、不能合成两趟。** 二、三趟都是水位法、都填最空的人,合并起来总量一模一样 —— 但**被拆散的专属关系数不一样**。先用无专属的去补空手的人,能少动一个有主患者;合成一趟,系统就会随机地把某个有主患者改派出去,而同时某个无专属患者落给了别人。
**为什么第一趟要封顶。** 本地实测:池子 1,081 人里 **755 人(70%)挂在同一个客服名下**。不封顶,他一批拿走 248 条;而 17 位在岗客服里有 10 位名下一个患者都没有,只能靠 119 个自由患者过活。
**为什么第一趟要封顶。** 本地实测:池子 1,081 人里 **755 人(70%)挂在同一个客服名下**。不封顶,他一批拿走 248 条而 17 位在岗客服里有 10 位名下一个患者都没有,全队只有 119 个无专属患者可分。
**为什么第三趟不自动改派。** 把患者从他的专属客服手里挪走,是**关系层面的决定,助手没资格替主管做**。所以这些人不是被丢掉,是原地不动、单列出来交他定 —— 关系还在,只是这轮没轮到。主管自己拖一下当然可以,那条会标成「他手动改的」。
**为什么第三趟不自动改派。** 把患者从他的专属客服手里挪走,是**关系层面的决定,助手没资格替主管做**。所以这些人不是被丢掉,是原地不动、单列出来交他定 —— 关系还在,只是这轮没轮到。主管自己改派当然可以,那条会标成「他手动改的」。
</Callout>
⚠️ 同水位时按客服 id 打破平局 —— **同样的输入两次必须算出同样的分法**,这是主管敢按确认键的前提。
⚠️ 同水位时按固定顺序打破平局 —— **同样的输入两次必须算出同样的分法**,这是主管敢按确认键的前提。
### 后三步
三趟只是默认。主管可以在这一版上移出某几个人、改派给谁、单独给某位少分点(「李莉这周带教,这批最多给 5 条」)—— 程序按规则落,主管微调。
### ③ 确认 · ④ 确认之后
| 步 | 主管在决定什么 | 谁来做 |
|---|---|---|
| **② 分人** | 上面那三趟是默认;他可以移出某几个人、改派给谁、单独给某位少分点(「李莉这周带教,这批最多给 5 条」) | 程序按规则落,主管微调 |
| **③ 确认** | **要不要就这么发下去** —— 他点下去这一刻才真的分下去 | 只有主管 |
| **④ 确认之后** | **发出去之后怎么管**:发错了限时撤回、临时加个福利、跟踪这批打得怎么样 | 主管发起,程序执行 |
### 红色那个菱形,是助手在这条线上**唯一实质的判断**
### 代价不对称:什么时候重来,什么时候就地改
主管说一句话,助手要判断他动的是哪一层:
红色那个菱形,是助手在这条线上**唯一实质的判断** —— 主管说一句话,它要判断他动的是哪一层:
| 他说 | 动的是 | 走 |
| 他说 | 动的是 | 代价 |
|---|---|---|
| 「王强移出这批」「待分配都还给专属」「给 5 天」「带个福利」 | **② 分人** | 就地改,同一版 |
| 「只要商保直付的」「改成 200 人」「换成一两年没来的」 | **① 选人**(初选那两问、精选那两问,都算) | 重跑,出新版 |
<Callout type="warn">**代价不对称**:把「① 选人」误判成「② 分人」→ 主管以为条件生效了、其实没有(**看不出来的错**);反过来只是多算一次。⇒ **拿不准时一律走重跑。**</Callout>
| 「王强移出这批」「待分配都还给专属」「给 5 天」「带个福利」 | **分法** | **就地改**(同步)—— 同一版上动,人和分法都不重算 |
| 「换无专属客服的患者补上」 | **人**(但只换这一版里的人) | **重排**(几秒)—— 重新排一遍分法,不重新选人 |
| 「只要商保直付的」「改成 200 人」「换成一两年没来的」 | **人群**(初选那两问、精选那两问,都算) | **重出**(几十秒)—— 重新选一版,旧版当场作废 |
### 两条闭合的环
三档里最容易看走眼的是中间那条:**「换无专属的补上」摆在分人环里,换的却是人** —— 它是四个引导节点中唯一一个「长在分人环、代价却偏向选人环」的选项。
- **改分法** → 回到同一版:人没变,分法变了
- **改人群** → 回到新的一版:**旧版当场作废**,确认按钮禁用
「改时效」也有两条路,代价不一样:从**「这批多大」**改,会连人数一起重估(**重出**);从**「最忙的那位」**改,只延长这一批的期限、人不变(**就地改**)。
⚠️ 作废发生在**新版生成时**,不是确认时 —— 主管要能看见自己出过几版、哪一版才是当前的。
<Callout type="warn">**代价不对称,判断也要跟着不对称**:把「改人群」误判成「改分法」→ 主管以为条件生效了、其实没有(**看不出来的错**);反过来只是多算一次。⇒ **拿不准时一律走重出。**</Callout>
### 助手讲这一版时,也按这个顺序讲
⚠️ 旧版作废发生在**新版生成时**,不是确认时 —— 主管要能看见自己出过几版、哪一版才是当前的。
`① 选人 → ② 分人 → ③ 确认`。**顺序不能反**:选人那一档他一动,整版重出;先讲分法,他动一下就全白讲。
助手讲这一版时,也按 `① 选人 → ② 分人 → ③ 确认` 的顺序讲。**顺序不能反**:选人那一档他一动,整版重出;先讲分法,他动一下就全白讲。
---
## 二、提示词怎么搭的
助手的行为由一段系统提示词决定。它不是一篇散文,是**五层拼起来的**,装配顺序就是模型的阅读顺序:**通用 → 特殊**。
## 二、这个助手是怎么装出来的
### 它是登录那一刻装出来的,⛔ 不是一个常驻的"对象"
### 它是登录那一刻装出来的,⛔ 不是一个常驻的「对象」
系统里没有一个叫「助手」的东西守在那儿等人来问。**每次请求都按当前登录人现装一份**,装配的输入只有一个:他的权限。
```
登录人的权限 ──┬──→ 会话 主管的会话 / 客服的会话,各归各的
登录人的权限 ──┬──→ 会话 主管的会话 / 客服的会话,各归各的
├──→ 工具清单 21 个 / 9 个
├──→ 数据范围 能查哪几家诊所的人
└──→ ④角色 ⑤现场 他是谁的助手、此刻在做哪条线
①②③ 与谁登录无关,永远是同一份。
①②③ 与谁登录无关,永远是同一份。(①—⑤ 指下一节的提示词五层)
```
### 为什么必须按身份装,而不是"一个助手换个说法"
### 为什么必须按身份装,而不是「一个助手换个说法」
| 这一维 | 要不要按身份分 |
|---|---|
......@@ -249,15 +240,15 @@ flowchart TD
<Callout type="warn">
**为什么同一个会话里不能"切换身份"。** 上下文是**单向**的:高权限会话里已经载入的数据,不会因为一句「你现在是低权限角色」而消失。
**为什么同一个会话里不能「切换身份」。** 上下文是**单向**的:高权限会话里已经载入的数据,不会因为一句「你现在是低权限角色」而消失。
**提示词不是删除操作,也从来不是安全边界。**
</Callout>
所以「主管一个 agent、客服一个 agent」这个说法要拆开看:**同一套实现,按身份参数化**。⛔ 这不是「多 agent 编排」—— 编排指 agent 之间互相调用,而不同身份之间**不需要通信**;真要协作,走业务对象,⛔ 不走 agent 消息。
所以「主管一个 agent、客服一个 agent」这个说法要拆开看:**同一套实现,按身份参数化**。这不是「多 agent 编排」—— 编排指 agent 之间互相调用,而不同身份之间**不需要通信**;真要协作,走业务对象,⛔ 不走 agent 消息。
四条硬规则,都在结构上而非嘴上:
四条硬规则,都落在结构上而非嘴上:
1. **身份随每次调用传递**,⛔ 不随连接建立 —— 一个连接可能服务多个用户
2. **授权在工具内部执行**,⛔ 不在助手这一层
......@@ -267,11 +258,13 @@ flowchart TD
> **判据:如果模型不传某个参数,越权就不可能发生 —— 那这个参数就不该是参数。**
> 顺带的好处:模型不用猜,少一个必错的空格。
由此还得到一个平时容易忘的推论:**它没有"记性"** —— 不是存着状态的对象,上一轮的东西要么在对话历史里,要么就得重新查。所以主管在确认单上动过手之后,助手**必须重新去看那张单**,⛔ 不能拿出方案那一版的数接着算(「看当前确认单」那个工具就是为此存在的)。
由此还得到一个平时容易忘的推论:**它没有「记性」** —— 不是存着状态的对象,上一轮的东西要么在对话历史里,要么就得重新查。所以主管在确认单上动过手之后,助手**必须重新去看那张单**,⛔ 不能拿出方案那一版的数接着算(「看当前确认单」那个工具就是为此存在的)。
### 分层的判据是「什么会让它变」
### 提示词分层:判据是「什么会让它变」
⛔ 不是按话题分。同一个话题的话可能分属两层,只因为它们变化的原因不同。
助手的行为由一段系统提示词决定。它不是一篇散文,是**五层拼起来的**,装配顺序就是模型的阅读顺序:**通用 → 特殊**。
分层⛔ 不按话题分。同一个话题的话可能分属两层,只因为它们变化的原因不同。
| | 层 | 管什么 | 什么会让它变 | 占篇幅 |
|---|---|---|---|---|
......@@ -283,10 +276,9 @@ flowchart TD
前三层**所有人一样**;④⑤ 与工具清单**跟着登录账号走**。
### 只有主职责常驻
常驻的成本不是「多几百字」,是**每条业务线都常驻之后的总和** —— 分配、追踪、排班、复盘、盘点,每加一条,其余所有会话都在为它白付上下文,而**规则越多,每条被遵守的概率越低**。
常驻的成本不是「多几百字」,是**每条业务线都常驻之的总和** —— 分配、追踪、排班、复盘、盘点,每加一条,其余所有会话都在白白背着它的篇幅,而**规则越多,每条被遵守的概率越低**。
所以只有**主职责**(分配)常驻。次要的活(比如分配追踪)写成单独一篇,常驻里**只留一行索引**,助手要用时自己去取。
......@@ -302,9 +294,9 @@ flowchart TD
模型会说出 `cold_3y`、`implant` 这种内部取值码,而主管看到不认识的词,第一反应是**系统坏了**。
最初的对策是在提示词里写两页「⛔ 不许说出取值码」—— **拦不住**。因为模型调工具时**必须**拿这些码当参数,回话时自然就带出来了。
最初的对策是在提示词里写两页「不许说出取值码」—— **拦不住**。因为模型调工具时**必须**拿这些码当参数,回话时自然就带出来了。
真正的解法是**在返回值里就给它成的中文**:既回显它传进来的条件,又把桶名换成中文。**它手里有话可说,就不会去说码。**
真正的解法是**在返回值里就给它成的中文**:既回显它传进来的条件,又把内部分档的名字换成中文。**它手里有话可说,就不会去说码。**
<Callout type="info">这是这套工具设计反复用的那条判据:**能让它「说不出来」的,就别写成「不许说」。** 提示词里的禁令只拦得住你预想到的那些;把码换成中文是结构上的 —— 它想说也说不出来。</Callout>
......@@ -315,7 +307,7 @@ flowchart TD
| | 写什么 |
|---|---|
| **干什么** | 一句话说清它回答哪个问题 —— 「回答『现在该联系谁 / 今日推荐』」 |
| **什么时候用、⛔ 什么时候别用** | 「⛔ 出方案**不需要**先调它,方案自己会取名册」「⛔ 试探性调一次没有『预览』,那一次就是真撤」 |
| **什么时候用、什么时候别用** | 「出方案**不需要**先调它,方案自己会取名册」「试探性调一次没有『预览』,那一次就是真撤」 |
| **怎么用** | 参数怎么填、跟哪个工具配套 —— 「先用它给摘要,再用名单取明细」 |
**「什么时候别用」是最值钱的那一条,也几乎每条背后都有一次实测事故。**「不需要先调看人手」是抓到模型写字前白调了一次、返回的数一个没用上;「撤销没有预览」是因为它真的没有。**一个工具能干什么,看名字就猜得到;什么时候不该用,只能踩出来。**
......@@ -327,7 +319,7 @@ flowchart TD
### 全部工具
<Callout type="info">**两个人拿到的清单不一样** —— 不是靠提示词叮嘱它"别看别人的",是那些工具**根本没发给它**。</Callout>
<Callout type="info">**两个人拿到的清单不一样**— 不是靠提示词叮嘱它「别看别人的」,是那些工具**根本没发给它**。</Callout>
**两种人都有(9 个)**
......@@ -386,18 +378,18 @@ flowchart LR
---
## 五、要他定的事,做成按钮
## 五、要主管定的事,做成按钮
程序算出「这一版还有什么没定」,**摆成按钮**,不让主管打字。
| 节点 | 它对主管说什么 | 不处理会怎样 |
|---|---|---|
| **专属排满了** | 「182 人的专属客服这轮已排满」——**第三趟那一组**,四个选择:换无专属的补上(池子还有人时才给)/ 铺平给在岗 / 各自归专属客服 / 移出本批 | 这批不发给他们 |
| **能加个条件** | 「这一格 2,663 人,也可以只选其中一类」+ 四个带人数的选项(见 §1) | 就按这一格全部人来 |
| **能加个条件** | 「这批候选 2,663 人,也可以只选其中一类」+ 四个带人数的选项(见 §1) | 就按这批候选全部人来 |
| **这批多大** | 「本批 405 人 = 在岗 27 人 × 每天 15 通 × 1 天」,式子摊开给他看 | 就按这个数发 |
| **最忙的那位** | 「这批发下去,最忙的是王强:手上共 45 条,约 3 天的量;**另有 2 位也超过 1 天**」 | 就按这个时效发,到期没打完的自动回池 |
⚠️ **④ 为什么要报「另有几位」**:只说最忙的一个,主管分不出两种局面 —— 而这两种局面该做的事相反:
⚠️ **为什么要报「另有几位」**:只说最忙的一个,主管分不出两种局面 —— 而这两种局面该做的事相反:
| 局面 | 他该做的 |
|---|---|
......@@ -406,7 +398,7 @@ flowchart LR
只有他一个人超时,那半句**不出现** —— ⛔ 不制造无谓噪音。⛔ 也不在这里铺开每个人:确认单上每位客服那一行已经写着「约 N 天」,分布本来就在眼皮底下,引导只负责**点出要他定的事**,不负责展示数据。
⚠️ **④ 只给一个选项,而且必须带数**:「整批时效改成 **3** 天」—— 那个 3 是按最忙那位的量算出来的。
⚠️ **「最忙的那位」只给一个选项,而且必须带数**:「整批时效改成 **3** 天」—— 那个 3 是按最忙那位的量算出来的。
曾经还有「改每人每天打几通」「减少本批人数」两个,删掉了:它们**一个数都不带**,点下去等于替主管说了句「减少一些」——
**一个不带数的按钮,严格弱于他自己开口说一句。**
......@@ -417,7 +409,7 @@ flowchart LR
| | |
|---|---|
| **只陈述事实** | ⛔ 不写「建议你铺平」—— 给建议就是替主管做决定 |
| **默认永远是"不动"** | 一条不点、直接确认,**在任何情况下都安全** |
| **默认永远是「不动」** | 一条不点、直接确认,**在任何情况下都安全** |
| **有后果的全亮** | ⛔ 不许省、不许弱化成「另有若干」—— 藏一条,他就不知道有东西卡着 |
按钮和说话**走同一套动作**:他点按钮,和他开口说「把待分配的都还给专属客服」,落到程序里是同一件事。
......@@ -434,7 +426,7 @@ flowchart LR
| 把患者从他的专属客服手里挪走 | 关系层面的决定,只有主管能拍板 |
| 讲「成功率 / 转化率」 | 本系统**不统计成功与否**,那个结论编不出来 |
| 替他加福利的条件、期限、承诺 | 他说什么就原样写进去 |
| 说「我做不到」「你先自己弄完说」 | 他能改的东西助手手上都有工具;把几十次手工操作推回去不是保护,是甩锅 |
| 说「我做不到」「你先自己弄完再说」 | 他能改的东西助手手上都有工具;把几十次手工操作推回给主管,不是保护,是推卸 |
---
......@@ -450,7 +442,7 @@ flowchart LR
**第三层的判据是「动作」,不是「文字」。** 同一个意思十种说法都对;而最贵的那类失败恰恰是**话说得挺好、工具一次没调**。
<Callout type="warn">**跑一次不算数。** 同一份配置跑 3 轮得到 1/3、跑 10 轮得到 9/10 —— 是同一个行为。判断"它是不是退步了"必须看多轮通过率。</Callout>
<Callout type="warn">**跑一次不算数。** 同一份配置跑 3 轮得到 1/3、跑 10 轮得到 9/10 —— 是同一个行为。判断「它是不是退步了」必须看多轮通过率。</Callout>
用例全部来自**真实踩过的坑**,每条都写明由来 —— 没有一条是设想出来的场景。
......@@ -458,20 +450,20 @@ flowchart LR
## 八、跟一般的助手不一样在哪
这些差别都不是技术选择,是**产品选择** —— 每一条背后都有一个"如果按常规做会怎样"。
这些差别都不是技术选择,是**产品选择** —— 每一条背后都有一个「如果按常规做会怎样」。
| | 一般的助手 | 这一个 | 为什么 |
|---|---|---|---|
| **会话** | 有"新建会话"、有历史列表 | **都没有** —— 会话跟着他此刻在做的事,离开这一屏就结束 | 它不是一个聊天产品,是**工作台的一部分**。让他管理"会话",等于给他一件本来不存在的活 |
| **会话** | 有「新建会话」、有历史列表 | **都没有** —— 会话跟着他此刻在做的事,离开工作台就结束 | 它不是一个聊天产品,是**工作台的一部分**。让他管理「会话」,等于给他一件本来不存在的活 |
| **搞不清时** | 反问澄清,一轮一轮问 | **不追问,直接出一版** | 追问一轮 = 他等一轮。而**一版具体的方案本身就是最好的问题** —— 他看着改,比回答抽象提问快得多 |
| **让他做选择** | 让他打字说清楚 | **摆成按钮**,按钮和说话**走同一套动作** | 打字要过「模型理解 → 翻成动作」,而按钮是固定的,没有理解错的余地 |
| **让他做选择** | 让他打字说清楚 | **摆成按钮**,按钮和说话**走同一套动作**(见 §5) | 打字要过「模型理解 → 翻成动作」,而按钮是固定的,没有理解错的余地 |
| **输出** | 一段文字,卡片位置由模板定 | **模型自己排版** —— 卡片和按钮落在正文哪一句之后,由它调工具的位置决定 | 「先讲怎么排的,再摆明细」和「先甩一屏名单」是两种阅读体验,而只有它知道自己讲到哪了 |
| **和界面的关系** | 把知道的都说一遍 | **界面已经显示的不再说** —— 只写界面说不出来的那半句 | 同一件事读两遍,他下次就开始跳读,而跳读时最先丢的正是最要紧的那句 |
| **数字** | 模型自己算、自己推 | **一个数都不许自己产生** | 见 §4 —— 凡是能算的都由程序算,助手只转述 |
| **数字** | 模型自己算、自己推 | **一个数都不许自己产生**(见 §4) | 凡是能算的都由程序算,助手只转述 |
| **出错的兜底** | 出错了给个提示 | **默认永远安全** —— 一条引导不点、直接确认,在任何情况下都不会出事 | 他可以完全不理会助手的建议,而这不该有任何代价 |
| **怎么算验收通过** | 跑通一次就算 | **看多轮通过率** | 见 §7 —— 这一层天生有波动,跑一次说明不了任何事 |
| **怎么算验收通过** | 跑通一次就算 | **看多轮通过率**(见 §7) | 这一层天生有波动,跑一次说明不了任何事 |
<Callout type="info">**贯穿这些差别的是同一条:助手是工作台的一部分,不是工作台旁边的一个聊天机器人。** 它没有自己的"产品面" —— 没有会话管理、没有历史、没有设置。他在做的那件事就是它存在的全部理由。</Callout>
<Callout type="info">**贯穿这些差别的是同一条:助手是工作台的一部分,不是工作台旁边的一个聊天机器人。** 它没有自己的「产品面」—— 没有会话管理、没有历史、没有设置。**主管手上那件事,就是它存在的全部理由。**</Callout>
---
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment