4.6 KiB
4.6 KiB
记忆整理 SOP
核心原则:存在性编码
LLM自身是压缩器+解码器。L1只需让它意识到某类知识存在,它就能通过tool call自行取用深层内容。
L1本质:用最短词数表达——什么场景下有什么记忆可用(存在性)。
L1两类内容,统一ROI评估:
- 存在性指针:指向L2/L3知识的最短触发词
- 行为规则:不提醒就会犯的错(致命/高频均可,只要ROI过门槛)
ROI = (不放这几个词的犯错概率 × 代价) / 每轮词数成本
快速判断
该留:反直觉触发词——没提示就想不到去查SOP的场景词。如tmwebdriver_sop(httponly cookie):没有httponly cookie这个词,你不会想到取cookie要查tmwebdriver
该删:
- 名字翻译:
proxy-pool/(代理池)→ 名字自解释,括号是废词,直接proxy-pool即可 - 内容描述:
opencli_sop(66站点CLI,复用Chrome session)→ 实现细节属于SOP内部,不是触发场景 - 直觉能力:不提醒也能想到 → 0收益,白交每轮成本
- 冗余:L3已覆盖的规则 / L1其他行已含的片段
压缩四原则
- 命名自解释 > 加描述:SOP名能说清的,L1不加注释;改名的ROI常高于改L1
- 推论:极低ROI且文件名自解释的条目可不单独列入L1,但仍需被原则2的集合包含住,靠集合触发词+ls兜底
- 存在性集合最小描述:多个相近条目若可被同一上位场景覆盖,用集合名表达这类能力的存在,不必平铺子项。如
qq操作/飞书操作/企微操作→im操作:*_im_sop;子项名自解释则只列名不翻译 - 条目 = 场景↔方案存在性:如
视频理解:yt-dlp取字幕、fofa(资产测绘)——场景名是触发词,方案名编码存在性;括号内只放反直觉触发词,非反直觉的(纯翻译/内容描述/实现细节)全是浪费- 触发词判定:假设用户说出这个词,你能否想到去查对应SOP?能→直觉(不需要);不能→反直觉(必须留)。如
game_download(百度网盘):用户说"百度网盘下载",没这个词你不会想到game_download→必须留
- 触发词判定:假设用户说出这个词,你能否想到去查对应SOP?能→直觉(不需要);不能→反直觉(必须留)。如
- 分层归位:L1内部调整位置——带行为规则或高频高ROI的条目放上方场景行,纯存在性指针归L1下方平铺列表。归位≠移出L1,存在性不可丢
整理流程
- 逐行读L1,按
|拆片段,先分类:存在性指针 / RULES / 翻译 / 内容描述 / 实现细节 / 冗余 - 先清RULES:逐条问“这是全局高ROI,还是特定场景低危险规则?”
- 全局高ROI → 留
- 特定场景 / 低危险 → 降级到L3或删除
- 再清存在性指针:检查是否在表达场景↔方案存在性;场景触发词只在反直觉时才加,翻译/内容描述/实现细节删掉
- 审计幽灵条目:L1指向的L3文件是否真实存在?不存在则按ROI决定删除或补建文件
- 禁值存储:L1括号内禁放参数值(IP/端口/凭证等),这些属于L2,L1只编码存在性
- 检查L3文件名是否自解释;能靠改名解决的,不靠L1加描述;最后验证总行数 ≤ 30
红线:记忆修改是持久性伤害,错误每轮复利。L1只能patch词级别修改,禁overwrite 产生误导应及时修正L1或记忆更名
L2 瘦身流程(冗余长段→L3,事实无损)
适用:L2 某段冗长(服务器/工具详情),需压缩但禁丢事实。
- 先迁再压:把该段完整事实迁到/合并进 L3 专属 SOP(已有同主题 SOP 就并入,勿重复建,先
ls ../memory/查),L2 只留 6-9 行"连接方式+服务端点+高频坑+指针(见 xxx_sop.md)"。 - 迁移后同步 L1 加新 SOP 名(自解释即可,勿加冗余括号)。
- 每节独立闭环:迁移→压 L2→同步 L1,再进下一节,限制失败半径。
- 验证:核对 6 项(每个新 SOP 文件存在 & 已入 L1)、L2 无遗留脏字符、总行数下降。
坑:L2 历史脏字符导致 file_patch 匹配失败
- 现象:
file_patch连续报"未找到匹配旧文本块",但肉眼看 old_content 与文件一致。 - 根因:老记录行首可能混入真实的多余
|(或全角/箭头字节差异),复制时看不出。 - 排查:
for i,l in enumerate(lines): print(i+1, repr(l[:20]))用 repr 看真实字节。 - 解法:改用 Python 按行号切片替换:
lines=open(p,encoding='utf-8').read().split('\n'); assert lines[a].startswith(...); newlines=lines[:a]+repl+lines[b:]; open(p,'w',encoding='utf-8').write('\n'.join(newlines))。前后加assert startswith双锚点防错位,改完 repr 复核。此法顺带清脏字符。