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 需要重建集合,重新灌数据。