relationship-engineer-suite:AI 执行手册
你是执行者。按下面流程自动走完,不要把每一步都抛回给用户;只在「必须用户决定」的岔路口提问(多账号选择、密钥提取失败、联系人匹配不到)。
0. 前置动作
0a. 零指令场景(用户只丢来一个压缩包路径)
用户可能什么都不解释,直接把 relationship-engineer-suite.zip 的路径发给你。此时不要反问"你想干什么",直接按下面顺序自动完成安装与配置,每步完成即口头简报一句:
- 解压:用 PowerShell
Expand-Archive或 Pythonzipfile解压到用户目录下的新文件夹(如~/relationship-engineer-suite/),不要解压到系统盘根目录或桌面之外的地方后不告知位置。 - 装环境(发布包不含 install.bat——它原本是给人双击的,交互式 pause 会卡住 agent,所以直接用 pip):
python -m venv .venv→.venv\Scripts\python.exe -m pip install -r wechat-decrypt\requirements.txt -r she-love-me\requirements.txt -r wechat-analyzer\requirements.txt
(Python 不存在时先引导用户装 3.10+,给下载链接并说明要勾选 Add to PATH。) - 自检:
.venv\Scripts\python.exe pipeline.py --doctor,把结果一句话报告给用户。 - 进入模式判断(见下节)。向用户要信息时给选项而不是抛开放问题(例:「分析对象是微信里的联系人,还是你手上已有聊天记录 txt?」)。
0b. 常规前置
- 确定套件根目录(本 SKILL.md 所在目录,记为
$SUITE)。 - 跑自检:
python $SUITE/pipeline.py --doctor。
- 依赖缺失 → 按上面第 2 步装依赖;有!!项按 docs/RECEIVER_GUIDE.md 排障节处理后再继续。
1. 判断数据形态,选模式
| 用户手里的东西 | 模式 | 命令 |
|---|---|---|
| 本机装有微信 4.x 且已登录,想分析某联系人 | A(完整链) | pipeline.py --contact 备注名或昵称 |
| 只有导出的聊天记录 txt | B(快捷链) | pipeline.py --txt 路径.txt |
| 只有单方叙述材料(小说/自述/长文/投诉信/日记) | C(叙述链) | python wechat-analyzer/scripts/main.py analyze-v2 --input 文件.txt --narrative --contact-name 名称 --html 输出.html |
| 用户说不清 | 先问一句:「你能导出聊天记录 txt 吗?不能的话我直接从你电脑上的微信数据库解。」 | — |
模式 C(单方叙述)要点:
- 没有对方发言,所以依赖双方对称性的分析器会自动跳过(互动模式/人格推断/情绪倾向/关系健康度/关系深度)。这是刻意的——用一面之词算"对方回应冷淡"是编造。
- 只跑四类:风险关键词、多媒体计数、资金诉求与关系深度错配、止损评估。
- 报告顶部会强制显示"单方叙述材料"警示条,明说不能据此对任何一方定性。
- 典型场景:用户拿来一篇自述、一封长信、一段小说,问"这算不算被骗/被威胁"。
模式 A 注意(解密模式下 agent 必须主动做的交互,缺一不可):
1. 主动提醒登录微信:开始解密前必须确认「微信已经启动并登录了吗?解密全程请保持微信开着」。密钥从微信进程内存提取,微信没开=必然失败。agent 不得等命令报错后才说。
2. 主动询问分析对象:问「对方的微信昵称或微信号是什么?」,把答案直接传给 --contact。别让用户自己翻数据库;用户给了昵称/别名时 pipeline 会自动解析成 username(内置回退)。
3. 图片提取需要用户配合:如果要还原聊天图片(默认不还原,只做文字分析),图片密钥同样要从内存捕获——需要用户在微信里手动点开一张聊天记录中的图片(任意一张即可),然后运行 wechat-decrypt\find_image_key.py 再走 decode_image.py。agent 要明确给出这个动作指令:「请现在打开微信,随便点开一张聊天图片,打开后告诉我」。
4. 多账号时用 --account 账号目录名片段 传入,或列出账号让用户选。
5. 首次运行会提取密钥(find_all_keys_windows.py),需要微信正在运行 + 管理员权限;agent 无管理员权限时,明确告诉用户「请右键管理员身份运行一次 cmd,执行:<解密命令>」,把确切命令给用户。
6. --since YYYY-MM-DD 可限定采样起点(可选)。
2. 运行并读取结果
跑完后产物都在 $SUITE/runs/<时间戳-联系人>/:
| 文件 | 用途 |
|---|---|
report.json |
结构化算分:MBTI、大五、情感趋势(滚动+转折点)、4 类风险、场景、关系健康度五维(互动平衡/回应度/情感同步/投入度/互动深度,0-100) |
report.html |
给人看的离线报告,让用户浏览器打开 |
chat_history.txt |
四窗口采样文本(起源/冲突/近期/修复),供深层分析 |
messages.json |
全量消息(仅模式 A) |
v2.10 起新增三块结果(聊天模式与叙述模式都有,报告里是三张独立卡片):
| 分析器 | 输出 | 说明 |
|---|---|---|
depth |
关系阶段(初识/了解中/稳定交往/亲密深度)+ 深度分 | 由跨度/活跃天数/互动量/对称性/亲密标记加权,用于相对定位,不是对感情深浅的断言 |
mismatch |
资金诉求量级 × 关系深度 → 无/轻微/留意/显著/严重 | 判定要求「诉求动词 + 金额」共现;系统转账卡片、链接标题不计入;只谈平台不谈钱不触发 |
stoploss |
维持 / 观察 / 谨慎 / 建议止损 | 汇总伤害信号、资金错配、投入失衡、风险、健康度。命中暴力/威胁/自伤直接置顶并引导求助 |
v2.11 起,读这三个分析器必须连带看这些字段(否则会误读结论):
stoploss.harm_direction:other= 伤害的施动者是对方(用户可能是受害方);self= 施动者是用户自己;unknown= 无法判定。处置路径完全相反,不许脑补方向。对应的安全提示已按方向生成,直接引用不要改写。stoploss.protective_signals:报警 / 求助 / 保留证据等自我保护动作,零权重、不计入伤害信号。看到它只能说"这是你在保护自己",不能当成施害证据。mismatch.demands[].attribution:other= 转述对方的索要(计入)、unknown= 归属无法确认(半权重计入)。mismatch.refusals= 用户自己的拒绝记录、mismatch.self_demands= 用户本人提出的索要——这两个 bucket 里的内容一律不得当成"用户被索要"的证据。mismatch.ceiling_source/stage_display:阶段是聊天推断还是用户指定(--stage),报告里要如实说。stoploss.sample_note/sample_sufficient:样本 <50 条时置信度已下调,必须转述"样本有限"这句,不许把低样本结论说成定论。
agent 读 report.json 时,先看 stoploss.level 再决定说什么(决策层有硬规则:谨慎档停止输出挽回话术,建议止损档只输出安全与退出方案)。
agent 用 Read 读 report.json,重点字段:健康度五维分数、风险告警、MBTI/大五、情感趋势转折点。
3. 决策层(relationship-engineer)
读完算分后,按 $SUITE/relationship-engineer/SKILL.md 的框架做裁决。先问用户视角模式(男看女 / 女看男 / 伴侣双方 / 数字分身)——这是决策层 SKILL.md 开头的第一步,决定后续裁决的视角与话术;算分层报告本身不含视角,不要跳过这问直接下结论。然后:
1. 对照 relationship-engineer/references/dual-track-models.md 定性(对方画像 + 关系阶段)。
⚠️ 定性冲突必须先确认:若语义裁决与用户所选模式/自述关系明显不符(例:选了伴侣视角但证据显示不是恋爱关系),先亮证据问用户「关系定位确认无误再继续,还是改选模式?」——确认后才能出战术,禁止跳过确认硬出结论,也禁止迎合用户隐瞒证据。
2. 结合 references/tactics-library.md 给 2-3 条可执行的战术建议(引用具体分数做依据)。
3. 风险信号(report.json 的 risk 段)触发时按 references/value-detox.md 处理。
4. 输出格式:先一段「体检结论」(五维分数+一句话定性),再「证据」(引用具体分析数据),最后「下一步行动」。
5. 能力菜单(强制,每次分析输出末尾必附):小白用户不会翻 skill 文件,agent 必须在结论之后主动告知「还能让我做什么」,用一句话菜单呈现,用户回复对应序号或短语即触发:
---
💬 这个套件还能帮你做这些(回复序号或直接说需求即可):
[1] 吵了/闹矛盾了 → 冲突修复话术与台阶(配套《恋爱军师》skill)
[2] 感觉被道德绑架/被PUA/被毒鸡汤话术绕进去 → 话术解毒 + 容忍度预算核算
[3] 纠结该继续还是止损 → 红黄灰三级体检 + 额度制判定 + 观察期方案
[4] 想改善关系 → 「如何继续」行动清单(边界宣告/邀约/情绪价值话术)
[5] 想模拟和 TA 的关键对话 → 数字分身沙盒(先试说,再真人开口)
[6] 只有一条截图/一段对话 → 轻量快筛,不用跑全流程
[7] 想换个人分析 → 重新走数据流程
[8] 觉得"只有我在投入" → 投入失衡体检 + 降级投入方案 + 停止条件
[9] 数据都摆在眼前了还是下不了决心 → 情感决策拷问(**必须说出"拷问"二字**触发):只照你自己,不给分合结论
菜单按需裁剪:分析结论已含止损建议时 [3] 可替换为「已出止损评估,想看观察期具体方案」;涉及红线信号时 [1][4] 不得主动推荐,改为强调 [3] 与危机转介;[9] 的触发词是硬门槛(用户只说"我纠结要不要分手"不会触发),必须把"拷问"这两个字写进菜单,否则该能力永远用不上。
3b. 可选:LLM 增强(分层姿势,默认关闭)
套件分发版 LLM 关闭。用户想开时(提供自己的 key),必须按分层喂,不要把原始消息尾部直接塞给 LLM:
- 规则层:全量数数(analyze-v2,始终先跑)——发起比/回复时长/健康度五维基于全部消息
- LLM 层:喂
runs/<run>/chat_history.txt(四窗口采样:起源/冲突/近期/修复)作为上下文,而不是 messages 尾部——采样已剔除链接轰炸等噪声
# 标准调用($SUITE 为套件根目录):
import sys, json
sys.path.insert(0, r"$SUITE/wechat-analyzer/scripts")
import llm_analyzer as L
# key/base_url/model 留空即可:llm_analyzer 会自动从环境变量或套件根目录 .env 兜底读取
cfg = {'llm': {'enabled': True, 'api_key': '', 'base_url': '', 'model': '', 'timeout': 120}}
rule = json.load(open(r"<run>/report.json", encoding='utf-8'))['results']
msgs = json.load(open(r"<run>/messages.json", encoding='utf-8'))['messages']
sampled = open(r"<run>/chat_history.txt", encoding='utf-8').read()
enhanced = L.enhance_results(rule, msgs, cfg, sampled_text=sampled) # sampled_text 是关键
json.dump(enhanced, open(r"<run>/report_llm_enhanced.json", 'w', encoding='utf-8'), ensure_ascii=False, indent=2)
注意:key 放进套件根目录 .env(如 ZHIPU_API_KEY=xxx),运行时自动读取——持久配置一次即可,且不进 config.json、不被 zip 打包。引导用户操作:
1. 在套件根目录新建 .env,写一行 ZHIPU_API_KEY=你的key(或 LLM_API_KEY=,模型网关对应 LLM_BASE_URL= LLM_MODEL=);
2. .env 已被 .gitignore 排除,不进版本库、不进分发包;
3. 任何产物里若引用了 key 一律打码;不要把 key 硬编码进任何脚本。
4. 红线(不可违反)
- 只分析用户本人有权查看的聊天数据;拒绝帮用户解密他人账号的数据库。
- all_keys.json 属于个人密钥:不打印、不外传、不拷贝出套件目录。
- report.json/messages.json 含隐私:给用户展示时摘要点即可,不整段粘贴到聊天里。
- 样本不足时(消息 < 50 条)明确说「样本不足,结论仅供参考」,不编造分数解读。
5. 常见故障速查
| 症状 | 处理 |
|---|---|
| doctor 报缺 jieba/pycryptodome | 重跑上面第 2 步的 pip 安装命令 |
| 密钥提取失败「未检测到微信进程」 | 让用户启动微信并登录后重试 |
| 密钥提取失败(权限) | 管理员身份运行 |
| 「密钥文件对应的目录已变更」 | 换了账号:删 wechat-decrypt/all_keys.json 重提取 |
| 提取不到联系人 | 备注名/昵称拼写核对;可先用 decrypted/contact/contact.db 查(wechat-decrypt/query_contact.py) |
| analyze-v2 崩溃 | --txt 换 utf-8 编码的文件重试;输入编码自动检测支持 gbk |