跳至内容

嵌入#

概念#

嵌入在 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

# changing the global default
Settings.embed_model = OpenAIEmbedding()

# local usage
embedding = OpenAIEmbedding().get_text_embedding("hello world")
embeddings = OpenAIEmbedding().get_text_embeddings(
    ["hello world", "hello world"]
)

# per-index
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

# global default
Settings.embed_model = OpenAIEmbedding()

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

index = VectorStoreIndex.from_documents(documents)

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

query_engine = index.as_query_engine()

response = query_engine.query("query string")

自定义#

批量大小#

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

# set the batch size to 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 提供的任何嵌入。

下面的示例使用 Langchain 的嵌入类从 Hugging Face 加载模型。

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 = "Represent the Computer Science documentation or question:",
        **kwargs: Any,
    ) -> None:
        super().__init__(**kwargs)
        self._model = INSTRUCTOR(instructor_model_name)
        self._instruction = instruction

        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(
    "It is raining cats and dogs here!"
)

支持的嵌入列表#

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