Files
ai-gateway-go/docs/adr/0002-vector-storage-and-object-store.md
superidou b536672000 feat(m8): P2 pgvector + Ollama 向量化与语义检索
- PostgreSQL 切换 pgvector/pgvector:pg17 镜像;迁移 000024 建 vector 扩展、
  knowledge_chunks.embedding vector(1024) + HNSW 余弦索引,retrieval_mode 放宽三态
- OllamaEmbedder 本地 bge-m3 批量嵌入,404 惰性 pull 重试,维度/超时校验,可整体关闭
- SemanticRetriever/HybridRetriever + NewRetriever 按 retrieval_mode 分发,缺 embedder 回退 FTS
- 文档入库同步批量向量化;Ollama 故障降级入库 + embedding_failed 事件
- 修复 pgx CopyFrom 对 vector 列二进制编码误读:COPY 基础列后同事务 unnest 批量回填
- 修复降级路径 embeddings=nil 索引越界 panic(Add 与 Reprocess)
- 知识库列表 vectorized_chunk_count + 前端三态检索模式选择与向量化覆盖率
- 单测 embedder/retrievers + 集成 TestKnowledgeVectorLifecycle 全绿

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-12 15:16:32 +08:00

2.0 KiB
Raw Permalink Blame History

ADR-0002:对象存储与向量化基础设施入基线

状态:已接受
日期:2026-08-12
取代/修订:ADR-0001

决策

M8 起把 MinIO(对象存储)与 pgvector + 本地 Ollama(向量化)纳入基线,但它们都不作为启动依赖

  • MinIO 自托管:上传/下载全部经 gateway-api 代理,MinIO 不暴露主机端口;gateway.file_objects 元数据行以 PostgreSQL 为权威,对象未就绪时上传得到明确报错,服务不崩溃。
  • pgvector + OllamaPostgreSQL 镜像切换为 pgvector/pgvector:pg17(数据卷兼容),knowledge_chunks.embedding vector(1024) 由本地 Ollama 容器(默认 bge-m3)产生;Ollama 未就绪时知识库入库降级(embedding 置 NULL + knowledge_document.embedding_failed 事件),检索自动回退纯 FTS。
  • 不引入 pgvector-go / S3 客户端到领域层:向量以 $1::vector 字面量直传;对象存储经 internal/platform/storage 适配层隔离,领域层只依赖接口。
  • ClickHouse 仍不属于基线:审计与统计继续存放 PostgreSQL。

动机

  • 知识库需要向量化语义召回(旗舰版"外部文档导入、自动切分、向量化、语义匹配召回"),并作为 M10 记忆管理、M12 语义输出的依赖基座。
  • 门户个人文件仓库与管理端文件管理需要对象存储;自托管 MinIO 保证完全内网离线。
  • 本地 Ollama 生成嵌入避免外发文本到公网 embedding API,多语言模型 bge-m3 与中文检索目标匹配。

影响

  • 部署编排新增 minioollama 两个 stateful 服务与 minio-dataollama-models 卷;nginx client_max_body_size 提到 256 MiB 盖过 128 MiB 上传上限。
  • 运维需备份 minio-dataollama-models 卷;Ollama 首次拉取 bge-m3 约 1.2 GiBEMBEDDINGS_ENABLED=false 可关闭。
  • EMBEDDING_DIM 必须与 vector(1024) 一致,配置校验拦截不符。
  • ADR-0001 第 4 条(MinIO/S3 不在基线)与"知识库只保存纯文本"不再成立,本 ADR 取代。