全部作品

03 / 04

独立产品 · 开源

2026.05 – 今

Reggia

记忆由人策展,Agent 按需读取。

一个个人 AI 入口。长期背景与当前事项由用户自己维护;Agent 只在需要时读取,并且说得出读了什么。它反转了 AI memory 的方向:由人,而不是模型,决定什么是信号。

角色
独立完成:产品定义与开发编排
周期
2026.05 – 今
形态
本地运行的 Web 应用,单用户
技术
FastAPI · 原生 JavaScript · SQLite · Notion API
状态
日常自用,开源
链接
GitHub
Reggia 主界面:左侧是会话列表,中间是基于个人情境给出的回答,右侧是带优先级与截止时间的当前事项
Reggia · 主界面会话、基于 context 的回答与当前事项在同一屏。用户看得见 Agent 正在基于什么工作。
先查约 100 tokens 的目录,再决定要不要读 5K 至 30K tokens 的全文
2级读取
ReAct 循环的上限。复杂度停在能被读懂的地方
8轮
向量库与嵌入管线。没有 AI 替用户决定什么重要
0
从问题定义到可运行的原型
1次冲刺

01问题Problem

模型看见一段对话,人活在一段连续的情境里。

通用聊天产品从对话里猜测什么值得记住,把稳定的背景、当前的任务和偶然的一句话混在同一层。另一条主流路径是向量检索式 RAG:把资料切片、嵌入,再按相似度召回。它的问题不在效果,而在召回过程对用户不可见,也不可干预。用户不知道 Agent 读到了什么,更无法撤回。

Reggia 选择相反的方向:结构由用户亲手策展,Agent 按领域、优先级与敏感级别按需读取。读取路径必须可以解释。

比较项模型自动记忆向量检索式 RAGReggia
谁决定记什么模型,从对话里挖掘相似度,从切片里召回用户,写下来并随时修改
用户看得见吗大多看不见看不见召回了哪些切片看得见。存储是人能读、能改的页面与事项
代价稳定背景与临时状态混在一层不可控,不可解释要先花力气写下「什么重要」

02定义Definition

先路由,再索引,最后才读全文。

长期记忆按工作、研究、思想与个人四个域组织;短期记忆是一组带状态、优先级与敏感级别的进行事项。两者硬分层,也都是两级读取:先用低成本的目录判断相关性,再只取回答真正需要的内容。结构化的 context 不是越多越好,而是让每一次读取都有理由。

两级读取 · 永远先 L1,后 L2
记忆L1 · 索引L2 · 详情
长期背景四个域的章节标题目录,约 100 tokens一个域的完整页面,5K 至 30K tokens。每轮最多读一个域
当前事项事项列表,通常约 200 tokens单个事项的备注与细节

03编排Agent loop

产品规则,直接写成 Agent 读的规则。

Agent 是一个最多八轮的轻量 ReAct 循环:推理,选工具,读观察结果,再决定继续还是回答。没有额外的编排框架。状态转移直接表现为 SSE 事件,所以界面能区分推理、行动、观察与最终回答,而不是只显示一个旋转的图标。最初的引擎是在容器里编排 Claude Code 子进程,文件系统只读隔离;后来换成进程内的轻量循环,旧引擎保留为可选项。

backend/agent_loop.py系统提示词节选
# Sensitivity
- agent-readable: use freely
- contextual: reasoning only, never surface
  in third-party output
- private: skip entirely

# Updating
Never silently mutate. Propose changes
explicitly and call append/update endpoints
only after {name} confirms.

Available tools: {tool_list}.
Always prefer L1 over L2.
backend/agent_loop.py工具白名单
TOOL_EXECUTORS = {
    "reggia_index": _exec_reggia_index,
    "reggia_longterm_index": _exec_reggia_longterm_index,
    "reggia_longterm_read": _exec_reggia_longterm_read,
    "reggia_items_list": _exec_reggia_items_list,
    "reggia_item_detail": _exec_reggia_item_detail,
    "web_search": _exec_web_search,
}

executor = TOOL_EXECUTORS.get(name)
if executor:
    result = await executor(**args)
else:
    result = json.dumps(
        {"error": f"unknown tool: {name}"})

真实实现节选,有删节。敏感级别、写入前必须确认、读取的成本顺序,这三条都是产品决定;它们以模型能执行的方式写下来,而不是只写在文档里。

04边界Fit

说清楚它不适合谁。

适合

  • 对自己的方向与优先级已经有清楚判断的人
  • 希望模型带着个人背景工作,但不想让它挖掘自己的对话
  • 更信任人能读、能改的存储,而不是不透明的向量
  • 愿意先写下什么重要,换取之后的完全控制

不适合

  • 想要零维护的记忆
  • 需要团队共享的上下文。Reggia 是单用户的
  • 希望 AI 帮自己找回已经忘掉的线索

05结果与回顾Outcome

控制权正确,不代表策展体验已经正确。

Reggia 已经是我自己每天使用的 AI 入口。它验证了一个更克制的假设:准确性与用户信任度,不只来自更强的模型,也来自用户能维护、检查并撤回的 context。

回顾:主动维护 context 的摩擦比预期高。「写下什么重要」对多数人仍然是高门槛的动作。下一版会加入策展引导:Agent 可以提问、归纳并提出修改建议,但不能静默写入。控制权的归属不变,上手的路径可以更缓。