- name
- people-kb
- version
- 1.0.0
- description
- 名片知识库 / 人物志。在日常对话中被动感知用户聊到的人(朋友、同事、家人、合作方都记), 一人一档持续沉淀到知识库,让 Agent 越来越懂用户身边的人。三件事: ① 被动记录 — 对话里出现某个具体的人+关于 ta 的信息时,主动沉淀到 `人物 - {名字}`; ② 召回 — 再次聊到这个人时,先召回 memory 里的一句话指针,再 knowledge_search 拉全量档案补进上下文; ③ 去重与整理 — 按月去重,定期合并同一个人的零散记录。 存储走知识库(scene=work/life),不占用 memory(人物档案会越来越大)。
- trigger
- 记一下.*(是谁|这个人|他是|她是)|记到people|整理进people|归到people|人物档案|这个人|我同事|我朋友|我的朋友|我的同事|我们组的|团队成员|认识了|介绍下.*(是谁)|.*最近怎么样|.*是个什么样的人|谁是|关于.*的信息
- author
- Ethan Agent
- license
- MIT
- platforms
- ["linux","macos","windows"]
- metadata
- {"ethan":{"tags":["People","Knowledge","Relationship","Recall"]}}
# People KB(名片知识库 / 人物志)
> 把用户身边的人沉淀成一人一档的「人物志」,日积月累,让 Agent 越来越懂这些人。
> 数据写知识库(`scene` 区分 work/life),memory 里只放一句话「指针」用于召回。
## 🎯 核心理念
- **朋友、同事、家人、合作方都记** —— 不只是打工场景。是「你认识的人」的知识库。
- **被动感知**:不需要用户显式说"记一下"。只要对话里出现**一个具体的人 + 一条关于 ta 的信息**,就应该沉淀。
- **档案是活的**:每次聊到都可能补充,档案随时间变厚,画像越来越准。
- **存储在知识库、索引在 memory**:全量档案放知识库(可以很大);memory 里只留一句话指针,负责"下次聊到这个人时把 ta 捞回来"。
## 🚫 硬规则
### R1:写档案只用 knowledge_* 工具
人物档案的所有写入必须通过 `knowledge_add` / `knowledge_edit`,禁止 `file_write` / `shell`。路径由后端管理,不要自己拼 vault 路径。
- 新建 → `knowledge_add(title, content, tags, scene)`
- 追加 → `knowledge_edit(source, content, mode="append", scene)`
- 整篇改写 → `knowledge_edit(source, content, mode="replace", scene)`
### R2:档案条目命名固定为 `人物 - {名字}`
- 标题:`人物 - {名字}`(如 `人物 - 张三`)
- tags:`["people", "{名字}"]`(外加关系标签,如 `"colleague"` / `"friend"` / `"family"`)
- scene:**同事/工作关系 → `work`;朋友/家人/生活关系 → `life`**(拿不准默认 work)
- title 里禁止出现 `/`、`\`、连续 `-`、前后空格
### R3:memory 指针(召回索引,务必写)
**首次为某人建档、或档案有重要更新(换了关系/职业/重要标签)时**,用 `memory_write` 写一条极短的人物指针:
- `memory_type="relationship"`
- `content`:一句话,形如 `"用户的同事张三,负责支付方向,是直属下属;详细档案见知识库人物-张三"`
- 只写**身份锚点**(谁、什么关系、一句话画像),**不要**把事件流水写进 memory —— 那些留在知识库档案里
- 同一个人只维护**一条**指针(内容变化时 memory_write 会按内容 supersede,直接用最新的一句话覆盖式重写即可)
作用:下次用户提到这个人时,`recall_memory` 会先召回这句指针,Agent 据此知道"这是用户认识的人",再 `knowledge_search` 拉全量档案。
## ⚡ 快速路径
### 被动记录(核心,默认行为)
**触发**:对话中出现一个具体的人 + 关于 ta 的可沉淀信息。**判断标准**——满足下面任一条就该记:
- 提到某人的**身份/关系**("我同事张三"、"我朋友小林"、"我妹")
- 提到某人**做了什么 / 发生了什么**("张三今天把支付联调搞定了"、"小林最近换工作了")
- 提到某人的**特点/偏好/近况**("张三特别较真"、"小林喜欢滑雪"、"李姐孩子刚上小学")
**不记**:泛指的人("有个用户"、"某个同事"没点名)、纯路人、一次性无信息量的提及。
**流程**:
1. 提取 `{名字}`、`{关系}`(同事/朋友/家人/合作方/…)、`{信息}`、`{scene}`(按 R2)
2. `knowledge_search(query="人物 {名字}", scene=...)` 找档案:
- **不存在** → `knowledge_add` 建档(见 `references/profile-format.md` 的新建模板),并按 **R3** 写 memory 指针
- **存在** → `knowledge_read` 读全文,按月去重(见 `references/recall-and-dedup.md`)后 `knowledge_edit` 追加时间线条目
3. 回复确认:记到了谁、记了什么(一句话,别啰嗦)
> **低打扰原则**:被动记录时不要每条都追问。信息明确就直接记+一句话确认;只在关系/名字有歧义时才问。
### 召回(聊到熟人时补上下文)
**触发**:用户消息里出现一个可能是"用户认识的人"的名字,或问"X 最近怎么样 / X 是谁 / X 是个什么样的人"。
**流程**:
1. `recall_memory` 命中人物指针 → 确认这是用户认识的人
2. `knowledge_search(query="人物 {名字}", scene="work")` + 生活向再搜 `scene="life"`,找到档案
3. `knowledge_read` 读全文,把关系、画像、最近时间线提炼进当前回答的上下文
4. 若用户是在"聊这个人的新情况",顺带走一遍**被动记录**把新信息沉淀进去
### 显式整理
**触发**:「把 xxx 整理进 people」「记到 people 里」「给 X 建个档案」。
1. 从消息/上下文提取 `{名字}: {信息}` 列表
2. 逐个走**被动记录**流程(建档 or 追加 + 指针)
3. 回复:列出写入了哪些人、各写了什么
## 🗂️ 与其他技能的关系
| 技能 | 关系 |
|---|---|
| `team-manager` | **消费者**:绩效/CR/群扫描识别出的工作事件,写进本技能的 `人物 - {名字}` 时间线(带 `[亮点]/[问题]` 工作标签)。存储格式归本技能管。 |
| `task-and-schedule-manager` | 「X 生日 6.1」「下周约 X 吃饭」这类含人物的时间信号,转交 task-and-schedule-manager 建提醒;人物本身信息留在这里。 |
| `recall_memory` / `memory_write` | 人物指针的读写通道(R3)。 |
## 🧹 定期整理(建议配定时任务)
同一个人可能被零散记了多条、或名字写法不一("张三" vs "老张")。建议用 `task-and-schedule-manager` 配一个低频任务(如每月)做整理,prompt 见 `references/recall-and-dedup.md` 的「定期整理」章节:合并重名档案、去重时间线、补全画像摘要、刷新 memory 指针。
## ⚠️ 约束
- **隐私边界**:人物档案仅存本地知识库,绝不发送到任何外部渠道/群/个人。
- **客观记录**:时间线以事实为主;主观印象放"画像"段落并注明是印象。
- **敏感信息**:薪资、绩效评级、健康隐私等,除非用户明确要求,否则不写档案。
- **不臆造**:拿不准名字/关系时先问,不要猜一个写进去。
## 📎 详细规范
- `references/profile-format.md` — 人物档案的结构、新建/追加模板、字段规则
- `references/recall-and-dedup.md` — 召回流程、按月去重、memory 指针写法、定期整理 prompt
عرض على GitHub