给定一句话(字符串),对比「文本的字符相似度排序结果」与「文本的语义相似度排序结果」
加权混合排序
-- 加权混合(真实向量值待填充)
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 为“在哪里查看个人等级”经过向量模型转换后的向量值
可以对数据采用如下表格对照方式进行测试,以此来验证各种搜索排序的效果。
| 文本输入 | 向量值 | 字符相似度排序 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
发表评论