Back to Mem0

Oracle AI Vector Search

docs/components/vectordbs/dbs/oracledb.mdx

2.0.145.2 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 driver. In thick mode, Oracle Client 23.4 or later is also required.
bash
pip install oracledb

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"})

</CodeGroup>

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

```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},
    }
}

Config

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

ParameterDescriptionDefault Value
connection_paramsConnection settings passed to python-oracledb, such as user, password and dsn. See the connection handling guide.None
use_connection_poolCreate a connection pool from connection_params instead of a single connectionTrue
clientAn existing oracledb.Connection or oracledb.ConnectionPool to use instead of building one from connection_paramsNone
collection_nameName of the Oracle table that stores vectors and payloadsmem0
embedding_model_dimsDimension of your embedding vectors, must be greater than 01536
distance_metricDistance function used for indexing and search: COSINE, EUCLIDEAN, EUCLIDEAN_SQUARED, DOT, HAMMING or MANHATTANCOSINE
do_create_indexWhether to create a vector index on the collectionTrue
index_typeVector index type: HNSW or IVFHNSW
index_nameName of the vector index<collection_name>_VEC_IDX
index_parametersIndex tuning parameters. For HNSW: neighbors, efconstruction. For IVF: neighbor partitions, samples_per_partition, min_vectors_per_partition.None
index_accuracyTarget 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 `connection_params` and `use_connection_pool`. 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:

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,
        }
    }
}

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": [...]}

Multiple fields at the top level are combined with AND:

python
m.search(
    "movie recommendations",
    user_id="alice",
    filters={"category": {"in": ["movies", "books"]}, "rating": {"gte": 4}},
)