


开发AI智能体记忆服务,不让各用户的记忆混在一起
在开发或扩展AI智能体的长期记忆服务时使用。让每个记忆库彼此隔离,把摄取、检索和推理分开,并完成数据库迁移、API客户端更新、由另一个模型判定的测试,以及按租户或记忆库调整的设置。
要使用这个AI规则
## 区分记忆类型,不在记忆库之间混用数据
保持不同存储知识类型之间的区别,因为摄取、检索和推理会以不同方式使用它们。
### 对记忆进行显式建模
- 世界事实表示一般知识。
- 经历事实表示归属于某个用户或智能体的个人事件。
- 心智模型整合从多项事实中归纳出的模式。
- 允许每个记忆库携带背景上下文,以及怀疑倾向、字面主义和同理心等按1–5分衡量的倾向特征。
- 只将倾向特征应用于反思性推理;不得让它们改变事实回忆。
### 隔离各记忆库
- 将每个记忆库视为面向单个用户或智能体的独立记忆存储。
- 防止存储、检索、推理和测试中的跨库泄漏。
- 每个API请求只操作1个记忆库。
- 任何多记忆库工作流都应由客户端编排,不得因此削弱服务器边界。
## 分开摄取、检索和推理,并合并多种检索方法
将三项主要操作分开,同时共享模型、嵌入、实体和排序所需的稳定抽象。
### 保持操作语义
- Retain负责摄取内容并提取事实、实体和关系。
- Recall负责检索现有记忆,不应用倾向特征。
- Reflect基于记忆和已整合的心智模型,进行将倾向特征纳入考量的推理。
- 将编排与事实提取、实体规范化、链接管理和提供商适配器分离。
### 将检索构建为流水线
- 并行运行4种互补的检索策略:语义检索、词法BM25检索、图检索和时间检索。
- 在使用交叉编码器重新排序之前,先通过倒数排名融合合并各项排序结果。
- 将图扩展置于检索接口之后,使替代策略仍可互换。
- 通过职责单一的封装器支持本地和远程模型、嵌入及重新排序提供商。
### 同步API契约
- 更改端点后,重新生成OpenAPI规范。
- 规范更改后,重新生成所有受支持的客户端SDK,包括Python、TypeScript和Rust。
- 更改API参数时,同时更新代理路由、请求值提取、SDK调用、客户端类型和所有使用该参数的接口。
## 编写在PostgreSQL和Oracle上都能运行的迁移
让所有受支持的数据库共用同一套迁移历史,同时明确处理方言差异。
### 定义修订版本
- 为每项迁移赋予唯一的12个字符十六进制修订标识符,并让`down_revision`指向其前一个修订版本。
- 使升级和降级行为保持配对。
- 通过单一的方言路由器进行分派,由它根据当前连接选择相应实现。
- 缺少分派器时,应让迁移结构测试失败。
### 实现每种方言
- 分别为PostgreSQL和Oracle兼容数据库提供独立的升级函数和降级函数。
- 配置了租户架构时,应在原始PostgreSQL SQL中使用该架构进行限定。
- 只有迁移框架无法建模的数据库操作形式,例如特殊的向量、文本或分区操作,才使用驱动程序级执行。
- 如果某项迁移确实只适用于1种方言,应有意省略另一个槽位;绝不能因疏忽而将其留空。
- 评审时考虑不同方言之间的架构漂移。
### 验证执行
- 对基础架构和所有租户架构运行迁移。
- 同时支持只对1个具名租户架构进行定向运行,以便集中验证。
- 如果服务启动时会自动运行迁移,应针对所有受支持的方言和租户范围测试启动过程。
## push之前,先通过必需的检查和代码审查
每次实现变更后都使用标准工具链,并区分阻断性缺陷与建议性清理项。
### 运行必需检查
- 更改Python或TypeScript后,运行格式化、代码检查和类型检查。
- 将未使用的导入和变量、孤立的客户端文件以及未列入清单的软件包依赖项视为阻断性失败。
- 完整但未使用的函数和有意保持宽泛的组件库导出应视为建议项,除非项目政策将其提升为阻断项。
- 通过代码库的标准命令运行单元测试、API集成测试和相关基准测试。
- 按需重新生成API规范和客户端,然后确认没有未提交的生成文件差异残留。
### 发布前进行评审
- 实现完成后进行结构化代码评审。
- 修复所有涉及测试缺失、死代码、类型安全、数据隔离或生成文件漂移的必改问题。
- 在所有必改问题解决之前,不得推送代码或创建变更请求。
- 不要手动添加未发布的变更日志条目;由发布流程创建带版本号的条目。
## 确定性逻辑直接测试,模型回答交给另一个模型判定
根据行为是由机制确定,还是依赖模型解释来选择断言。
### 直接测试确定性机制
- 对数量、必填字段、提示词组装、抑制逻辑和注入的子字符串使用直接断言。
- 使用模拟模型或纯函数,让大多数测试保持快速。
- 为模型行为测试配套编写单元测试,覆盖其周边的确定性准备过程。
### 评判模型的语义行为
1. 为单提供商核心模型作业标记语义测试;将提供商矩阵标记保留给跨提供商验收。
2. 调用实际配置的流水线,而不是模拟对象。
3. 使用评估所需的语义标签概括响应。
4. 让独立的评判模型判断响应是否满足所提供上下文中的明确标准。
5. 绝不能使用与被测调用相同的模型调用进行评判。
- 对分类、归属、维度保持和指令遵循使用评判模型断言。
- 对于在不同模型和运行之间可以合理变化的行为,不要硬编码完全匹配的字符串或枚举值。
## 把API变更同步到所有客户端,并为新的集成添加CI
只有当运行时行为、测试、持续集成、发布注册和客户端接口保持一致时,集成才算完成。
### 更新API使用方
- 添加请求字段时,在代理路由中提取它并传给SDK调用。
- 更新客户端方法类型,以及所有提供或读取该字段的接口。
- 将每个请求限定于1个记忆库,并为多记忆库用例保留客户端编排。
### 完成集成
- 添加模拟或实际调用外部框架接口的测试,并验证该集成能正确调用记忆服务。
- 不要将仅测试辅助函数的单元测试视为充分的集成覆盖。
- 添加一项按变更范围触发的持续集成作业,用于构建、安装依赖项和运行集成测试。
- 在标准发布工作流中注册该集成。
- 对结构化数据使用类型化结构而不是原始字典,并避免返回包含多个元素的元组。
- 在测试、CI变更检测或发布注册缺失时,不得合并或发布。
## 先决定新设置能否按租户或记忆库调整,再添加
实现前对每项设置进行分类,使覆盖范围和文档保持一致。
### 选择配置级别
- 按全局环境值、租户覆盖值、记忆库级数据库覆盖值的层级顺序解析配置。
- 对模型提供商、模型名称、API密钥、操作专用选项和客户专用功能标志使用分层配置。
- 数据库地址、主机、端口、全局并发限制和系统级标志应在服务器级保持静态。
- 不得将静态字段加入可远程配置字段集合。
### 完整添加字段
1. 定义环境变量名称和默认值。
2. 向中央配置对象添加类型化字段。
3. 只有当租户或记忆库覆盖有效时,才将其加入可配置字段允许列表。
4. 从环境中初始化该字段。
5. 只有需要命令行覆盖时,才添加命令行选项。
6. 通过逐库解析器读取分层值,通过全局访问器读取静态值。
7. 更新配置参考和环境模板,写明说明、默认值和层级状态。
8. 同步所有随附的环境模板副本,并使模板同步测试持续通过。
- 绝不能在文档、模板、日志或测试中暴露真实凭据值。
