Chroma 教程

space:距离度量

🎉摘要:详解Chroma集合中space参数用法:创建时指定向量相似度算法,可选cosine、l2、ip且创建后不可修改。文本与RAG检索优先选cosine,避免向量模长干扰;l2适合图像数值向量;ip需归一化后使用。注意显式配置space,避免依赖embedding函数默认值,修改需重建集合并重新灌数据。

space 用来指定向量之间怎么算相似度,在建集合的时候确定,创建之后不能修改。只在索引配置(hnsw /spann)里面设置。

配置如下:

col = client.create_collection(
    name="kb_demo",
    embedding_function=None,
    configuration={
        "hnsw": {
            "space": "cosine" # 看这里
        }
    },
)

有三种取值(源码里 Space = Literal["cosine", "l2", "ip"]):

  • cosine(余弦距离,RAG 文本最常用) 计算向量夹角,只关心方向,不关心向量长度。 向量提前做归一化之后,余弦距离等价于内积。 适合句子、文本 Embedding,绝大多数中文 / 英文检索场景优先选这个。 取值范围 0~2;数值越小代表越相似。

  • l2(欧氏距离) 计算两个向量每个维度差值平方和再开根。 既看方向,也看向量模长。 适合图像、数值类向量;很多 CLIP 图像检索会用。 取值 ≥0;数值越小代表越相似。

  • ip(内积,Inner Product) 直接向量点乘。 只有向量全部归一化时,内积越大,余弦相似度越高。 未归一化向量,模长会严重干扰结果,一般不推荐新手直接用。取值没有固定区间;和另外两个相反:数值越大代表越相似。

注意,文本检索一律用 cosine。原因:

  • 文本 embedding 的长度(模)携带的信息往往跟语义无关,用 l2 会被长度干扰

  • cosine 只看方向,对“长文档 vs 短查询”这种长度差异大的情况更稳

  • 值域固定在 0~2,方便设阈值和做相似度换算(sim = 1 - dist)

有个细节:如果你建集合时传了嵌入函数(embedding_function)且没显式指定 space,Chroma 会用嵌入函数的 ef.default_space() 作为默认值。所以有些 EF 建出来的集合自动就是 cosine。但别依赖这个,显式写清楚,避免踩坑。

创建集合一旦指定了 space 就不能修改,如果到集合数据很多时才发现,要修改 space 需要重建集合,重新灌数据。

  

说说我的看法
全部评论()
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号