阿毛
It's me !
想你所想

pg相似度匹配与混合检索

给定一句话(字符串),对比「文本的字符相似度排序结果」与「文本的语义相似度排序结果」

加权混合排序

-- 加权混合(真实向量值待填充)
SELECT id,
       (0.7 * (1 - (embedding <-> '[-0.03900614008307457, ]'::vector)) + 0.3 * (ts_rank(to_tsvector('testzhcfg', content), plainto_tsquery('testzhcfg', '在哪里查看个人等级')))) as mixed_score,
       1 - (embedding <-> '[-0.03900614008307457, ]'::vector) AS similarity,
       ts_rank(to_tsvector('testzhcfg', content), plainto_tsquery('testzhcfg', '在哪里查看个人等级')) AS rank,
       content,
       answer
FROM documents
-- where answer is null
ORDER BY mixed_score DESC
OFFSET 0
LIMIT 50
;
  • “在哪里查看个人等级”为客户端用户输入问题
  • content 为 documents 表中的字段(知识库字典QA对中的Q)
  • embedding 为 documents 表中的字段(为 content 字段文本内容经过向量模型转换后的向量值)
  • -0.03900614008307457 为“在哪里查看个人等级”经过向量模型转换后的向量值

理念类似于 https://help.aliyun.com/zh/polardb/polardb-for-postgresql/vector-hybrid-retrieval?spm=a2c4g.11186623.help-menu-2249963.d_8_6_1_0.710644e2DW3ofX#0c6c7c6c9a8hl

可以对数据采用如下表格对照方式进行测试,以此来验证各种搜索排序的效果。

文本输入向量值字符相似度排序 ORDER BY rank DESC, similarity DESC语义相似度排序 ORDER BY similarity DESC, rank DESC加权混合排序 `ORDER BY (0.7 * similarity + 0.3 * rank) DESC`
在哪里查看个人等级

PostgreSQL 全文搜索中文分词匹配原理

ts_rank(to_tsvector(‘testzhcfg’, content), plainto_tsquery(‘testzhcfg’, %s )) AS rank

tsvector 数据类型

函数分解

1. to_tsvector('testzhcfg', content)

  • 作用:将表中的 content 文本字段转换为搜索向量
  • 中文分词:使用 testzhcfg 配置进行中文分词处理
  • 处理过程
    • 对 content 字段进行中文分词
    • 移除停用词(如”的”、”了”等)
    • 词干提取和标准化
    • 生成带权重的词素向量

2. plainto_tsquery('testzhcfg', %s)

  • 作用:将用户输入的查询文本转换为搜索查询
  • 处理方式
    • 同样使用 testzhcfg 中文分词配置
    • 将查询文本分词处理
    • 转换为可匹配的查询格式
    • 词间默认为 AND 逻辑关系

3. ts_rank()

  • 计算相关性:基于词频、文档长度、词权重等因素计算匹配得分
  • 返回分数:数值越高表示匹配度越好

中文分词配置

testzhcfg 配置

  • 中文分词器:专门针对中文文本的分词处理
  • 分词算法:可能基于词典匹配或统计模型
  • 处理特点
    • 能正确处理中文词语边界
    • 支持多字词的识别
    • 处理中文标点符号

匹配流程

1. 预处理阶段

content字段 → to_tsvector('testzhcfg') → 标准化词素向量
%s输入 → plainto_tsquery('testzhcfg') → 查询词素向量

2. 匹配阶段

  • 对比 content 向量中的词素与查询向量中的词素
  • 计算词素匹配的数量和频率
  • 考虑词素在文档中的位置和权重

3. 评分阶段

  • 词频因子:查询词在文档中出现的频率
  • 文档长度:较短文档中匹配词的重要性更高
  • 词权重:不同词素可能有不同的权重设置

实际示例

假设场景

  • content = “人工智能技术在医疗领域的应用”
  • %s = “人工智能医疗”

分词处理

content分词: ["人工智能", "技术", "医疗", "领域", "应用"]
查询分词: ["人工智能", "医疗"]

匹配计算

  • 匹配词数:2个词匹配(”人工智能”、”医疗”)
  • 词频计算:每个词在文档中的出现频率
  • 最终得分:基于匹配度和权重计算的综合分数

优势特点

中文支持

  • 专门的中文分词配置确保准确分词
  • 处理中文特有的语言特点

灵活匹配

  • 支持部分匹配和模糊匹配
  • 不要求完全精确的字符串匹配

相关性排序

  • 通过 rank 分数实现结果排序
  • 返回最相关的文档优先

text-embedding-v4底层原理及输入处理分析

text-embedding-v4是基于Transformer架构的预训练语言模型,属于Qwen3-Embedding系列。其核心原理是通过深度神经网络将文本映射为高维向量(默认1024维),该向量能捕捉文本的语义、语法及上下文信息。以下是关键机制:

1. 文本向量化流程

当输入文本“怎么充会员”时,模型会执行以下步骤:

  • 分词与编码:将文本拆分为词语或子词单元(如“怎么”“充”“会员”),并转换为模型可处理的数字ID序列。
  • 上下文嵌入:通过Transformer的多头自注意力机制,为每个词生成包含上下文信息的词向量。例如,“充”在“充会员”中的语义会结合前后文被理解为“购买”或“开通”的含义。
  • 聚合向量:将所有词向量融合为一个固定维度的文本向量(如1024维),该向量综合表征整个句子的语义。

2. 是否进行同义词分析?

是的,模型会隐式捕捉同义词的语义关联,但不会显式将文本替换为同义词(如“充”转为“购买”)。其原理如下:

  • 语义表征能力:通过预训练学习大规模文本数据,模型已掌握词语间的语义相似性。例如,“充会员”与“购买会员”“开通会员”等表达会在向量空间中形成语义邻近的向量(余弦相似度高)。
  • 任务指令优化(如文档【1】所述):若结合任务指令(instruct参数),模型可进一步聚焦特定场景(如会员充值流程),提升向量对检索需求的匹配度。

3. 输入“怎么充会员”的结果示例

假设使用默认1024维向量:

# 调用示例(参考文档【1】和【5】)
resp = dashscope.TextEmbedding.call(
    model="text-embedding-v4",
    input="怎么充会员",
    dimension=1024
)
vector = resp.output['embeddings'][0]['embedding']  # 长度为1024的浮点数列表

该向量将与“如何购买会员”“会员充值步骤”等语义相关文本的向量具有高相似度,从而支持语义搜索分类任务

4. 关键特性与限制

  • 向量维度可调:支持64~2048维(文档【1】)。更高维度保留更多细节,但存储成本上升。
  • 多语言支持:覆盖100+语种,包括中文、英语等(文档【1】)。
  • 任务指令增强:通过instruct参数优化向量生成(需SDK/API支持,文档【1】)。
  • 成本优化:批量处理(Batch接口)可降低大规模数据处理费用(文档【1】)。

总结

text-embedding-v4通过深度学习模型将文本转化为语义向量,无需显式替换同义词即可实现语义关联。输入“怎么充会员”生成的向量能与相关语义表达(如“购买会员”)在向量空间中形成聚类,从而支持精准检索或推荐。若需进一步优化,可通过任务指令明确检索意图(例如:instruct="Retrieve steps for membership recharge")。

搜索方式比对

全文搜索特点(to_tsvector)

  • PostgreSQL 内置的全文搜索功能
  • 基于关键词匹配:使用分词器处理文本
  • 语义理解有限:只匹配词素,不理解语义相似性
  • 速度快:适合精确关键词搜索
  • 支持中文分词:’testzhcfg’ 配置专门处理中文

向量搜索特点(embedding <-> %s::vector)

  • vector 数据类型(PGVector 扩展)
  • 基于语义相似性:基于欧几里得向量距离、余弦相似度等计算语义相似性
  • 语义理解强:能找出语义相关但关键词不同的内容
  • 需要预计算:文档需提前转换为向量嵌入
  • 使用 <-> 操作符:计算向量间的距离

tsvector ≠ PGVector 的 vector

humh

文章作者

站长本人,一个憨批!

发表评论

textsms
account_circle
email

想你所想

pg相似度匹配与混合检索
给定一句话(字符串),对比「文本的字符相似度排序结果」与「文本的语义相似度排序结果」 加权混合排序 -- 加权混合(真实向量值待填充) SELECT id, (0.7 * (1 - (embeddi…
扫描二维码继续阅读
2026-01-08