qmd/docs/plan/pg-memory-bridge-test-report.md
Haitao Pan 47bd3ded44 feat(pg): add switchable PostgreSQL backend + OpenClaw/Hermes memory bridge
Add an optional PostgreSQL backend (QMD_BACKEND=pg) alongside the
unchanged default SQLite path. PG store uses pgvector (HNSW) for vectors
and pg_jieba + pg_trgm for full-text/Chinese tokenization, with a
namespace column isolating multi-agent memory (openclaw/hermes).

- src/pg/: config, db-pg, schema bootstrap, memory store
- MCP memory_add/memory_search/memory_get tools; qmd pg status + memory CLI
- connection via QMD_PG_URL/DATABASE_URL/qmd config, stunnel TLS 5443
- tests: pg-config (unit) + pg-memory integration (gated on QMD_PG_URL) + pg-compose
- docs/plan: plan, usage, test report, changelog; track docs/**/*.md

SQLite path: zero regression (typecheck clean, 249 passed / 6 skipped).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:13:04 +08:00

62 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 测试验证报告PostgreSQL 记忆桥梁
> 关联:[规划](pg-backend-memory-bridge.md) · [使用说明](pg-memory-bridge-usage.md)
> 日期2026-06-23 · 范围P1P5qmd PG 可切换后端 + OpenClaw/Hermes 记忆桥梁)
## 1. 验证矩阵
| 项 | 命令 | 结果 |
|---|---|---|
| 类型检查 | `npx tsc --noEmit -p tsconfig.build.json` | ✅ 0 errors |
| 构建产物 | `npm run build` | ✅ 成功,`dist/pg/*`、`dist/cli/pg-commands.js` 已 emit |
| 单元/集成测试 | `npx vitest run` | ✅ 249 passed / 6 skipped |
| PG 配置解析 | `test/pg-config.test.ts` | ✅ 15 passed |
| CLI 冒烟 | 见下文 §3 | ✅ 通过 |
> 现有 SQLite 路径全部测试零回归 —— 满足“原有功能不变”。
## 2. 测试范围
### 2.1 已自动覆盖(无需外部依赖)
- **`test/pg-config.test.ts`** —— 连接配置解析:
- `QMD_PG_URL` / `DATABASE_URL` / `qmd config` 三来源优先级
- TLSstunnel `5443` / `sslmode`)参数推导
- `namespace` 默认值与覆盖
- 缺失连接串时的报错信息(不暴露口令)
- **现有全量回归** —— SQLite 后端 FTS/向量/RRF/重排/分块/collections/context 等,结果与改造前一致。
### 2.2 需外部 PostgreSQL默认 skip门控 `QMD_PG_URL`
- **`test/pg-memory.integration.test.ts`**6 用例,未配置时跳过):
- schema 引导pgvector / pg_jieba / pg_trgm 扩展存在性)
- `memory_add` 写入 → 内容寻址 + 分块 + 嵌入落库
- `memory_search` 混合检索tsvector + pgvectorRRF 融合)
- `namespace` 隔离openclaw vs hermes 互不可见)
- `memory_get` 按 docid/path 取回
- `qmd pg status` 健康探测
- **`test/pg-compose.yml`** —— 一键起本地 PGpostgresql.svc.plus 同款扩展镜像)供上述集成测试使用。
## 3. CLI 冒烟记录
- `qmd --help` —— 新增 `memory`、`pg status` 命令正常列出。
- `qmd memory search foo`(未配置后端)—— 干净报错,提示设置 `QMD_BACKEND=pg` + 连接串,无堆栈泄漏。
- `QMD_BACKEND=pg qmd pg status`(无连接串)—— 干净报错,提示缺少 `QMD_PG_URL`,不打印口令。
## 4. 本地复现集成测试
```sh
# 1) 起本地 PGpgvector + pg_jieba + pg_trgm
docker compose -f test/pg-compose.yml up -d # macOS 先 colima start
# 2) 指向该实例并跑集成测试
export QMD_PG_URL='postgres://postgres:postgres@localhost:5432/qmd'
npx vitest run test/pg-memory.integration.test.ts
# 3) 连真实服务postgresql.svc.plusstunnel TLS 5443
export QMD_PG_URL='postgres://USER:PASS@postgresql.svc.plus:5443/qmd?sslmode=require'
qmd pg status
```
## 5. 限制与待办
- ⚠️ **集成测试尚未对接“真实 PostgreSQL”执行**(本机无运行中的 Docker daemonmacOS 依赖 docker/colima 已补入 infra 基线。CI 接入 `test/pg-compose.yml` 后即可常态化。
- ⚠️ **打分语义差异**PG `ts_rank` ≠ FTS5 BM25排序与 SQLite 后端存在差异,靠 RRF + reranker 缓解;上线前建议跑一轮 SQLite vs PG 对等评测。
- 远程 PG over TLS 的延迟基准尚未压测。