AI
一个案例
tokenizer 说明
加载数据集
DatasetDict 类
logits 说明
langchain(一)
关键词提取
RAG与向量检索
RAG与向量检索(二)
TF-IDF 算法
本文档使用 MrDoc 发布
-
+
首页
RAG与向量检索(二)
### 概述 文本检索主要有三种方法: - 关键字检索; - 密集向量相似度(语义检索); - 稀疏向量相似度; ### 计算文本相似度 ``` import numpy from milvus_model.hybrid import BGEM3EmbeddingFunction bge_m3_ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu") sentences_1 = ["I love NLP", "I love machine learning"] sentences_2 = ["I love BGE", "I love text retrieval"] embeddings_1 = bge_m3_ef(sentences_1) embeddings_2 = bge_m3_ef(sentences_2) print(embeddings_1) print(embeddings_2) # 稀疏向量相似度 similarity = numpy.array(embeddings_1["dense"]) @ numpy.array(embeddings_2["dense"]).T print(similarity) # 密集向量相似度 similarity = numpy.array(embeddings_1["sparse"]) @ numpy.array(embeddings_2["sparse"]).T print(similarity) ``` ### 相似度矩阵(Matrix Multiplication for Similarity) 通过矩阵乘法 `similarity = embeddings_1 @ embeddings_2.T`,得到了一个 2 x 2 的相似度矩阵。 假设 `A(embeddings_1)`和 `B(embeddings_2)`是两个 2 x d 的矩阵,那么 `A @ B.T` 是一个 2 x 2 的矩阵,其 i, j 元素即为 A 中第 i 个向量与 B 中第 j 个向量的点积。 最终输出的相似度矩阵的结构如下: ``` | s11 s12 | similarity = | | | s21 s22 | ``` 其中: - `s_{11}` 是 embeddings_1[0] 和 embeddings_2[0] 的点积,即 "I love NLP" 和 "I love BGE" 的相似度; - `s_{12}` 是 embeddings_1[0] 和 embeddings_2[1] 的点积,即 "I love NLP" 和 "I love text retrieval" 的相似度; - `s_{21}` 是 embeddings_1[1] 和 embeddings_2[0] 的点积,即 "I love machine learning" 和 "I love BGE" 的相似度; - `s_{22}` 是 embeddings_1[1] 和 embeddings_2[1] 的点积,即 "I love machine learning" 和 "I love text retrieval" 的相似度; ### 一些说明 - `点积:`点积是一个常见的相似度度量。较高的点积值表示两个嵌入向量较为相似,较低的点积值表示两个嵌入向量较不相似。 - `取值范围:`因为嵌入向量的数值一般较大,所以点积值可以是正值,也可以是负值。点积值越大,表示两个句子在嵌入空间中的方向越相似。 - `归一化:`在特定语境下,如果嵌入向量已经被归一化(即每个向量的模长为1),那么点积值会在 [-1, 1] 范围内。否则,值的范围可能会较大。 ### 进一步操作 如果你希望将相似度值理解得更清晰,可能需要进一步的处理,例如: - 归一化处理,将点积的值规范化到一个标准的相似度量,如余弦相似度。 - 可视化,帮助直观理解各个句子之间的相似度关系。 > 如果嵌入向量已经进行了归一化处理,那么计算得到的相似度结果(点积)就不需要再进一步归一化,因为点积在这种情况下等同于余弦相似度。这是因为归一化后的向量的模长为1,点积就是余弦相似度的值。 如果你不确定嵌入是否已经归一化,可以检查嵌入向量的模长: ``` import numpy as np # 检查嵌入向量的模长是否为1 def check_normalization(embeddings): norms = np.linalg.norm(embeddings, axis=1) print("Norms:", norms) return np.allclose(norms, 1.0) normalized = check_normalization(embeddings_1) and check_normalization(embeddings_2) print("Are embeddings normalized? ", normalized) ``` 如果所有嵌入向量的模长均接近1,那么它们已经归一化,无需进一步处理。 ### 扩展阅读:稀疏向量 `稀疏向量`使用向量嵌入表示单词或短语,`其中大多数元素为零`,只有少数非零元素表示特定单词的存在。加权余弦相似度考虑了向量中每个非零元素的权重,通过计算向量之间的夹角余弦值来衡量它们的相似程度。稀疏向量模型,例如 SPLADEv2,在领域外的知识搜索、关键词感知和可解释性方面优于稠密模型。它们在信息检索、自然语言处理和推荐系统中特别有用,通过将稀疏向量用于召回并使用大型模型进行排名,可以显著改善召回结果。 > 具体计算加权余弦相似度的步骤如下: > 1. 对两个稀疏向量进行归一化处理,将它们的长度标准化为1。这可以通过将向量除以其范数(即向量的欧几里德长度)来实现。 > 2. 对于两个向量中的每个非零元素,将其乘以相应的权重。权重可以根据具体的应用场景来确定,例如可以基于特征的重要性或者其他统计信息来赋予不同的权重。 > 3. 计算两个加权向量之间的余弦相似度。余弦相似度可以通过计算两个向量的点积(即对应元素相乘后求和)除以两个向量的范数的乘积来得到。 > [Milvus文档:稀疏向量](https://www.milvus-io.com/reference/sparse_vector) > [稀疏向量上的加权余弦相似度](https://cloud.tencent.com.cn/developer/information/%E7%A8%80%E7%96%8F%E5%90%91%E9%87%8F%E4%B8%8A%E7%9A%84%E5%8A%A0%E6%9D%83%E4%BD%99%E5%BC%A6%E7%9B%B8%E4%BC%BC%E5%BA%A6)
gaojian
2024年9月30日 08:51
分享文档
收藏文档
上一篇
下一篇
微信扫一扫
复制链接
手机扫一扫进行分享
复制链接
关于 MrDoc
觅思文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅思文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅思文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
Markdown文件
分享
链接
类型
密码
更新密码