前面内容,强烈建议生产环境传 embedding_function=None,让 Chroma 只当存储使用,不要计算向量,一是慢,而是中文不友好。
但是,有个隐藏行为你不得不知道,即使你将 embedding_function 设置为 None,当调用 add() 时只给 documents 不给 embeddings(向量),Chroma 客户端还是会回退到默认模型去算(因此,强制要求传递 embeddings)。
我实测过:
import chromadb
client = chromadb.EphemeralClient()
col = client.get_or_create_collection("notes", embedding_function=None)
print(col._embedding_function) # None
print(col.configuration["embedding_function"]) # None
col.add(ids=["a1"], documents=["只给文本"])
emb = col.get(ids=["a1"], include=["embeddings"])["embeddings"]
print(len(emb[0])) # 384 ← 默认模型算的!也就是说你以为禁用了自动嵌入,其实只是“没显式指定时用默认的”。要真正避免这件事,只有一个办法:每次 add 都显式传 embeddings,自己提前算好向量。
反过来,这也意味着集合一旦被“意外”用默认模型建出了 384 维,你再想塞别的维度的向量就晚了。此时,你只能删除集合,从头再来。
我的做法(推荐你也这么做):
建库脚本里第一行就是 create_collection(..., embedding_function=None),然后所有写入函数强制要求传 embeddings,没有就抛异常。别指望框架帮你兜底。