bounded-systems/string-audit

GitHub: bounded-systems/string-audit

具备成本意识的类型化文案审计器,通过 content-hash 缓存和溯源校验,仅对变更内容触发 LLM 审计调用,防止 AI 生成文案中出现捏造事实和套路化痕迹。

Stars: 0 | Forks: 0

# @bounded-systems/string-audit 一个**具备成本意识且基于溯源的文案审计器**。每个字符串都是一个命名的、*有类型的* 符号; 审计按 type 进行范围划分;结果通过 **content-hash 进行缓存**,因此只有发生更改的文案 才需要支付(昂贵的)LLM 调用费用。重写内容无法凭空捏造事实——主张会与溯源来源 进行核对,绝非捏造。 ``` node audit.mjs # deterministic, offline, free ANTHROPIC_API_KEY=… node audit.mjs # real audits — only on cache-misses ``` ## 一个边界,四大特性 1. **是符号,非无结构数据 (blobs)** —— `pdp.hero.headline → { type: "headline", value }`。 **type 即契约**;它决定了应用哪些审计。 2. **基于 type 划分范围的审计** —— `headline` → 长度/冲击力;`cta` → 动作动词;`meta` → ≤160;`claim` → **grounding**(即“每个主张皆须证明”的检查)。 3. **内容寻址缓存** —— `key = sha256(auditVersion : type : value)`。未更改的 符号 → 命中缓存 → 跳过调用。只有自上次运行以来的差异部分会产生费用; 更新 `AUDIT_VERSION` 即可有针对性地使其失效。该机制可免费提供 `▲▼ 与上次运行的对比`。 4. **基于溯源,而非捏造** —— `claim` 只能断言 grounding 来源中存在的事实;未经溯源验证的 数字/评分/规格将被 *标记*,绝不会作为既定事实被重写。 ## Providers - **deterministic**(默认,离线)—— 本地检查;可复现;无需 API key。 - **anthropic** (`anthropic.mjs`) —— 当设置了 `ANTHROPIC_API_KEY` 时,在缓存 **未命中** 时 运行。通过 tool-use (`{score, findings}`) 实现结构化输出,采用具备成本意识的默认 模型 (`claude-haiku-4-5`,可通过 `AUDIT_MODEL` 覆盖),并在 系统 prompt 中强制实施 grounding。 ## 文案规范性检查 —— 确定性的文案校验 在每个符号、每次运行时执行(低成本,从不缓存): - **spell** —— 现代词汇表 ∪ `dictionary.txt` (品牌术语)。 - **grammar/style** —— write-good (检测被动语态、冗长、含糊其辞的词汇)。 - **ai-isms** —— 机器生成文案的套路化痕迹:`it isn't X — it's Y` 式对立句式、`the easy part … the hard part` (简单部分…困难部分) 句式、三段式 排比、破折号节奏、修辞性悬念片段、聊天机器人伪影/占位符,以及流行词填充 (`delve`, `seamless`, `leverage`, `unlock`, `robust` …)。这些模式与词库是 [`ai-tells.json`](ai-tells.json) 中的 **数据** (每条规则带有各自的 severity),因此 它们能够追踪上游语料库,而不是硬编码在代码中;而结构性特征 (破折号计数、首语重复、 三段式) 则保留在 `prose.mjs` 中。 - **overclaims** —— 绝对化、无法证实的语言,且与覆盖范围术语绑定 (`every privileged effect`, `always enforced`);请限定其范围或提供来源链接。这是 grounding 检查的 文案等价物 —— 普通正文中常规的 `never`/`always` 不会受此影响。 - **proofread** —— 拼写/语法检查遗漏的机械性失误:重复单词、双重/多余 空格、标点前空格、逗号后缺失空格、重复标点、 混用直角引号与弯引号。即那种“这到底有没有校对过?”的痕迹。 - **readability** —— 让你读不下去的文案:过长的句子,以及 (针对 `body`/`meta`) 依据 Flesch 阅读容易度判定为确实晦涩难懂的文案。用于衡量“我为什么要读这个?”的代理指标。 - **overlap** —— 文案重复或高度相似的符号。 每条发现都包含一等的 **severity** `{ level, msg }` —— `error` `✗` (准确性/诚实度:未溯源、拼写错误、overclaims) · `warn` `⚠` (ai-ism/proofread) · `suggestion` `·` —— 并且 `audit.mjs` 会根据 `level` 渲染相应的字形 (类似于 Vale 的严重级别)。 这些规则源于对公开文案的初步阅读 (“AI-isms 让我生不如死”;“不确定有没有 校对过”;“绝不声称具备 *every* 特权效果”)。基于 key 调用的 Anthropic 审计器也遵循相同的规则,因此 LLM 路径也会对其进行标记。 **现有技术。** 专门针对 AI 痕迹的 linting,[Vale](https://github.com/vale-cli/vale) \+ [`vale-signs-of-ai-writing`](https://github.com/ammil-industries/vale-signs-of-ai-writing) (实现了 [维基百科的 *Signs of AI writing*](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing)) 以更大的规模和置信度分级涵盖了同样的领域。我们的词库种子源自 该语料库;此处的差异化在于 typed-symbol 目录、content-hash 缓存, 以及 grounding/overclaim 检查 —— 这些都是普通文案 linter 做不到的。请参阅处于开放状态的 “adopt Vale” issue,了解如何将二者整合。 ## 复用 bounded-systems 技术栈 | 需求 | 基础组件 | |---|---| | 基于 hash-keyed 的结果缓存 | [`cas`](https://github.com/bounded-systems/cas) — 基于 SHA-256 的字节存储 | | 签名且可追溯血缘关系的派生 | [`anchored-chain`](https://github.com/bounded-systems/anchored-chain) | | typed symbol 目录 + 逐类型断言 | [`brand/content`](https://github.com/bounded-systems/brand) | | 预算感知 | [`prx`](https://github.com/bounded-systems/prx) | 本地的 `.cache/` (基于 SHA-256 键控) 已经是一个有效的 CAS;`cas` 包 + `anchored-chain` 血缘关系可以通过未命中路径上的同一套 get/put 接口无缝接入。 ## 存储后端 (`STORE=`) 使用相同的 `get/put/has` 接口,提供三种后端: - **`fs`** (默认) —— 内容寻址的文件缓存。 - **`cas`** —— 实现 cas 的 `BlobStore` 接口 (内容寻址的字节存储,去重) + 一条 anchored-chain 派生日志 (输入→输出的血缘关系)。 - **`socket`** —— 连接到 **挂载在处于 room 状态的 Unix socket 上的 store daemon**: node store-daemon.mjs & # 挂载 $ROOM/store.sock (默认为 .room/) STORE=socket node audit.mjs # 通过挂载的 store 进行审计 该 room (`ROOM=`,默认为 `.room/`) 是挂载点 —— 即 socket “门”的客满式 归宿;CAS 的 blobs/refs/lineage 数据就存放在 `/cas` 下。 ## 状态 v0.3 —— 可运行。已验证确定性 + 缓存 + grounding;Anthropic 路径已 实现 (使用 key 进行实时验证)。文案规范性检查套件 (ai-isms, overclaims, proofread, readability) 采用了数据驱动的 [`ai-tells.json`](ai-tells.json) 规则 + 一等公民级别的 severity。请参阅开放的 issue 了解生产化进度 (`cas`/`anchored-chain` 后端,真实的 `strings.json` 目录,可选的 Vale provider — #6)。
标签:DLL 劫持, GNU通用公共许可证, MITM代理, Node.js, SOC Prime, 内容审计, 大语言模型, 开发工具, 数据可视化, 文本处理, 自定义脚本