← 返回全部文章
·约 18 分钟PPT

Recall

配套媒体

本页对应的 PPT 与演示视频

recall-recommend.mp4
PPT
recall-recommend.pptx浏览器不能直接打开 PPT,下载后用 PowerPoint / WPS / Keynote 查看
下载没反应?点这里复制直链

侧边栏预览窗口(Electron webview)会拦截下载,把下面的链接复制到 Chrome / Edge 地址栏打开即可保存。

PPT../../recall-recommend.pptx
视频../../recall-recommend.mp4
本文目录
  1. 🚀 什么是 Recall?
  2. ✨ 核心功能一览
  3. 🛠️ 快速上手:5 分钟装好
  4. 安装 Recall 插件
  5. 配置自动保存(关键一步)
  6. 三个核心斜杠命令
  7. 完整代码示例(summarizer.py 核心算法)
  8. 📊 与竞品对比:Recall 为什么不一样?
  9. 💡 适用场景(3 个真实用例)
  10. 场景 1:跨会话续接 OAuth 调试
  11. 场景 2:50% Token 浪费问题
  12. 场景 3:3 人协作 vs 10 人团队的不同用法
  13. 🔄 Recall 工作流:四阶段全自动
  14. 关键工程亮点
  15. 🔐 隐私与安全
  16. 💰 定价方案
  17. 🎯 总结

📌 核心价值:每次开 Claude Code 都不用再重复介绍项目背景了

Recall = Claude Code 的"项目记忆外挂",完全本地保存、自动捕获会话、用经典 TF-IDF 算法压成 1-2K token 摘要,下次开会话 AI 直接续接上下文。

封面图


🚀 什么是 Recall?

Recall 是一款专为 Claude Code 设计的本地持久化记忆插件。它解决了一个很多人都在忍受却没人解决的痛点:Claude Code 每次打开新会话就像失忆——你得重新告诉它项目背景、技术栈、当前进度、卡在哪里。

Recall 用 4 个 Claude Code 官方钩子自动捕获会话行为(SessionStart 注入上下文、Stop / SessionEnd 触发保存),并在你的项目目录下生成两个文件:

文件 作用 写入策略
history.md 完整日志(用户提问、Claude 回复、涉及文件、执行的命令) append-only(持续追加)
context.md 紧凑摘要(目标 / 进度 / 待办 / 上次结束位置) 覆盖写入

核心定位:完全离线 + 零 LLM + 零 API Key,1-2K token 让 Claude Code 无缝续接上下文

开源协议:MIT | ⭐ Stars:623 | 🍴 Forks:34 GitHub: raiyanyahya/recall

GitHub stars GitHub license


✨ 核心功能一览

Recall 对比 CLAUDE.md 和 --continue 三种方案


🛠️ 快速上手:5 分钟装好

安装 Recall 插件

Recall 是标准的 Claude Code 插件(.claude-plugin/),不需要 pip install 也不需要配置环境变量。两条命令搞定:

# Step 1: 把仓库克隆或下载到本地任意目录
git clone https://github.com/raiyanyahya/recall.git

# Step 2: 在 Claude Code 中通过插件市场加载这个目录
# 在 Claude Code 输入框里直接粘:
/plugin add /path/to/recall

注意:路径必须是绝对路径,比如 D:/recall 或 ~/projects/recall

配置自动保存(关键一步)

在项目根目录创建 recall.config.json:

{
  "auto_save_context": "on_end",
  "max_history_lines": 2000,
  "redact_patterns": [
    "API_KEY=*",
    "sk-*",
    "ghp_*",
    "-----BEGIN .* PRIVATE KEY-----"
  ]
}

重点: auto_save_context: "on_end" 让 Recall 在每次会话结束时自动生成摘要,你完全不需要记得去执行 /recall:save,真正的"零摩擦力"自动化。

三个核心斜杠命令

/recall:save   # 手动触发摘要生成(写入 context.md)
/recall:show   # 打印当前 context.md 内容
/recall:log    # 查看 history.md 末尾 50 行

完整代码示例(summarizer.py 核心算法)

Recall 的核心是 TF-IDF + TextRank 算法,完全 vendored,不依赖任何模型:

from collections import Counter
import math
import re

def extract_summary(messages: list[str], target_tokens: int = 1800) -> str:
    """TF-IDF + TextRank 抽取式摘要,纯 Python 实现,约 100 行"""
    # 1) 分句
    sentences = [s.strip() for s in re.split(r"(?<=[.!?。!?])\s+", "\n".join(messages)) if len(s.strip()) > 8]

    # 2) 简单分词(中文按字符 bigram,英文按 word)
    def tokenize(s: str) -> list[str]:
        s = re.sub(r"\s+", " ", s)
        # 英文 word
        en_words = re.findall(r"[a-zA-Z]+", s)
        # 中文 bigram
        zh_chars = re.findall(r"[\u4e00-\u9fff]", s)
        zh_bigrams = ["".join(zh_chars[i:i+2]) for i in range(len(zh_chars)-1)]
        return en_words + zh_bigrams

    # 3) 计算 TF-IDF
    docs_tokens = [tokenize(s) for s in sentences]
    df = Counter()
    for toks in docs_tokens:
        for t in set(toks):
            df[t] += 1
    N = len(sentences)
    idf = {t: math.log(N / (1 + c)) for t, c in df.items()}

    def score_sentence(toks):
        if not toks:
            return 0.0
        tf = Counter(toks)
        return sum((tf[t] / len(toks)) * idf.get(t, 0) for t in toks) / len(toks)

    # 4) TextRank 迭代(Pagerank 简化版)
    # ... 这里省略约 60 行,详见 scripts/summarizer.py

    # 5) 按分数排序,截取到目标 token 数
    ranked = sorted(
        enumerate(sentences),
        key=lambda iv: score_sentence(docs_tokens[iv[0]]),
        reverse=True,
    )
    summary_parts, total_tokens = [], 0
    for idx, sent in ranked:
        est_tokens = len(tokenize(sent)) + 5
        if total_tokens + est_tokens > target_tokens:
            break
        summary_parts.append((idx, sent))
        total_tokens += est_tokens

    summary_parts.sort(key=lambda x: x[0])  # 恢复原文顺序
    return "\n".join(s for _, s in summary_parts)

完整 100 行实现见 scripts/summarizer.py,支持 numpy 加速(可选)+ 纯 Python 回退。两路径采用四舍五入分数 + 按位置打破并列,保证输出完全一致。


📊 与竞品对比:Recall 为什么不一样?

Claude Code 现在有 3 种"项目记忆"方案,很多人不清楚它们各自定位。下表横向对比一下:

Recall 对比表 7 维度

核心结论:

方案 一句话定位
CLAUDE.md 规则层:你告诉 AI "我希望你这么工作"
--continue / --resume 会话级:重载整段历史 transcript
Recall(推荐) 状态层自动化:自动捕获 + TF-IDF 摘要 + 1-2K token 续接

Recall 不是要替代 CLAUDE.md,而是补齐"动态状态"这一层:CLAUDE.md 写规则,Recall 维护状态。两个一起用,Claude Code 才真正"懂你的项目"。


💡 适用场景(3 个真实用例)

场景 1:跨会话续接 OAuth 调试

Recall 工作流:两次会话通过本地摘要引擎无缝衔接

痛点:你在 OAuth 回调上卡了 3 个会话,每次重启 Claude Code 都要重新粘贴堆栈、相关文件、已尝试的方案……

Recall 怎么用:

  • 第一次会话:把 OAuth 配置相关的 5 个文件给 AI,让它尝试不同的解法
  • Stop 钩子实时追加到 history.md
  • SessionEnd 钩子生成 context.md:
## 目标
修复 NextAuth OAuth 回调失败(state 参数被吞)

## 当前进度
- 已读文件:app/api/auth/[...nextauth]/route.ts
- 已排除:环境变量配置错误(验证过 .env.local)
- 当前假设:state 参数在 redirect 时被 strip
- 下次先看:/api/auth/callback 路由的 req.url 解析

## 待办
- [ ] 增加 console.log debug state 参数
- [ ] 检查 NextAuth v5 的 state cookie 设置
  • 重启 Claude Code:直接看到 context.md,自动续接"上次我们卡在 state 参数 strip 的问题"

效果:第二次会话完全不用重新介绍项目,AI 直接定位到你上次停下的代码位置继续分析


场景 2:50% Token 浪费问题

50% Token 浪费在重复上下文解释

数据触目:

  • 重启会话前重新介绍项目:5,000 – 15,000 token
  • 读 Recall 的 context.md:1,000 – 2,000 token
  • 节省 70% – 87% 的 Token

对按量计费的用户,比如 Claude API / Cursor Business / Claude Code 订阅——这直接关联真金白银。对订阅版用户,1-2K token 压缩让上下文能装下更多近期代码变更。


场景 3:3 人协作 vs 10 人团队的不同用法

没装 Recall vs 装上 Recall 的对话场景对比

个人开发者:当 ~/.recall/ 私有记忆,每项目独立 context.md。

小团队(3-5 人):把 .recall/ 整个目录 git push 到共享仓库,新成员 git clone 后立刻获得 AI 的项目上下文——比"老员工带新人"更快。

企业团队(10+ 人):每个代码仓库一个 context.md,配合 PR Review 时自动 commit 新的 context 增量,AI 始终理解"代码库现在到哪一步"。

注意:Recall 默认是单机的,多人协作需要团队约定 .recall/ 的提交策略——别让敏感 API key 通过 git 泄露。


🔄 Recall 工作流:四阶段全自动

Recall 四阶段全自动工作流

关键工程亮点

维度 实现
算法 TF-IDF + TextRank(2004 年成熟算法)— 故意不用 LLM
可选 numpy 加速 有则 numpy 更快,无则纯 Python(输出完全一致)
脱敏处理 写入前剥离 API_KEY=* / sk-* / ghp_* / PEM 密钥等
Hardened git 读取 禁用 core.fsmonitor、diff.external、钩子、分页器
写入路径限制 output_dir 强制保留在项目内部,禁止写到上级目录
范围限定 仅读取当前 cwd 对应的会话记录
Windows 兼容 三连修:`python3 ...
CI 质量门 Python 3.9-3.13 × with/without numpy、pytest、Bandit、CodeQL、密钥扫描

为什么用 20 年前的老算法? 因为这个场景只需要"准确提取关键信息",不需要"创造性生成"。20 年老算法 + 1-2K token 摘要 + 完全离线 = 比任何"AI 摘要工具"都省 token、都安全。


🔐 隐私与安全

Recall 是少数几个默认最隐私的记忆工具:

隐私保障 实现细节
❌ 无网络调用 摘要器只用 Python 标准库,不发任何外部请求
❌ 无 API Key 不需要配置任何第三方凭证
❌ 无遥测 不收集任何使用数据
✅ 写入前脱敏 自动过滤常见密钥形态(best-effort,非 100%)
✅ 输出路径锁定 禁止把 .recall/ 写到项目外部

唯一警告:如果你打算把 .recall/ commit 到 GitHub,请先扫一遍 context.md,确保没有把公司密钥或个人 token 写进去。 Recall 的脱敏是 best-effort,不替代人工 review。


💰 定价方案

Recall 100% 免费 + 开源(MIT):

  • ✅ 全部功能免费
  • ✅ 商用免费
  • ✅ 修改源码 / Fork / 二次分发都可以
  • ❌ 无 Pro 版 / 无企业版 / 无 SaaS 升级路径

GitHub 仓库:raiyanyahya/recall 开源协议:MIT


🎯 总结

Recall 把 Claude Code 的"会话冷启动浪费"问题彻底解决,用的是 20 年前成熟的 TF-IDF + TextRank 算法,完全本地、完全免费、完全隐私。

适用人群:

  • ✅ Claude Code 订阅版 / API 用户(直接省 token)
  • ✅ 长周期项目(多次跨会话续接)
  • ✅ 隐私敏感场景(金融 / 医疗 / 内部工具)
  • ✅ 重视"项目状态可追溯"的团队

不适合:

  • ❌ 偶尔用 Claude Code 的轻度用户(成本收益不高)
  • ❌ 需要跨模型记忆(当前只支持 Claude Code Hook)
  • ❌ 不想碰一行配置的用户(虽然配置只有 5 行 JSON)

推荐指数:⭐⭐⭐⭐⭐(满分 5 星)

立即体验:

git clone https://github.com/raiyanyahya/recall.git
/plugin add /path/to/recall
# 在项目根目录创建 recall.config.json(见上文)
# 重启 Claude Code,享受"自动记忆"

数据截至 2026-06-30,最新信息请以 GitHub 仓库 为准。