OracleVS(Oracle AI 向量搜索的 LangChain 向量存储集成)来:
- 将文档和嵌入摄取到 Oracle 中
- 运行相似性搜索
- 创建 HNSW 和 IVF 索引
- 应用元数据过滤以进行高级检索
- 在 Oracle Database 26ai 中启用混合搜索(关键词 + 语义)
- 使用 Oracle Text 运行全文搜索
先决条件
安装langchain-oracledb。python-oracledb 驱动程序将作为依赖项自动安装。
连接到 Oracle 数据库
以下示例代码将展示如何连接到 Oracle 数据库。默认情况下,python-oracledb 在“Thin”模式下运行,该模式直接连接到 Oracle 数据库。此模式不需要 Oracle 客户端库。但是,当 python-oracledb 使用它们时,会提供一些额外的功能。当使用 Oracle 客户端库时,python-oracledb 被称为“Thick”模式。两种模式都全面支持 Python 数据库 API v2.0 规范。请参阅以下指南,了解每种模式支持的功能。如果您无法使用 Thin 模式,您可能需要切换到 Thick 模式。导入所需的依赖项
加载文档
使用不同的距离度量创建向量存储
首先,我们将创建三个具有不同距离函数的向量存储。由于我们尚未在其中创建索引,它们目前只会创建表。稍后我们将使用这些向量存储来创建 HNSW 索引。要了解有关 Oracle AI 向量搜索支持的不同索引类型的更多信息,请参阅以下指南。 您可以手动连接到 Oracle 数据库,并将看到三个表:Documents_DOT、Documents_COSINE 和 Documents_EUCLIDEAN。
然后,我们将创建三个额外的表 Documents_DOT_IVF、Documents_COSINE_IVF 和 Documents_EUCLIDEAN_IVF,这些表将用于在表上创建 IVF 索引,而不是 HNSW 索引。
文本的添加和删除操作以及基本相似性搜索
使用特定参数创建索引
高级搜索
Oracle Database 23ai 支持预过滤、过滤中和后过滤,以增强 AI 向量搜索功能。这些过滤机制允许用户在执行向量相似性搜索之前、期间和之后应用约束,从而提高搜索性能和准确性。 Oracle 23ai 中过滤的关键点:- 预过滤 应用传统 SQL 过滤器,在执行向量相似性搜索之前减少数据集。 通过限制 AI 算法处理的数据量来帮助提高效率。
- 过滤中 利用 AI 向量搜索直接在向量嵌入上执行相似性搜索,使用优化的索引和算法。 基于向量相似性高效过滤结果,而无需扫描整个数据集。
- 后过滤 在向量相似性搜索之后应用额外的 SQL 过滤以优化结果。 允许根据业务逻辑或其他元数据条件进行进一步优化。
- 性能优化:预过滤显著减少了查询执行时间,使在海量数据集上的搜索更加高效。
- 准确性增强:过滤中确保向量搜索在语义上有意义,提高搜索结果的质量。
过滤详情
OracleVS 支持一组可以使用 filter 参数应用于 metadata 字段的过滤器。这些过滤器允许您根据各种条件选择和优化数据。
可用的过滤器操作符:
| 操作符 | 描述 |
|---|---|
\$exists | 字段存在。 |
\$eq | 字段值等于操作数值 (=)。 |
\$ne | 字段存在且值不等于操作数值 (!=)。 |
\$gt | 字段值大于操作数值 (>)。 |
\$lt | 字段值小于操作数值 (<)。 |
\$gte | 字段值大于或等于操作数值 (>=)。 |
\$lte | 字段值小于或等于操作数值 (<=)。 |
\$between | 字段值在操作数数组中的两个值之间(或等于)。 |
\$startsWith | 字段值以操作数值开头。 |
\$hasSubstring | 字段值包含操作数作为子字符串。 |
\$instr | 字段值包含操作数作为子字符串。 |
\$regex | 字段值匹配给定的正则表达式模式。 |
\$like | 字段值匹配操作数模式(使用类似 SQL 的语法)。 |
\$in | 字段值等于操作数数组中的至少一个值。 |
\$nin | 字段存在,但其值不等于操作数数组中的任何值,或者字段不存在。 |
\$all | 字段值是一个数组,包含操作数数组中的所有项,或者与单个操作数匹配的标量。 |
- 您可以使用逻辑操作符组合这些过滤器:
| 逻辑操作符 | 描述 |
|---|---|
\$and | 逻辑 AND |
\$or | 逻辑 OR |
\$nor | 逻辑 NOR |
- 当对象中的所有过滤器都必须满足时,可以省略
$and。这两者是等效的:
$not子句可以否定比较操作符:
- 使用
field: scalar等同于field: { "$eq": scalar }:
混合搜索
Oracle Database 26ai 支持混合搜索,将关键词(全文)和语义(向量)搜索结合到单一的检索功能中。langchain-oracledb 集成公开了:
OracleVectorizerPreference:创建由混合索引使用的数据库端向量化器首选项。create_hybrid_index/acreate_hybrid_index:创建 HYBRID VECTOR INDEX。OracleHybridSearchRetriever:在OracleVS表上执行关键词、语义或混合检索。
先决条件和模型配置
使用混合搜索时,请使用OracleEmbeddings 配置您的 OracleVS,以便向量化器首选项与嵌入配置完全匹配。您可以通过 OracleVectorizerPreference 提供额外参数来进一步调整混合向量索引。有关详细信息,请参阅文档。
- 如果您不想管理命名首选项,请传递
vector_store。该函数将创建临时首选项,构建索引,然后自动删除首选项。
- search_mode 决定使用哪些信号:
- “keyword”:仅关键词
- “semantic”:仅向量
- “hybrid”(默认):两者结合
- 通过检索器的 params 参数传递
DBMS_HYBRID_VECTOR参数。 return_scores=True将总体分数以及组件 text_score 和 vector_score 添加到 Document.metadata。- 通过
acreate_hybrid_index和OracleHybridSearchRetriever.ainvoke支持异步用法。
全文搜索(Oracle Text)
您可以使用 Oracle Text 直接在 Oracle 数据库上运行高质量的关键词搜索。langchain-oracledb 集成公开了:
create_text_index/acreate_text_index:在列上创建 Oracle TextSEARCH INDEX。OracleTextSearchRetriever:运行CONTAINS查询并返回 LangChainDocument对象。
- 如果您有
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等)。在此模式下,fuzzy 被忽略。
- 传递 Oracle Text 表达式不变(
- 当定位原始表时,通过
returned_columns在结果中包含额外列;它们附加到Document.metadata。 - 对于
OracleVS,returned_columns默认为 [“metadata”]。
- 当使用
operator_search=True时,fuzzy 被忽略(按设计)。 - 通过
acreate_text_index和OracleTextSearchRetriever.ainvoke支持异步用法。
端到端演示
请参阅我们的完整演示指南 Oracle AI 向量搜索端到端演示指南,以借助 Oracle AI 向量搜索构建端到端 RAG 管道。连接这些文档 到 Claude、VSCode 等,通过 MCP 获取实时答案。

