PGVector(PostgreSQL + pgvector)
PGVector 是基于 PostgreSQL + pgvector 扩展的向量存储实现,支持混合检索(向量相似度 + 文本相关性)。
基础配置
配置选项
连接配置
PGVector 支持两种连接配置方式(按优先级从高到低):
1. 直接连接配置
2. 使用已注册实例
复用已在 storage/postgres 中注册的 PostgreSQL 实例,适合多个组件共享同一数据库连接的场景。
优先级规则:
- WithPGVectorClientDSN() / WithHost()... > WithPostgresInstance()
- 如果同时指定多个方式,优先级高的生效
| 选项 | 说明 | 默认值 |
|---|---|---|
WithPGVectorClientDSN(dsn) |
PostgreSQL 连接字符串 | - |
WithHost(host) |
数据库主机地址 | "localhost" |
WithPort(port) |
数据库端口 | 5432 |
WithUser(user) |
数据库用户名 | - |
WithPassword(password) |
数据库密码 | - |
WithDatabase(database) |
数据库名称 | "trpc_agent_go" |
WithTable(table) |
表名称 | "documents" |
WithSSLMode(mode) |
SSL 模式 | "disable" |
WithPostgresInstance(name) |
使用已注册的 PostgreSQL 实例 | - |
向量配置
| 选项 | 说明 | 默认值 |
|---|---|---|
WithIndexDimension(dim) |
向量维度(需与 embedding 模型匹配) | 1536 |
WithVectorIndexType(type) |
向量索引类型(VectorIndexHNSW / VectorIndexIVFFlat) |
VectorIndexHNSW |
WithHNSWIndexParams(params) |
HNSW 索引参数(M, EfConstruction) | M=16, EfConstruction=64 |
WithIVFFlatIndexParams(params) |
IVFFlat 索引参数(Lists) | Lists=100 |
混合检索配置
| 选项 | 说明 | 默认值 |
|---|---|---|
WithEnableTSVector(enabled) |
启用文本检索向量 | true |
WithHybridSearchWeights(vector, text) |
混合检索权重(向量/文本) | 0.7, 0.3 |
WithLanguageExtension(lang) |
文本分词语言扩展(如 zhparser/jieba) | "english" |
搜索配置
| 选项 | 说明 | 默认值 |
|---|---|---|
WithMaxResults(n) |
默认搜索结果数量 | 10 |
WithDocBuilder(builder) |
自定义文档构建方法 | 默认构建器 |
WithExtraOptions(opts...) |
注入自定义 PostgreSQL ClientBuilder 配置,默认无需关心 | - |
字段映射(高级)
| 选项 | 说明 | 默认值 |
|---|---|---|
WithIDField(field) |
ID 字段名 | "id" |
WithNameField(field) |
名称字段名 | "name" |
WithContentField(field) |
内容字段名 | "content" |
WithEmbeddingField(field) |
向量字段名 | "embedding" |
WithMetadataField(field) |
元数据字段名 | "metadata" |
WithCreatedAtField(field) |
创建时间字段名 | "created_at" |
WithUpdatedAtField(field) |
更新时间字段名 | "updated_at" |
全文检索
PGVector 支持全文检索(TSVector),可用于 Keyword Search 和 Hybrid Search(混合检索)。
⚠️ 重要提示: Keyword Search 和 Hybrid Search 需要通过
WithEnableTSVector(true)启用 PostgreSQL 全文检索功能。
搜索模式支持
| 搜索模式 | 是否需要 TSVector | 说明 |
|---|---|---|
| Vector Search | ❌ | 仅使用向量索引 |
| Keyword Search | ✅ 必需 | 依赖 PostgreSQL tsvector 全文索引 |
| Hybrid Search | ✅ 必需 | 同时使用向量索引和 tsvector 索引 |
| Filter Search | ❌ | 仅过滤元数据 |
如果未启用 WithEnableTSVector(true):
系统会自动降级搜索模式,不会报错: - 尝试使用 Keyword/Hybrid 搜索时 → 自动降级为 Vector Search(有向量)或 Filter Search(无向量) - 会输出 INFO 日志提示降级原因
注意: 从 SearchTool 到 VectorStore 的默认调用链路不会主动指定 SearchModeKeyword,因此通常不会触发 Keyword Search,而是使用默认的 Vector 或 Hybrid 搜索。
搜索模式与 Score 归一化
💡 提示: 本节内容为具体计算细节,默认用户无需关心。PGVector 会自动处理所有搜索模式的评分归一化。
PGVector 支持多种搜索模式,所有模式的 score 都归一化到 [0, 1] 范围,分数越高表示相关性越强。
1. Vector Search (向量搜索)
SQL 模板 (使用子查询避免重复计算):
归一化公式:
数学原理:
- PGVector <=> 操作符返回 Cosine Distance: d ∈ [0, 2]
- d = 0: 向量完全相同
- d = 1: 向量正交
- d = 2: 向量完全相反
- Cosine Similarity: s = 1 - d ∈ [-1, 1]
- 归一化到 [0, 1]: score = (s + 1) / 2 = (2 - d) / 2 = 1 - d/2
示例:
- distance = 0.2 → score = 1 - 0.2/2 = 0.90 (高度相似)
- distance = 1.0 → score = 1 - 1.0/2 = 0.50 (正交)
- distance = 1.8 → score = 1 - 1.8/2 = 0.10 (几乎相反)
2. Keyword Search (关键词搜索)
SQL 模板 (使用子查询避免重复计算):
归一化公式:
c = 0.1 (sparseNormConstant)
数学原理:
- PostgreSQL ts_rank() 返回原始文本相关性分数,范围不固定(通常 [0, ∞))
- 使用双曲函数归一化: f(x) = x / (x + c) 将其映射到 [0, 1)
- 参数 c 控制敏感度:
- c 越小:对小 rank 值更敏感,区分度更高
- c 越大:对大 rank 值更宽容,趋于饱和
示例 (c = 0.1):
- rank = 1.0 → score = 1.0 / 1.1 = 0.909
- rank = 0.5 → score = 0.5 / 0.6 = 0.833
- rank = 0.1 → score = 0.1 / 0.2 = 0.500
- rank = 0.01 → score = 0.01 / 0.11 = 0.091
计算流程示例:
假设用户查询 "machine learning",数据库中有一篇文档内容为 "Machine learning enables intelligent systems..."
核心函数:
- to_tsvector(): 文本 → 可搜索向量(分词、词干化)
- websearch_to_tsquery(): 用户查询 → 搜索表达式(支持 "引号", OR, -排除)
- @@: 匹配检查(true/false)
- ts_rank(): 计算相关性分数
3. Hybrid Search (混合搜索)
SQL 模板 (使用子查询避免重复计算):
归一化公式:
w_v = 0.7, w_t = 0.3
数学原理:
- 分别计算 vector_score 和 text_score(如上述两个模式)
- 使用线性加权组合,权重可通过 WithHybridSearchWeights() 配置
- 由于两个 score 都在 [0, 1] 范围且 w_v + w_t = 1,最终 hybrid_score ∈ [0, 1]
- 重要: 不会强制过滤文本不匹配的文档,因为向量相似度权重更高(0.7),即使文本不匹配也可能返回高质量结果
示例:
4. Filter Search (过滤搜索)
SQL 模板:
说明:
- 纯元数据过滤,不涉及向量或文本相似度
- 所有结果 score = 1.0(因为都满足过滤条件)
- 按创建时间降序排序