PrivateGPT supports [Qdrant](https://qdrant.tech/), [Chroma](https://www.trychroma.com/), [PGVector](https://github.com/pgvector/pgvector) and [ClickHouse](https://github.com/ClickHouse/ClickHouse) as vectorstore providers. Qdrant being the default.

In order to select one or the other, set the `vectorstore.database` property in the `settings.yaml` file to `qdrant`, `chroma`, `postgres` and `clickhouse`.

```yaml
vectorstore:
  database: qdrant
```

### Qdrant configuration

To enable Qdrant, set the `vectorstore.database` property in the `settings.yaml` file to `qdrant`.

Qdrant settings can be configured by setting values to the `qdrant` property in the `settings.yaml` file.

The available configuration options are:
| Field        | Description |
|--------------|-------------|
| location     | If `:memory:` - use in-memory Qdrant instance. If `str` - use it as a `url` parameter.|
| url          | Either host or str of 'Optional[scheme], host, Optional[port], Optional[prefix]'. Eg. `http://localhost:6333` |
| port         | Port of the REST API interface. Default: `6333` |
| grpc_port    | Port of the gRPC interface. Default: `6334` |
| prefer_grpc  | If `true` - use gRPC interface whenever possible in custom methods. |
| https        | If `true` - use HTTPS(SSL) protocol.|
| api_key      | API key for authentication in Qdrant Cloud.|
| prefix       | If set, add `prefix` to the REST URL path. Example: `service/v1` will result in `http://localhost:6333/service/v1/{qdrant-endpoint}` for REST API.|
| timeout      | Timeout for REST and gRPC API requests. Default: 5.0 seconds for REST and unlimited for gRPC |
| host         | Host name of Qdrant service. If url and host are not set, defaults to 'localhost'.|
| path         | Persistence path for QdrantLocal. Eg. `local_data/private_gpt/qdrant`|
| force_disable_check_same_thread         | Force disable check_same_thread for QdrantLocal sqlite connection, defaults to True.|

By default Qdrant tries to connect to an instance of Qdrant server at `http://localhost:3000`.

To obtain a local setup (disk-based database) without running a Qdrant server, configure the `qdrant.path` value in settings.yaml:

```yaml
qdrant:
  path: local_data/private_gpt/qdrant
```

### Chroma configuration

To enable Chroma, set the `vectorstore.database` property in the `settings.yaml` file to `chroma` and install the `chroma` extra.

```bash
poetry install --extras chroma
```

By default `chroma` will use a disk-based database stored in local_data_path / "chroma_db" (being local_data_path defined in settings.yaml)

### PGVector
To use the PGVector store a [postgreSQL](https://www.postgresql.org/) database with the PGVector extension must be used.

To enable PGVector, set the `vectorstore.database` property in the `settings.yaml` file to `postgres` and install the `vector-stores-postgres` extra.

```bash
poetry install --extras vector-stores-postgres
```

PGVector settings can be configured by setting values to the `postgres` property in the `settings.yaml` file.

The available configuration options are:
| Field         | Description                                               |
|---------------|-----------------------------------------------------------|
| **host**      | The server hosting the Postgres database. Default is `localhost` |
| **port**      | The port on which the Postgres database is accessible. Default is `5432` |
| **database**  | The specific database to connect to. Default is `postgres` |
| **user**      | The username for database access. Default is `postgres` |
| **password**  | The password for database access. (Required)            |
| **schema_name** | The database schema to use. Default is `private_gpt`       |

For example:
```yaml
vectorstore:
  database: postgres

postgres:
  host: localhost
  port: 5432
  database: postgres
  user: postgres
  password: <PASSWORD>
  schema_name: private_gpt
```

The following table will be created in the database
```
postgres=# \d private_gpt.data_embeddings
                                      Table "private_gpt.data_embeddings"
  Column   |       Type        | Collation | Nullable |                         Default
-----------+-------------------+-----------+----------+---------------------------------------------------------
 id        | bigint            |           | not null | nextval('private_gpt.data_embeddings_id_seq'::regclass)
 text      | character varying |           | not null |
 metadata_ | json              |           |          |
 node_id   | character varying |           |          |
 embedding | vector(768)       |           |          |
Indexes:
    "data_embeddings_pkey" PRIMARY KEY, btree (id)

postgres=# 
```
The dimensions of the embeddings columns will be set based on the `embedding.embed_dim` value.  If the embedding model changes this table may need to be dropped and recreated to avoid a dimension mismatch.

### ClickHouse

To utilize ClickHouse as the vector store, a [ClickHouse](https://github.com/ClickHouse/ClickHouse) database must be employed.

To enable ClickHouse, set the `vectorstore.database` property in the `settings.yaml` file to `clickhouse` and install the `vector-stores-clickhouse` extra.

```bash
poetry install --extras vector-stores-clickhouse
```

ClickHouse settings can be configured by setting values to the `clickhouse` property in the `settings.yaml` file.

The available configuration options are:
| Field                | Description                                                    |
|----------------------|----------------------------------------------------------------|
| **host**             | The server hosting the ClickHouse database. Default is `localhost` |
| **port**             | The port on which the ClickHouse database is accessible. Default is `8123` |
| **username**         | The username for database access. Default is `default` |
| **password**         | The password for database access. (Optional) |
| **database**         | The specific database to connect to. Default is `__default__` |
| **secure**           | Use https/TLS for secure connection to the server. Default is `false` |
| **interface**        | The protocol used for the connection, either 'http' or 'https'. (Optional) |
| **settings**         | Specific ClickHouse server settings to be used with the session. (Optional) |
| **connect_timeout**  | Timeout in seconds for establishing a connection. (Optional) |
| **send_receive_timeout** | Read timeout in seconds for http connection. (Optional) |
| **verify**           | Verify the server certificate in secure/https mode. (Optional) |
| **ca_cert**          | Path to Certificate Authority root certificate (.pem format). (Optional) |
| **client_cert**      | Path to TLS Client certificate (.pem format). (Optional) |
| **client_cert_key**  | Path to the private key for the TLS Client certificate. (Optional) |
| **http_proxy**       | HTTP proxy address. (Optional) |
| **https_proxy**      | HTTPS proxy address. (Optional) |
| **server_host_name** | Server host name to be checked against the TLS certificate. (Optional) |

For example:
```yaml
vectorstore:
  database: clickhouse

clickhouse:
  host: localhost
  port: 8443
  username: admin
  password: <PASSWORD>
  database: embeddings
  secure: false
```

The following table will be created in the database:
```
clickhouse-client
:) \d embeddings.llama_index
                                   Table "llama_index"
  № |  name     | type                                         | default_type | default_expression | comment | codec_expression | ttl_expression
----|-----------|----------------------------------------------|--------------|--------------------|---------|------------------|---------------
  1 | id        | String                                       |              |                    |         |                  |
  2 | doc_id    | String                                       |              |                    |         |                  |
  3 | text      | String                                       |              |                    |         |                  |
  4 | vector    | Array(Float32)                               |              |                    |         |                  |
  5 | node_info | Tuple(start Nullable(UInt64), end Nullable(UInt64)) |       |                    |         |                  |
  6 | metadata  | String                                       |              |                    |         |                  |

clickhouse-client
```

The dimensions of the embeddings columns will be set based on the `embedding.embed_dim` value. If the embedding model changes, this table may need to be dropped and recreated to avoid a dimension mismatch.
