嵌入#
概念#
在 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 提供的任何内容集成。