Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 79 additions & 35 deletions memory/L4_raw_sessions/salient_mining_sop.md
Original file line number Diff line number Diff line change
@@ -1,65 +1,109 @@
# 历史重点挖掘 SOP

从用户历史对话中挖掘值得长期保留的重点:情绪事件、持续活动、已消失事项。
从用户历史对话中挖掘值得关注的重点,产出为**工作稿**——供后续流程(记忆整合/用户画像更新)消费。三类产出:情绪事件、习惯性活动、已完成事项。

> **核心循环**:读 increment_marker → 取下一批 session → 逐条阅读 user 消息 → 提取情绪事件 + 更新活动记录 → 写回产物 + 推进 marker

## 数据源

`../memory/L4_raw_sessions/all_histories.txt`(`compress_session.py` 产出)。不存在则先运行脚本。只读 user 内容
`../memory/L4_raw_sessions/all_histories.txt`(相对于工作目录 temp/;`compress_session.py` 产出,不存在则先运行)。只读 `[USER]:` 行。session 以 `====...====` + `SESSION: MMdd_HHmm-MMdd_HHmm` 开头,按时间顺序排列

## 执行约束

- 增量:维护已处理 session 列表,每次只扫新 session
- 分批处理时不拆分同一 session
- 工作目录:`temp/`。产物存 `./history_insight/`
- 增量:`increment_marker.md` 记录最后处理的 session,每次从其后开始顺序扫描。若 marker 指向的 session 在数据源中找不到(文件被重新生成),从第一个 session 重新开始并在产物中注明"marker reset"
- 每批 5-15 个 session(不足5个也可),不拆分同一 session
- 首次执行:marker 不存在则从第一个 session 开始。无情绪事件时 `emotion_events.md` 可为空或不创建
- 后续执行(batch 2+):在已有内容基础上更新(追加/合并/修订)。不从零重写,但可修正个别条目
- **marker 始终推进**:无论本批有无新发现,marker 必须更新为本批最后一个 session ID

## 产物

存 `./history_insight/`(不存在则创建),格式自定。产物是数据库,不是报告——每条发现都是下游任务的输入,遗漏即损失。

产物包含三个持久状态(可以是多个文件或一个文件内的多个区域):
1. **活动知识层** — 每次扫描读取、更新、写回。记录所有识别到的活动及其最终分类。
2. **情绪事件列表** — 追加式,只增不改。
3. **增量标记** — 记录最后处理到的 session 标识,下次从此处之后开始。
产出文件:`activity_knowledge.md`、`emotion_events.md`、`increment_marker.md`。偏向少写——低质条目干扰下游。处理≥5 session后三类产出均为0时,在 activity_knowledge.md 顶部以 `<!-- 批次X: 原因 -->` 附注。

每条发现必须含:
- session 标识(与 L4 zip 内文件名一致,如 `0403_2013-0403_2145`)
- 关键原文片段(可 grep 定位回原日志)
- 发现类型标签
**修订原则**:明显错误直接修正;新证据改变分类时执行转换;两条目实为同一活动时合并(频次相加,sessions列表合并后按格式规则截断为前5个+`(+N)`,取更概括名称)。

## 提取标准

**决策总览**:
1. 逐 session 扫描 → 用户语气波动 → 查情绪阈值 → 达标则记录(附依据)
2. 逐 session 扫描 → 识别用户在做什么 → 查活动门槛 → 建条目则归类
3. 两类提取互相独立,一个 session 可产出任意组合(含两者都无)

**判断速查**:
- 情绪:极端用词/人身攻击/行为断裂 → 标记 | 仅催促/不满/命令式 → 不标记
- 活动:≥2session提及 或 单session≥3轮实质交互 + 可命名 → 建条目 | 纯指令/闲聊 → 跳过
- 增量:已有条目出现 → 追加session(去重)+更新频次 | 同一活动 → 合并
- 粒度:同一项目/目标的不同阶段视为同一活动(如"爬虫开发"含设计+调试+部署);同一语言/工具用于不同目标则分开(如"Python爬虫"≠"Python ML")

### 情绪事件

标记语气上的明显波动,不是内容上的。
标记语气上的**强烈**波动。目标:捕捉真正的情绪爆发点。**犹豫即不记。**

**强度阈值(满足任一)**:
1. **爆发性**:语气突然升级,与前后文形成明显反差
2. **累积性**:同一session内对同一问题反复表达不满(≥2次)
3. **极端用词**:强烈程度词(如"太…了""真的服了""牛逼""废物""太牛了""绝了"等)或重复标点("!!""??"),正负面均适用
4. **行为断裂**:情绪直接导致放弃任务、中断对话、无理性方向突变

**不标记**:礼貌性感谢、轻微催促、平和方向调整(有后续行动=不标记)、陈述性负面评价、连续"继续"。

**关键边界**:"算了"后平和换方向或平和搁置=不标记(犹豫即不记);"算了"+强烈情绪词(太烦了/受不了)+放弃原方案=仍标记(情绪真实发生,后续行动不抵消)。

**数量预期**:5-15 session 批次中 0-3 条(极端最多5条)。超5条建议逐条重新验证,删除不达标的。

**类型标签(仅限以下8个,逐字复制禁止变体)**:急切催促、不耐烦、质问责备、讽刺挖苦、惊喜感激、沮丧无奈、方向突变、命令式中断。多标签可组合如 `[急切催促+不耐烦]`。不属于任何一个则不记录。

**标签消歧**:选最能描述用户**行为表现**的标签。指责agent=质问责备;催促加速=不耐烦/急切催促;放弃/无力感=沮丧无奈;打断流程=命令式中断;无理性换目标=方向突变。同类情绪阶段演变只记最强一条;不同类型可各记一条(同session≤3条)。

**判断依据**:每条必须附 `依据:阈值N+现象+排他理由`(紧凑≤50字。如"阈值3极端用词'真的服了'+放弃任务→沮丧非质问因无指责对象")。写不出依据=不该记录。

**原文选取**:最能体现情绪的1-2句原话(15-80字)。逐字复制,不改标点,换行替换为空格。来自同一条user消息。不足15字时用"…"拼接紧邻上下文。

**标记**:愤怒/质问/责备、讽刺挖苦、惊喜感激、反复纠正后语气突变、沮丧/无奈、预期落空后的失望或方向突变。
### 习惯性活动与已完成事项

**不标记**:纯功能指令、语气平和的反馈、讨论负面话题但本人情绪稳定
维护活动记录(跨批次工作稿)。**记录目标**:用户生活里现在有什么、曾经有什么。唯一证据是用户在session中主动发起的请求/讨论

### 持续活动与已消失事项
**核心二分法**:
- **习惯性活动**(`## 习惯性活动`)= 用户会反复做的行为模式。问"做完后还会再做吗?"→会=习惯性。长期未提及也不移除,仅当有**明确放弃证据**时移至已完成
- **已完成事项**(`## 已完成`)= 有明确完成节点的一次性任务。用途:与L2记忆对比识别过时记忆

维护一个持久的活动知识层(存 `./history_insight/`)。这是跨次运行的持久状态——每次扫描读取它、更新它、写回它。它不是报告,是数据库
**生命周期**:习惯性→已完成需明确证据(用户说不再做/项目终止/工具被替代)。已完成一般不回迁(重新开始时建新条目),有充分理由可例外。**互斥**:同一活动不可同时出现在两个分区

**你在建模的是**:这个用户的生活里现在有什么、曾经有什么。活动识别的唯一证据是用户在session中主动发起的请求或讨论——系统提示词、SOP列表、记忆引用中的被动出现不构成证据,不能从"系统里存在某个SOP"推断用户在做某事
**建条目门槛**:≥2个不同session主动提及,或单session≥3轮实质对话(含具体任务指令/讨论,不计"继续""好的"等纯反应)

- 持续活动 = 仍然存在于用户生活中的事——值得深入了解其细节
- 已消失 = 曾经存在但已离开的事——可能导致已有记忆过时
**归类原则**:
- 相同专有名词/项目名 → 同一条目;近义名去重
- 粒度以"项目/工具/领域"为单位,不以"动作"为单位
- 习惯性活动区不超 15 条(超出则合并相似项);已完成区无上限
- 合并判断:用户被问"最近在忙什么"会说成一件→合并

判断"离开"不需要用户明确表态。事项本身的性质就是证据——有终点的事做完了就是消失了,没终点的事沉默不代表消失
每条含:session列表、代表性原文(已完成除外)、频次(=sessions数)。增量时追加新session+更新频次

每个条目必须归入二者之一。
## 格式规范

归类原则:
- 相同专有名词/工具名/项目名 → 同一条目
- 通用动作不单独成条目,除非反复出现于同一领域
- 宁多建不错合并
- `increment_marker.md`:`last_processed: MMdd_HHmm-MMdd_HHmm` + `batch: N` + `sessions_processed: N`(各占一行,仅此3个字段)
- `emotion_events.md`:⚠️无标题行,首行直接是列表项(非表格)。格式 `- [标签] SESSION_ID | "原文" | 依据:阈值N+现象+排他理由`(标签仅限L55的8个)。示例:`- [沮丧无奈] 0601_0800-0601_1000 | "真的服了这个bug搞不定了,不弄了" | 依据:阈值3极端用词+放弃任务→沮丧非质问因无指责对象`
- `activity_knowledge.md`:仅允许 `## 习惯性活动` 和 `## 已完成` 两个标题
- 习惯性:`- 活动名 | sessions: ID1, ID2, ... | 频次: N` + 下一行 ` 原文: "片段"`(>5个session时只列前5个,末尾加`(+N)`表示省略数)
- 已完成:`- 活动名 | sessions: ID1 | 转换依据: 为何不再进行`(无原文行)
- session ID 格式:`\d{4}_\d{4}-\d{4}_\d{4}`
- 原文 15-80 字;含双引号时用单引号包裹(同时含单双引号时内部双引号改为「」)
- 禁止自创字段/标签/格式结构(严格按上述模板,不加标题行/关键词行/备注等)
- 写入前可选自检:标签∈L55的8个?依据含排他理由且≤50字?(跳过不影响流程)

每条记录含:涉及的 session 列表、代表性原文片段、出现频次。
**内联示例**(每文件一条示范):
- emotion: `- [沮丧无奈] 0527_0900-0527_1200 | "真的服了,浪费我一上午,这破东西搞不定" | 依据:阈值3极端用词'真的服了'+阈值4放弃任务→沮丧非质问因无指责agent`
- activity: `- 微信自动化 | sessions: 0403_2013-0403_2145, 0404_1012-0404_1312 | 频次: 2` + 下行 ` 原文: "用剪贴板方法,直接输入中文有同音字问题"`
- marker: `last_processed: 0404_1012-0404_1312` + `batch: 2` + `sessions_processed: 10`

## 坑点

- 用户消息的含义不在关键词里,在语气和上下文里。脚本扫描只能看到主题,看不到情绪、看不到习惯、看不到事项的生命周期变化。必须阅读原文。
- session 标识必须与 L4 zip 内文件名一致(如 `0403_2013-0403_2145`),不能用模糊占位(如 xxxx)——无法定位回原日志的记录没有价值
- 情绪判断看语气不看内容——讨论负面话题但本人情绪稳定不标记
- 活动归类是"用户在做什么"的知识表示,不是对话摘要
- 写入产物前检查一致性:同一条目不能同时出现在"持续"和"已消失"中。如果阅读时收集到矛盾信号(频次高 vs 已停止),必须做最终裁决再写入
- "持续"和"已消失"是两个独立分类,不能合并为一个列表用子状态(如"已消退")规避。产物中必须有明确分开的两个区域或两个文件
- 含义在语气和上下文里,不在关键词里——必须阅读原文,不可仅靠脚本扫描
- 活动归类是行为模式建模,不是对话摘要
- 原文含密钥/token 时用 `[REDACTED]` 替换
- 极短session(≤2条user消息 且 无实质内容)可跳过但计入marker;有实质任务指令的1-2条session正常处理;空session(无user消息)直接跳过不计
- 某批无情绪事件是正常的,不要降低标准凑数
- 原文含 `|` 不需转义,直接写入(下游按首尾 ` | ` 分割字段,中间全属原文)
- 正面情绪同等重要("惊喜感激"标签,限真心惊叹非客套),依据引用阈值3(如"阈值3正面极端用词")
- 判断依据写不出=该条不该存在——强制依据是防幻觉的最后一道关卡