Oracle AI 向量搜索:生成嵌入
Oracle AI向量搜索是为人工智能(AI)工作负载设计的,它允许您基于语义而非关键词查询数据。 Oracle AI向量搜索的一大优势在于可以将非结构化数据上的语义搜索与业务数据上的关系搜索结合在一个系统中使用。 这不仅非常强大而且更加有效,因为您不需要添加一个专门的向量数据库,从而避免了在多个系统之间进行数据碎片化的痛苦。
此外,您的向量可以利用Oracle数据库的所有最强大功能,例如以下内容:
- 分区支持
- 真实应用集群的可扩展性
- Exadata 智能扫描
- 跨地理分布数据库的分片处理
- 交易
- 平行SQL
- 灾难恢复
- 安全
- Oracle 机器学习
- Oracle 图数据库
- Oracle Spatial and Graph
- Oracle 区块链
- JSON
本指南演示了如何在 Oracle AI 向量搜索中使用嵌入功能,通过 OracleEmbeddings 为您的文档生成嵌入。
如果您是第一次使用 Oracle 数据库,可以考虑探索我们的 免费 Oracle 23 AI,它提供了一个很好的入门介绍来设置您的数据库环境。在操作数据库时,默认避免使用系统用户会更加安全和灵活;您可以创建自己的用户以增强安全性并进行个性化设置。有关用户创建的详细步骤,请参阅我们的 端到端指南,其中还介绍了如何在 Oracle 中设置用户。此外,了解用户权限对于有效管理数据库安全至关重要。您可以在官方 Oracle 指南 中了解更多关于管理用户帐户和安全性的内容。
前置条件
确保已安装 Oracle Python 客户端驱动程序,以便实现 Langchain 与 Oracle AI 向量搜索的集成。
# pip install oracledb
连接到Oracle数据库
以下示例代码将展示如何连接到Oracle数据库。默认情况下,python-oracledb 以‘薄’模式运行,直接连接到 Oracle 数据库。这种模式不需要 Oracle 客户端库。但是,在使用这些库时会提供一些额外的功能性。当 python-oracledb 使用 Oracle 客户端库时,它被认为是以‘厚’模式运行的。两种模式都具有全面的功能以支持 Python 数据库 API v2.0 规范。请参阅以下 指南,其中介绍了每种模式所支持的特性。如果您无法使用薄模式,您可能需要切换到厚模式。
import sys
import oracledb
# Update the following variables with your Oracle database credentials and connection details
username = "<username>"
password = "<password>"
dsn = "<hostname>/<service_name>"
try:
conn = oracledb.connect(user=username, password=password, dsn=dsn)
print("Connection successful!")
except Exception as e:
print("Connection failed!")
sys.exit(1)
对于嵌入生成,用户有多种提供商选项可用,包括在数据库内生成嵌入以及使用第三方服务(如OcigenAI、Hugging Face和OpenAI)。选择第三方提供商的用户必须建立包含必要认证信息的凭据。或者,如果用户选择“数据库”作为其提供商,则需要将ONNX模型加载到Oracle数据库中以支持嵌入生成。
加载ONNX模型
Oracle 支持多种嵌入提供者,使用户能够在专有的数据库解决方案与第三方服务(如 OCIGENAI 和 HuggingFace)之间进行选择。该选择决定了生成和管理嵌入向量的方法。
重要:如果用户选择数据库选项,则必须将ONNX模型上传到Oracle数据库中。相反,如果选择第三方提供商来生成嵌入,则无需将ONNX模型上传到Oracle数据库。
在 Oracle 中直接使用 ONNX 模型的一个显著优势是,无需将数据传输给外部方,从而提升了安全性和性能。此外,此方法还避免了通常与网络或 REST API 调用相关的延迟。
以下是将ONNX模型上传到Oracle数据库的示例代码:
from langchain_community.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 模型的“database”提供商除外。
# proxy to be used when we instantiate summary and embedder object
proxy = "<proxy>"
以下示例代码将展示如何生成嵌入(embeddings):
from langchain_community.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}")
End to End Demo
请参考我们的完整示例指南 Oracle AI向量搜索端到端示例指南,在Oracle AI向量搜索的帮助下构建完整的RAG流水线。