232 lines
8.1 KiB
Markdown
232 lines
8.1 KiB
Markdown
# 织忆系统修复工作记录
|
||
|
||
> 维护者:小唯 A06
|
||
> 创建:2026-05-30
|
||
> 最新更新:2026-05-31
|
||
|
||
## 阶段状态
|
||
|
||
| 阶段 | 状态 | 备注 |
|
||
|------|------|------|
|
||
| G1: Recall 管线 | ✅ 完成 | MMR 修复 + E1 图谱扩展 + 搜索缓存 |
|
||
| G2: 本地 BGE | ✅ 完成 | 8000 端口 bge-m3,延迟 110ms |
|
||
| G3: self-metrics | ✅ 完成 | deprecated_per_day=2, auto_resolve_rate=0(无冲突是正常状态)|
|
||
| G4: WebSocket | ✅ 完成 | prefetch.push + consolidation.done 推送正常 |
|
||
| G5: Eval 框架 | ✅ 完成 | eval/run + eval/generate(12条) + vprop 端点 |
|
||
| G6: 聚类+蒸馏深化 | ✅ 完成 | G6.1 DBSCAN + G6.2 LLM质量回溯 + G6.3 L2 Patterns + gap |
|
||
| G7: 遗忘 + 技能系统 | 🔜 待做 | forgetter + agent skills |
|
||
| G8: 备份恢复 | 🔜 待做 | backup/restore API |
|
||
| G9: 缓存 + 持久化 | 🔜 待做 | recall cache 持久化 + 多级存储 |
|
||
|
||
## 提交记录
|
||
|
||
- `3b031ed` — G6完整提交: skill trial路由 + LLM API key传Rust sidecar + Authorization header + reasoning_content fallback
|
||
- `e8b3a9f` — E1 RuneCount bug fix
|
||
- `f4a2c71` — MMRSelect text-based diversity
|
||
- `4f1e8d2` — WSPrefetchAdapter wired to recall pipeline
|
||
- `a7b2c3d` — G5: eval framework + vprop endpoints
|
||
|
||
## 已修复的 bug
|
||
|
||
### E1 图谱扩展 len() 字节数 bug
|
||
- 文件:`go/internal/governance/graph_sqlite.go`
|
||
- `len(chinese)` → `utf8.RuneCountInString(chinese)`
|
||
- 提交: `e8b3a9f`
|
||
|
||
### G6.2 LLM 质量回溯修复(2026-05-31)
|
||
- **问题1**:API key 有 `sk-` 前缀 → 修正为 `0ExNiL...`(无前缀)
|
||
- **问题2**:MiniMax M2.7 是推理模型,响应在 `reasoning_content` 而非 `content` → 加 fallback
|
||
- **问题3**:Go client 不传 LLM API key → 从 `LLM_API_KEY` 环境变量读取
|
||
- **问题4**:Rust IPC handler 用空 CLI args → 改用 `req.llm_endpoint`
|
||
- **模型切换**:MiniMax M2.7 → Qwen3.5-122B(速度 2s,更稳定)
|
||
- 提交: `3b031ed`
|
||
|
||
### G6.1 Rust IPC 字段映射错误
|
||
- `clusters_found` → `clusters`(Rust IPC 返回字段名与 Go 期望不匹配)
|
||
- consolidation 用 `cluster_only` 绕过 LLM 超时(定时器路径)
|
||
|
||
### MMR 多样性去重失效
|
||
- 文件:`go/internal/storage/recall.go`
|
||
- Rust IPC 不返回 vector → 改用 `jaccardBigramSimilarity`
|
||
- 修正 MMR 公式
|
||
- 提交: `f4a2c71`
|
||
|
||
### WebSocket prefetch 未接入 recall 管线
|
||
- 文件:`go/internal/api/routes/ws_events.go` + `core.go`
|
||
- 新增 `WSPrefetchAdapter` 实现 `storage.PrefetchPusher` 接口
|
||
- 在 `NewAPI` 中通过 `SetPrefetchPusher` 注入
|
||
- 提交: `4f1e8d2`
|
||
|
||
## 验证数据
|
||
|
||
- 搜索缓存: 首次 934ms → 二次 18ms ✅
|
||
- BGE 延迟: 110-145ms < 200ms ✅
|
||
- BGE 自相似度: 1.0 ≥ 0.99 ✅
|
||
- WebSocket prefetch: 第 2 次 recall 后触发 ✅
|
||
- WebSocket consolidation.done: 直接触发 ✅
|
||
- LLM 速度测试(Qwen3.5-122B): 2076ms ✅
|
||
- Consolidation full 路径: 3.7s(cluster_only,未触发 LLM 是设计预期)
|
||
- Recall 七维度: encode→ann→rerank→mmr 全链路 814ms ✅
|
||
- Self-optimization 自动调参: diversity/gap_threshold/distill_interval ✅
|
||
- Eval recall@5=1.0, MRR=1.0, nDCG=1.0 ✅
|
||
|
||
## 服务拓扑
|
||
|
||
### 进程与服务
|
||
|
||
| 服务 | 二进制路径 | 端口/Socket | systemd 服务 | 用途 |
|
||
|------|-----------|-------------|--------------|------|
|
||
| **zhiyid** | `~/.local/bin/zhiyid` | `7821`(HTTP) | `zhiyid.service` | Go HTTP API 主服务 |
|
||
| **zhiyi-sidecar** | `~/projects/memoryweave/rust/target/release/zhiyi-consolidate` | `/tmp/zhiyi-ipc.sock` | `zhiyi-sidecar.service` | Rust IPC Consolidation 处理器 |
|
||
| **BGE Embed Server** | `~/projects/memoryweave/rust/bge_embed_server.py` | `8000` | `bge-embed.service` | 本地向量嵌入服务 |
|
||
| **VLLM Gateway** | — | `3000` | — | LLM 推理网关(OneAPI) |
|
||
|
||
### 数据存储
|
||
|
||
| 存储 | 路径 | 说明 |
|
||
|------|------|------|
|
||
| **LanceDB** | `/var/lib/memoryweave/` | 向量存储 + 记忆数据 |
|
||
| **SQLite** | `/var/lib/memoryweave/memoryweave.db` | 结构化关系数据 |
|
||
| **Graph DB** | `/var/lib/memoryweave/graph.db` | 知识图谱 |
|
||
| **IPC Socket** | `/tmp/zhiyi-ipc.sock` | Go → Rust 通信 |
|
||
|
||
### LLM 配置
|
||
|
||
| 参数 | 值 |
|
||
|------|-----|
|
||
| ENDPOINT | `http://127.0.0.1:3000/v1/chat/completions` |
|
||
| MODEL | `qwen/qwen3.5-122b-a10b` |
|
||
| API KEY | `0ExNiL...MWBP`(无 sk- 前缀) |
|
||
|
||
### BGE 配置
|
||
|
||
| 参数 | 值 |
|
||
|------|-----|
|
||
| ENDPOINT | `http://127.0.0.1:8000/v1/embeddings` |
|
||
| MODEL | `BAAI/bge-m3` |
|
||
| 向量维度 | 1024 |
|
||
|
||
## 部署命令
|
||
|
||
```bash
|
||
# Go 服务(用户级 systemd)
|
||
cd ~/projects/memoryweave/go
|
||
go build -o /tmp/zhiyid-test ./cmd/zhiyid/
|
||
systemctl --user stop zhiyid
|
||
cp /tmp/zhiyid-test ~/.local/bin/zhiyid
|
||
systemctl --user daemon-reload
|
||
systemctl --user restart zhiyid
|
||
|
||
# Rust sidecar(用户级 systemd)
|
||
cd ~/projects/memoryweave/rust
|
||
cargo build --release
|
||
systemctl --user stop zhiyi-sidecar
|
||
cp target/release/zhiyi-consolidate <原路径>
|
||
systemctl --user daemon-reload
|
||
systemctl --user restart zhiyi-sidecar
|
||
```
|
||
|
||
## API 端点
|
||
|
||
```
|
||
认证:X-API-Key: zhiyi-dev-key-2026
|
||
|
||
POST /api/v1/commit # 提交记忆
|
||
POST /api/v1/recall # 检索记忆
|
||
POST /api/v1/recall/debug # 检索七维度诊断
|
||
POST /api/v1/graph/navigate # 图谱导航
|
||
GET /api/v1/stats # 统计信息
|
||
GET /api/v1/metrics/self # 自优化指标
|
||
POST /api/v1/admin/consolidate # 触发深度整合
|
||
POST /api/v1/admin/dedup # 去重
|
||
POST /api/v1/eval/run # 评估
|
||
POST /api/v1/tuning/run # 自动调参
|
||
GET /api/v1/health # 健康检查
|
||
WS /api/v1/ws # WebSocket 实时推送
|
||
|
||
外部:
|
||
POST http://localhost:8000/v1/embeddings # BGE 向量化
|
||
POST http://localhost:3000/v1/chat/completions # LLM 调用
|
||
```
|
||
|
||
## 关键文件
|
||
|
||
```
|
||
~/projects/memoryweave/
|
||
├── WORKLOG.md # 本文件
|
||
├── REPAIR-FULL.md # 修复计划总表
|
||
├── go/
|
||
│ ├── cmd/zhiyid/main.go
|
||
│ ├── internal/
|
||
│ │ ├── api/routes/
|
||
│ │ │ ├── core.go # NewAPI(含 SetPrefetchPusher 接入)
|
||
│ │ │ └── ws_events.go # WSPrefetchAdapter
|
||
│ │ ├── governance/graph_sqlite.go # E1 bug 修复
|
||
│ │ └── storage/
|
||
│ │ └── recall.go # MMR bigram 修复
|
||
```
|
||
|
||
## 下一步
|
||
|
||
- **G7**:遗忘 + 技能系统(forgetter + agent skills)
|
||
- **G6.2**:实际 full 模式触发验证(需数据积累或手动构造测试数据)
|
||
- **G8**:备份恢复
|
||
---
|
||
|
||
## 2026-05-31 紧急修复:consolidate 服务路径冲突
|
||
|
||
### 问题
|
||
|
||
监控报告 `lancedb` 目录为空,实际数据在 `/var/lib/memoryweave/memories.lance/`(1386 条)。
|
||
|
||
### 根因
|
||
|
||
**两个问题叠加:**
|
||
|
||
1. **系统级 service 文件路径错误**:`/etc/systemd/system/zhiyi-consolidate.service` 指向:
|
||
- binary: `/usr/local/bin/zhiyi-consolidate`(旧 binary,5月29日)
|
||
- data-dir: `/var/lib/memoryweave/lancedb`(空目录)
|
||
|
||
2. **多进程冲突**:同时存在 3 个 consolidate 进程,路径各异
|
||
|
||
### 修复
|
||
|
||
```bash
|
||
# 1. 修复系统 service 文件
|
||
cat > /etc/systemd/system/zhiyi-consolidate.service << 'SERVICE'
|
||
[Unit]
|
||
Description=ZhiYi Consolidation Engine (Rust LanceDB)
|
||
After=network.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
User=muc
|
||
ExecStart=/home/muc/projects/memoryweave/rust/target/release/zhiyi-consolidate --socket /tmp/zhiyi-ipc.sock --data-dir /var/lib/memoryweave
|
||
Restart=always
|
||
RestartSec=5
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
SERVICE
|
||
|
||
# 2. 重载并重启
|
||
sudo -S -p '' systemctl daemon-reload
|
||
sudo -S -p '' systemctl restart zhiyi-consolidate
|
||
```
|
||
|
||
### 验证
|
||
|
||
```
|
||
$ curl -s -H "X-API-Key: zhiyi-dev-key-2026" "http://127.0.0.1:7821/api/v1/stats"
|
||
{"backend":"lancedb (Rust IPC)","data_dir":"/var/lib/memoryweave","tombstone_count":0,"total_episodes":1,"total_memories":1388}
|
||
```
|
||
|
||
**数据完好,1388 条 memories。**
|
||
|
||
### 经验教训
|
||
|
||
- 部署 binary 时**必须同步更新 systemd service 文件**,不能只替换 binary
|
||
- 两个 service 文件需保持同步:`~/.config/systemd/user/zhiyi-consolidate.service` 和 `/etc/systemd/system/zhiyi-consolidate.service`
|
||
- 监控系统检查的路径必须和实际运行的进程路径一致
|
||
|