Skip to main content
Oracle AI Database 支持通过 语义(意义)而非关键词查询数据的 AI 工作负载。它将 非结构化内容的语义搜索 与 业务数据的关联过滤 结合在单一系统中——因此您可以在不引入独立的向量数据库的情况下构建检索工作流(如 RAG),并避免将数据分散到多个平台。 本指南演示如何使用 OracleVS(用于 Oracle AI Vector Search 的 LangChain 向量存储集成)来实现:
  • 将文档和嵌入导入 Oracle
  • 运行相似性搜索
  • 创建 HNSW 和 IVF 索引
  • 应用元数据过滤器以实现高级检索
  • 在 Oracle Database 26ai 中启用混合搜索(关键词 + 语义)
  • 使用 Oracle Text 运行全文搜索

前置条件

安装 langchain-oracledb。python-oracledb 驱动程序将作为依赖项自动安装。

连接到 Oracle Database

以下示例代码将展示如何连接到 Oracle Database。默认情况下,python-oracledb 以“Thin”模式运行,直接连接到 Oracle Database。此模式无需 Oracle 客户端库。然而,当 python-oracledb 使用它们时,可以提供一些附加功能。当使用 Oracle 客户端库时,python-oracledb 被称为“Thick”模式。两种模式都具有支持 Python 数据库 API v2.0 规范的全面功能。请参阅以下 指南,了解每种模式下支持的功能。如果您无法使用 Thin 模式,可能需要切换到 Thick 模式。

导入所需的依赖项

langchain-community包已不再维护。从langchain_community导入的示例可能过时或无法使用。请谨慎使用。

加载文档

使用不同的距离度量创建向量存储

首先,我们将创建三个使用不同距离函数的向量存储。由于我们尚未在这些向量存储中创建索引,它们目前只会创建表。稍后,我们将使用这些向量存储来创建 HNSW 索引。要了解 Oracle AI Vector Search 支持的索引类型更多信息,请参阅以下 指南。 您可以手动连接到 Oracle Database,并将看到三个表: Documents_DOT、Documents_COSINE 和 Documents_EUCLIDEAN。 然后,我们将创建三个额外的表 Documents_DOT_IVF、Documents_COSINE_IVF 和 Documents_EUCLIDEAN_IVF,这些表将用于在表上创建 IVF 索引,而不是 HNSW 索引。

文本的添加和删除操作,以及基本的相似性搜索

具有特定参数的索引创建

高级搜索

Oracle Database 23ai 支持预过滤、内过滤和后过滤,以增强 AI Vector Search 功能。这些过滤机制允许用户在执行向量相似性搜索之前、期间和之后应用约束,从而提高搜索性能和准确性。 Oracle 23ai 中过滤的关键点:
  1. 预过滤 在执行向量相似性搜索之前应用传统的 SQL 过滤器,以减少数据集。 通过限制 AI 算法处理的数据量,有助于提高效率。
  2. 内过滤 利用 AI Vector Search 直接在向量嵌入上执行相似性搜索,使用优化的索引和算法。 基于向量相似性高效过滤结果,无需扫描完整数据集。
  3. 后过滤 在向量相似性搜索后应用额外的 SQL 过滤器,以细化结果。 允许根据业务逻辑或额外的元数据条件进行进一步细化。
为什么这很重要?
  • 性能优化:预过滤显著减少查询执行时间,使在大型数据集上的搜索更高效。
  • 准确性增强:内过滤确保向量搜索具有语义意义,提高搜索结果的质量。

过滤详情

OracleVS 支持一组可以应用于 metadata 字段的过滤器,使用 filter 参数。这些过滤器允许您根据各种标准选择和细化数据。 可用的过滤运算符:
  • 您可以使用逻辑运算符组合这些过滤器:
示例过滤器:
附加使用提示:
  • 当对象中的所有过滤器都必须满足时,可以省略 $and。这两个是等效的:
  • $not 子句可以否定比较运算符:
  • 使用 field: scalar 等同于 field: { "$eq": scalar }:
有关更多过滤器示例,请参阅 测试规范。

混合搜索

Oracle Database 26ai 支持混合搜索,将关键字(全文)和语义(向量)搜索结合为单一检索功能。langchain-oracledb 集成暴露了:
  • OracleVectorizerPreference:创建用于混合索引的 DB 端向量化偏好设置。
  • create_hybrid_index / acreate_hybrid_index:创建 HYBRID VECTOR INDEX。
  • OracleHybridSearchRetriever:对 OracleVS 表执行关键字、语义或混合检索。

前置条件和模型配置

使用混合搜索时,请使用 OracleVS 配置 OracleEmbeddings,以便向量化偏好设置与嵌入配置完全匹配。您可以通过 OracleVectorizerPreference 提供附加参数来进一步微调混合向量索引。详细信息,请参阅 文档。
替代 创建索引而不显式指定偏好设置:
  • 如果您不想管理命名的偏好设置,请传递 vector_store。该函数将创建临时偏好设置,构建索引,然后自动删除偏好设置。
注意事项和提示:
  • search_mode 决定使用的信号:
    • “keyword”:仅关键字
    • “semantic”:仅向量
    • “hybrid”(默认):两者结合
  • 通过检索器的 params 参数传递 DBMS_HYBRID_VECTOR 参数。
  • return_scores=True 向 Document.metadata 添加整体分数和组件 text_score 和 vector_score。
  • 通过 acreate_hybrid_index 和 OracleHybridSearchRetriever.ainvoke 支持异步使用。
更多信息:

全文搜索(Oracle Text)

您可以使用 Oracle Text 直接在 Oracle 数据库上运行高质量的关键字搜索。langchain-oracledb 集成暴露了:
  • create_text_index / acreate_text_index:在列上创建 Oracle Text SEARCH INDEX。
  • OracleTextSearchRetriever:运行 CONTAINS 查询并返回 LangChain Document 对象。
索引选项:
  • 如果您有一个 OracleVS 向量存储,您可以索引其内置的 “text” 列。
  • 您也可以通过直接提供 table_name + column_name 来索引任何其他表/列。
运算符模式和高级查询:
  • 默认行为(operator_search=False):
    • 输入被视为字面文本,在非单词字符上分词,并重写为 ACCUM 表达式。
    • 使用 fuzzy=True 时,每个标记都被包装为 FUZZY("token") 以匹配拼写错误。
  • 运算符模式(operator_search=True):
    • 传递未更改的 Oracle Text 表达式(NEAR、ABOUT、AND、OR、NOT、WITHIN 等)。在此模式下,模糊被忽略。
返回的列:
  • 当针对原始表时,通过 returned_columns 在结果中包含附加列;它们附加到 Document.metadata。
  • 使用 OracleVS 时,returned_columns 默认为 [“metadata”]。
注意事项和提示:
  • 使用 operator_search=True 时,模糊被忽略(按设计)。
  • 通过 acreate_text_index 和 OracleTextSearchRetriever.ainvoke 支持异步使用。
更多信息:

端到端演示

请参考我们的完整演示指南 Oracle AI Vector Search 端到端演示指南,使用 Oracle AI Vector Search 帮助您构建端到端 RAG 管道。
官方原文:src/oss/python/integrations/vectorstores/oracle.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。
Last modified on November 3, 2026