首页
/ LlamaIndex JinaAI 嵌入集成详解:JinaEmbedding 类 API 与底层实现指南

LlamaIndex JinaAI 嵌入集成详解:JinaEmbedding 类 API 与底层实现指南

2026-09-07 16:35:36作者:段琳惟

本文基于 LlamaIndex 官方 API 参考文档 embeddings/jinaai.md(该文档以 mkdocs auto-gen 指令指向 llama_index.embeddings.jinaai 包中的 JinaEmbedding 成员)展开,完整介绍 llama-index-embeddings-jinaai 集成包的安装方式、JinaEmbedding 构造参数、查询/文档双编码配置、task 与维度控制、图像多模态嵌入,并深入源码剖析其对 Jina AI Embeddings API 的同步/异步调用链与二进制编码解码逻辑。读完后,你可以将该嵌入模型直接接入 LlamaIndex 的向量索引与检索流程,并理解每一处参数在底层是如何生效的。

1. 集成包定位与安装

llama-index-embeddings-jinaai 是 LlamaIndex 生态中对接 Jina AI 嵌入服务的官方集成包,位于仓库的 llama-index-integrations/embeddings/llama-index-embeddings-jinaai 目录。从 pyproject.toml 可以看到它的关键元信息:

项目 取值
包名 llama-index-embeddings-jinaai
当前版本 0.6.0
Python 要求 >=3.10,<4.0
核心依赖 llama-index-core>=0.13.0,<0.15
导入路径 llama_index.embeddings.jinaai

其中 [tool.llamahub] 配置块显式声明了 import_path = "llama_index.embeddings.jinaai",并将 JinaEmbedding 登记为该类作者为 llama-index 的公开 API,这正是 API 参考文档 ::: llama_index.embeddings.jinaai 指令所引用的对象。包内部结构很精简:llama_index/embeddings/jinaai/init.py 只导出了 JinaEmbedding 一个符号,全部实现集中在 base.py

安装方式(与官方示例 jinaai_embeddings.ipynb 一致):

pip install llama-index-embeddings-jinaai

使用前需要设置 API Key。该集成支持通过环境变量 JINAAI_API_KEY 读取密钥——源码中通过 get_from_param_or_env("api_key", api_key, "JINAAI_API_KEY", "") 实现“构造参数优先、环境变量兜底”的取值逻辑:

import os

jinaai_api_key = "YOUR_JINAAI_API_KEY"
os.environ["JINAAI_API_KEY"] = jinaai_api_key

2. JinaEmbedding API 参考

JinaEmbedding 继承自 llama_index.core.embeddingsMultiModalEmbedding(见 base.py#L159),因此它同时支持文本与图像两种输入模态。其构造函数完整签名如下(摘自源码):

def __init__(
    self,
    model: str = "jina-embeddings-v3",
    embed_batch_size: int = DEFAULT_EMBED_BATCH_SIZE,
    api_key: Optional[str] = None,
    callback_manager: Optional[CallbackManager] = None,
    encoding_queries: Optional[str] = None,
    encoding_documents: Optional[str] = None,
    task: Optional[str] = None,
    dimensions: Optional[int] = None,
    late_chunking: Optional[bool] = None,
    **kwargs: Any,
) -> None:

各参数含义与默认值:

参数 默认值 说明
model "jina-embeddings-v3" 调用 Jina AI API 时使用的嵌入模型名,可切换为 jina-clip-v1 等多模态模型
embed_batch_size DEFAULT_EMBED_BATCH_SIZE 批量编码时每批文本条数,默认值 10,定义于 llama-index-core/llama_index/core/constants.py
api_key None Jina AI API 密钥,缺省时回退读取环境变量 JINAAI_API_KEY
callback_manager None LlamaIndex 回调管理器,用于事件追踪
encoding_queries "float"None 时) 查询向量的编码格式,合法取值 float / ubinary / binary(源码中以 VALID_ENCODING 列表约束并在初始化时断言)
encoding_documents "float"None 时) 文档向量的编码格式,取值同上
task None 任务类型透传给 Jina API,如 retrieval.passage(文档侧)、retrieval.query(查询侧)
dimensions None 输出向量维度,非 None 时透传给 Jina API
late_chunking None 布尔开关,非 None 时透传给 Jina API 控制 late chunking 行为

两点值得注意的源码细节:

  1. 查询与文档使用不同编码:类内部以私有属性 _encoding_queries / _encoding_documents 分别保存两者,文本批量编码走 encoding_documents,单条查询编码走 encoding_queries。初始化时会对二者逐一断言合法,否则抛出包含可选值列表的 AssertionError
  2. 类名标识class_name() 返回 "JinaAIEmbedding",用于 LlamaIndex 的类序列化与反序列化体系。

3. 快速上手:文本嵌入与 task 双模型配置

官方示例 jinaai_embeddings.ipynb 演示了 jina-embeddings-v3 推荐的“文档/查询分任务”用法——为文档索引和查询各建一个编码器,task 分别设为 retrieval.passageretrieval.query

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",
)

批量编码则通过 get_text_embedding_batch 完成,并用 embed_batch_size 控制分批粒度(示例中设为 16):

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"]
)

示例笔记随后将该嵌入器接入标准检索管线:以 paul_graham 文章 为语料,经 SimpleDirectoryReader 读取、VectorStoreIndex 构建向量索引,再交给 LLM 做问答。仓库内另有 jina_embeddings.ipynb 作为同主题的补充示例。

4. 图像多模态嵌入

得益于 MultiModalEmbedding 基类,JinaEmbedding 还实现了 _get_image_embedding / _get_image_embeddings 及其异步版本。从源码(base.py#L270-L304)看,其输入组装逻辑是:

  • 本地文件路径file:// 或无协议且文件存在):读取二进制内容后做 base64 编码,以 {"bytes": <base64>} 形式提交;
  • 远程 URL:直接以 {"url": img_file_path} 提交,由 Jina API 侧拉取。

官方示例中使用 jina-clip-v1 模型对远程图片做跨模态比较(计算图像向量与文本向量的余弦相似度):

embed_model = JinaEmbedding(
    api_key=jinaai_api_key,
    model="jina-clip-v1",
)

image_embeddings = embed_model.get_image_embedding(image_url)
text_embeddings = embed_model.get_text_embedding(text)

一个容易忽略的实现细节:图像编码路径调用 API 时不传递 taskdimensionslate_chunking 参数encoding_type 也固定走默认值 float,即多模态编码目前只输出浮点向量。

5. 源码级实现:_JinaAPICaller 的请求与解码

JinaEmbedding 的全部远程交互都委托给内部类 _JinaAPICallerbase.py#L24-L144),它是理解参数生效位置的关键。

请求构造。默认 API 基址为 https://api.jina.ai/v1,最终 POST 地址为 {base_url}/embeddings。请求体只包含非 None 的可选字段:

input_json = {
    "input": input,
    "model": self.model,
    "encoding_type": encoding_type,
}
if task is not None:
    input_json["task"] = task
if dimensions is not None:
    input_json["dimensions"] = dimensions
if late_chunking is not None:
    input_json["late_chunking"] = late_chunking

task / dimensions / late_chunking 都是按需透传:不设置时不会出现在请求体中,交由 Jina API 使用其默认行为。

认证头的一个注意点。从源码结构看,同步版本 _JinaAPICaller.__init__ 中,请求会话头的 Authorization 使用的是构造参数 api_key 本身,而 self.api_key 则来自“参数或环境变量”的合并结果;异步版本 aget_embeddings 则统一使用 self.api_key。由此可以推断:如果仅通过环境变量 JINAAI_API_KEY 提供密钥而不显式传参,异步路径行为正确,但同步路径的头部取值依赖参数原值。因此在实战中建议始终显式传入 api_key=jinaai_api_key,这也是官方示例的写法。

响应解码。三种 encoding_type 的返回处理差异很大:

  • float:直接按 index 排序后返回 result["embedding"] 浮点列表;
  • ubinary:将 uint8 向量经 np.unpackbits 展开为 0/1 位列表;
  • binary:先把嵌入值 +128 转回无符号再 np.unpackbits 展开为位列表。

也就是说,选择二进制编码后,get_text_embedding 返回的不再是浮点向量而是展开的位序列,其维度会膨胀为原字节数 × 8,应配合支持二进制向量存储/检索的下游组件使用。错误处理上,若响应中缺少 data 字段,会抛出携带 resp["detail"]RuntimeError;异步版本还会执行 response.raise_for_status() 抛出 HTTP 状态异常。

同步与异步双通道_JinaAPICaller 同时提供 get_embeddings(基于 requests.Session,长连接复用,Accept-Encoding: identity 头避免压缩干扰二进制响应)和 aget_embeddings(基于 aiohttp.ClientSession)两套实现,解码逻辑完全一致,二者按 index 字段排序以保证批量输入与输出顺序对齐。JinaEmbedding_get_query_embedding / _aget_query_embedding 等成对方法就是分别转发到这两条通道。

文件头部还定义了 MAX_BATCH_SIZE = 2048 常量,从源码看目前未被类逻辑直接引用,可以推断其用途是预留的批量规模参考值,实际分批仍由 embed_batch_size 控制。

6. 测试验证与适用前提

集成包的测试 tests/test_embeddings_jinaai.py 采用离线断言的方式验证契约:

def test_embedding_class():
    emb = JinaEmbedding()
    assert isinstance(emb, BaseEmbedding)
    assert isinstance(emb, MultiModalEmbedding)

它确认 JinaEmbedding 同时满足 BaseEmbedding 接口(可注入任意 VectorStoreIndexSimpleDirectoryReader 管线)和 MultiModalEmbedding 接口(可用 get_image_embedding 系列方法),且无需 API Key 即可实例化——远程调用在真正发起请求时才需要凭据。

适用前提小结:

  • 需要 Python 3.10+,且 llama-index-core 版本落在 >=0.13.0,<0.15 区间(当前包版本 0.6.0 的声明);
  • 所有嵌入调用均为远程 API 调用,依赖网络与 Jina AI 账户额度;
  • dimensionslate_chunking 等能力最终由所选 Jina 模型服务端支持,集成包本身只做透传。

7. 小结

JinaEmbedding 以不到三百行的实现,把 Jina AI 嵌入服务的关键能力完整映射进了 LlamaIndex 的嵌入抽象:通过 task + encoding_queries/encoding_documents 支撑文档/查询不对称编码,通过 dimensions / late_chunking 透传服务端高级选项,通过 MultiModalEmbedding 基类补齐图像输入路径,并以同步/异步双通道保证与 LlamaIndex 全链路的兼容。结合 API 参考文档核心实现官方示例,即可在 LlamaIndex 项目中快速落地 Jina 嵌入方案。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.13 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
897
5.8 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
529
593
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
915
1.83 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.58 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.35 K
1.46 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.01 K
515
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
547
388