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, efConstruction和 accuracy.
// 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 。
后续步骤
- - 使用
OracleDocLoader - - 使用
OracleEmbeddings - - 使用
OracleSummary