J'Blog

4 课 · Chroma

语义检索

基于 Chroma 向量库,与 Workspace 知识库分离。用自然语言描述你想查的内容。 非管理员每人每天可检索 5 次(消耗站点 AI 配额)。

Chroma Embedding 函数

原文:Embedding 函数

一句话

Embedding 函数是将数据转换为数值表示的工具,使 Chroma 能够存储、索引和搜索相似内容。

什么时候翻这页

当你需要了解如何在 Chroma 中使用不同的 embedding 函数,或者需要自定义 embedding 函数时。

核心概念

  • Embedding:数据的数值表示,能够捕捉数据的含义,使 AI 模型能够处理文本、图像、音频和视频等数据
  • Embedding Function:将数据转换为向量的函数,可链接到集合并在调用 addupdateupsertquery 时自动使用
  • DefaultEmbeddingFunction:Chroma 默认使用的 embedding 函数,基于 Sentence Transformers 的 all-MiniLM-L6-v2 模型,在本地运行
  • Custom Embedding Function:用户自定义的 embedding 函数,需要实现 EmbeddingFunction 接口

怎么做

使用 OpenAI Embedding Function

# 设置 OPENAI_API_KEY 环境变量
from chromadb.utils.embedding_functions import OpenAIEmbeddingFunction

collection = client.create_collection(
    name="my_collection",
    embedding_function=OpenAIEmbeddingFunction(
        model_name="text-embedding-3-small"
    )
)

# Chroma 将使用 OpenAIEmbeddingFunction 来嵌入你的文档
collection.add(
    ids=["id1", "id2"],
    documents=["doc1", "doc2"]
)

使用默认 Embedding Function

from chromadb.utils.embedding_functions import DefaultEmbeddingFunction

default_ef = DefaultEmbeddingFunction()
embeddings = default_ef(["foo"])
print(embeddings)  # [[0.05035809800028801, 0.0626462921500206, -0.061827320605516434...]]

collection.query(query_embeddings=embeddings)

创建自定义 Embedding Function

from typing import Dict, Any
from chromadb import Documents, EmbeddingFunction, Embeddings
from chromadb.utils.embedding_functions import register_embedding_function

@register_embedding_function
class MyEmbeddingFunction(EmbeddingFunction):

    def __init__(self, model):
        self.model = model

    def __call__(self, input: Documents) -> Embeddings:
        # 实现文档嵌入逻辑
        return embeddings

    @staticmethod
    def name() -> str:
        return "my-ef"

    def get_config(self) -> Dict[str, Any]:
        return dict(model=self.model)

    @staticmethod
    def build_from_config(config: Dict[str, Any]) -> "EmbeddingFunction":
        return MyEmbeddingFunction(config['model'])

命令 / API 速查

  • OpenAIEmbeddingFunction(model_name):创建 OpenAI embedding 函数
  • DefaultEmbeddingFunction():创建默认 embedding 函数
  • collection.add():添加文档,自动使用关联的 embedding 函数
  • collection.query():查询相似内容,可使用 query_embeddings 参数
  • @register_embedding_function:装饰器,用于注册自定义 embedding 函数

支持的 Embedding 提供商

提供商PythonTypeScript
Cloudflare Workers AI
Cohere
Google Generative AI
Hugging Face-
Hugging Face Embedding Server
Jina AI
Mistral
Morph
OpenAI
Sentence Transformers
Together AI

与 Hello-Agents / LangGraph / 本博客 handbook 索引的联系

在 Hello-Agents 的记忆与检索章节中,我们学习了基本的检索概念,而 Chroma 的 embedding 函数是实现这些概念的具体工具。在本博客 handbook 中,我们使用 Chroma 作为 vector store,而 embedding 函数是将文本转换为向量的关键组件,直接影响检索效果。当我们在 RAG 系统中使用 Chroma 时,选择合适的 embedding 函数对提高检索准确性至关重要。

初学者易错点

  1. 忘记设置 OPENAI_API_KEY 环境变量
  2. 混淆 embedding 函数和 retriever 的概念
  3. 在创建集合时不指定 embedding 函数,导致使用默认函数可能不符合需求
  4. 自定义 embedding 函数时没有正确实现所有必需的方法
  5. 在 TypeScript 中忘记安装相应的 embedding 函数包(如 @chroma-core/openai

相关词条

官方原文:https://docs.trychroma.com/docs/embeddings/embedding-functions