Skip to main content
Oracle AI 数据库支持 AI 工作负载,您可以通过含义(语义)而非仅关键词来查询数据。它将对非结构化内容的语义搜索对业务数据的关系过滤结合在单一系统中——因此您可以构建检索工作流(如 RAG),而无需引入独立的向量数据库并将数据分散到多个平台中。 本指南演示如何使用 OracleEmbeddings 为您的内容生成嵌入。
为什么要在 Oracle 中(或通过 Oracle)生成嵌入? 您可以将数据治理和运营保证(安全性、事务、可用性)与您的 AI 工作流保持紧密联系——同时选择适合您环境的嵌入提供商模型。

先决条件

安装 langchain-oracledbpython-oracledb 驱动程序将作为依赖项自动安装。
pip install -qU langchain-oracledb

连接到 Oracle 数据库

以下示例代码将展示如何连接到 Oracle 数据库。默认情况下,python-oracledb 以精简模式运行,直接连接到 Oracle 数据库。此模式不需要 Oracle 客户端库。但是,当 python-oracledb 使用这些库时,可以使用一些附加功能。当使用 Oracle 客户端库时,python-oracledb 处于厚模式。两种模式都具有支持 Python Database API v2.0 规范的全面功能。请参阅以下指南,其中介绍了每种模式支持的功能。如果您无法使用精简模式,可能需要切换到厚模式。
import sys

import oracledb

# Please update with your username, password, hostname, port and service_name
username = "<username>"
password = "<password>"
dsn = "<hostname>:<port>/<service_name>"

connection = oracledb.connect(user=username, password=password, dsn=dsn)
print("Connection successful!")
对于嵌入生成,用户可以使用多种提供商选项,包括数据库内部的嵌入生成以及 OcigenAI、Hugging Face 和 OpenAI 等第三方服务。选择第三方提供商的用户必须建立包含所需身份验证信息的凭据。另外,如果用户选择”数据库”作为其提供商,则需要将 ONNX 模型加载到 Oracle 数据库中以生成嵌入。

加载 ONNX 模型

Oracle 支持多种嵌入提供商,使用户可以在专有数据库解决方案和第三方服务(如 OCIGENAI 和 HuggingFace)之间进行选择。此选择决定了生成和管理嵌入的方法。 重要提示:如果用户选择数据库选项,他们必须将 ONNX 模型上传到 Oracle 数据库。相反,如果选择第三方提供商进行嵌入生成,则不需要将 ONNX 模型上传到 Oracle 数据库。 直接在 Oracle 中使用 ONNX 模型的一个显著优势是,它通过消除向外部方传输数据的需要,提供了增强的安全性和性能。此外,这种方法还避免了通常与网络或 REST API 调用相关的延迟。 以下是将 ONNX 模型上传到 Oracle 数据库的示例代码:
from langchain_oracledb.embeddings.oracleai import OracleEmbeddings

# Update the directory and file names for your ONNX model
# make sure that you have onnx file in the system
onnx_dir = "DEMO_DIR"
onnx_file = "tinybert.onnx"
model_name = "demo_model"

try:
    OracleEmbeddings.load_onnx_model(conn, onnx_dir, onnx_file, model_name)
    print("ONNX model loaded.")
except Exception as e:
    print("ONNX model loading failed!")
    sys.exit(1)

创建凭据

选择第三方提供商生成嵌入时,用户需要建立凭据以安全访问提供商的端点。 重要提示: 选择”数据库”提供商生成嵌入时,不需要凭据。但是,如果用户决定使用第三方提供商,则必须创建特定于所选提供商的凭据。 以下是一个示例:
try:
    cursor = conn.cursor()
    cursor.execute(
        """
       declare
           jo json_object_t;
       begin
           -- HuggingFace
           dbms_vector_chain.drop_credential(credential_name  => 'HF_CRED');
           jo := json_object_t();
           jo.put('access_token', '<access_token>');
           dbms_vector_chain.create_credential(
               credential_name   =>  'HF_CRED',
               params            => json(jo.to_string));

           -- OCIGENAI
           dbms_vector_chain.drop_credential(credential_name  => 'OCI_CRED');
           jo := json_object_t();
           jo.put('user_ocid','<user_ocid>');
           jo.put('tenancy_ocid','<tenancy_ocid>');
           jo.put('compartment_ocid','<compartment_ocid>');
           jo.put('private_key','<private_key>');
           jo.put('fingerprint','<fingerprint>');
           dbms_vector_chain.create_credential(
               credential_name   => 'OCI_CRED',
               params            => json(jo.to_string));
       end;
       """
    )
    cursor.close()
    print("Credentials created.")
except Exception as ex:
    cursor.close()
    raise

生成嵌入

Oracle AI 向量搜索提供多种生成嵌入的方法,可以使用本地托管的 ONNX 模型或第三方 API。有关配置这些替代方案的全面说明,请参阅 Oracle AI 向量搜索指南 注意: 用户可能需要配置代理才能使用第三方嵌入生成提供商,不包括使用 ONNX 模型的”数据库”提供商。
# proxy to be used when we instantiate summary and embedder object
proxy = "<proxy>"
以下示例代码将展示如何生成嵌入:
from langchain_oracledb.embeddings.oracleai import OracleEmbeddings
from langchain_core.documents import Document

"""
# using ocigenai
embedder_params = {
    "provider": "ocigenai",
    "credential_name": "OCI_CRED",
    "url": "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/embedText",
    "model": "cohere.embed-english-light-v3.0",
}

# using huggingface
embedder_params = {
    "provider": "huggingface",
    "credential_name": "HF_CRED",
    "url": "https://api-inference.huggingface.co/pipeline/feature-extraction/",
    "model": "sentence-transformers/all-MiniLM-L6-v2",
    "wait_for_model": "true"
}
"""

# using ONNX model loaded to Oracle Database
embedder_params = {"provider": "database", "model": "demo_model"}

# If a proxy is not required for your environment, you can omit the 'proxy' parameter below
embedder = OracleEmbeddings(conn=conn, params=embedder_params, proxy=proxy)
embed = embedder.embed_query("Hello World!")

""" verify """
print(f"Embedding generated by OracleEmbeddings: {embed}")

端到端演示

请参阅我们完整的演示指南 Oracle AI 向量搜索端到端演示指南,以借助 Oracle AI 向量搜索构建端到端 RAG 管道。