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

相关推荐
Shulex1 小时前
跨境电商 AI Agent 核心架构解析:从只读问答到自主执行的工程落地
人工智能·架构·智能客服·跨境电商
Java后端的Ai之路1 小时前
CAS并发控制-从CPU指令到企业级乐观锁
vue.js·人工智能·python·cas·乐观锁
情 九1 小时前
MCP 实战 06:把 HTTP 接口接成工具,让 AI 帮你查数据
人工智能·网络协议·http·mcp
码农小旋风2 小时前
Ray分布式计算引擎介绍
人工智能·架构
火山引擎和TA的超级拍档们2 小时前
产品情报局 08 | AI 内容助手:全网热点驱动,一站式打通内容生产全链路
人工智能
Binovate缤江数智2 小时前
水泵远程开关之后,还需要管什么?数智开关在无人值守泵站中的监测、保护与能耗分析
人工智能·物联网
ZhengEnCi2 小时前
Agent 架构怎么选:从单 Agent 到多 Agent 编排的选型决策指南
算法·架构
素男2 小时前
两个月不是六十天
人工智能·agent·self-becoming·ai长期记忆·ai自我介绍
byte轻骑兵2 小时前
【LMP】规范精讲[10]: 语音专线开线记——SCO 固定占座与 eSCO 限时重传
人工智能·人机交互·lmp·蓝牙链路管理·蓝牙外设