以编程方式使用文档

Oracle AI Database 支持 AI 工作负载,您可以通过 **含义** (语义)而不仅仅是关键词来查询数据。它将 **非结构化内容的语义搜索** 与 **业务数据的关系过滤** 结合在单一系统中,使您可以构建检索工作流(如 RAG),而无需引入单独的向量数据库并在多个平台之间分散数据。

本指南演示如何使用 OracleVS (Oracle AI Vector Search 的 LangChain 向量存储集成)来:

  • - 将文档和嵌入导入 Oracle
  • - 运行相似性搜索
  • - 创建 HNSW 和 IVF 索引
  • - 应用元数据过滤器以实现高级检索
  • - 在 Oracle AI Database 26ai 中启用混合搜索(关键词 + 语义)
  • - 使用 Oracle Text 运行全文搜索

概述

集成详情

混合搜索Python 支持
OracleVS@oracle/langchain-oracledb

设置

安装 Oracle 客户端绑定和 LangChain Oracle 辅助工具:

npm install @oracle/langchain-oracledb @langchain/core
yarn add @oracle/langchain-oracledb @langchain/core
pnpm add @oracle/langchain-oracledb @langchain/core

为将拥有向量表的 Oracle 用户设置连接凭证:

创建向量存储

以下示例假设您已创建包含向量和元数据列的表,并使用 OracleEmbeddings.

const connection = await oracledb.getConnection({
  user: process.env.ORACLE_USER,
  password: process.env.ORACLE_PASSWORD,
  connectionString: process.env.ORACLE_DSN,
});

const embeddings = new OracleEmbeddings(connection, {
  provider: "database",
  model: "DEMO_MODEL",
});

const vectorStore = new OracleVS(embeddings, {
  client: connection,
  tableName: "DEMO_VECTORS",
  query: "Find documents about Oracle RAG patterns.",
  distanceStrategy: "DOT",
});
await vectorStore.initialize();

const docs: Document[] = [
  {
    pageContent: "LangChain works great with Oracle Database.",
    metadata: {
      doc_id: "doc-1",
      title: "RAG overview",
      status: "release",
      tags: ["AI", "rag"],
      category: "books",
      price: 18,
    },
  },
];

await vectorStore.addDocuments(docs);

// Close connections or pools in application shutdown hooks to avoid leaks.
// await connection.close();

如果您的应用程序已经管理 Oracle Database 连接池,请直接将 OracleVS传递给。存储按需获取和释放连接。

const pool = await oracledb.createPool({
  user: process.env.ORACLE_USER,
  password: process.env.ORACLE_PASSWORD,
  connectString: process.env.ORACLE_DSN,
  poolIncrement: 1,
  poolMax: 4,
  poolMin: 0,
  poolPingInterval: 60,
});

const vectorStoreFromPool = new OracleVS(embeddings, {
  client: pool,
  tableName: "DEMO_VECTORS",
  query: "Find documents about Oracle RAG patterns.",
  distanceStrategy: "DOT",
});
await vectorStoreFromPool.initialize();

// Release resources during shutdown.
// await pool.close(0);

过滤搜索结果

您可以将丰富的元数据过滤器作为第三个参数传递给 similaritySearch, similaritySearchWithScore, or similaritySearchVectorWithScore。过滤器在 metadata 列上操作,Oracle VS 为每个文档维护该列。

支持的比较运算符包括 $eq (默认)、 $ne, $lt, $lte, $gt, $gte, $in, $nin, $between$exists。使用 $and$or 组合子句以构建更具表达力的谓词。

const results = await vectorStore.similaritySearch("oracle rag", 3, {
  $and: [
    { status: "release" },
    { tags: { $in: ["AI"] } },
    { price: { $between: [10, 25] } },
  ],
});

// Or request scores alongside documents.
const scored = await vectorStore.similaritySearchWithScore(
  "oracle rag",
  3,
  { status: "release" },
);

console.log(results[0]?.pageContent);
console.log(scored[0]?.[1]); // similarity score

也支持嵌套逻辑子句。例如:

const complexFilter = {
  $or: [
    { status: "draft" },
    {
      $and: [
        { category: "books" },
        { price: { $lte: 20 } },
      ],
    },
  ],
};

使用向量索引加速搜索

Oracle Database 可以通过在 embedding 列上创建向量索引来加速相似性查询。 @oracle/langchain-oracledb 辅助工具提供 createIndex 实用程序,可配置 HNSW(默认)或 IVF 索引。

HNSW 索引(默认)

当您需要图索引来平衡召回率和延迟时使用 HNSW。省略 idxType 以使用默认配置或覆盖参数(如 neighbors, efConstructionaccuracy.

// Reuse the vectorStore and connection from the setup section,
// or create one with OracleVS.fromDocuments / initialize().
await createIndex(connection, vectorStore, {
  idxName: "demo_hnsw_idx",
  neighbors: 48,
  efConstruction: 400,
  accuracy: 95,
  parallel: 16,
});

IVF 索引

通过传递参数切换到 IVF idxType: "IVF" 以及要创建的相邻分区数量。IVF 将向量划分为簇,适用于需要粗粒度量化且内存使用可预测的场景。

await createIndex(connection, vectorStore, {
  idxName: "demo_ivf_idx",
  idxType: "IVF",
  neighborPart: 64,
  accuracy: 90,
  parallel: 8,
});

运行 createIndex 一次(加载数据后或 initialize)后),然后重复使用该索引进行后续搜索。要重建或更换策略,请通过标准 SQL(DROP INDEX ...)删除现有索引,然后使用新参数重新运行 createIndex

后续步骤