# 它解决什么问题

AI agent 正在变得越来越强大,但它们有一个共同的盲区:它们不了解你。同一个 Claude Code,给十个人用,行为完全一样——不知道你的写作风格、工作习惯、项目优先级、人际关系。

Persome 的答案很直接:给你的 AI agent 配一本自动更新的工作日记。每次 agent 启动前,先翻翻这本日记,看看你现在在忙什么、跟谁合作、有什么习惯——而不是每次从零猜。

💡 核心理念 不是训练一个大模型来"理解你",而是用确定性算法 + 少量 LLM 调用,把屏幕活动数据组织成一个结构化的知识图谱。LLM 只用于语义理解部分,其他全是确定性代码。

# 五层模型结构

Persome 把"关于你"的信息组织成五个层级,每层都有明确的证据要求:

层级含义证据门槛生成方式
Point 一个具体观察或事件 原始捕获记录 增量提取 + 确定性门控
Line 实体之间的关系或趋势 引用验证 + 置信度 ≥ 0.5 增量提取 + 共现自动化
Face 有证据支撑的稳定行为模式 ≥ 4 条相关持久事实 L1 模式挖掘 (LLM)
Volume 跨域高阶结构 ≥ 2 次独立观察 L2 跨域综合 (LLM, 硬预算 8次)
Root 当前"你"的完整模型 活跃 Face × Volume × Profile L3 压缩合成 (LLM, token 预算约束)
⚡ 绝不编造 当证据不足时,模型标记为 degraded(降级)。不存在的 Root 永远不会被创建,已有的有效 Root 永远不会被空结果覆盖。

# 整体架构流水线

从原始屏幕捕获到最终人格模型,Persome 走的是确定性流水线 + LLM 辅助的混合路线。只有一个生产路径:

macOS AX watcher ──┐ 本地 PP-OCRv6 ─────┤ 可信 ingest API ──┼─▶ 捕获缓冲区 ──▶ 时间线分块 ──▶ 会话切割 手机数据桥 ────┘ │ │ ↓ 每5分钟规约器 · LLM #1 ──▶ 事件记忆 │ │ ↓ 窗口内存增量 · LLM #2 ──▶ 确定性门控 ──▶ delta_apply │ │ ↓ 模式挖掘 · 跨域综合 · Root 合成 LLM #3 — #N │ ┌─────────────────────────────────────┼──────────────────┐ │ │ │ ↓ ↓ ↓ 模型快照 (JSON) MCP 接口 /model 页面 HUMAN.md (渲染) 给 agent 读

# 数据捕获(纯确定性)

Persome 的捕获层不涉及任何 LLM 调用。全部走 macOS 原生 API 和确定性规则:

1 macOS Accessibility API mac-ax-helper
读取当前焦点应用的结构化界面信息——窗口标题、可见文本、URL。这是主信号源。二进制路径不可变,TCC 权限精确到每个文件。
2 本地 OCR 回退 PP-OCRv6 / Apple Vision
当应用(如终端模拟器)不暴露可读 AX 文本时,Apple Silicon 上通过子进程隔离的 PP-OCRv6 做屏幕 OCR。Intel 用 Apple Vision。必须用户明确授权 Screen Recording 才启用。
3 两种运行模式 daemon / ingest
Daemon 模式——自己监听系统事件。Ingest 模式——外部可信源发出数据,Persome 只做纯处理不做系统级捕获。两种模式在 S1 阶段汇聚到同一处理管道。

# 状态形成(确定性规则)

捕获的原始数据经过四步确定性处理,才能进入 LLM 阶段:

阶段做了什么LLM?
Parsers各应用原始结构→统一捕获记录格式❌
Timeline按 1 分钟一块分组,保证据源❌
Session 切割确定性规则切出有边界的工作时段❌
Writer 写入每5分钟增量规约,幂等写入持久态⚠️ 含一次 LLM 规约
🔒 幂等设计 会话切割、短时窗口回放、崩溃恢复都走同一个共享服务。同一套输入保证同一套输出——daemon、CLI、重试、safety-net 调用都一样。

# LLM 调用全明细

这是 Persome 最核心的设计决策:LLM 只用在需要语义理解的地方。以下是系统中所有 LLM 调用点,按流水线顺序排列:

1. 会话规约器 · 每5分钟

把时间线块(应用、窗口标题、操作)规约为 {summary, sub_tasks},写入事件记忆文件。这是最频繁的 LLM 调用。

📋 失败兜底:连续 5 次 LLM 失败后,确定性启发式按每个应用一个粗粒度子任务写入,标记为 heuristic。

2. 窗口内存增量 · 每新窗口

这是最重要的 LLM 调用——从规约好的窗口里提取实体、断言、关系、事件、用户别名。每条输出必须引用会话原文。返回的 JSON 通过 7 道确定性门控后才能进入持久存储。

LLM 响应格式 json_mode
{
  // 别名候选(需两次独立会话才激活)
  "owner_alias_candidates": [
    {"alias": "jay_dev",
     "source_kind": "owned_account",
     "quote": "Alice: @jay_dev 看看 HTTP 502 的情况",
     "confidence": 0.8}
  ],
  // 实体(必须引用原文)
  "entities": [
    {"ref": "Alice", "kind": "person", "quote": "...", "confidence": 0.95}
  ],
  "assertions": [{"subject": {"ref": "self"}, "text": "...", ...}],
  // 关系(封闭谓词集)
  "relations": [{"src": {"ref": "self"}, "dst": {"ref": "Alice"},
                   "predicate": "knows", "polarity": "+", ...}],
  "events": [{"title": "Fixed handle_payment HTTP 502 bug", ...}]
}

3. 行为模式检测

重复出现的事件证据积累到阈值后,LLM 验证是否构成稳定模式。单个出现不够——必须多次重复才触发。输出 skills/skill-*.md。

4. 案例提取器

找到"错误→解决"的窗口,用 LLM 提炼可复用的 Problem/Solution 卡。没有解析到错误就不调用 LLM。

5. 结构挖掘(Faces)

把持久事实跨域聚类。少于 4 条事实的 bundle 直接跳过。低置信度标记为 forming,不参与活跃模型。

6. 跨域综合(Volumes)

比较不同域下的 Faces,判断是否可合并。每次 build 最多 8 次 LLM 调用(可配置),用完了排队等下一次。

7. Root 合成

把活跃的 Face/Volume/Profile 证据压缩为 Root。失败或不输入绝不覆盖有效 Root。

8. 后台维护(默认关闭)

记忆压缩(超过 5% 名词丢失就拒绝)、记忆衰减、矛盾检查——这些默认不启用。

🎯 一张完整的工作会话 LLM 账单
一次 5 分钟的码代码会话(修 bug)触发 2 次 LLM 调用:

1. 会话规约器(写事件日志)
2. 窗口内存增量(提取实体/关系/事件 + 7 道门控)

模型构建(Faces/Volumes/Root)是异步后台任务,而非常驻调用。

# 确定性门控系统

LLM 返回的东西不能全信。Persome 在每次 LLM 调用后都跑一套严格的确定性门控:

🔗 引用验证
每项的 quote 必须在原文中逐字出现。没有 → drop。
📊 置信度下限
默认 ≥ 0.5 才保留。低于 → drop。
🔑 身份解析
ref 必须在 roster 中存在,或 new_entity 原文出现。
🚫 封闭谓词集
关系只能用 6 个预定谓词:participates_in、part_of、reports_to、knows、about、depends_on
👤 Self 不是实体
系统 owner 永远不是 entity。只能通过 self 出现在关系端点。
🏷️ 别名门控
别名必须来自 explicit_self_identification 或 owned_account。两次独立会话才激活。
🔄 共现 knows
同一会话中出现多个人物 → 代码自动生成 knows 关系(置信度 0.6),不需要 LLM 判断。
🪞 /model 自免
Persome 自己的 /model 页面输出不进证据。防止模型读自己的输出循环训练。
💾 先持久后验证 内存增量走 persist-before-apply 原则:先把 LLM 结论写进 audit row(状态 pending),再跑确定性 apply。失败可重试,永不丢审计轨迹。

# 存储设计与安全

数据存哪特点
捕获缓冲区capture-buffer/*.json有界,滚动淘汰
事件记忆memory/*.md人类可读,增量追加
搜索索引index.dbSQLite WAL + FTS5 + 向量
模型快照model-build.json含每阶段模型名、prompt hash、commit、失败记录
人类视图HUMAN.mdmode 0600,只有 owner 可读
脱敏导出exports/*.json默认脱敏路径和敏感文本
🔐 安全设计核心
• macOS 权限精确到每个二进制文件(不可变路径),不是笼统的 Accessibility
• HUMAN.md 写入 mode 0600
• 导出默认脱敏但不保证完全匿名
• 更新用同文件系统原子交换,崩溃可确定性回滚
• 最多一个 Root——架构级保障

# 暴露接口

💻 CLI
persome start|stop|status
persome model build|status|export
persome mcp
persome llm setup|status
🌐 REST API
健康检查、权限、状态、可信 ingest
/model 浏览器查看当前模型
仅 loopback 访问 + bearer token
🔌 MCP 协议 (Model Context Protocol)
search — 搜索记忆
read_receipt — 读证据详情
resolve_evidence — 解析证据链
process_pending_model_work — 批量后台处理
📸 模型快照
版本化 Point/Line/Face/Volume/Root JSON
API 返回机型可读结构
MCP 返回 agent 可读上下文
🔌 MCP 设计哲学
agent 通过 MCP 读取 Persome 的模型,但 Persome 完全不知道 agent 内部状态。它只暴露一个"关于你"的只读知识层,不耦合具体 agent 协议。这意味着任何支持 MCP 的客户端(Claude Code、Codex、Cursor 等)都可用。

# 关键设计哲学

原则具体体现
捕获与建模分离 捕获只收数据不做理解,建模只收结构化数据不做捕获。边界清晰,可分开调试。
确定性 > LLM 能走代码(会话切割、证据门控、共现关系、模型渲染)绝不走 LLM。LLM 只做语义理解,所有结果都要过代码门控。
证据链可追溯 每个结论都带 receipt(证据回执),可追溯到原始捕获记录。新证据可以强化、修正或推翻以前结论。
稳定覆盖不稳定 LLM 失败或返回垃圾,不会摧毁已有的有效模型。降级模式比编造好。
自治不越界 Persome 只做观察与建模——不做任务分派、通知、computer-use 等执行操作。边界在架构层面编码。
数据主权在人 所有数据在本地 Mac,Apache 2.0 开源可审计,导出脱敏。用户说自己删了就真删了。

# 快速体验

想自己试一下?5 分钟就能跑起来,不动你的真实数据:

git clone https://github.com/Intuition-Lab/personal-model.git
cd personal-model
uv run python scripts/sample_demo.py

然后打开 http://127.0.0.1:8743/model 就能看到模型结构。这用的是合成数据演示,不会碰你的个人数据。

# 延伸阅读

📄 架构文档
ARCHITECTURE.md — 完整数据流和运行时设计
📐 模型格式
MODEL_FORMAT.md — Point/Line/Face/Volume/Root 规范
🔌 MCP 协议
MCP.md — agent 接入接口文档
🧑‍💻 AGENTS.md
面向 coding agent 的开发指引,含 pipeline invariants
🏷️ 标签
Personal AI Memory Model MCP macOS Open Source Evidentiary Gate Deterministic Pipeline