LlamaIndex OCIGenAIEmbeddings 深度解析:OCI Generative AI 嵌入集成的 API 与实现细节
【免费下载链接】llama_indexLlamaIndex is the leading document agent and OCR platform项目地址: https://gitcode.com/GitHub_Trending/ll/llama_index
本文以 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.com,compartment_id是目标 OCI compartment 的 OCID。创建之后即可使用 LlamaIndexBaseEmbedding提供的标准方法,例如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_query、search_document、classification、clustering等 |
service_endpoint | None | 服务 endpoint URL |
compartment_id | None | compartment 的 OCID |
auth_type | "API_KEY" | 鉴权类型,可取API_KEY、SECURITY_TOKEN、INSTANCE_PRINCIPAL、RESOURCE_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 的回调/遥测体系 |
两个值得注意的实现细节:
input_type的“或”语义:在_embed中构造请求时写的是input_type=self.input_type or input_type,即构造时显式传入的input_type会覆盖按调用场景(查询/文档)自动推导的默认值。embed_batch_size的边界:约束gt=0, le=2048定义在核心包基类 BaseEmbedding 中,OCIGenAIEmbeddings通过继承获得,无需自行声明。
此外,基类还向该集成提供了embeddings_cache(嵌入缓存)、rate_limiter(限流器)等字段,to_payload()输出的观测载荷只包含class_name、model_name、embed_batch_size,天然不含任何凭证信息。
四种鉴权模式在源码中的实现
OCIAuthType枚举定义了四种鉴权类型:API_KEY、SECURITY_TOKEN、INSTANCE_PRINCIPAL、RESOURCE_PRINCIPAL。__init__中按auth_type分派构建oci.generative_ai_inference.GenerativeAiInferenceClient的client_kwargs,每种模式的行为如下:
- API_KEY(默认):调用
oci.config.from_file(file_location=auth_file_location, profile_name=auth_profile)读取配置文件中的密钥信息,并移除 signer,走配置签名路径。这要求你本地已有包含相应 key/fingerprint 的~/.oci/configprofile。 - 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_profile、auth_file_location与auth_type是否有效。实际接入时的配套条件是:你的 IAM profile/role 已具备访问 OCI Generative AI 服务的策略,且如果使用了非默认的 config profile,需要通过auth_profile与auth_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这里包含两个关键点:
- 按需服务 vs 专用端点自动切换:当
model_name以常量CUSTOM_ENDPOINT_PREFIX = "ocid1.generativeaiendpoint"开头时,说明你传入的是一个自托管的 OCI 专用推理端点 OCID,此时构造DedicatedServingMode(endpoint_id=...);否则按OnDemandServingMode(model_id=...)调用 OCI 托管模型。同一个类因此同时覆盖了“托管模型”和“专属部署”两种接入形态。 - 输入/查询双通道:
_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客户端,monkeypatchembed_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.0与cohere.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.3与llama-index-core>=0.13.0,<0.15、具备访问 OCI Generative AI 服务的 IAM 策略与有效的~/.oci/config(或改用实例/资源主体鉴权)。在 RAG 管道中,将该嵌入器作为VectorStoreIndex/检索器的 embedding 组件传入即可,用法与其他 LlamaIndex 嵌入集成完全一致。
【免费下载链接】llama_indexLlamaIndex is the leading document agent and OCR platform项目地址: https://gitcode.com/GitHub_Trending/ll/llama_index
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考