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