graphify记忆层完全指南:save-result与reflect如何让知识图谱"越用越聪明"
【免费下载链接】graphifyTurn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local deterministic AST parsing, every edge explained, no vector store.项目地址: https://gitcode.com/GitHub_Trending/graph/graphify
graphify 是一款把代码库、文档、SQL 模式与配置文件转化为可查询知识图谱的开源工具,也是 Claude Code、Cursor、Codex 和 Gemini CLI 的/graphify技能。它的记忆层由两个命令组成:save-result负责把每次问答归档为带信号的记忆文档,reflect负责把这些记忆确定性地聚合成一份 LESSONS.md 经验清单——无需向量库、无需 LLM,让 AI 助手在下一次会话开始时自动"想起"哪些来源可靠、哪些路是死胡同。🧠
什么是 graphify 的记忆层
graphify 的核心管线是:扫描 → 抽取 → 建图 → 聚类 → 分析 → 报告 → 导出,全部产物落在graphify-out/目录。而记忆层是在此之上的一圈反馈闭环:
- 写入侧:每次 AI 回答完问题,用
save-result把问答存档到graphify-out/memory/,并打上一个"结果信号"; - 读取侧:会话开始时跑一次
reflect,把所有记忆文档压缩成一份graphify-out/reflections/LESSONS.md,AI 读它即可快速定向; - 同步侧:可选安装 git post-commit 钩子,提交后自动重新生成经验文件,保持"记忆"与代码同步。
整个机制是确定性的:同样的输入必然产出字节级相同的 LESSONS.md,不依赖任何大模型,所以又快又便宜(实现见 graphify/reflect.py)。
save-result 三步上手:把问答存成记忆
在 agent 工作流中,一条典型的存档命令长这样(命令定义见 graphify/cli.py):
graphify save-result \ --question "支付重试逻辑在哪里?" \ --answer "在 retry_policy() 中,指数退避最多 3 次" \ --type query \ --nodes retry_policy PaymentService \ --outcome useful它会生成一个形如query_20260830_120000_支付重试逻辑在哪里.md的文件,落在graphify-out/memory/下,内部结构很朴素:YAML frontmatter(问题、日期、结果信号、来源节点)+ Markdown 正文(问答与结论),方便人直接阅读,也方便下一次--update时被抽取进知识图谱(存档逻辑见 graphify/ingest.py)。
三种结果信号:记忆的灵魂
--outcome参数只有三个取值(OUTCOMES = ("useful", "dead_end", "corrected"),见 graphify/ingest.py):
| 信号 | 含义 | 对图谱的作用 |
|---|---|---|
useful | 这个答案确实有用 | 相关来源节点加分 |
dead_end | 此路不通,别再试 | 相关来源节点减分,列入"已知死胡同" |
corrected | 答案被用户纠正过 | 减分,并把正确版本写入 Corrections 区 |
答错了也没关系——--correction "正确答案是…"可以把纠正内容一并存档,这正是记忆层最宝贵的数据。
reflect 一键聚合:LESSONS.md 是怎么生成的
graphify reflect # 默认读 memory/,输出 reflections/LESSONS.md graphify reflect --if-stale # LESSONS.md 已是最新则直接跳过(几乎零开销)reflect会扫描graphify-out/memory/下所有记忆文档(带 frontmatter 的才会被解析,外来 .md 会被自动跳过),按结果信号对每个来源节点做带时间衰减的加减分,最后渲染出五类经验(渲染逻辑见 graphify/reflect.py):
- Preferred sources(首选来源):被 ≥2 次不同
useful结果印证的节点——下次优先从这里查起; - Tentative(待验证):只被用过一次且有效的节点——可用,但先核实;
- Contested(有争议):既有正面又有负面信号的节点——按"最近一次"的胜负判定;
- Known dead ends(已知死胡同):被标记
dead_end的问题——别再重复推导; - Corrections(纠正记录):用户纠正过的答案,附正确版本。
两个关键参数:时间衰减与互相印证
--half-life-days(默认 30):每条信号的权重每 30 天减半。三个月前的"有用"抵不过最近一次"此路不通"——新鲜的失败比陈旧的成功更有分量(衰减公式见 graphify/reflect.py);--min-corroboration(默认 2):一个节点必须被至少 2 次不同的useful结果印证才能晋升为"首选"。一次存档无法凭空制造一条可信经验——这是防止记忆"自我吹嘘"的设计。
另外两点很贴心:若旁边存在graph.json,经验会按社区(主题)分组展示,同时自动剔除代码中已不存在的节点(经验不会指向已删除的函数);LESSONS.md 被刻意放在reflections/而非 wiki 目录,因为graphify export wiki每次运行都会清空wiki/*.md,放错地方经验文件就会被覆盖(设计说明见 graphify/reflect.py)。
git 钩子自动保鲜:会话开始只需一条命令
安装钩子后(graphify install),每次 git 提交都会自动重跑一次 reflect,让 LESSONS.md 与代码库保持同步(钩子实现见 graphify/hooks.py)。
因此在会话开始时,agent 只需执行:
graphify reflect --if-stale--if-stale会对比 LESSONS.md 与所有输入文件的修改时间,如果钩子刚刚刷新过它就直接跳过——所以"每次会话都跑一遍"的额外成本几乎为零。完整用法示例见 README.md。
学习覆盖层:.graphify_learning.json 是什么
当 reflect 同时拿到图谱文件时,还会在graph.json旁边写一个派生覆盖层.graphify_learning.json:为每个优选/待验证/有争议的节点记录状态、得分、来源轨迹(最近 5 条问答),并用源码文件的内容哈希做"新鲜度指纹"——文件一改,对应经验自动标记为stale,提示"代码变了,请重新验证"(覆盖层实现见 graphify/reflect.py)。
注意它只是只读投影:graph.json本身这份"结构事实"永远不被写入学习字段,经验与结构严格分离,删除覆盖层即可完全回退。
相关源码与文档清单
| 文件 | 作用 |
|---|---|
| graphify/reflect.py | reflect 核心:解析、计分、渲染 LESSONS.md、学习覆盖层 |
| graphify/ingest.py | save_query_result:记忆文档的写入端 |
| graphify/cli.py | save-result/reflect命令入口 |
| graphify/hooks.py | post-commit 钩子自动刷新经验文件 |
| graphify/skills/claude/references/query.md | 各平台 agent 的"存档+反思"工作流约定 |
| tests/test_reflect.py | 完整测试:从 frontmatter 解析到"第二次会话受益于第一次"的端到端用例 |
| docs/how-it-works.md | 官方工作原理说明 |
新手常见疑问 💬
Q:不装 git 钩子能用吗?能。手动跑graphify reflect即可,--if-stale只是让重复运行更省。
Q:LESSONS.md 需要人工维护吗?不需要。它是自动生成物,人工想留经验应写入save-result存档,再让 reflect 聚合。
Q:记忆会无限膨胀吗?时间衰减让旧信号自动"褪色",且代码中已删除的节点会从经验中剔除,记忆层随代码演进自然瘦身。
一句话总结:save-result记住每一次问答的成败,reflect把它们蒸馏成一份带时间权重的经验清单——graphify 由此从"静态知识图谱"升级为"会自我修正的知识图谱"。
【免费下载链接】graphifyTurn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local deterministic AST parsing, every edge explained, no vector store.项目地址: https://gitcode.com/GitHub_Trending/graph/graphify
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考