feat(docs): add Graphiti optimization方案文档

This commit is contained in:
yunying
2026-04-06 17:18:19 +08:00
parent 3c9dfe3354
commit d074bffa3e

View File

@@ -0,0 +1,181 @@
# Graphiti 知识图谱云端调用优化方案
## 背景
当前 OpenClaw 的 Graphiti 插件在每条消息处理时都会触发完整的知识图谱构建流程(`add_episode`),导致频繁调用云端大模型:
- **每次 `add_episode` 调用**3 次云端 LLM 调用(节点提取、关系提取、节点去重)
- **16 个活跃 Agent**:日均约 285 条有效消息
- **月云端调用量**~8,550 次
- **老大 coding plan 配额**90,000 次/月
- **Graphiti 占比**9.5%(未计算 Agent 对话本身的调用)
为大幅降低云端调用成本,同时保持知识图谱功能完整,特制定本优化方案。
## 优化目标
- **主要目标**:将 Graphiti 月云端调用从 ~8,550 次降至 **<1,000 次**
- **次要目标**:保持实时向量搜索能力,知识图谱构建质量不降
- **约束条件**:最小化工程改动,确保可回滚
## 方案设计:两层架构 + 动态调度
### 架构概览
```
┌─────────────────┐ ┌──────────────────┐
│ 实时层 │ │ 批量层 │
│ (全本地,零云端) │ │ (云端,定时批量) │
└────────┬────────┘ └────────┬─────────┘
│ │
▼ ▼
┌─────────────────┐ ┌──────────────────┐
│ 原始消息存储 │ │ 知识图谱构建 │
│ + 向量索引 │ │ (实体+关系提取) │
└────────┬────────┘ └────────┬─────────┘
│ │
└──────────┬───────────┘
┌─────────────────┐
│ 统一搜索接口 │
│ (graphiti_search)│
└─────────────────┘
```
### 实时层(零云端调用)
- **触发时机**:每条用户/助手消息到达时
- **处理内容**
- 将原始消息存入 Neo4j 作为 `EpisodicNode`
- 使用本地 Ollama (`nomic-embed-text`) 生成向量嵌入
- 存储向量用于实时相似度搜索
- **技术栈**完全本地IPEX-LLM + Intel iGPU
- **效果**:消息发出后立即可被向量搜索命中
### 批量层(云端调用)
- **触发时机**cron 定时任务(每日 11 次)
- **处理内容**
- 收集自上次处理以来的所有新消息
- 为每条消息添加 **Agent 命名空间前缀**(如 `[yunying] 运营官:...`
- 合并所有消息为 **单个 episode**
- 调用 Graphiti REST `/messages` 接口进行完整知识图谱构建
- **技术栈**云端大模型qwen3.5-plus用于高质量实体/关系提取
- **效果**:保持知识图谱构建质量,但有 ≤2 小时延迟
### 动态调度策略
基于 3 天实测活跃度数据4/4-4/6制定以下 cron 调度:
| 时间段 | 调度频率 | 理由 |
|--------|----------|------|
| **00:00-03:00** | 跳过 | 几乎无活跃(日均 <0.5 条/小时) |
| **04:00** | 1 次 | 🌙 凌晨兜底,汇总夜间消息 |
| **09:00-14:00** | 每 1-2 小时 | 上午/午间中等活跃 |
| **16:00-20:00** | 每 1 小时 | 🔴 下午/晚间高峰(日均 8-15 条/小时) |
| **22:00** | 1 次 | 全天收尾 |
**具体 cron 配置:**
```cron
# Graphiti 批量 ingest 调度 v1.0
0 4 * * * /path/to/batch_ingest.sh
0 9 * * * /path/to/batch_ingest.sh
0 10 * * * /path/to/batch_ingest.sh
0 12 * * * /path/to/batch_ingest.sh
0 14 * * * /path/to/batch_ingest.sh
0 16 * * * /path/to/batch_ingest.sh
0 17 * * * /path/to/batch_ingest.sh
0 18 * * * /path/to/batch_ingest.sh
0 19 * * * /path/to/batch_ingest.sh
0 20 * * * /path/to/batch_ingest.sh
0 22 * * * /path/to/batch_ingest.sh
```
## 预期效果
| 指标 | 优化前 | 优化后 | 改善幅度 |
|------|--------|--------|----------|
| 日批次次数 | - | 11 | - |
| 每批次云端调用 | - | 3 | - |
| **日云端调用** | ~285 | **33** | ↓ 88% |
| **月云端调用** | ~8,550 | **~990** | ↓ 88% |
| **配额占比** | 9.5% | **1.1%** | ↓ 88% |
| 实时搜索 | ✅ | ✅ | 无变化 |
| 知识图谱质量 | ✅ | ✅ | 无变化 |
| 知识图谱延迟 | 0 秒 | ≤2 小时 | 可接受 |
## 实施步骤
### 1. 配置变更
- 修改 `~/.openclaw/openclaw.json`
```json
{
"plugins": {
"entries": {
"graphiti": {
"config": {
"autoCapture": false // 关闭实时 ingest
}
}
}
}
}
```
### 2. 部署批量脚本
- 脚本位置:`~/.openclaw/services/graphiti-batch/batch_ingest.sh`
- 功能:
- 扫描所有 Agent 的 session transcript 文件
- 提取 user/assistant 消息,过滤系统消息
- 添加 `[agent_name]` 命名空间前缀
- 合并为单个 episode 并调用 Graphiti REST API
- 记录处理统计用于后续调度优化
### 3. 配置 cron
- 安装上述 11 条 cron 任务
- 日志输出到 `~/.openclaw/services/graphiti-batch/cron.log`
### 4. 重启服务
- 重启 OpenClaw Gateway 使 `autoCapture: false` 生效
## 风险与缓解
| 风险 | 缓解措施 |
|------|----------|
| **消息丢失** | 脚本记录最后处理时间戳,失败自动重试 |
| **实体混淆** | Agent 命名空间前缀确保上下文隔离 |
| **紧急场景延迟** | 关键任务可通过 `/recall` 直接查询历史 |
| **调度不准** | 脚本埋点记录每批消息量2 周后优化调度 |
| **回滚困难** | 保留原配置,改回 `autoCapture: true` 即可 |
## 回滚方案
如遇问题,执行以下步骤即可回退:
1. 修改 `~/.openclaw/openclaw.json` → `"autoCapture": true`
2. 删除 cron 任务:`crontab -l | grep -v batch_ingest | crontab -`
3. 重启 Gateway`openclaw gateway restart`
## 实施状态
- ✅ **已实施**2026-04-06 17:00
- ✅ **配置更新**`autoCapture: false`
- ✅ **脚本部署**`batch_ingest.sh` 测试通过
- ✅ **Cron 安装**11 条任务已生效
- ✅ **首次运行**17:00 成功处理 2 条新消息
## 后续优化
- **数据驱动调度**:收集 2 周 `batch_stats.csv` 数据,优化 cron 频率
- **优先级标记**:支持关键消息即时处理(需额外开发)
- **监控告警**:建立调用次数和处理延迟监控
---
**文档作者**:运营官 (yunying)
**评审人员**:参谋 (canmou)、小X总指挥 (director)
**实施日期**2026-04-06
**版本**1.0