# ADR-002：pgvector 作為唯一 KM 向量庫

- **Status**: Accepted
- **Date**: 2026-04-18
- **Decision Maker**: 統帥
- **Author**: Claude

## Context

KM（知識管理）需要向量化檢索能力來支援 RAG（Retrieval-Augmented Generation）。市面選項：pgvector、ChromaDB、Qdrant、Weaviate、Milvus。

現況：MOMO Pro 已使用 PostgreSQL，且生產環境的 PG 實例（192.168.0.188）映像為 `pgvector/pgvector:pg14` —— 即 pgvector 擴充已內建。

## Decision

**KM 唯一向量庫 = pgvector**。禁用任何其他向量資料庫（ChromaDB、Qdrant、Weaviate、Milvus）。

## Alternatives Considered

| 方案 | 拒絕原因 |
|---|---|
| ChromaDB（輕量獨立） | 必須在兩個 DB 之間 JOIN，「結構化篩選 + 語意檢索」要兩階段，痛苦 |
| Qdrant（性能最好） | 需獨立部署、運維成本、與現有 PG 切割記憶 |
| Weaviate / Milvus | 過度工程化，超出當前需求量 |

## Consequences

### Positive
- **零部署**：pgvector 已在 192.168.0.188 PG 實例上運行
- **零維運**：沿用既有備份/監控/擴容機制
- **單條 SQL** 同時做語意檢索 + 結構化篩選：

  ```sql
  SELECT insight_text, generated_at, ai_model
  FROM ai_insights
  WHERE insight_type = 'monthly'
    AND created_at > NOW() - INTERVAL '90 days'
    AND status = 'approved'
  ORDER BY embedding <-> :query_vector
  LIMIT 5;
  ```

- **事務一致性**：洞察寫入 + embedding 寫入同一 transaction，原子性

### Negative / Trade-offs
- pgvector 在百萬向量量級時，HNSW 索引需要調優（IVFFlat or HNSW）
- 與專業向量庫相比，cluster 化方案較少（但短中期不需要）

## Implementation Notes

```sql
-- 1. 確認擴充
CREATE EXTENSION IF NOT EXISTS vector;

-- 2. ai_insights 表加 embedding 欄
ALTER TABLE ai_insights
  ADD COLUMN embedding vector(1024);  -- bge-m3 維度（見 ADR-003）

-- 3. HNSW 索引（v0.5.0+）
CREATE INDEX ON ai_insights
  USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);
```

## Related ADRs

- ADR-001：三 Agent 分工
- ADR-003：embedding 模型選型決定向量維度
