embedding_function=None 的一个坑

🎉摘要:Chroma即使设置embedding_function=None,在add()未传入embeddings时仍会回退默认模型计算向量,导致维度锁定。文中给出实测代码和最佳实践:强制传预计算的embeddings,否则抛异常,避免生产隐患。

前面内容,强烈建议生产环境传 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,没有就抛异常。别指望框架帮你兜底。

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