Hacker News 中文摘要

RSS订阅

Local Indexing to reduce tool calling and token usage

Mac 版冥想盆(Pensieve for Mac)可在本地搜索文件、代码仓库和代理会话,并为编码代理提供上下文,一次搜索就能定位少数关键片段,而不必全局检索,减少工具调用与成本。它要求 Apple Silicon 和 macOS 14 或更高版本,免费且开源,可连接克劳德代码(Claude Code)、光标(Cursor)等代理。按下 Control+Shift 会浮出玻璃面板,覆盖文档、git 仓库与编码代理的对话,支持按语义或精确词搜索,选中结果后按 Control 即可用键盘完成操作。

正文

为你和你的 agent 全面加速

在本地搜索你的文件、repo 和 agent 会话,并为你的 agent 提供完成任务所需的最佳上下文。一次搜索就能把它们指向少数几段关键内容,而不是 grep 整个硬盘。工具调用更少,成本更低。

用你的 agent 安装 看看它如何工作

Apple Silicon · macOS 14 或更高版本 · 免费且开源

它连接到你已经在用的 agent:

  • Claude Code
  • Codex
  • Cursor
  • Gemini CLI
  • Windsurf
  • Claude Desktop
  • VS Code
  • 任何 MCP client

在本地搜索一切。

一次搜索,覆盖所有文件、repo 和会话

按下 Control+Shift,会在你的文档、文件夹、git repo 和与 coding agent 的对话之上唤出一个玻璃面板。可以按含义搜索,也可以按精确词语搜索。选中一个结果后轻点 Control,无需鼠标即可选择要执行的操作。

例如搜索 "retry" payments -draft:按含义匹配 payments,同时排除 draft。结果包括代码 payments/retry.py(位于 acme-app/payments,maxretryattempts = 5,精确匹配)、Incident review.md(位于 ~/Documents/Ops,内容涉及 card declines、retry with backoff,精确匹配)、Receipts 文件夹(位于 ~/Downloads),以及 Codex 会话 Refactor the auth flow。选中结果后可执行打开(Open)、在 Finder 中显示(⌘↩)、在地图中显示(⌥↩)或复制路径(⌘C)等操作;再输入 pricing model 则会按含义查找。

按含义搜索

用普通词语就能找到你真正想找的内容,即使文件里从未出现这些词。例如搜 rate limit。

精确匹配

引号内的短语按字面精确匹配。两者可以混用,让精确命中结果再按含义排序。例如用 -draft 排除 draft。

排除内容

减号用于排除某个词或引号中的短语,如 -draft。

缩小范围

用 kind:code、ext:pdf 等过滤到文件、代码或会话、某种文件类型,或用 in: 指定文件夹或 repo。

给你的 agent 的超能力

恰到好处的上下文,而不是整个硬盘

Agent 的表现取决于给它的上下文。通过 MCP 连接后,你的 coding agent 向 Pensieve 提一个问题,就能拿回少数几段关键内容及其文件和行号,从而用更少的工具调用从正确的代码开始。

没有 Pensieve 时,agent 先 grep 再读文件:问“为什么卡在拒付后重试会停止?”,在 acme-app 中 grep "retry" 得到 212 个匹配,然后依次 read payments/retry.py、payments/gateway.py、billing/invoices.py、tests/test_payments.py……还有 36 个文件,仍在找 backoff 规则。工具调用为 1 次 grep、40 次 read 且还在增加。

有了 Pensieve,只需一次搜索:问同样的问题,agent 调用 pensieve · search "card retry after decline",返回 payments/retry.py:42(stop on hard_decline)、payments/gateway.py:118(decline codes)、Incident review.md(why we changed it);再 pensieve · read payments/retry.py:42,得到“硬拒付会跳过重试队列。Maya Rivera 负责这块,详见 3 月 4 日的评审。”工具调用为 1 次搜索、1 次读取。

在下方基准测试中,使用 Pensieve 的 agent 每次查找平均 2.0 次工具调用,而 grep 为 3.4 次;144 次运行中有 82 次在单次调用后就给出了答案。

运行 pensieve integrate recommended 后,各 agent 的 MCP 会开启:claude-mcp、codex-mcp、cursor-mcp、claude(在 ~/.claude/CLAUDE.md 中加入“search before you grep”)、pensieve-search、claude-hook、claude-repo-check 均为 on。Agent 在启动时加载 MCP server,因此需重启已打开的 agent,它们才能获得 Pensieve。

按任务限定范围

在 repo 中启动的 agent 只能看到该 repo、它的 worktree 和会话。指定 scope 可以让它访问几个 repo 和一个规格文件夹。

精确或按含义

Agent 使用和你相同的搜索:按含义、按精确标识符,或两者结合,覆盖代码、文档和过往会话。

配合你的 agent

Claude Code、Codex、Cursor 或任何 MCP client,通过 stdio 使用 pensieve mcp,或通过 HTTP。pensieve integrate 会连接你 Mac 上的 agent,并加入“search before you grep”说明块和技能,其中可选技能会告诉你哪个队友熟悉相关代码。

实测,而非空谈

更少的搜索,第一步就找对文件

我们给 Claude Code 布置了相同的找代码任务,分别在有无 Pensieve 的情况下进行:任务是真实 repo 中预留的,规模从 500 到 35,000 个文件,用五种方式提问,从纯描述到精确名称和错误信息。使用 Pensieve 时,它找到的更多,工具调用更少,并且在每个 repo 中每次查找成本都更低。在超过 1,000 次测试查询中,一次搜索的中位耗时为 79 ms。

131 / 144 次运行使用 Pensieve 找到了正确的文件,而仅用 grep 时为 123 / 144。

减少 43% 的工具调用:每次查找 2.0 次,而 grep 为 3.4 次。

便宜 18%:每次查找 $0.041,而不是 $0.050,且在四个 repo 中都更便宜。

快 21%:每次查找 8.6 秒,而不是 10.9 秒。

正确文件位于首个结果

一次搜索(在没有任何 agent 参与前):在四类共 1,000 次测试查询中,答案作为首个结果出现的频率。对比一次 grep 与 Pensieve 搜索。

每次代码查找的 agent 成本

在四个真实 repo 中测量 Claude Code 里的 Claude Sonnet。Pensieve 在每个 repo 中都更便宜,且在最大的 repo 中节省最多。图表标签为 Grep, Glob and Read 对比 With Pensieve。

方法:通过 Claude Code 以 headless 方式运行 Claude Sonnet。任务由代码生成,并按找到的文件评分。“With Pensieve”是默认 agent 工具集加上 pensieve integrate 的说明块,测量时使用 Pensieve 0.5.6。两种配置在四个 repo(504、1,783、2,383 和 34,847 个文件)上运行相同的 72 个预留任务,每个跑两次,在同一批次中完成,因为成本取决于当时 Claude 的 prompt cache。这些任务从未被用于调优 Pensieve。成本是 Claude Code 报告的按标价计算的 API 成本。Pensieve 少用了 16% 的 token。

“正确文件位于首个结果”的图表和搜索时间来自另一项测试:在同样四个 repo(193,498 个已索引片段)上的 1,000 次查询,使用 Pensieve 0.6.3 测量。查询混合了以下测试用例:

  • 334 个简短问题:用普通词语,不含代码中的名称,例如 “email sent once when free trial ends, skip sync-only users”。Pensieve 将正确文件放在首位的比例为 44%,前 3 为 65%,前 10 为 80%。
  • 333 个精确查询:219 个函数或类名(91% 首位)和 114 条错误信息或代码中的其他精确字符串(83% 首位,而一次 grep 为 89%)。
  • 333 个混合查询:一个名称加几个普通词。Pensieve 将正确文件放在首位为 70%,前 3 为 94%。

总体上,67% 的查询正确文件在首位,84% 在前 3,92% 在前 10。对整个查询做一次 grep,只有 22% 能在首位找到,因为 grep 无法把普通词语匹配到代码。在这 1,000 次查询中,371 个来自我们用于调优 Pensieve 的任务,其余 629 个不是;两组结果相同(首位分别为 67% 和 68%)。在 Apple M4 Max 上,一次搜索中位耗时 79 ms,95 分位为 110 ms。基准脚本开源在 bench/;你可以在自己的 repo 上运行它们。

知道该问谁

看清谁负责什么

每个 repo 都是一张地图,每一行都有 git blame。询问任何主题,都能得到最懂该领域的人,以及每位队友最近在做什么。最快的答案往往是一次对话。

来自 blame 的所有权

谁写了各个区域,按今天仍然存在的行数加权。

领域知识

问一个主题而不是文件,得到代码与该主题最相关的人。

团队活动

每位队友在过去 90 天里交付了什么,以及你工作附近还有哪些区域尚未探索。

找出知识缺口

知道知识流失到了哪里

当编写某部分代码库的人不再活跃时,那部分知识就处于风险中。Pensieve 会标记这些区域,显示还有多少人了解它们,以及如今谁最了解。

acme-app / billing/tax

1 位活跃专家

2,140 行 · 上次重大变更在 7 个月前

Not active here · 78% Priya Nair · 14% Others · 8%

DK

Daniel Kim 自 3 月起不活跃

58%

LS

Lena Schultz 自去年起不活跃

20%

PN

Priya Nair 本月活跃 · 如今最了解

14%

建议: 在修改税务规则前先与 Priya 配对,并在 vat.py 中记录舍入逻辑。

一眼看清 bus factor

对 repo 的每个区域:有多少代码是由仍活跃在那里的人写的,以及这样的人有多少。

谁仍然了解它

在该区域行数最多的活跃人员,让你在修改前知道该找谁。

规划交接

在事故发生前发现缺口。让 agent 针对该区域起草缺失的文档。

(示例使用虚构姓名和数字。)

始终保持最新

修改文件,几秒后就能搜到

Pensieve 监听你的文件夹、repo 和 agent 会话,并重新索引发生变化的内容。未提交的编辑也算数,每个 worktree 都按分支跟踪,因此 agent 永远不会基于过时的上下文工作。

payments/retry.py acme-app 中的未提交更改,刚刚

New worktree: fix-backoff 与 main 不同的文件,按分支标记,12 秒前

Q3 planning.pdf 保存到 ~/Documents/Planning,1 分钟前

Price the annual plan correctly 正在运行的 Claude Code 会话中的新回合,2 分钟前

隐私优先的设计

你的工作留在你的 Mac 上

索引和搜索都在本地运行。你决定索引什么,AI 完全可选。

本地运行

设备端 embedding 模型和 ~/.pensieve 中的本地索引。它的 server 只响应这台 Mac,不响应你的网络或其他网站。没有账号,没有云服务。

可关闭任何来源

Agent、文件夹、repo 和 app 各自都有开关。关掉一个就会移除它索引的内容。

跳过机密

密码管理器导出、密钥、.env 文件和凭据永远不会被索引。

按需使用 AI

摘要和洞察是可选的。选择由谁生成,或完全关闭:

  • 内置 Qwen 3.5 9B(本地)
  • LM Studio 或本地 server(本地)
  • Claude Code 或 Codex(云端)
  • 关闭(本地)

获取 Pensieve

免费且开源。你的 coding agent 负责安装。

让你的 coding agent 来问

把下面这段提示粘贴到 Claude Code、Codex、Cursor、Gemini CLI、Qwen Code、Windsurf 或 VS Code 中:

Install Pensieve on my Mac by running sh -c "$(curl -fsSL https://tedhaley.ca/pensieve/install.sh)", then run pensieve integrate recommended. Then run pensieve setup, show me what it found, ask me which sources to index, and run pensieve setup with my choices. Open the Pensieve app and tell me when it's ready.

  1. 粘贴提示 到你使用的任意 coding agent 中。
  2. 你的 agent 安装它 先装 app,再为你 Mac 上的每个 agent 装好 Pensieve。
  3. 选择索引什么 你的 agent 会询问。在你选择之前不会索引任何内容。
  4. 按下 Control 和 Shift 在索引运行时也能搜索。索引很耗电,所以请插上电源。

版本 0.5.9 · Apple Silicon · macOS 14 或更高版本

问题

Pensieve 搜索什么? 你的文件和文件夹(Documents、Desktop、Downloads 以及你添加的任何文件夹)、你的 git repo(包括未提交更改和 worktree),以及 Claude Code、Codex 和 Qwen Code 会话。也支持 Obsidian 仓库,并可选支持 Apple Notes。一切都在你的 Mac 上索引和搜索。

Pensieve 如何帮助我的 agent? 没有它时,coding agent 常常 grep repo 并读取许多整个文件来找到相关内容,而读取的每个文件都要消耗 token。通过 MCP 连接 Pensieve 后,agent 问一个问题,就能拿回最相关的片段及其文件和行号,从而用更少的工具调用从正确的代码开始。在我们的基准测试中,这让每次查找便宜 18%、快 21%;见上面的测量结果。

Pensieve 会让 Claude Code 更便宜吗? 在基准测试中,使用 Pensieve 的 Claude Code 在 144 次运行中有 131 次找到正确文件,而仅用 grep 时为 123 次,工具调用减少 43%。每次查找总体便宜 18%,在四个从 504 到 34,847 个文件的 repo 中,每个都便宜 6–28%。基准脚本开源,你可以在自己的代码上运行它们。

怎么让 agent 用 Pensieve 而不是 grep? Agent 习惯用 grep。安装提示会运行 pensieve integrate recommended,它向 Claude Code、Codex 和 Gemini CLI 的指令文件添加一小段“search before you grep”,外加一个搜索技能和两个 Claude Code 钩子。你也可以在 Settings → Agents 中开启这些。开启后,agent 在我们最新基准测试的全部 144 次运行中都使用了 Pensieve。

哪些 agent 能和 Pensieve 配合? 任何 MCP client。pensieve integrate recommended 会为你连接 Claude Code、Codex、Cursor、Gemini CLI、Windsurf、Claude Desktop 和 VS Code。其他 agent 可通过 stdio 使用 pensieve mcp,或走 HTTP。可选技能还会建议哪些队友了解某个区域,并帮助围绕已有代码规划新代码。

它如何发现知识缺口? Pensieve 读取每个 repo 各个区域的 git blame 和近期提交历史。如果某个区域大部分行是由近期没有提交的人写的,就会被标记,同时显示有多少活跃人员了解该区域,以及他们中谁最了解。

有什么东西会离开我的 Mac 吗? 你的文件、代码和会话不会离开。索引和搜索在你的 Mac 上运行。Pensieve 只下载自己的模型并检查 GitHub 更新,这些都可以关闭。例外是如果你选择让 Claude Code 或 Codex 生成可选 AI 洞察,那些会标为 Cloud。使用内置模型、LM Studio 等本地 server,或完全不用 AI,则一切保持本地。

我需要 AI 模型吗? 不需要。搜索、agent 上下文、所有权和知识缺口都不需要模型。AI 洞察是可选的:可选择内置 Qwen 3.5 9B、LM Studio、Claude Code、Codex,或关闭。

Pensieve 免费吗? 是的。它在 MIT 许可下免费且开源。代码在 GitHub。

为什么 macOS 打开前会询问? 该 app 尚未经过公证(notarized)。如果 macOS 阻止打开,请打开 System Settings → Privacy & Security,然后点击 Open Anyway。只需操作一次。

它能在 Intel Mac 或 Linux 上用吗? App 需要 Apple Silicon。在 Linux 和 Intel Mac 上,同样的提示会安装后端和浏览器可视化工具。如果安装了 Xcode command-line tools,Intel Mac 也能获得搜索面板。

如何卸载? 先运行 pensieve integrate all --remove 断开你的 agent。然后退出 Pensieve,把它拖到废纸篓,并删除 ~/.pensieve、~/.local/share/uv/tools/pensieve 和 ~/.local/bin/pensieve。它的模型位于 ~/.cache/huggingface。

评论

多数人质疑这款本地语义索引工具的必要性和宣传文案,认为 grep/ripgrep 已经足够快、灵活且不过期,索引方案最多只是重复造轮子,甚至会返回过时结果。分歧主轴在于代码库膨胀究竟该靠架构卫生解决,还是该靠新的检索/索引工具打补丁;少数人则认可“召回历史会话并打开对应代理”等差异化点。

认为本地语义索引能省下代理反复 grep 的开销并按意图命中

  • 工具方主张,代理找代码实际是靠一遍遍 grep 精确字符串,代码库变大后每一轮都在烧 token;本地索引代码、文档和历史会话,通过 MCP 一次返回少数相关文件,避免“必须知道准确名字”的失败,比如问“计费提供商的限流在哪处理”时 grep 首轮命中率为零,长期能省下可观的查找成本(少数人)。 > 代理找代码其实是一遍遍 grep 精确字符串,问“计费提供商的限流在哪处理”第一次命中率是零,本地索引能首次就给出相关文件。(@TedHaley)
  • 另有做过同类本地索引工具的人认同这一思路,并补充向量索引还能做重复代码搜索,减少代理反复造重复辅助函数的问题;但其评测显示使用 map 命令只省下大约 10% 的 token,效果高度依赖任务类型(少数人)。

认为这类工具已经泛滥且多为氛围编码产物,不值得分发

  • 多人表示同类工具见过约二十个,而且每个月都有新冒出来;Cursor 曾上线类似功能后又移除。再加上 AI 让自制工具几乎零成本,单页站点一眼可辨是 LLM 生成,个人自用尚可,但几乎不值得分享或分发(较多人)。 > 我见过大约二十个这种工具,而且每个月都有新的冒出来。(@sheo)

认为它本质上只是 ripgrep,索引并不比 grep 更强

  • 反对者强调 grep/ripgrep 无需索引、永不过期、支持通用正则,已经能在单次工具调用里搜到相关片段;本地索引最多在理论上让搜索更快,却必然滞后于磁盘状态,切分支后会指向已不存在或行号错误的匹配,且每次切换都要重建索引,属于额外负担(高赞)。
  • 也有人直接嘲讽这工具,代表了一种认为它换汤不换药的社区情绪(较多人)。 > 它说白了就是 ripgrep,之后总会有人哭喊“它还能索引、还有很多功能”。(@deadbabe)

批评安装方式让用户让代理执行 curl 脚本并管道给 bash

  • 有人质疑安装指引实质上还是“下载脚本直接管道给 shell 执行”,只是改成让代理去做;这种做法延续了老的不安全习惯,也让整个页面看起来像玩笑或氛围编码产物(较多人)。 > 让用户叫代理去 curl 一个脚本再管道给 bash,不就是新版“curl 脚本再管道给 bash”吗?(@pcthrowaway)

质疑页面缺乏实现细节,尤其是是否下载嵌入模型

  • 有人问它是否要下载嵌入模型、具体是哪一个,并抱怨几乎没有说明它如何工作;这种对透明度和本地索引实现方式的怀疑,和“宣传文案像 LLM 生成、读起来不通”的批评相呼应(少数人)。 > 它会下载嵌入模型吗?如果是,用的是哪一个?关于它怎么工作几乎没有信息。(@febed)

认为工具是在掩盖代码库卫生和架构问题,而非解决根因

  • 有人认为加索引只是治标:真正的问题是任由 LLM 把代码揉成一团、忽视关注点分离和服务划分,才导致代码库膨胀、grep 变慢;只要稍微做好架构和代码卫生,收益远大于再加一个检索工具,若 grep 都成瓶颈说明开发方式本身有问题(少数人)。 > 这类工具是在给发霉的墙贴墙纸,代码库任由 LLM 糊成一团才需要索引;稍微做好架构和关注点分离,回报远大于再加工具。(@tinthedev)

认为召回历史会话并打开对应代理是有价值的差异化功能

  • 少数人肯定工具在历史会话检索上的改进:相比只用 funes 做对话搜索,能根据一次搜索召回某个会话并打开当初正确的代理,省去人工先开一个代理、开错再换另一个的麻烦(少数人)。 > 相比 funes,这个前端能召回某个会话并打开正确的代理,不用我先开一个代理、开错再换另一个,看起来不错。(@striking)

有价值的补充

  • 有人实测用 ripgrep 搜索约 11GB 的检出代码耗时约 0.2 秒,GNU grep 约 4 秒,主要因为后者不自动排除 .git 目录且只用单线程;这被用来说明 grep 本身已经极快,索引的提速空间有限。
  • 类似工具中,Hugging Face 的 funes 被一些人用作对话或会话搜索的常备方案;另一个自建工具 slopdex 用 treesitter 解析代码与文档、向量化后做语义搜索和“跨搜索”查重,能缓解代理重复造辅助函数的问题,但其 map 命令评测只显示约 10% 的 token 节省。
  • 有人推想,将来这类工具的推广页会优化给代理自己看:人类只说一句“请优化成本”,代理就会自己去找到并安装使用,人类甚至不知道也不关心。