Jina Embeddings¶
如果你在 colab 上打开此 Notebook,你可能需要安装 LlamaIndex 🦙。
%pip install llama-index-embeddings-jinaai
%pip install llama-index-llms-openai
!pip install llama-index
你可能还需要安装 LlamaIndex 不直接附带的其他包。
!pip install Pillow
对于此示例,你需要一个 API 密钥,可以从 https://jina.ai/embeddings/ 获取。
# Initilise with your api key
import os
jinaai_api_key = "YOUR_JINAAI_API_KEY"
os.environ["JINAAI_API_KEY"] = jinaai_api_key
通过 JinaAI API 使用 Jina Embedding 模型嵌入文本和查询¶
你可以使用 JinaEmbedding 类编码你的文本和查询。Jina 提供了一系列适用于各种用例的模型。
模型 | 维度 | 语言 | MRL (套娃表示学习) | 上下文 |
---|---|---|---|---|
jina-embeddings-v3 | 1024 | 多语言 (89 种语言) | 是 | 8192 |
jina-embeddings-v2-base-en | 768 | 英语 | 否 | 8192 |
jina-embeddings-v2-base-de | 768 | 德语和英语 | 否 | 8192 |
jina-embeddings-v2-base-es | 768 | 西班牙语和英语 | 否 | 8192 |
jina-embeddings-v2-base-zh | 768 | 中文和英语 | 否 | 8192 |
推荐模型:jina-embeddings-v3
我们推荐使用 jina-embeddings-v3
作为 Jina AI 最新、性能最优的嵌入模型。此模型在其骨干之上训练了 5 个任务特定的适配器,优化了各种嵌入用例。
默认情况下,JinaEmbedding
类使用 jina-embeddings-v3
。在骨干之上,jina-embeddings-v3
针对不同的嵌入用途训练了 5 个任务特定的适配器。
针对特定任务的适配器
在你的请求中包含 task
以优化你的下游应用程序
- retrieval.query:用于在检索任务中编码用户查询或问题。
- retrieval.passage:用于在检索任务中索引时编码大型文档。
- classification:用于为文本分类任务编码文本。
- text-matching:用于编码文本以进行相似性匹配,例如衡量两个句子之间的相似性。
- separation:用于聚类或重排序任务。
套娃表示学习 (Matryoshka Representation Learning):
jina-embeddings-v3
支持 Matryoshka 表示学习,允许用户在性能损失最小的情况下控制嵌入维度。
在你的请求中包含 dimensions
以选择所需的维度。
默认情况下,dimensions 设置为 1024,建议使用 256 到 1024 之间的数字。
你可以参考下表获取关于维度与性能的提示
维度 | 32 | 64 | 128 | 256 | 512 | 768 | 1024 |
---|---|---|---|---|---|---|---|
平均检索性能 (nDCG@10) | 52.54 | 58.54 | 61.64 | 62.72 | 63.16 | 63.3 | 63.35 |
长上下文 Embedding 模型中的延迟分块
jina-embeddings-v3
支持 后期分块(Late Chunking),该技术利用模型的长上下文能力生成上下文感知的分块嵌入。在你的请求中包含 late_chunking=True
以启用上下文分块表示。当设置为 true 时,Jina AI API 将连接输入字段中的所有句子并将它们作为单个字符串提供给模型。在内部,模型会嵌入这个长连接字符串,然后执行后期分块,返回一个与输入列表大小匹配的嵌入列表。
from llama_index.embeddings.jinaai import JinaEmbedding
text_embed_model = JinaEmbedding(
api_key=jinaai_api_key,
model="jina-embeddings-v3",
# choose `retrieval.passage` to get passage embeddings
task="retrieval.passage",
)
embeddings = text_embed_model.get_text_embedding("This is the text to embed")
print("Text dim:", len(embeddings))
print("Text embed:", embeddings[:5])
query_embed_model = JinaEmbedding(
api_key=jinaai_api_key,
model="jina-embeddings-v3",
# choose `retrieval.query` to get query embeddings, or choose your desired task type
task="retrieval.query",
# `dimensions` allows users to control the embedding dimension with minimal performance loss. by default it is 1024.
# A number between 256 and 1024 is recommended.
dimensions=512,
)
embeddings = query_embed_model.get_query_embedding(
"This is the query to embed"
)
print("Query dim:", len(embeddings))
print("Query embed:", embeddings[:5])
通过 JinaAI API 使用 Jina CLIP 嵌入图像和查询¶
你也可以使用 JinaEmbedding 类来编码你的图像和查询
from llama_index.embeddings.jinaai import JinaEmbedding
from PIL import Image
import requests
from numpy import dot
from numpy.linalg import norm
embed_model = JinaEmbedding(
api_key=jinaai_api_key,
model="jina-clip-v1",
)
image_url = "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcStMP8S3VbNCqOQd7QQQcbvC_FLa1HlftCiJw&s"
im = Image.open(requests.get(image_url, stream=True).raw)
print("Image:")
display(im)
image_embeddings = embed_model.get_image_embedding(image_url)
print("Image dim:", len(image_embeddings))
print("Image embed:", image_embeddings[:5])
text_embeddings = embed_model.get_text_embedding(
"Logo of a pink blue llama on dark background"
)
print("Text dim:", len(text_embeddings))
print("Text embed:", text_embeddings[:5])
cos_sim = dot(image_embeddings, text_embeddings) / (
norm(image_embeddings) * norm(text_embeddings)
)
print("Cosine similarity:", cos_sim)
批量嵌入¶
你还可以批量嵌入文本,可以通过设置 embed_batch_size
参数来控制批量大小(如果未传入,默认值为 10,且不应大于 2048)
embed_model = JinaEmbedding(
api_key=jinaai_api_key,
model="jina-embeddings-v3",
embed_batch_size=16,
task="retrieval.passage",
)
embeddings = embed_model.get_text_embedding_batch(
["This is the text to embed", "More text can be provided in a batch"]
)
print(len(embeddings))
print(embeddings[0][:5])
让我们使用 Jina AI Embeddings 构建一个 RAG 管线¶
下载数据¶
!mkdir -p 'data/paul_graham/'
!wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham/paul_graham_essay.txt'
导入¶
import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.llms.openai import OpenAI
from llama_index.core.response.notebook_utils import display_source_node
from IPython.display import Markdown, display
加载数据¶
documents = SimpleDirectoryReader("./data/paul_graham/").load_data()
构建索引¶
your_openai_key = "YOUR_OPENAI_KEY"
llm = OpenAI(api_key=your_openai_key)
embed_model = JinaEmbedding(
api_key=jinaai_api_key,
model="jina-embeddings-v3",
embed_batch_size=16,
task="retrieval.passage",
)
index = VectorStoreIndex.from_documents(
documents=documents, embed_model=embed_model
)
构建检索器¶
search_query_retriever = index.as_retriever()
search_query_retrieved_nodes = search_query_retriever.retrieve(
"What happened after the thesis?"
)
for n in search_query_retrieved_nodes:
display_source_node(n, source_length=2000)