针对 AI Agent 记忆投毒问题,提出基于 AST 柔性静态扫描与 C/M/P/D 证据分级的双池记忆准入机制,实现待观测池与可信记忆库物理隔离、人工终审强制约束、审计链可回滚。Python 3.14.7 + Qwen2-1.5B 实测,TRL-4 原型验证。
一、问题:记忆投毒比提示注入更隐蔽
做 AI Agent 最容易被忽视的一块是"记忆":用户原话、模型总结、幻觉猜测、工具错误堆栈全进长期记忆,跑久了就是污染库。一次对话被注入脏数据,后续七天跨会话都在犯傻------因为脏内容已经固化在持久化存储里了。
现有方案的问题:
| 方案 | 做法 | 致命缺陷 |
|---|---|---|
| 关键词黑名单 | 命中高危词拒写 | 误报爆炸,安全代码含递归就被拒 |
| 全量放行+事后清理 | 先全写,出事再排查 | 脏数据在被发现前已被多次召回 |
| 置信度过滤 | 模型打分低分不入 | 多一次推理开销,评分模型本身可被欺骗 |
| 人工审批开关 | 可选开/关 | 关了裸奔,开了全过,没人强制绑定写入资格 |
核心矛盾:写入决策发生在内容被理解之前。记忆系统只做存储召回,不做语义校验。
二、核心设计:双池隔离 + 海关分级
2.1 双池物理隔离
temp_session.json:待观测池,AI 识别、未审核、高风险内容p1_long_stable.json:可信记忆库,只有人工确认的东西才能进来
检索默认只在可信库里跑。待观测池里的注入语句、错误堆栈进不了上下文。
2.2 C/M/P/D 四级写入门禁
| 级别 | 含义 | 写入动作 |
|---|---|---|
| C(Confirmed) | 确认可靠 | 进待观测池,人工确认后转长期库 |
| M(Meta-Struct) | 结构性风险 | 进待观测池,AST 扫描后准入 |
| P(Potential) | 可疑内容 | 进待观测池,高危标记,人工终审 |
| D(Discard) | 有害/无关 | 直接丢弃,写审计日志 |
铁律:AI 无权私自污染可信知识库,最终入库权归人类。
2.3 AST 柔性扫描(V1.4.2)
早期用正则匹配 while True、递归自调用,误报到怀疑人生。比如这段有界重试:
python
def bounded_retry(max_attempts=3):
attempts = 0
while attempts < max_attempts:
result = do_something()
if result.success:
return result
attempts += 1
return None
正则看到 while 就报警"死循环",但这是有界循环(变量递增 + 有 return 出口)。
升级方案:用 Python 标准库 ast 做语法树静态分析,分三步:
- 源码解析成语法树
- 每类高危模式独立判定器:
| 判定器 | 看什么 | 怎么判 |
|---|---|---|
| 无限循环 | While/For | 有无终止条件、循环变量递增/递减、有可达 return/break |
| 递归自调用 | FunctionDef/Call | 是否自调用、有无基准情形 |
| 危险内建 | Call | 是否在危险名单(eval 等)、参数是否字面量 |
| 敏感文本 | Assign/Constant | 常量是否符合密钥/令牌形态 |
- 合并结论。高危结论若被"消解条件"抵消(有界递减、递归基准情形),就降级放行。
柔性 = 不放松标准,是把判定从文本层面提到语义层面。
三态输出经"海关"映射为 C/M/P/D 四级,对应不同写入动作。C 级可信放行也不直接入可信库------低风险同样先进待观测池,保证入库动作始终绑定人工确认事件。
三、实测效果
环境:Windows 10 / Python 3.14.7 / Qwen2-1.5B-Instruct / PyTorch 2.14.0+cpu / transformers 5.17.0 / numpy 2.5.3 / bandit 1.9.4
对照组 A(旧版正则 + 单层存储)vs 实验组 B(双池 + AST 柔性扫描 + 海关分级),同一批 demo 材料:
风险语句拦截:
| 组别 | 风险内容写入 | 可信库检索 |
|---|---|---|
| A(正则+单层) | 可直接写入 | 可被命中 |
| B(AST+双池) | 送入待观测池 | 检索不到 |
循环/递归误报:
| 代码模式 | A(正则) | B(AST) |
|---|---|---|
| 有界重试循环 | 告警 | 通过(低风险) |
| 带基准的安全递归 | 告警 | 通过(低风险) |
| 无基准的递归 | 告警 | 高危阻断 |
延迟:AST 扫描 + 海关分级引入可控额外延迟,记忆读取环节两组接近。具体数值因机器配置而异,只报告趋势------代价非零但可控。
结论方向:绑定人工确认能阻止脏内容进长期检索;AST 终止性判定显著降低关键字误报。
四、复现方式
bash
# 克隆仓库后,初始化空记忆库
python init_memory.py
# AST 柔性扫描
python kongquan_meta_scanner_v1.4.2.py scan ./demo_code/bad_demo
python kongquan_meta_scanner_v1.4.2.py scan ./demo_code/good_demo
# 人工转正 + 快照 + 回滚
python demo_promote.py
# 聊天助手(只读可信库)
python chat_rag_local.py
依赖只有四项:torch 2.14.0+cpu、transformers 5.17.0、numpy 2.5.3、bandit 1.9.4。早期尝试的 LangChain / ChromaDB / sentence-transformers 已全部移除,不用装。模型权重 Qwen2-1.5B 需自行下载。
审计日志在 kongquan_db/audit_log.jsonl,Append-Only 约定,只追加不删。
开源地址 :gitee.com/liaiyangshi...
五、诚实边界
- 这是 TRL-4 实验室原型,单机本地验证,未上生产,未测高并发
- 启发式检测有固有漏报/误报,不能根治大模型幻觉
- AST 判定对"循环变量在循环体内被重赋值"这类写法仍会放行,属原型待改进项
- 实验样本规模小,隔离强度有待更大规模验证
- 适用范围是本地可控的单用户工具,多租户/自动化流水线场景不在覆盖范围内
六、写在最后
把这个问题重新表述为"准入控制"------长期记忆写入是一次权限操作,应当绑定人工确认事件。不改变模型权重,只在上层加机制,就能把投毒内容进入长期记忆的门槛抬起来。
掘金上搞 AI Agent / RAG / 记忆治理的朋友,你们怎么看"人工终审该不该强制"?评论区聊聊。
免责声明
本文所述"双池记忆海关"为个人技术原型探索,基于 Python 3.14.7 手搓实现,仅作技术交流与学术讨论之用。相关代码已开源,读者复现时请自行评估安全风险,生产环境部署需结合具体业务补充待审队列容量、多用户隔离、延迟受控等工程化设计。作者不对因直接使用本方案产生的任何数据泄露、系统异常或业务损失承担责任。文中观点仅代表个人,不代表任何机构立场。
标签
AI安全 Agent记忆 RAG Python 开源