召回编排器
召回不是搜索。召回是上下文工程——将记忆加工成可以直接注入 Agent 上下文窗口的结构化块。
8 步处理流水线
每次召回请求,编排器串行执行以下步骤:
| 步骤 | 名称 | 说明 |
|---|---|---|
| 1 | 候选检索 | 向量搜索 + 词法搜索,覆盖 Stable 和 History 两层 |
| 2 | 评分 | importance × recency × hybridScore 三维加权 |
| 3 | 排序 | 按复合分降序 |
| 4 | 语义键去重 | 同一 semantic_key 只保留最高分版本 |
| 5 | 冲突检测 | hasConflict=true 的记录优先浮现至结果头部 |
| 6 | Token 预算分配 | 按 prefer 参数在两层间分配 token 配额 |
| 7 | 新鲜度标注 | 超过 30/90/365 天阈值的记录附加警告标签 |
| 8 | 结果块组装 | 输出 RecallContextBlock |
搜索策略
召回器使用混合检索,两种方式并行,结果通过 RRF(倒数排名融合)合并:
混合检索 = 向量搜索(语义相似) + 词法搜索(关键词精确)
↓
RRF Fusion
↓
统一候选集
降级策略:
- 无 Embedding 服务 → 纯词法搜索
- zhparser 不可用 →
plainto_tsquery(基础全文搜索) - 任何单点故障不导致召回完全失败
请求参数
POST /v1/recall
{
"task": "实现带邮箱验证的用户注册功能",
"scope": { "projectId": "p_demo" },
"prefer": "stable_first",
"maxTokens": 2000,
"includeHistory": true,
"historyDays": 30
}
| 参数 | 类型 | 说明 |
|---|---|---|
task | string | 当前任务描述,作为检索 query |
scope | object | 访问范围 |
prefer | enum | Token 分配策略(stable_first / history_first / balanced / stable_only) |
maxTokens | int | 总 token 预算,默认 2000 |
includeHistory | bool | 是否包含历史记录,默认 true |
historyDays | int | 历史记录时间窗口(天),默认 30 |
输出结构
{
"code": "SUCCESS",
"data": {
"stableMemories": [
{
"id": "mem_a1b2c3d4",
"content": "所有 API 统一返回 {code, message, data}",
"memoryType": "project_rule",
"importance": 0.9,
"score": 0.94
}
],
"historyRecords": [
{
"id": "rec_x9y8z7",
"content": "完成 MailCodeService,用 Redis 管理 TTL",
"recordKind": "task_summary",
"createdAt": "2024-04-01T10:00:00Z"
}
],
"conflicts": [],
"tokenEstimate": 1420,
"truncated": false,
"freshnessWarnings": []
}
}