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

相关推荐
Li emily6 小时前
解决了加密货币api多币种订阅时的数据乱序问题
人工智能·python·api·fastapi
csdn_aspnet6 小时前
C语言 Lomuto分区算法(Lomuto Partition Algorithm)
c语言·开发语言·算法
山川绿水6 小时前
bugku——PWN——overflow2
人工智能·web安全·网络安全
程序员cxuan7 小时前
微信读书官方发了 skills,把我给秀麻了。
人工智能·后端·程序员
fake_ss1987 小时前
AI时代学习全栈项目开发的新范式
java·人工智能·学习·架构·个人开发·学习方法
谙弆悕博士7 小时前
【附C源码】从零实现C语言堆数据结构:原理、实现与应用
c语言·数据结构·算法··数据结构与算法
nassi_7 小时前
对AI工程问题的一些思考
大数据·人工智能·hadoop
AI技术控7 小时前
《Transformers are Inherently Succinct》论文解读:从“能表达什么”到“多紧凑地表达”
人工智能·python·深度学习·机器学习·自然语言处理
蔡俊锋7 小时前
AI记忆压缩术:从305GB到7.4GB的魔法
人工智能·ai·ai 记忆
Upsy-Daisy7 小时前
AI Agent 项目学习笔记(二):Spring AI 与 ChatClient 主链路解析
人工智能·笔记·学习