ChromaDB距离计算公式示例

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判断问题是否被记录

https://blog.csdn.net/liliang199/article/details/159476341

相关推荐
easyCesium2 小时前
无人机平台-ai及智能体
人工智能·无人机
人道领域2 小时前
【LeetCode刷题日记】242.字母异位词
算法·leetcode·职场和发展
lifallen2 小时前
Flink Agent:RunnerContext 注入与装配演进分析
java·大数据·人工智能·语言模型·flink
搬砖者(视觉算法工程师)2 小时前
下一代人工智能技术:从大语言模型(LLM)到世界模型(WM)
人工智能
掘金安东尼2 小时前
什么是 OpenCode?
人工智能
QDYOKR1682 小时前
一文了解什么是OKR
大数据·人工智能·笔记·钉钉·企业微信
Westward-sun.2 小时前
背景建模详解与OpenCV实现:从原理到代码实战
人工智能·opencv·计算机视觉
科技峰行者2 小时前
闪存创新赋能全域,闪迪构建AI存储全栈版图
人工智能·ai·存储·闪存·闪迪
卖男孩的小火柴.2 小时前
java内置方法总结及基础算法
java·算法