首页
/ LlamaIndex OCIGenAIEmbeddings 深度解析:OCI Generative AI 嵌入集成的 API 与实现细节

LlamaIndex OCIGenAIEmbeddings 深度解析:OCI Generative AI 嵌入集成的 API 与实现细节

2026-09-07 16:50:39作者:姚月梅Lane

本文以 LlamaIndex 仓库中 OCI Generative AI 嵌入集成的 API 参考页(docs/api_reference/api_reference/embeddings/oci_genai.md)为核心,完整梳理 OCIGenAIEmbeddings 类的安装方式、全部构造参数及其默认值、四种 OCI 鉴权模式在源码中的具体实现、支持模型清单与嵌入请求的底层调用链。读完本文后,你可以直接复制可用的接入代码,并理解每次 get_text_embedding 调用从 LlamaIndex 侧到 OCI SDK 的完整路径。

API 参考页的生成方式

该 API 参考页本身是一个极简的 mkdocs autodoc 存根(见 oci_genai.md),全部内容只有三行:

::: llama_index.embeddings.oci_genai
options:
members: - OCIGenAIEmbeddings

它通过 ::: 语法指向 Python 模块 llama_index.embeddings.oci_genai,并声明该页面只渲染 OCIGenAIEmbeddings 这一个成员。也就是说,渲染后的 API 文档内容(类 docstring、参数说明、示例代码)全部来自集成包中的源码 docstring。这也是 LlamaIndex monorepo 中 docs/api_reference 下数百个集成页面的统一组织方式:文档即源码 docstring 的投影。因此理解这一页 API,等价于精读以下两个源文件:

  • 核心实现:base.py
  • 包导出:init.py,其中 __all__ = ["OCIGenAIEmbeddings"],与 autodoc 配置的 members 列表一一对应。

安装与依赖

集成包的 README.md 给出两步安装:

pip install llama-index-embeddings-oci-genai
pip install -U oci

第二行安装的是 Oracle 官方的 OCI Python SDK。从 pyproject.toml 可以确认精确的依赖约束与适用前提:

项目 约束
包版本 0.5.0
Python >=3.10,<4.0
OCI SDK oci>=2.125.3
LlamaIndex 核心 llama-index-core>=0.13.0,<0.15

注意源码中对 oci 包的导入采用了函数内懒加载策略(__init___embed 内部分别 import oci),未安装 OCI SDK 时不会在 import 阶段报错,而是抛出带明确提示的 ModuleNotFoundError

raise ModuleNotFoundError(
    "Could not import oci python package. "
    "Please make sure you have the oci package installed."
)

最小可用示例

README 与类 docstring 中给出的是同一套接入范式,创建嵌入器必须提供三个关键参数:模型标识、服务 endpoint 与 compartment OCID:

from llama_index.embeddings.oci_genai import OCIGenAIEmbeddings

embedding = OCIGenAIEmbeddings(
    model_name="MY_MODEL",
    service_endpoint="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com",
    compartment_id="MY_OCID",
)

其中 service_endpoint 的形式为 https://inference.generativeai.<region>.oci.oraclecloud.comcompartment_id 是目标 OCI compartment 的 OCID。创建之后即可使用 LlamaIndex BaseEmbedding 提供的标准方法,例如 embedding.get_text_embedding("...")embedding.get_query_embedding("...")embedding.get_text_embedding_batch([...])

构造参数全解

OCIGenAIEmbeddings.__init__ 的完整签名及默认值(来源:base.py 的 Pydantic Field 定义与 __init__)如下:

参数 默认值 说明
model_name 必填 要使用的嵌入模型的 ID 或名称,如 cohere.embed-english-light-v3.0;也可以传入专用端点 OCID(见下文)
truncate "END" 对超出模型输入长度的文本的截断策略,取值 START / END / NONE
input_type None 输入类型提示。不提供时,查询侧自动使用 SEARCH_QUERY、文档侧自动使用 SEARCH_DOCUMENT;模型相关,可取 search_querysearch_documentclassificationclustering
service_endpoint None 服务 endpoint URL
compartment_id None compartment 的 OCID
auth_type "API_KEY" 鉴权类型,可取 API_KEYSECURITY_TOKENINSTANCE_PRINCIPALRESOURCE_PRINCIPAL
auth_profile "DEFAULT" ~/.oci/config 中的 profile 名称
auth_file_location "~/.oci/config" OCI 配置文件路径
client None 可选的现成 OCI 客户端对象;提供后跳过内部客户端创建逻辑(测试与高级注入场景用)
embed_batch_size DEFAULT_EMBED_BATCH_SIZE(即 10) 批量嵌入的批大小,来自核心包常量 constants.py
callback_manager None 回调管理器,用于接入 LlamaIndex 的回调/遥测体系

两个值得注意的实现细节:

  1. input_type 的“或”语义:在 _embed 中构造请求时写的是 input_type=self.input_type or input_type,即构造时显式传入的 input_type 会覆盖按调用场景(查询/文档)自动推导的默认值。
  2. embed_batch_size 的边界:约束 gt=0, le=2048 定义在核心包基类 BaseEmbedding 中,OCIGenAIEmbeddings 通过继承获得,无需自行声明。

此外,基类还向该集成提供了 embeddings_cache(嵌入缓存)、rate_limiter(限流器)等字段,to_payload() 输出的观测载荷只包含 class_namemodel_nameembed_batch_size,天然不含任何凭证信息。

四种鉴权模式在源码中的实现

OCIAuthType 枚举定义了四种鉴权类型:API_KEYSECURITY_TOKENINSTANCE_PRINCIPALRESOURCE_PRINCIPAL__init__ 中按 auth_type 分派构建 oci.generative_ai_inference.GenerativeAiInferenceClientclient_kwargs,每种模式的行为如下:

  • API_KEY(默认):调用 oci.config.from_file(file_location=auth_file_location, profile_name=auth_profile) 读取配置文件中的密钥信息,并移除 signer,走配置签名路径。这要求你本地已有包含相应 key/fingerprint 的 ~/.oci/config profile。
  • SECURITY_TOKEN:先读取配置文件,然后从配置中的 key_file 加载私钥,再从 security_token_file 读取 token 字符串,构造 oci.auth.signers.SecurityTokenSigner(st_string, pk) 作为 signer。
  • INSTANCE_PRINCIPAL:不依赖本地任何配置,直接使用 oci.auth.signers.InstancePrincipalsSecurityTokenSigner(),适合在 OCI 计算实例上运行时通过实例身份访问。
  • RESOURCE_PRINCIPAL:使用 oci.auth.signers.get_resource_principals_signer(),适合在 OCI 函数等资源上下文中运行。
  • 传入以上之外的值时抛出 ValueError,提示 auth_type 非法。

所有模式共享的客户端参数还包括:

"retry_strategy": oci.retry.DEFAULT_RETRY_STRATEGY,
"timeout": (10, 240),  # OCI Gen AI 服务的默认超时配置(连接 10s / 读取 240s)

另外,若鉴权构建过程中出现非导入类异常,源码会统一包装为 ValueError,提示检查 auth_profileauth_file_locationauth_type 是否有效。实际接入时的配套条件是:你的 IAM profile/role 已具备访问 OCI Generative AI 服务的策略,且如果使用了非默认的 config profile,需要通过 auth_profileauth_file_location 显式指明。

支持模型清单

源码中定义了 SUPPORTED_MODELS 集合,并通过类方法 list_supported_models() 暴露:

SUPPORTED_MODELS = {
    "cohere.embed-v4.0",
    "cohere.embed-english-v3.0",
    "cohere.embed-english-light-v3.0",
    "cohere.embed-multilingual-v3.0",
    "cohere.embed-multilingual-light-v3.0",
    "cohere.embed-english-light-v2.0",
}

从源码结构看,model_name 字段本身是一个自由字符串,构造时并未强制校验其必须属于 SUPPORTED_MODELS——该清单的用途是“该集成当前已知可对接”的 OCI Generative AI 托管嵌入模型,查询时调用 list_supported_models() 即可枚举。

嵌入请求的底层调用链

embedding.get_text_embedding("...") 为例,调用链为:BaseEmbedding 的批量/缓存逻辑 → _get_text_embedding(text)_embed([text], input_type="SEARCH_DOCUMENT")self._client.embed_text(request)_embed 的核心逻辑:

if self.model_name.startswith(CUSTOM_ENDPOINT_PREFIX):
    serving_mode = models.DedicatedServingMode(endpoint_id=self.model_name)
else:
    serving_mode = models.OnDemandServingMode(model_id=self.model_name)

request = models.EmbedTextDetails(
    serving_mode=serving_mode,
    compartment_id=self.compartment_id,
    input_type=self.input_type or input_type,
    truncate=self.truncate,
    inputs=texts,
)
response = self._client.embed_text(request)
return response.data.embeddings

这里包含两个关键点:

  1. 按需服务 vs 专用端点自动切换:当 model_name 以常量 CUSTOM_ENDPOINT_PREFIX = "ocid1.generativeaiendpoint" 开头时,说明你传入的是一个自托管的 OCI 专用推理端点 OCID,此时构造 DedicatedServingMode(endpoint_id=...);否则按 OnDemandServingMode(model_id=...) 调用 OCI 托管模型。同一个类因此同时覆盖了“托管模型”和“专属部署”两种接入形态。
  2. 输入/查询双通道_get_query_embedding 使用 SEARCH_QUERY_get_text_embedding / _get_text_embeddings(批量)使用 SEARCH_DOCUMENT。对 Cohere 系嵌入模型,query 与 document 使用不同的输入前缀可获得更好的检索效果,这个区分正是通过 input_type 参数下发给服务端的。

从源码结构还可以确认一个值得知晓的细节:异步方法 _aget_text_embedding_aget_query_embedding 当前直接转调同步实现,并未做真正的并发封装;批量吞吐主要依靠 embed_batch_size 分批与 get_text_embedding_batch 的服务端批处理(一次 embed_text 请求携带 inputs 列表)。

单元测试的验证方式

集成包的测试展示了两种验证思路,可作接入自检参考:

  • test_oci_genai.py:通过 client= 注入一个 MagicMock 客户端,monkeypatch embed_text 返回伪向量(含 "Hello" 的文本返回 [1.0, 0.0, 0.0]、含 "World" 的返回 [0.0, 1.0, 0.0]),再断言 get_text_embedding_batch(["Hello", "World"]) 的输出与期望一致。这也正是 client 参数存在的意义——它让整条嵌入路径可以在完全不触达真实 OCI 服务的情况下被验证。该测试同时参数化覆盖了 cohere.embed-english-light-v3.0cohere.embed-english-v3.0 两个模型 ID。
  • test_embeddings_oci_genai.py:检查 OCIGenAIEmbeddings 的 MRO 中包含 BaseEmbedding,保证接口契约(get_text_embedding 等公共方法可用)不被破坏。

小结与适用前提

OCIGenAIEmbeddings 是 LlamaIndex 对接 OCI Generative AI 嵌入能力(llama-index-embeddings-oci-genai,当前版本 0.5.0)的唯一入口类,其能力边界由源码清晰划定:四种 OCI 鉴权模式、按需/专用端点双服务模式、query/document 输入类型区分、批量嵌入与缓存/限流能力(继承自核心基类)。适用前提包括:Python >= 3.10、安装 oci>=2.125.3llama-index-core>=0.13.0,<0.15、具备访问 OCI Generative AI 服务的 IAM 策略与有效的 ~/.oci/config(或改用实例/资源主体鉴权)。在 RAG 管道中,将该嵌入器作为 VectorStoreIndex/检索器的 embedding 组件传入即可,用法与其他 LlamaIndex 嵌入集成完全一致。

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