Skip to content

嵌入#

概念#

在 LlamaIndex 中,嵌入用于使用复杂的数字表示来表示您的文档。嵌入模型以文本作为输入,并返回一长串数字,用于捕捉文本的语义。这些嵌入模型经过训练,以这种方式表示文本,并帮助实现许多应用,包括搜索!

在高层次上,如果用户提出关于狗的问题,那么该问题的嵌入将与谈论狗的文本非常相似。

在计算嵌入之间的相似性时,有许多方法可用(点积,余弦相似度等)。默认情况下,LlamaIndex 在比较嵌入时使用余弦相似度。

有许多嵌入模型可供选择。默认情况下,LlamaIndex 使用来自 OpenAI 的 text-embedding-ada-002。我们还支持 Langchain 提供的任何嵌入模型在这里,并提供了一个易于扩展的基类,用于实现您自己的嵌入。

使用模式#

在 LlamaIndex 中,最常见的用法是在 Settings 对象中指定嵌入模型,然后在向量索引中使用它。嵌入模型将用于嵌入在索引构建期间使用的文档,以及稍后使用查询引擎进行任何查询时的嵌入。您还可以为每个索引指定嵌入模型。

如果您尚未安装嵌入模型:

pip install llama-index-embeddings-openai

然后:

from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.core import VectorStoreIndex
from llama_index.core import Settings

# 全局
Settings.embed_model = OpenAIEmbedding()

# 每个索引
index = VectorStoreIndex.from_documents(documents, embed_model=embed_model)

为了节省成本,您可能希望使用本地模型。

pip install llama-index-embeddings-huggingface
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.core import Settings

Settings.embed_model = HuggingFaceEmbedding(
    model_name="BAAI/bge-small-en-v1.5"
)

这将使用 Hugging Face 的一个性能良好且快速的默认模型。

您可以在下面找到更多的使用细节和可用的自定义选项。

入门#

嵌入模型的最常见用法将是在全局 Settings 对象中设置它,然后用它来构建索引和查询。输入文档将被分解成节点,并且嵌入模型将为每个节点生成一个嵌入。

默认情况下,LlamaIndex 将使用 text-embedding-ada-002,这是下面示例手动为您设置的内容。

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.core import Settings

# 全局默认
Settings.embed_model = OpenAIEmbedding()

documents = SimpleDirectoryReader("./data").load_data()

index = VectorStoreIndex.from_documents(documents)

然后,在查询时,嵌入模型将再次用于嵌入查询文本。

query_engine = index.as_query_engine()

response = query_engine.query("查询字符串")

自定义#

批处理大小#

默认情况下,嵌入请求以 10 的批量发送到 OpenAI。对于一些用户,这可能(很少)会导致速率限制。对于嵌入许多文档的其他用户,此批处理大小可能太小。

# 将批处理大小设置为 42
embed_model = OpenAIEmbedding(embed_batch_size=42)

本地嵌入模型#

使用本地模型的最简单方法是:

from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.core import Settings

Settings.embed_model = HuggingFaceEmbedding(
    model_name="BAAI/bge-small-en-v1.5"
)

HuggingFace Optimum ONNX 嵌入#

LlamaIndex 还支持使用 HuggingFace 的 Optimum 库创建和使用 ONNX 嵌入。简单地创建并保存 ONNX 嵌入,然后使用它们。

一些先决条件:

pip install transformers optimum[exporters]
pip install llama-index-embeddings-huggingface-optimum

指定模型和输出路径进行创建:

from llama_index.embeddings.huggingface_optimum import OptimumEmbedding

OptimumEmbedding.create_and_save_optimum_model(
    "BAAI/bge-small-en-v1.5", "./bge_onnx"
)

然后使用:

Settings.embed_model = OptimumEmbedding(folder_name="./bge_onnx")

LangChain 集成#

我们还支持 Langchain 提供的任何嵌入在这里

下面的示例加载了一个来自 Hugging Face 的模型,使用 Langchain 的嵌入类。

pip install llama-index-embeddings-langchain
from langchain.embeddings.huggingface import HuggingFaceBgeEmbeddings
from llama_index.core import Settings

Settings.embed_model = HuggingFaceBgeEmbeddings(model_name="BAAI/bge-base-en")

自定义嵌入模型#

如果您想使用 LlamaIndex 或 Langchain 没有提供的嵌入,您也可以扩展我们的基础嵌入类并实现自己的嵌入!

下面的示例使用 Instructor Embeddings(安装/设置详细信息在这里),并实现了一个自定义嵌入类。Instructor 嵌入通过提供文本以及关于文本领域的“指导”来工作。当嵌入来自非常特定和专业化的主题时,这将非常有帮助。

from typing import Any, List
from InstructorEmbedding import INSTRUCTOR
from llama_index.core.embeddings import BaseEmbedding


class InstructorEmbeddings(BaseEmbedding):
    def __init__(
        self,
        instructor_model_name: str = "hkunlp/instructor-large",
        instruction: str = "代表计算机科学文档或问题:",
        **kwargs: Any,
    ) -> None:
        self._model = INSTRUCTOR(instructor_model_name)
        self._instruction = instruction
        super().__init__(**kwargs)

        def _get_query_embedding(self, query: str) -> List[float]:
            embeddings = self._model.encode([[self._instruction, query]])
            return embeddings[0]

        def _get_text_embedding(self, text: str) -> List[float]:
            embeddings = self._model.encode([[self._instruction, text]])
            return embeddings[0]

        def _get_text_embeddings(self, texts: List[str]) -> List[List[float]]:
            embeddings = self._model.encode(
                [[self._instruction, text] for text in texts]
            )
            return embeddings

        async def _get_query_embedding(self, query: str) -> List[float]:
            return self._get_query_embedding(query)

        async def _get_text_embedding(self, text: str) -> List[float]:
            return self._get_text_embedding(text)

独立使用#

您也可以将嵌入作为独立模块用于您的项目、现有应用程序或一般测试和探索。

embeddings = embed_model.get_text_embedding(
    "这里正在下瓢泼大雨!"
)

支持的嵌入列表#

我们支持与 OpenAI、Azure 以及 LangChain 提供的任何内容集成。