AI 记不住"我妈对虾过敏"——它记的方式从根上就错了

  • 关联论文:2606.16707

你有没有这种崩溃时刻:

AI 助手和你聊到第 20 句,你说"我对虾过敏",它乖乖记下; 过两天你又提"我上周吃了虾没事啊",它又乖乖记下; 再过一个月,它看着这两条"事实",一脸真诚地告诉你:"你没说过你对虾过敏" 🤦

这不是 AI 健忘,是 AI 记东西的方式从根上就错了。

2026 年 7 月的 arXiv 2606.16707(User as Code, UaC)做了一件看似"返祖"的事:

别让 AI 用"向量"和"知识图谱"记用户,直接让它把用户写成 Python 代码。 状态是 typed object,规则是 typed function——记忆即程序,推理即运行

听起来像倒退三十年——AI 不该更"像人"吗?为什么要回到代码?

但恰恰是这套"老土"的范式,把 AI 在个性化助手这件事上一直被诟病的三个老毛病一次性全治了


一、AI 记用户的三种姿势,三种都不行

今天主流 Agent 记忆用户信息,基本就是三板斧:

1. 向量数据库(Embedding) 把每句用户的话变成一串数字,需要的时候做"相似度检索"。

✅ 单条事实召回还行(比如"用户喜欢猫"); ❌ 矛盾检测无能——上面那个"对虾过不过敏"的死结就是这么来的; ❌ 算不了数——用户问"我去年去了几个国家?",向量库只能"搜相似文本",准确率 6–43%(论文数据)。

2. 知识图谱(Knowledge Graph) 把事实节点化,用图查询语言(Cypher/SPARQL)拉关系。

✅ 关系明确; ❌ 写起来痛苦、查起来慢,工程上跟写代码没两样但又没代码灵活; ❌ 还是算不了数。

3. 事实袋(Bag-of-Facts) 每条记录是一句自然语言,"记得什么"取决于相似度匹配。

✅ 上手简单; ❌ 上面两种的毛病它全有——无法聚合、无法检测矛盾、无法主动触发。

共同的根本问题:记忆是"被动"的——你问什么,它才查什么。但现实里很多事是"主动的"——比如医生开药时,Agent 应该主动跳出来说"这药和你 3 个月前记录的过敏史冲突",而不是等用户问"我最近过敏过吗"。


二、User as Code 的核心思路:把用户写成一个"活的项目"

UaC 的主张简单到粗暴:

别记"事实",直接写代码。状态就是 typed object,规则就是 typed function。

它把每个用户建模成一个可执行的小项目:

user_model/
├── __init__.py
├── state.py        # 用户状态:类型化数据类
│                    # residence_country: str
│                    # allergies: list[Allergen]
│                    # medications: list[Medication]
├── rules.py        # 业务规则:Python 函数
│                    # drug.contains_allergen(allergen)
│                    # 冲突检测函数
└── memory.py       # 持久化逻辑(append-only log)

要回答"我去年去过几个国家?",直接:

international_trips = [
    t for t in user.travel_history
    if t.country != user.residence_country
    and t.date.year == current_year
]
len(international_trips)  # 直接计算,接近 100% 准确

这哪是"记忆",这是"运行"。

关键三件事:

  1. 类型化——allergies: list[Allergen] 不是字符串,是带类型的字段。新事实写入时类型系统可以自动检测"ShellfishNone"是不是冲突;
  2. 可执行——记忆本身就是程序,表示和推理是同一件事;
  3. 可校验——mypy / pyright 能在代码进入主流程前自动捕获类型错误,避免运行时崩溃。

三、UaC 为什么敢这么"复古"

你可能会问:"这不就是回到写代码了吗?AI 的意义在哪?"

UaC 的回答是:AI 的意义不是替代结构化,而是把结构化"自动生成"出来

具体做法:

  • Checkpoint 机制:每隔一段时间(每天 / 每周),LLM 读完整的 append-only 日志,自动生成或更新 typed Python 代码;
  • 类型检查门:生成的代码必须通过 mypy 校验才能进入主流程——LLM 写错了类型,系统拒绝上线;
  • Append-only log 永不覆盖:原始对话记录保留,代码只是"压缩视图",可以随时回滚。

形象地说:LLM 是"代写代码的程序员",类型系统是"严厉的技术总监",日志是"完整的历史账本"。

这样一来,LLM 不用真的"理解"用户——它只需要把理解翻译成代码,剩下的事交给 Python 解释器


四、这件事为什么重要——三个直接受益的场景

1. 个性化助手(消费级)

你希望 Siri / 小爱 / Alexa 是"了解你"的——不是"你说一句它记一句"的复读机。UaC 让助手真能算:"基于你过去 3 个月的睡眠数据,你明天应该几点起床"。

2. 医疗 Agent(高风险)

医嘱 Agent 必须在每次开药时主动交叉检查过敏史、用药冲突、其他病史。检索式记忆下,这需要 Agent 在"医生开药"的情境下主动记得去检索——实践上极不可靠。UaC 下,冲突检测是 if drug.contains_allergen(user.allergies): raise DrugConflictError,自动触发

3. 企业内部助手(B2B SaaS)

公司里有"员工福利规则""报销政策""休假规则"——都是强类型、强逻辑的规则。UaC 让"公司记忆"可以直接写成 Python,员工问"我能报销打车吗?",Agent 不再检索文档,而是直接执行规则函数


五、亮点与必须看清的边界

亮点:

  1. 范式跃迁:从"检索式记忆"→"可执行记忆",代差级提升聚合查询和主动推理;
  2. 类型系统天然防错:LLM 写错代码,mypy 兜底,运行时错误大幅下降;
  3. Append-only log 提供审计追溯:原始对话永不丢,可回滚、可解释;
  4. 工程友好:Python + mypy + pytest,所有现成工具链都用得上,不需要新基础设施。

局限(必须看清):

  1. 软性偏好难类型化:"我开会时喜欢安静思考"这种偏好,强行 enum 会爆炸,只能用 Optional[str] 兜底;
  2. Checkpoint 成本随 log 累积上升:几千条对话后,LLM 重新生成代码的成本会显著增长;
  3. 静默逻辑错误:mypy 抓不到 > vs ==,必须靠测试覆盖;
  4. 代码即攻击面:用户规则是 Python 代码,有注入风险,生产环境必须沙箱隔离;
  5. ~99% 准确率属数量级断言:原文未给精确数字,落地以原论文实验设置为准。

六、工程落地清单(可直接照搬)

✅ 阶段 1:用 dict + 函数模拟(最小可行,1 天搞定)
   user_state = {"allergies": [], "medications": []}

✅ 阶段 2:引入 checkpoint + 类型检查(2 周)
   append-only log → 每日 LLM 生成 typed code → mypy 校验

✅ 阶段 3:完整 UaC 范式(1 个月)
   引入 __setattr__ 自动触发规则 → 多用户隔离 → RestrictedPython 沙箱

5 个必踩的坑:

  • 🔴 每条规则必须有 pytest 用例——否则 LLM 静默错误的修复窗口极长;
  • 🟠 Checkpoint 设超时与回退——LLM 失败时不能阻塞主流程;
  • 🟠 Log 设最大长度(建议 500 条)并定期归档;
  • 🟡 沙箱隔离——RestrictedPython 或 subprocess,绝不能直接 exec();
  • 🟡 软性偏好用 Optional[str] 兜底——不要强行 enum 穷举。

总结

UaC 的核心价值不在"Python 多优雅",而在三件事:

  1. 把"记忆"从"被动检索"升级为"主动执行"——Agent 不再"等问才查",而是推理即运行;
  2. 用类型系统给 LLM 加"质检门"——LLM 写代码,mypy 校验,工程级鲁棒性;
  3. Append-only log 提供完整审计追溯——可解释、可回滚、可合规。

对做 AI 助手、医疗 Agent、企业 SaaS 的团队,这都是一个值得认真读+认真复现的工作——尤其是你已经被"AI 记不住矛盾信息"或"聚合查询总出错"折磨过的场景,几乎可以即插即用


三个标题变体

  1. AI 记不住"我妈对虾过敏"——它记的方式从根上就错了
  2. 别让 AI 用向量记你了——2026 这篇论文让它把你的记忆写成 Python
  3. Siri 永远不懂你,因为它记你的方式是错的——一篇论文把这件事根治了

小红书风格卡片文案(可直接发布)

🤖 AI 记不住"我妈对虾过敏"——它记的方式从根上就错了 😱

2026 年 7 月这篇论文(arXiv 2606.16707) 讲了一个每个用过 AI 助手的人都崩溃过的事:

AI 记东西的方式根本是错的 别让它用向量记你了——直接写成 Python 代码 💻

你以为 AI 记你,是这样:

  • 🗣️ "我对虾过敏" → ✅ 记下了
  • 🗣️ "我上周吃了虾没事" → ✅ 也记下了
  • 🤔 AI:"你没说过你对虾过敏啊" 🤦

但实际是这样的 🫥:

  • 向量数据库 → 每句话变成一串数字,只能"相似度匹配"
  • 知识图谱 → 事实节点化,但算不了数
  • 事实袋 → 一句句自然语言,矛盾检测无能、聚合查询崩溃

结果 6-43% 的准确率——用户问"我去年去过几个国家?",AI 只能搜文本,算不出数。

User as Code 怎么解 🔧:

一句话:把用户写成一个 Python 项目

user_model/
├── state.py     # 类型化数据类
│                # allergies: list[Allergen]
├── rules.py    # 业务规则:Python 函数
│                # drug.contains_allergen(allergen)
└── memory.py   # append-only log

关键设计 💡:

  • 类型化:allergies: list[Allergen] 不是字符串,类型系统自动检测冲突
  • 可执行:记忆本身就是程序,推理即运行 🚀
  • 可校验:mypy / pyright 自动捕获类型错误,LLM 写错就拒绝上线 🛡️
  • Append-only log:原始对话永不覆盖,可回滚、可审计 📜

回答"我去年去过几个国家?":

trips = [t for t in user.travel_history
         if t.country != user.residence_country
         and t.date.year == current_year]
len(trips)  # 直接算,~99% 准确

为什么重要 🛠️:

1️⃣ 个性化助手 — 主动提醒、自动聚合,不再"等问才查" 📱 2️⃣ 医疗 Agent — 每次开药自动交叉检查过敏史,挽救生命级别 🏥 3️⃣ 企业 SaaS — 公司规则直接写成 Python,员工问"能报销吗"直接执行 🏢

⚠️ 必须警惕的边界:

  • 🔴 软性偏好难类型化:"我喜欢安静思考"这种,只能用 Optional 兜底 🎭
  • 🟠 Checkpoint 成本累积:几千条对话后 LLM 重新生成代码成本暴涨 💸
  • 🟠 静默逻辑错误:mypy 抓不到 > vs ==,必须靠测试覆盖 🧪
  • 🟡 代码即攻击面:用户规则有注入风险,生产必须沙箱隔离 🔒
  • 🟡 ~99% 是数量级断言:原文未给精确数字 ⚖️

立刻能用的工程路线 💡:

✅ 阶段 1(1 天):dict + 函数模拟最小可行
✅ 阶段 2(2 周):checkpoint + mypy 校验
✅ 阶段 3(1 个月):__setattr__ 自动触发 + 多用户隔离 + 沙箱

📎 论文 ID:2606.16707

💬 评论区聊聊:你被 AI"记不住矛盾信息"坑过吗?愿意试试"把用户写成 Python"吗?🤔

AI科普 #智能助手 #Agent #大模型 #个性化AI #论文分享 #技术分享 #工程实践 #开发者 #研究者 #记忆系统 #Python