Perslis 项目 · Perslis Floor

试点版 · 1.1.2

基于你自己的数据,
给出精确答案。

只需提出一次问题:模型编写计算流程,Floor 验证它,由人工批准,你保留一个经过签名的工具。此后它在你的机器上离线、精确地回答,推理环节不调用任何模型。数据不足以支撑精确答案时,它会拒绝回答。

PERSLIS FLOOR● 录制
you> How much have we paid, by vendor region?

→ tools/call derive_demo_paid_by_region
← DERIVED · model_calls: 0
  Central  11215.45
  East     21576.59
  South     4800.25
  West     32996.02

rows → filter(status = paid) → join(vendors) →
group_by(vendors.region) → sum(amount)

录制自 1.1.2 发行版的 MCP stdio 会话。演示数据为虚构数据,随下载包提供。

回答时不调用模型每个答案都带有 model_calls: 0,以及生成它的确切计算流程。
要么精确,要么拒绝十进制精确运算。数值列中的 N/A、含糊的日期、重复或无法匹配的关联键,都会被点名拒绝。
经过签名与审核每个工具都通过八项检查,经人工批准,并使用 Ed25519 签名。

为什么构建它

关于数据的大多数问题,其实是算术。

我们在每个区域付了多少钱?前三大供应商是谁?有多少发票没有采购单号?这些都不是推理问题,而是对你已经掌握的数据进行计数、筛选和求和。把它们交给模型,意味着每次调用都要付费,得到的却是一个无法核对的数字——而这个答案本来就是可以核对的。

Perslis Floor 只在模型真正有用的地方使用它:读懂一次问题,从封闭的词汇表中组合出计算流程,绝不编写代码。此后,你机器上的小型运行时每次都会精确执行该流程,并展示计算过程。它源自我们的符号地板研究。

清晰可见的流程

提问、组合、验证、批准、运行。

  1. 你的问题用你自己的话提出:“我们在各供应商区域分别付了多少钱?”
  2. 规格,而非代码模型组合出一条流水线:筛选 → 关联 → 分组 → 求和。
  3. 准入关卡八项检查:列真实存在、数据可信、结果确定、有据可依,并且验证器必须拒绝错误答案。
  4. 人工审核审核人阅读工具计算内容的文字说明,以及它在真实数据上的答案,然后决定是否批准。
  5. 你的机器签名后的工具通过 MCP 在本地运行。无网络、无密钥、无模型。
为什么需要人工?准入关卡能证明一个流程“按其写法”是正确的,却无法证明它“表达的正是问题的含义”:一个名为“已付款总额”、却筛选 status = open 的规格,能通过所有机械检查。因此,在有人阅读并批准之前,任何工具都不会发布,而且这份批准会被签名进工具中。事后修改工具、它所读取的表或审核记录,批准即告失效。

构建过程中的发现

那些看起来像答案的失败。

关卡能证明流程,却证明不了含义。

一次对抗性审查发现:一个标注为“已付款发票总额”、实际却在累加未付款发票的规格,通过了全部自动检查。因此现在每个工具都必须带有经签名的人工批准;工具、数据表或数据快照一旦改变,批准即告失效。

最初的“有据可依”检查拒绝了正确的工具。

在一万行贴近真实的数据上,我们尝试的四个正确规格全部被拒绝:检查只扰动前 25 行,而匹配的行在更后面。现在它扰动真正参与计算答案的行,并且针对每一类问题都在这一规模上做了测试。

浮点数与静默丢弃:看起来对,其实错。

9,007,199,254,740,992 加 1,结果没有变化。一次关联操作静默丢掉了一张 900 美元的发票,报告为 100 美元。现在运算采用十进制精确计算;无法匹配的行会被拒绝,除非工具明确规定了处理方式。

下载旁边的校验和,什么也证明不了。

能替换压缩包的人,也能替换它的校验和。现在发行版使用 Perslis 发布密钥签名,该公钥在两个地方公开;安装脚本拒绝任何验证失败的文件——我们用一个被篡改的镜像测试过。

构建状态 · 2026 年 9 月 26 日

今天可以测试什么。

能力当前证据与限制
运行时与 MCP 服务器标准库 Python 3.9+,无依赖、无网络代码。300 多项自动化测试在 Python 3.9 与 3.13 上通过;一次真实的 Claude Code 会话调用了构建好的工具包,返回了精确答案,并把无法回答的问题记录为缺口。
数据支持 CSV、TSV、JSON、JSONL、SQLite 或包含它们的文件夹;数据变化时自动重新读取。在 50 万行(18 MB CSV)上实测:加载约 1.3 秒,内存约 400 MB,首次查询约 2.3 秒;重复查询使用缓存。默认上限 100 万行。
准入与审核八项检查的准入关卡,之后由审核人用自己的密钥签署人工审核;运行时会拒绝任何缺少有效审核签名的工具。9 月 26 日经过四轮对抗性审查;1.1.2 修复了全部发现,每一项都由回归测试固定。
签名与发行工具使用 Ed25519 签名,运行时只能验证。发行版校验和经过签名,可用 ssh-keygen 验证;构建可逐字节复现。
尚未支持相对日期(“最近 30 天”)、带参数的工具、直接数据库连接,以及自助式准入关卡。针对你的数据的工具目前通过试点提供。

试用

先验证,再安装,从演示开始。

在发布签名核对通过之前,不运行任何代码。先下载安装脚本与签名的校验和,用下方的 Perslis 发布密钥验证(GitHub README 中公开的是同一把密钥——请对照两处),然后再运行安装脚本:它会下载压缩包、再次验证、解压到 ~/perslis-floor,并运行演示——虚构的发票与供应商数据,附带六个经过审核和签名的工具。

V=1.1.2; B=https://github.com/AgewellEPM/perslis-floor/releases/download/v$V
curl -fsSL -O "$B/install.sh" -O "$B/SHA256SUMS" -O "$B/SHA256SUMS.sig"
echo 'releases@perslis.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJfmXcRm2o52skHrajOCntbGMwPIB13CWnzt/tRGxXxd' > perslis_signers
ssh-keygen -Y verify -f perslis_signers -I releases@perslis.com -n perslis-release -s SHA256SUMS.sig < SHA256SUMS
grep ' install.sh$' SHA256SUMS | shasum -a 256 -c -
bash install.sh

我们不提供 curl … | bash 形式的命令:从某个分支直接管道执行脚本,会在任何验证之前就运行它。安装完成后,将其连接到 Claude Code,用自然语言提问:

claude mcp add perslis-floor-demo -- python3 ~/perslis-floor/floor-serve.py \
    --data ~/perslis-floor/demo/data --tools ~/perslis-floor/demo/tools

针对你的数据

发送数据导出与你的问题,换回一个工具包。

准入关卡与签名密钥保留在 Perslis,这是有意为之:一个被错误签名的工具会自信地、离线地、永久地给出答案,而再也没有任何环节去复查它。试点流程是:你发送数据导出(CSV、JSON 或 SQLite)和你的问题;我们构建每个工具、逐一审核并签名;你得到运行时、你的工具,以及一份五分钟即可读完的指南。需要判断而非算术的问题,会被标注为“需要模型”——绝不会以猜测作答。

所依据的标准

以下为协议与密码学参考,并非背书。

更多 Perslis 项目:Jira Monkey · 全部工具。