faiss和chromadb是LLM时代两种重要的轻量级向量库实现方式。
之前探索了使用向量库faiss和LLM判断问题是否被记录。
https://blog.csdn.net/liliang199/article/details/159476341
这里进一步探索chromadb距离计算公式,所用示例参考和修改自网络资料。
1 ChromaDB距离计算
ChromaDB支持三种核心距离计算方式,分别通过l2、cosine和ip三个参数来指定。
ChromaDB默认使用l2,即平方后的欧几里得距离。
1.1 平方欧几里得距离
平方欧几里得距离 (Squared L2),衡量两个向量在空间中的直线距离,对向量长度敏感。
其计算公式为:
适应于向量未经归一化处理,或注重绝对差异的场景。
1.2 余弦距离 (Cosine)
基于"余弦相似度"衍生而来。它计算的是向量间的夹角,关注方向的差异而非长度。
其公式为:
在ChromaDB中,余弦距离是核心概念,值越接近0表示向量越相似。
余弦距离对向量的绝对数值不敏感。
例如,一个小学生`[0.13, 0.16, 0.05]`和一个大学生`[0.63, 0.84, 0.45]`的知识向量长度差异很大,但方向相似(都是数学突出),因此它们的余弦距离很小。
余弦距离适应于文本、语义相似度等注重方向而非长度的场景。
1.3 内积距离 (ip)
内积距离(Inner Product / Dot Product) |ip| 也叫点积,它是计算两个向量点积的负数(或补数),用于衡量向量在彼此方向上的投影大小。
在ChromaDB中内积距离公式可以理解为:
通常,如果某个距离计算为内积,其值越小,相似度越高。
内积距离通常用于优化过的场景,如配合特定嵌入模型使用。
2 距离计算代码示例
2.1 如何设置距离计算方式
ChromaDB允许在创建集合Collection时指定计算方式,一旦创建就无法修改。
以下是Python示例:
import chromadb
# 创建客户端(使用内存模式)
client = chromadb.Client()
# 1. 使用默认的 L2 距离(等价于下面这行)
collection_default = client.create_collection("my_collection_l2")
# 2. 显式设置使用 Cosine 距离
collection_cosine = client.create_collection(
name="my_collection_cosine",
metadata={"hnsw:space": "cosine"} # 设置为余弦距离
)
# 3. 显式设置使用 Inner Product (点积) 距离
collection_ip = client.create_collection(
name="my_collection_ip",
metadata={"hnsw:space": "ip"} # 设置为内积距离
)
# 添加一些示例向量
collection_cosine.add(
ids=["id1", "id2", "id3"],
embeddings=[[1.2, 2.3, 3.4], [0.5, 1.2, 2.1], [1.0, 2.0, 3.0]]
)
# 查询并返回距离分数
results = collection_cosine.query(
query_embeddings=[[1.1, 2.2, 3.3]],
n_results=2,
include=["distances"] # 返回距离分数
)
print(results['distances'])
在新版Chroma(v1.0以上)中,推荐使用更规范的configuration参数来设置,更具可维护性。
2.2 距离计算的关联影响
使用不同的距离计算方式,也可能影响到某些查询功能:
1)距离阈值
ChromaDB中的Max Query Distance参数用于筛选结果,其最大值的范围会因您选择的距离计算方式而不同
2)距离分数解读
在ChromaDB中,similarity_search_with_score函数返回的分数其实是距离值。
分数越低代表相似度越高,这点与相似度的直观感受是相反的。
如果需要快速验证设置,可使用ChromaDB内存模式或Docker方式,无需进行复杂的配置。
reference
collections
https://cookbook.chromadb.dev/core/collections/#
Frequently Asked Questions and Commonly Encountered Issues¶
https://cookbook.chromadb.dev/faq/
如何使用向量库faiss和LLM判断问题是否被记录