Back to Mem0

Oracle AI Vector Search

docs/components/vectordbs/dbs/oracledb.mdx

2.0.177.5 KB
Original Source

Oracle AI Vector Search stores embeddings in an Oracle table using the native VECTOR data type, so you can combine semantic search over unstructured data with relational queries over business data in a single database.

Requirements

  • Oracle Database 23.4 or later, with a user that can create tables and vector indexes
  • The python-oracledb or node-oracledb driver. In thick mode, Oracle Client 23.4 or later is also required.
<CodeGroup> ```bash Python pip install oracledb ```
bash
npm install oracledb
</CodeGroup>

Usage

<CodeGroup> ```python Python import os from mem0 import Memory

os.environ["OPENAI_API_KEY"] = "sk-xx"

config = { "vector_store": { "provider": "oracledb", "config": { "collection_name": "mem0", "embedding_model_dims": 1536, "connection_params": { "user": "mem0_user", "password": "your-password", "dsn": "localhost:1521/FREEPDB1", }, } } }

m = Memory.from_config(config) messages = [ {"role": "user", "content": "I'm planning to watch a movie tonight. Any recommendations?"}, {"role": "assistant", "content": "How about thriller movies? They can be quite engaging."}, {"role": "user", "content": "I'm not a big fan of thriller movies but I love sci-fi movies."}, {"role": "assistant", "content": "Got it! I'll avoid thriller recommendations and suggest sci-fi movies in the future."} ] m.add(messages, user_id="alice", metadata={"category": "movies"})


```typescript TypeScript
import { Memory } from "mem0ai/oss";

const config = {
  vectorStore: {
    provider: "oracledb",
    config: {
      collectionName: "mem0",
      embeddingModelDims: 1536,
      connectionParams: {
        user: "mem0_user",
        password: "your-password",
        connectString: "localhost:1521/FREEPDB1",
      },
    },
  },
};

const memory = new Memory(config);

const messages = [
  {
    role: "user",
    content: "I'm planning to watch a movie tonight. Any recommendations?",
  },
  {
    role: "assistant",
    content: "How about thriller movies? They can be quite engaging.",
  },
  {
    role: "user",
    content: "I'm not a big fan of thriller movies but I love sci-fi movies.",
  },
  {
    role: "assistant",
    content:
      "Got it! I'll avoid thriller recommendations and suggest sci-fi movies in the future.",
  },
];

await memory.add(messages, {
  userId: "alice",
  metadata: { category: "movies" },
});
</CodeGroup>

To reuse a connection or pool you already manage, pass it as client instead of the connection parameters:

<CodeGroup> ```python Python import oracledb

pool = oracledb.create_pool(user="mem0_user", password="your-password", dsn="localhost:1521/FREEPDB1")

config = { "vector_store": { "provider": "oracledb", "config": {"client": pool}, } }


```typescript TypeScript
import oracledb from "oracledb";

const pool = await oracledb.createPool({
  user: "mem0_user",
  password: "your-password",
  connectString: "localhost:1521/FREEPDB1",
});

const config = {
  vectorStore: {
    provider: "oracledb",
    config: { client: pool },
  },
};
</CodeGroup>

Config

Here are the parameters available for configuring Oracle AI Vector Search:

PythonTypeScriptDescriptionDefault Value
connection_paramsconnectionParamsConnection settings passed to the Oracle driver, such as user, password and dsn (connectString in TypeScript). See the Python or Node.js connection handling guide.None
use_connection_pooluseConnectionPoolCreate a connection pool from the connection parameters instead of a single connectionTrue
clientclientAn existing Oracle connection or pool to use instead of building one from the connection parametersNone
collection_namecollectionNameName of the Oracle table that stores vectors and payloadsmem0
embedding_model_dimsembeddingModelDimsDimension of your embedding vectors, must be greater than 01536
distance_metricdistanceMetricDistance function used for indexing and search: COSINE, EUCLIDEAN, EUCLIDEAN_SQUARED, DOT, HAMMING or MANHATTANCOSINE
do_create_indexdoCreateIndexWhether to create a vector index on the collectionTrue
index_typeindexTypeVector index type: HNSW or IVFHNSW
index_nameindexNameName of the vector index<collection_name>_VEC_IDX
index_parametersindexParametersIndex tuning parameters. For HNSW: neighbors, efconstruction. For IVF: neighbor partitions, samples_per_partition, min_vectors_per_partition.None
index_accuracyindexAccuracyTarget index accuracy from 1 to 100, applied as WITH TARGET ACCURACY <n>None
<Note> When you pass a pre-built `client`, Mem0 uses it as-is and ignores the connection parameters and pooling options. Mem0 does not close a client it did not create. </Note>

Vector indexes

Set the index type with index_type and tune it with index_parameters:

<CodeGroup> ```python Python config = { "vector_store": { "provider": "oracledb", "config": { "connection_params": {"user": "mem0_user", "password": "your-password", "dsn": "localhost:1521/FREEPDB1"}, "index_type": "HNSW", "index_parameters": {"neighbors": 32, "efconstruction": 200}, "index_accuracy": 95, } } } ```
typescript
const config = {
  vectorStore: {
    provider: "oracledb",
    config: {
      connectionParams: {
        user: "mem0_user",
        password: "your-password",
        connectString: "localhost:1521/FREEPDB1",
      },
      indexType: "HNSW",
      indexParameters: { neighbors: 32, efconstruction: 200 },
      indexAccuracy: 95,
    },
  },
};
</CodeGroup>

For the full list of supported options, see the Oracle CREATE VECTOR INDEX reference.

Search scores

Oracle returns a distance from VECTOR_DISTANCE, which Mem0 converts to a score where higher means more similar. COSINE and the other non-negative metrics produce scores in the range [0, 1]. DOT returns the inner product, which can fall outside that range.

Metadata filters

Filters run against the JSON payload column and support:

Filter typeExamples
Scalar equality{"user_id": "alice"}
Field existence{"agent_id": "*"}
Comparison{"score": {"gte": 0.5}}, also eq, ne, gt, lt, lte
Membership{"category": {"in": ["movies", "books"]}}, also nin
String matching{"title": {"contains": "sci-fi"}}, also icontains for case-insensitive
Logical groups{"AND": [...]}, {"OR": [...]}, {"NOT": [...]}, also $and, $or, $not

Multiple fields at the top level are combined with AND:

<CodeGroup> ```python Python m.search( "movie recommendations", user_id="alice", filters={"category": {"in": ["movies", "books"]}, "rating": {"gte": 4}}, ) ```
typescript
await memory.search("movie recommendations", {
  userId: "alice",
  filters: { category: { in: ["movies", "books"] }, rating: { gte: 4 } },
});
</CodeGroup>