[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-79990":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":13,"stars7d":13,"stars30d":13,"stars90d":14,"forks30d":14,"starsTrendScore":15,"compositeScore":16,"rankGlobal":9,"rankLanguage":9,"license":17,"archived":18,"fork":18,"defaultBranch":19,"hasWiki":18,"hasPages":18,"topics":20,"createdAt":9,"pushedAt":9,"updatedAt":41,"readmeContent":42,"aiSummary":43,"trendingCount":14,"starSnapshotCount":14,"syncStatus":44,"lastSyncTime":45,"discoverSource":46},79990,"relationship-candlestick-lab","ZhenyuanPAN822\u002Frelationship-candlestick-lab","ZhenyuanPAN822","把聊天记录画成K线图，看你和TA的关系曲线",null,"Python",75,7,3,0,9,2.71,"MIT License",false,"main",[21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"candlestick-chart","chat-analysis","chinese","claude","claude-code","claude-skills","data-visualization","deepseek","emotional-intelligence","fastapi","gemini","kline","lightweight-charts","llm","ohlc","openai","python","relationship-analysis","technical-indicators","wechat","2026-06-12 02:03:56","\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fpreview.png\" alt=\"聊天关系K线 · Relationship Candlestick Lab\" width=\"900\">\n\u003C\u002Fp>\n\n\u003Ch1 align=\"center\">聊天关系K线 · Relationship Candlestick Lab\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\u003Ci>把聊天记录画成K线图，看你和TA的关系曲线\u003C\u002Fi>\u003C\u002Fp>\n\n> 把两个人的聊天记录，压缩成一张 K 线走势图。\n\n**像读股票 K 线一样，读一段关系的变化。**\n\n> 小提示：导入数据时**强烈推荐使用 CSV**，尽量不要用 JSON——多数微信导出工具的 JSON 是给 LLM 微调用的格式，没有时间戳，跑不出 K 线。详见 [输入格式](#输入格式)。\n\n系统先对聊天记录里的**每一条消息**进行量化：\n一条冷淡回复会让关系价格下跌，一句暧昧称呼会让价格上涨，一次吵架会形成下探，一次解释和修复会把价格重新拉回。\n\n当每条消息都被转化成带时间戳的关系指数后，系统再把这些指数按 5 分钟、1 小时、日线、周线等周期压缩成 K 线蜡烛图：\n\n- **Open**：这个周期开始时的关系指数\n- **High**：这个周期内关系最热的时刻\n- **Low**：这个周期内关系最冷的时刻\n- **Close**：这个周期结束时的关系指数\n- **Volume**：这段时间的互动密度和情绪强度\n\n所以，一根关系 K 线不是模型主观生成的，而是由消息级指数路径自然聚合出来的。\n上影线代表关系曾经冲高但回落，下影线代表关系曾经下探但被修复。\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fpipeline.png\" alt=\"工作原理：聊天记录 → 逐条评分 → 聚合成 K 线\" width=\"780\">\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\u003Ci>↑ 不是直接判断\"喜不喜欢\"，而是先看每条消息让关系升温还是降温，再按时间聚合成 OHLC K 线\u003C\u002Fi>\u003C\u002Fp>\n\n---\n\n## 它能给你什么\n\n- **K 线 + 成交量**：每根 bar 看那段时间的关系强度变化、互动密度\n- **MA \u002F 布林带 \u002F MACD \u002F RSI \u002F KDJ**：你熟悉的技术指标，本地计算，零等待\n- **每根 K 线的事件归因**：鼠标悬停 → 「这天主要是 *亲昵 +1.4 \u002F 互动 -1.15* 在拉动」+ 4 条最有代表性的关键消息\n- **多个时间周期**：5m \u002F 15m \u002F 30m \u002F 1h \u002F 2h \u002F 4h \u002F 日 \u002F 周 \u002F 月 \u002F 季 \u002F 年\n- **历史分析记录**：每次跑过的任务都留在本机，随时回看\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fshowcase.png\" alt=\"关系K线实际效果：左侧主导维度归因 + 关键时刻 \u002F 中间 K 线 + 成交量 \u002F 底部 MACD \u002F 顶部多周期切换\" width=\"900\">\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\u003Ci>↑ 实际效果：悬停某根 K 线时，左侧自动展开归因——主导维度（互动 -10.20 \u002F 投入 +5.50）+ 那段时间的关键消息\u003C\u002Fi>\u003C\u002Fp>\n\n---\n\n## 准备工作：先导出你的微信聊天记录\n\n整个工具的输入是**两个人的聊天导出文件**——所以第一步是用一个微信数据导出工具，把你和某个人的对话导成 CSV（推荐）\u002F JSON \u002F TXT。\n\n推荐两个开源导出工具（任选其一）：\n\n| 工具 | Stars | 技术栈 | 描述 |\n|---|---|---|---|\n| [**WeFlow**](https:\u002F\u002Fgithub.com\u002Fhicccc77\u002FWeFlow) | 9.1k | TypeScript \u002F Electron | 本地微信聊天记录导出 + 年度报告应用，桌面 GUI |\n| [**WeChatDataAnalysis**](https:\u002F\u002Fgithub.com\u002FLifeArchiveProject\u002FWeChatDataAnalysis) | 1.1k | Python | 微信 4.x 数据解密、高仿微信界面，支持导出聊天记录、朋友圈、年度总结等 |\n\n> ⚠️ **导出时请选 CSV，不要选 JSON**。MemoTrace 等工具的 JSON 导出是 LLM 微调格式（无时间戳），本工具无法处理；CSV 才包含完整的发送者 \u002F 时间戳 \u002F 消息内容。\n\n> 其他可用工具：pywxdump、Memotrace 等。**任何能产出\"两个人对话表\"的工具都行**——只要列里有发送者、时间戳、消息内容三样。\n\n导出完拿到一个聊天文件就行，后面的所有步骤都基于这个文件。\n\n**不是微信也能用**：本工具只看\"两个发送者轮流发消息\"的结构，所以 iMessage \u002F Telegram \u002F Discord DM \u002F Instagram DM 等只要能导出成相同格式，一样能跑（详见下面 [输入格式](#输入格式)）。\n\n---\n\n## 一键启动\n\n> 前提：你电脑上有 **Python 3.9+**。\n> 没有的话去 [python.org\u002Fdownloads](https:\u002F\u002Fwww.python.org\u002Fdownloads\u002F) 装一个。\n> Windows 安装时记得勾上 *Add Python to PATH*。\n\n下载本仓库后，**在仓库目录下打开终端**（Windows: PowerShell \u002F cmd；macOS: Terminal），跑：\n\n```bash\npython start.py\n```\n\n`start.py` 会自动：检查依赖 → 缺什么就提示装什么 → 启动本地后端 → 帮你打开浏览器到 `http:\u002F\u002F127.0.0.1:7000`。\n\n> macOS \u002F Linux 上如果默认是 Python 2，请用 `python3 start.py`。\n\n打开网页后，会让你二选一：\n\n| | 适合谁 |\n|---|---|\n| **本地分析（Skills 模式）** | 你已经在用 Claude Code \u002F Codex 等 IDE，希望聊天数据完全不出本机 |\n| **在线分析（API 模式）**   | 想直接图形化操作，愿意把聊天发给所选模型厂商 |\n\n---\n\n### 如果你想手动控制每一步\n\n也行，传统三步：\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FZhenyuanPAN822\u002Frelationship-candlestick-lab.git\ncd relationship-candlestick-lab\npip install -r requirements.txt\n\n# 选装一个 LLM SDK（按你要走的厂商）\npip install anthropic              # 走 Claude\npip install \"openai>=1.30\"          # 走 GPT \u002F DeepSeek \u002F Gemini \u002F 国产八家\n\n# 启动\npython -m relationship_candlestick.cli serve\n# → 浏览器打开 http:\u002F\u002F127.0.0.1:7000\n```\n\n---\n\n## 两条工作流\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Ftwo-modes.png\" alt=\"Skill 模式 vs API 模式：一个偏本地隐私，一个偏网页直连\" width=\"780\">\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\u003Ci>↑ 一个偏本地隐私，一个偏网页直连——按场景选，不用纠结\u003C\u002Fi>\u003C\u002Fp>\n\n### 路线一 · 本地分析（Skills 模式）\n\n聊天记录全程不出本机。**适合敏感对话**。\n\n1. 在你常用的 IDE（Claude Code \u002F Codex \u002F GPT 桌面端…）里把本仓库的 `skill\u002FSKILL.md` 注册为 Skill\n2. 在 IDE 中输入 `\u002Frcl-score`\n3. Skill 会引导你粘聊天文件路径，然后自动跑：拆单字 → 聚合连发 → 逐条评分 → 反扩展回消息级\n4. 跑完会给你一份本机评分文件的路径\n5. **在仓库目录下跑 `python start.py` 启动网页**\n6. 浏览器自动打开后选「导入本地文件」，把刚才的路径粘进去\n\n> 推荐：Claude Sonnet 4.6 + effort `low`，或 GPT-5 系列 + effort `low`。\n> 1000 条消息约 7 分钟。\n\n### 路线二 · 在线分析（API 模式）\n\n让网页端直接调外部模型 API 跑。\n\n1. **在仓库目录下跑 `python start.py` 启动网页**\n2. 浏览器自动打开 `http:\u002F\u002F127.0.0.1:7000`，选「在线分析」\n3. 选厂商 + 模型，填 API Key，给聊天文件路径\n4. 进度跑完自动跳到 K 线页\n\n支持的厂商（每家都内置最新主流型号，也能自定义模型 ID）：\n\n| 厂商 | 协议 |\n|---|---|\n| Anthropic（Claude） | Anthropic SDK |\n| OpenAI（GPT） · DeepSeek · Google Gemini · xAI（Grok） · Moonshot（Kimi） · 通义千问 · 智谱 GLM · 字节豆包 · 百度文心 ERNIE · 任意 OpenAI 兼容端点 | OpenAI 兼容 |\n\n---\n\n## 输入格式\n\n支持 **CSV \u002F JSON \u002F TXT**：\n\n> ⚠️ **强烈推荐使用 CSV**。MemoTrace、pywxdump 等工具的 JSON 导出是给 LLM 微调用的格式（一组 `{\"conversations\": [{role, content}]}`，**没有时间戳**），本工具无法将其转成 K 线，会直接报错并提示你改用 CSV。\n\n- **CSV**（推荐）：微信导出 CSV、pywxdump、Memotrace 等都能识别\n- **JSON**：必须**带时间戳**。支持以下形式：\n  - 顶层数组：`[{timestamp, sender, message}, ...]`\n  - 包壳对象：`{\"messages\": [...]}` \u002F `{\"data\": [...]}` \u002F `{\"chat\": [...]}` 等\n  - JSONL（每行一个对象）\n  - 字段别名：`ts` \u002F `time` \u002F `StrTime` → timestamp；`from` \u002F `user` \u002F `talker` → sender；`text` \u002F `content` \u002F `StrContent` → message\n- **TXT**：每行 `YYYY-MM-DD HH:MM[:SS] sender: message`\n\n`examples\u002F` 下有三种格式的合成示例可参考。\n\n---\n\n## 项目结构\n\n```\nrelationship-candlestick-lab\u002F\n├── relationship_candlestick\u002F   ← Python 后端模块\n│   ├── pipeline.py             核心：预处理 + 评分 + 反扩展\n│   ├── server.py               FastAPI Web 后端\n│   ├── ohlc.py                 K 线聚合 + 每根 bar 的归因\n│   ├── indicators.py           MA \u002F 布林带 \u002F MACD \u002F RSI \u002F KDJ（纯本地）\n│   ├── parser.py               CSV \u002F JSON \u002F TXT 解析\n│   └── cli.py                  命令行入口\n├── frontend\u002F                   ← 前端单页应用\n├── scripts\u002F                    ← 流水线 CLI 脚本\n├── skill\u002FSKILL.md              ← Claude Code Skill 入口 + v3.1 评分规则\n├── config\u002Fdefault_weights.yaml ← 数值参数\n├── examples\u002F                   ← 合成示例数据\n├── tests\u002F                      ← 39 个 pytest 单元测试\n├── ARCHITECTURE.md             ← 架构 + 多厂商 API 接入清单\n└── README.md\n```\n\n---\n\n## 评分规则（v3.1）\n\n### 核心思想：相对评分，不是绝对评分\n\nLLM **不**打\"这条消息亲昵度 = 5\"这种绝对分（因为没有客观锚点）。\n它给每条消息**两个相对 delta**：\n\n- `delta_vs_prior` — 比**紧挨着的上一条**消息暖了 \u002F 冷了多少\n- `delta_vs_atmosphere` — 比**最近 20 条的整体氛围**暖了 \u002F 冷了多少\n\n为什么这么设计？\"这条比上一条暖一点\"、\"这条比这两天的氛围突然冷下来\"是人类能稳定判断的；\"这条值多少分\"则不是。\n\n### 10 个语义维度\n\n除了两个 delta，每条消息还要标一个**主导维度**——是哪个轴在拉动这条消息：\n\n| 维度 | 含义 | 推涨示例 | 推跌示例 |\n|---|---|---|---|\n| **affection** | 情感温度 | 宝宝 \u002F 想你 \u002F 晚安宝贝 | 单字\"哦\u002F嗯\" \u002F 呵呵 \u002F 无所谓 |\n| **engagement** | 互动投入 | 长回复 \u002F 主动延展 \u002F 秒回 | 敷衍短回 \u002F 转移话题 \u002F 拖延 |\n| **care** | 关心 | 关心身体 \u002F 记得对方细节 | 漠视处境 \u002F 嘲讽状态 |\n| **conflict** | 冲突（双向）| 道歉 \u002F 示弱 \u002F 让步（修复）| 阴阳 \u002F 翻旧账 \u002F 冷战（攻击）|\n| **tension** | 暧昧张力 | 试探 \u002F 吃醋 \u002F 打闹 | 明确划界 \u002F 拒推进 |\n| **investment** | 关系投入 | 主动约 \u002F 锁时间地点 \u002F 送礼 | 拒邀约 \u002F 取消计划 \u002F 找借口 |\n| **awkwardness** | 默契度（反向）| 接梗 \u002F 共笑 \u002F 流畅来回 | 尬聊 \u002F 答非所问 \u002F 突兀转场 |\n| **future_orientation** | 未来导向 | \"等寒假回来\" \u002F \"以后\" | \"先到这吧\" \u002F 拒谈未来 |\n| **vulnerability** | 暴露脆弱 | 分享秘密 \u002F 感情史 \u002F 弱点 | 回避深入 \u002F 筑墙 |\n| **shared_identity** | 内圈语言 | 用昵称 \u002F 用内梗 \u002F \"我们\" | 刻意外圈称呼 |\n\n> 注意：维度只用于**展示和归因**（鼠标悬停一根 K 线时显示\"这天主要是 *亲昵 +1.4* 在拉动\"），**不进入数学计算**。真正驱动 K 线的是两个 delta。\n\n### 评分尺度（每条消息都在动指针）\n\n真实聊天里**没有两条连续消息温度完全一样**。哪怕话题情绪看起来一样，也有微动：emoji-only 比文字轻一点、\"嗯\"在干货之后是小冷却、\"哈哈\"在对方笑话之后是小确认。所以默认 delta 是 **±0.2 ~ ±0.5 的小非零**，不是 0。\n\n| Delta 量级 | 含义 | 真实聊天里的频率 |\n|---|---|---|\n| **±0.2 ~ ±0.5** | 微波动——自然起伏 | **大多数消息都在这** |\n| ±0.5 ~ ±1.5 | 轻微但能感知的变化 | ~25% |\n| ±2 ~ ±4 | 明显能注意到的变化 | ~10% |\n| ±5 ~ ±8 | 大动作（试探 \u002F 邀约 \u002F 修复 \u002F 冲突）| ~3% |\n| ±9 ~ ±15 | 罕见标志事件（告白 \u002F 分手）| \u003C 1% |\n| `0, 0` | 真的完全不动——少用 | \u003C 15% |\n\n正是这些微波动让 K 线长出**影线**：上影 = 那段曾经冲高但回落，下影 = 那段曾经下探但被修复。\n如果 LLM 全部输出 `0, 0`，K 线就是一条平直线，所有故事都没了。\n\n### 框架做的事：时间衰减 + OHLC 聚合\n\n每条消息打完分后，本地 Python 框架按下面的公式递推关系指数：\n\n```\ngap_hours   = 距上条消息的真实时长\ndecay       = 1 - exp(-gap_hours \u002F 72)              # 72 小时半衰期\ndelta_blend = 0.5 × delta_vs_prior + 0.5 × delta_vs_atmosphere\n\nindex_t = prev_index × (1 - decay) + 50 × decay + delta_blend\n```\n\n含义：\n\n- **混合两个参考帧**：`vs_prior` 和 `vs_atmosphere` 各占一半，避免单一视角偏差\n- **时间衰减**：长时间不聊，关系指数自动往 50 基线回归——LLM 不用手动惩罚\"长时间没说话\"\n- **不夹紧**：指数可以突破 100，也可以跌破 0（罕见，但允许）\n\n之后按你选的周期（5m \u002F 1h \u002F 日 \u002F 周 \u002F 月 …）把消息级指数压成 OHLC：\n\n| | 含义 |\n|---|---|\n| **Open** | 周期开始时的关系指数 |\n| **High** | 周期内的最高点 |\n| **Low** | 周期内的最低点 |\n| **Close** | 周期结束时的关系指数 |\n| **Volume** | 那段时间的互动密度 × 情绪强度 |\n\n完整规则、Worked examples（密集 flirt 段、冷战段、单条事件三类示例打分）、边界情况见 [`skill\u002FSKILL.md`](skill\u002FSKILL.md)。架构和评分流水线见 [`ARCHITECTURE.md`](ARCHITECTURE.md)。\n\n---\n\n## 隐私\n\n- **本地分析**：聊天数据全程不出本机\n- **在线分析**：聊天文本会发送给你选的厂商。敏感对话请走本地分析\n- API Key 只在浏览器本会话使用，**不写入** localStorage\n- 文件路径**不写入** localStorage（早期版本会写，从 v6 起严格不写）\n- `.gitignore` 默认排除 `output\u002F`，分析结果不会被误推到仓库\n- 本仓库不收集任何遥测，不上报使用数据\n\n---\n\n## 它**不**能干的事\n\n- 不预测对方真实想法、不预测关系结果\n- 不做\"TA 喜不喜欢你\"这种主观判断\n- 它只读你能在聊天里看见的信号，给一个走势图\n\n如果你想用它来做决定，请先意识到这只是一种**事后视角的可视化**。\n\n---\n\n## License\n\nMIT — 详见 [`LICENSE`](LICENSE)。\n图表库 lightweight-charts 是 Apache 2.0。\n","Relationship Candlestick Lab 是一个将聊天记录转化为K线图的工具，用以分析两人关系的变化趋势。其核心功能是通过量化每条消息对关系的影响，包括情感温度、互动频率等，并按时间周期（如5分钟、1小时、日线等）聚合生成OHLC K线图及技术指标（如MA, Bollinger Bands, MACD, RSI, KDJ）。该工具基于Python开发，支持CSV格式的数据输入，适用于微信及其他即时通讯软件的对话分析。它适合用于个人间关系动态的可视化探索，帮助用户更直观地理解彼此交流模式随时间的变化情况。",2,"2026-06-11 03:58:48","CREATED_QUERY"]