跳到主要内容

OracleDB Vector 存储

OracleVector 将嵌入存储在 Oracle Database 的 VECTOR 列中,并通过 Mastra 的 Vector 接口公开。每个逻辑 Mastra Vector 索引都通过注册表映射到一个 Oracle Vector 表,而元数据则以 Oracle JSON 格式存储,用于结构化筛选。

安装
安装的直接链接

npm install @mastra/oracledb@latest

用法
用法的直接链接

import { OracleVector } from '@mastra/oracledb'

const vector = new OracleVector({
id: 'oracle-vector',
user: process.env.ORACLE_DATABASE_USER,
password: process.env.ORACLE_DATABASE_PASSWORD,
connectString: process.env.ORACLE_DATABASE_CONNECT_STRING,
})

await vector.createIndex({
indexName: 'memory_messages',
dimension: 1536,
metric: 'cosine',
})

await vector.upsert({
indexName: 'memory_messages',
vectors: [embedding],
metadata: [{ resource_id: 'user-1', thread_id: 'thread-1' }],
})

const results = await vector.query({
indexName: 'memory_messages',
queryVector,
topK: 5,
filter: { resource_id: 'user-1' },
})

默认情况下,OracleVector 使用精确搜索,不创建近似 Vector 索引。当数据集和延迟要求需要近似搜索时,可配置 IVF 或 HNSW。

构造函数选项
构造函数选项的直接链接

直接传入 Oracle 连接选项(userpasswordconnectStringpool、wallet 选项或 externalAuth),或者传入 poolManager,以共享 OracleStore 使用的连接池。Vector 专用选项如下:

id:

string
此 Vector 存储实例的唯一标识符。

poolManager?:

OraclePoolManager
共享的 Oracle 连接池管理器。使用此选项可与 OracleStore 共享同一个 Oracle 连接池。

schemaName?:

string
用于限定 Vector 注册表和 Vector 表的 Oracle schema 名称。

tablePrefix?:

string
= 'MASTRA_VEC'
物理 Oracle Vector 表使用的前缀。

registryTableName?:

string
= 'MASTRA_VECTOR_INDEXES'
用于将 Mastra 逻辑索引名称映射到物理 Vector 表的 Oracle 表。

defaultIndexConfig?:

OracleVectorIndexConfig
= { type: 'none', accuracy: 95 }
默认 Oracle Vector 索引配置。

defaultMetadataIndexes?:

string[]
= ['thread_id', 'resource_id', 'message_id', 'source_id']
创建 Vector 表时自动建立索引的元数据字段。

defaultVectorFormat?:

'vector' | 'bit' | 'int8'
= 'vector'
密集、二进制和 int8 嵌入使用的默认 Oracle Vector 格式。

upsertBatchSize?:

number
= 200
每次 Oracle executeMany 调用发送的 Vector 数量。所有批次均成功后,整个 upsert 仅提交一次。

构造函数示例
构造函数示例的直接链接

与 OracleStore 共享连接池
与 OracleStore 共享连接池的直接链接

import { OracleStore, OracleVector } from '@mastra/oracledb'

const storage = new OracleStore({ id: 'oracle-storage', user, password, connectString })

const vector = new OracleVector({
id: 'oracle-vector',
poolManager: storage.getPoolManager(),
})

对于 Autonomous Database 和 mTLS 连接,请在同一个构造函数中传入 walletLocationwalletPasswordconfigDir

方法
方法的直接链接

createIndex()
createindex的直接链接

创建注册表行、物理 Oracle Vector 表、元数据索引,并可选择创建 Oracle Vector 索引。

indexName:

string
逻辑 Mastra 索引名称。Provider 会在内部将其映射到有效的 Oracle 表名。

dimension:

number
Vector 维度。该值必须与嵌入模型的输出大小一致。

metric?:

'cosine' | 'euclidean' | 'dotproduct' | 'hamming' | 'jaccard'
= cosine
相似度搜索使用的距离度量。二进制 Vector 支持 hammingjaccard

vectorFormat?:

'vector' | 'bit' | 'int8'
= vector
Oracle Vector 存储格式。

indexConfig?:

OracleVectorIndexConfig
= { type: 'none', accuracy: 95 }
Oracle Vector 索引配置。none 表示使用精确搜索,不创建近似 Vector 索引。

buildIndex?:

boolean
= true
indexConfig.typeivfhnsw 时,是否构建 Oracle Vector 索引。

metadataIndexes?:

string[]
要建立索引的元数据字段名称,以加快 JSON 元数据筛选。

OracleVectorIndexConfig
oraclevectorindexconfig的直接链接

type?:

'none' | 'ivf' | 'hnsw'
= 'none'
Oracle Vector 索引类型。

accuracy?:

number
= 95
近似 Vector 搜索的目标准确率。

ivf.neighborPartitions?:

number
Oracle IVF 相邻分区设置。

hnsw.neighbors?:

number
Oracle HNSW 邻居设置。

hnsw.efConstruction?:

number
Oracle HNSW 构建时的 construction 设置。

索引配置
索引配置的直接链接

await vector.createIndex({
indexName: 'support_articles',
dimension: 1536,
metric: 'cosine',
indexConfig: {
type: 'ivf',
accuracy: 95,
ivf: {
neighborPartitions: 32,
},
},
})

默认为 indexConfig: { type: 'none' },它使用精确搜索,无需调整近似索引。仅当数据量和延迟要求确实需要近似搜索时,才使用 IVF 或 HNSW。HNSW 通过 indexConfig: { type: 'hnsw', hnsw: { neighbors, efConstruction } } 配置,并需要 Oracle Vector Pool 内存;对于本地或自行管理的数据库,可使用 configureVectorMemory() 分配该内存。

upsert()
upsert的直接链接

indexName:

string
要 upsert Vector 的索引名称。

vectors:

number[][]
嵌入 Vector 数组。

metadata?:

Record<string, any>[]
以 Oracle JSON 格式存储的元数据。必须按位置与 vectors 对齐。

ids?:

string[]
可选的 Vector ID。省略时会生成 ID。

query()
query的直接链接

indexName:

string
要查询的索引名称。

queryVector:

number[]
查询 Vector。

topK?:

number
= 10
要返回的结果数量。

filter?:

Record<string, any>
转换为 Oracle JSON 谓词的 Mastra 元数据筛选条件。

includeVector?:

boolean
= false
每个结果中是否包含 Vector。

minScore?:

number
= -1
最低相似度分数阈值。

queryMode?:

'exact' | 'approx'
Oracle 查询模式。未配置近似 Vector 索引时,默认使用精确搜索。

targetAccuracy?:

number
Oracle 近似 Vector 查询的目标准确率。

listIndexes()
listindexes的直接链接

返回 Oracle Vector 注册表中记录的逻辑 Mastra 索引名称。

describeIndex()
describeindex的直接链接

返回 Oracle 索引元数据,包括物理表名、维度、Vector 数量、度量、索引类型、Vector 格式和配置的准确率。

deleteIndex()
deleteindex的直接链接

删除 Oracle Vector 表,并移除逻辑索引的注册表条目。

updateVector()
updatevector的直接链接

按 ID 或元数据筛选条件更新 Vector。必须提供 idfilter,但不能同时提供两者。update 对象可以包含 vectormetadata 或两者。

await vector.updateVector({
indexName: 'support_articles',
id: 'doc-1',
update: { metadata: { status: 'reviewed' } },
})

deleteVector()
deletevector的直接链接

按 ID 删除单个 Vector。

deleteVectors()
deletevectors的直接链接

按 ID 或元数据筛选条件删除多个 Vector。必须提供 idsfilter,但不能同时提供两者。

buildIndex()
buildindex的直接链接

为现有逻辑索引构建 Oracle Vector 索引。如果解析后的索引类型为 none,此方法不会执行任何操作。

rebuildIndex()
rebuildindex的直接链接

删除并重新创建现有逻辑索引的 Oracle Vector 索引,通常用于更改近似索引的调优设置后。

索引诊断
索引诊断的直接链接

使用 getIndexStatus({ indexName }) 检查 Oracle 目录状态;使用 indexAccuracyQuery({ indexName, queryVector, topK, targetAccuracy }) 针对近似索引运行 DBMS_VECTOR.INDEX_ACCURACY_QUERY

configureVectorMemory()
configurevectormemory的直接链接

分配 HNSW 索引所需的 Oracle Vector Pool 内存。此方法会调用 ALTER SYSTEM SET VECTOR_MEMORY_SIZE,因此需要特权连接,例如 SYSDBASYSTEM

size:

string
Vector Pool 大小,为整数,后面可跟 KMG(例如 "512M")。

scope?:

'MEMORY' | 'SPFILE' | 'BOTH'
= 'MEMORY'
Oracle ALTER SYSTEM 的作用域。使用 'SPFILE' 或 'BOTH' 可使设置在数据库重启后继续生效。

disconnect()
disconnect的直接链接

当连接池管理器由 OracleVector 创建时,关闭 Oracle 连接池。如果提供了 poolpoolManager,则需要自行管理其生命周期。

元数据筛选器
元数据筛选器的直接链接

OracleVector 接受 Mastra 的标准元数据筛选语法。筛选条件会转换为使用绑定值的 Oracle JSON 谓词:

  • 标量比较使用 JSON_VALUE
  • 数组、存在性和元素匹配检查使用 JSON_EXISTS
  • 正则表达式筛选使用 REGEXP_LIKE
  • 字符串包含筛选使用不区分大小写的 LIKE
const results = await vector.query({
indexName: 'memory_messages',
queryVector,
topK: 5,
filter: {
resource_id: 'user-1',
tags: { $contains: 'support' },
score: { $gte: 0.8 },
$or: [{ source: 'docs' }, { source: 'tickets' }],
},
})

元数据以原生 Oracle JSON 格式存储,因此也可以使用 DBeaver 和 SQL Developer 等标准 Oracle JDBC 工具直接读取这些行。

当 Agent 应生成与 Oracle 兼容的元数据筛选条件时,请使用 ORACLEDB_PROMPT 配合 createVectorQueryTool()

import { Agent } from '@mastra/core/agent'
import { createVectorQueryTool } from '@mastra/rag'
import { fastembed } from '@mastra/fastembed'
import { ORACLEDB_PROMPT } from '@mastra/oracledb'

const vectorQueryTool = createVectorQueryTool({
vectorStoreName: 'oracle',
indexName: 'support_articles',
model: fastembed,
enableFilter: true,
})

export const ragAgent = new Agent({
id: 'oracle-rag-agent',
name: 'Oracle RAG Agent',
model: 'openai/gpt-5.6-sol',
instructions: `
Use the retrieval tool when you need source context.
Available metadata fields: resource_id, thread_id, source, category, tags.
${ORACLEDB_PROMPT}
`,
tools: { vectorQueryTool },
})

响应类型
响应类型的直接链接

查询结果以以下格式返回:

interface QueryResult {
id: string
score: number
metadata: Record<string, any>
vector?: number[]
}

用法示例
用法示例的直接链接

src/mastra/agents/oracle-agent.ts
import { Agent } from '@mastra/core/agent'
import { Memory } from '@mastra/memory'
import { fastembed } from '@mastra/fastembed'
import { OracleStore, OracleVector } from '@mastra/oracledb'

const storage = new OracleStore({
id: 'oracle-storage',
user: process.env.ORACLE_DATABASE_USER,
password: process.env.ORACLE_DATABASE_PASSWORD,
connectString: process.env.ORACLE_DATABASE_CONNECT_STRING,
})

const vector = new OracleVector({
id: 'oracle-vector',
poolManager: storage.getPoolManager(),
})

export const oracleAgent = new Agent({
id: 'oracle-agent',
name: 'Oracle Agent',
instructions: 'You are an assistant with OracleDB-backed memory and semantic recall.',
model: 'openai/gpt-5.6-sol',
memory: new Memory({
storage,
vector,
embedder: fastembed,
options: {
semanticRecall: { topK: 3, messageRange: 2 },
},
}),
})