Skip to content
LlamaIndex 文档版本 跟随上游 源快照 23e02147 更新于 2026-10-18

如果你在 Colab 中打开这个 Notebook,可能需要先安装 LlamaIndex 🦙。

%pip install llama-index-embeddings-jinaai
%pip install llama-index-llms-openai
!pip install llama-index

你可能还需要其他未随 llama-index 直接提供的包

!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 嵌入模型嵌入文本和查询

你可以使用 JinaEmbedding 类对文本和查询进行编码。Jina 提供了一系列可适配各种用例的模型。

模型维度语言MRL(Matryoshka)上下文
jina-embeddings-v31024多语言(89 种语言)是8192
jina-embeddings-v2-base-en768英语否8192
jina-embeddings-v2-base-de768德语和英语否8192
jina-embeddings-v2-base-es768西班牙语和英语否8192
jina-embeddings-v2-base-zh768中文和英语否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 Representation Learning),允许用户以最小的性能损失控制嵌入维度。
在请求中包含 dimensions 以选择所需的维度。
默认情况下,dimensions 设为 1024,建议使用 256 到 1024 之间的数值。
你可以参考下表了解维度与性能的关系:

维度32641282565127681024
平均检索性能(nDCG@10)52.5458.5461.6462.7263.1663.363.35

长上下文嵌入模型中的延迟分块

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/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)

BytesRouter 是社区翻译站点,所有译文仅供参考,一切以官方英文原文为准。