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

相关推荐
满怀冰雪16 分钟前
24-PaddleClas 模型评估、导出与推理部署入门
大数据·人工智能·python·深度学习·paddle
Mid_search2 小时前
随机排列与Fisher-Yates算法
人工智能·深度学习·强化学习·随机排列·fisher-yates
ZGIAI6 小时前
ZGI Workflow:条件分支走错时先查哪一层
人工智能·架构
X54先生(人文科技)6 小时前
《元创力》纪实录 · 桥段 《窑变纪元:一份来自星历2227年的深空考古笔记》
人工智能·开源·ai写作·零知识证明
ZGIAI6 小时前
ZGI 文件产物:生成报告后怎样交付
人工智能·架构
东方-教育技术博主6 小时前
自动编码在教育场景中的重要性:一项基于多源证据的深度综述
大数据·人工智能
骥龙6 小时前
模块二:Ollama本地模型部署与OpenCode代理配置
人工智能
阡之尘埃6 小时前
Python数据分析案例85——大模型微调全流程(SFT的LoRA微调)
人工智能·python·深度学习·语言模型·llm·微调·千问
Regentsoft丽晶软件6 小时前
品牌方新品上市促销政策无法实时同步经销商,有没有支持总部-经销商-终端一站式的分销解决方案?
人工智能·经验分享·数据库架构