Memory 显式搜索
wesgine 记忆系统的显式搜索 API 与语义检索机制。
与自动注入的区别
| 自动注入 | 显式搜索 | |
|---|---|---|
| 触发 | 引擎自动(每轮 / 当轮) | Agent 主动 memory(search) |
| 质量门 | RecallQualityOK(排除冲突/过时) | 不设质量门 |
| 目的 | "模型该知道什么" | "我存过什么" |
| 隐藏冲突条目 | ✓ | ❌ |
显式搜索不隐藏被取代的行——对指名索取者隐藏被取代的行是把错答换成缺答。记忆中心必须显示冲突否则无人能解决。
API
语义搜索
POST /cells/{id}/memory/search
Body:
{
"query": "编辑器偏好设置",
"layer": "about_me",
"namespace": "...",
"limit": 20
}
参数
| 参数 | 说明 |
|---|---|
query | 搜索查询文本 |
layer | 按层过滤(可选) |
namespace | 按命名空间过滤(可选) |
limit | 最大返回数 |
actor | 按 actor 过滤(admin token 时) |
搜索机制
Embedding 向量搜索
记忆写入时生成 embedding → 搜索时与查询 embedding 计算相似度。
Hybrid Ranking
语义相似度 + BM25 文本匹配的混合排序:
查询
↓ 同时
向量相似度(语义)
BM25 分数(文本匹配)
↓ 合并
Hybrid Rank
↓ 排序
返回结果
Actor 边界
- 非 admin token:一律取
Principal.Actor - admin token:
?actor=参数生效 - 空 actor 是合法值(admin 全 Cell 视图)
工具侧
Agent 通过 memory(search) 工具触发显式搜索:
{
"action": "search",
"query": "用户的格式偏好"
}
结果返回给 Agent 作为工具输出。
召回计数更新
搜索命中的条目更新 accessed_at 和 recall_count:
accessed_at→ 当前时间recall_count+= 命中次数
这影响 GC 的 RetentionScore 计算。
与列表查询的区别
| 搜索 | 列表 | |
|---|---|---|
| 方法 | POST /memory/search | GET /memory |
| 排序 | 相似度排序 | 时间排序 |
| 用途 | 语义查找 | 浏览所有 |
| 更新召回计数 | ✓ | ❌ |
相关文档
- Memory 自动注入 →
memory-auto-injection.md - Memory GC 与 Digest →
memory-gc-digest.md - Memory 层模型 →
memory-layer-model.md