DifyでOracle Autonomous Databaseを使ってみた

Difyのv1.0.1でOracle Autonomous Database(ADB)がサポートされたので、使うために接続方法についてこちらの記事で記載したいと思います。

以前投稿した記事の続きで、OCI Compute上にデプロイしたDify環境との接続を目指します。

## 前提条件
* OCIのアカウントを持っていること
* VCN(仮想クラウドネットワーク)の作成が完了していること
* OCI Computeの作成が完了していること

## ADBの作成
下記を参考にADBを作成します。

https://oracle-japan.github.io/ocitutorials/adb/adb101-provisioning/

注意点としては、データベース・バージョンを**23ai**にする必要があります。
それ以外はOCIチュートリアルの通りで概ね問題ないかと思います。

## LEXERの作成
今回はOracle TEXTという全文検索の機能を使いたかったので、`WORLD_LEXER`という多言語対応されたものを使用しています。

ADBの詳細画面で、データベース・アクション→SQLをクリックするなどして、下記を実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3742484/d61fe28b-07f6-4954-a5cb-9758992980b7.png)

```
BEGIN
    CTX_DDL.CREATE_PREFERENCE('world_lexer','WORLD_LEXER');
END;
/
```

## ウォレットのダウンロード
ADBの詳細画面で、データベース接続をクリックします。

データベース接続の画面で、ウォレットのダウンロードをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3742484/15c66102-db64-4775-90ea-a8652a7bbfd9.png)

次にウォレットのパスワードを作成し、ダウンロードをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3742484/66d0f690-e2d4-4c30-acd8-4af07d580a88.png)

ダウンロード後に、接続文字列のTNS名(例：`xxx_high`)をコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3742484/246f6c5d-806a-4ecc-9988-03fa25d917a9.png)

## Docker、docker-composeのインストール
下記を参考に実施してください。

https://qiita.com/hamorita/items/ae33bf48a405ae37ffeb

## Difyのインストール

バージョン1.1.0のDifyをクローンし、ディレクトリに移動します。
前述の通り、v1.0.1からOracle Autonomous Databaseがサポートされるようになっています。

```
git clone -b 1.1.0 https://github.com/langgenius/dify.git
cd dify/docker
```

環境設定ファイルを作成します。

```
cp .env.example .env
```

Oracle Autonomous Databaseをベクトルストアとして使用するには、環境設定ファイルを下記のように編集します。

```vi.env
# Supported values are `weaviate`, `qdrant`, `milvus`, `myscale`, `relyt`, `pgvector`, `pgvecto-rs`, `chroma`, `opensearch`, `tidb_vector`, `oracle`, `tencent`, `elasticsearch`, `elasticsearch-ja`, `analyticdb`, `couchbase`, `vikingdb`, `oceanbase`.
VECTOR_STORE=oracle

・
・
・

# Oracle configuration, only available when VECTOR_STORE is `oracle`
ORACLE_USER=admin
ORACLE_PASSWORD=<ADMINユーザーのパスワード>
ORACLE_DSN=<接続文字列のTNS名>
ORACLE_CONFIG_DIR=/app/api/storage/wallet # 固定
ORACLE_WALLET_LOCATION=/app/api/storage/wallet # 固定
ORACLE_WALLET_PASSWORD=<ウォレットのパスワード>
ORACLE_IS_AUTONOMOUS=true
```

また、以前のバージョンから利用できるようになっていた、Oracle Database 23ai FreeのDockerコンテナが起動しないように、`profiles`の値をたとえば`oracle-skip`に変更します。

```vi docker-compose.yaml
  # Oracle vector database
  oracle:
    image: container-registry.oracle.com/database/free:latest
    profiles:
      - oracle-skip
    restart: always
    volumes:
      - source: oradata
        type: volume
        target: /opt/oracle/oradata
      - ./startupscripts:/opt/oracle/scripts/startup
    environment:
      ORACLE_PWD: ${ORACLE_PWD:-Dify123456}
      ORACLE_CHARACTERSET: ${ORACLE_CHARACTERSET:-AL32UTF8}
```

Dockerコンテナを起動します。
```
docker compose up -d
```

先ほどダウンロードしたADBのウォレットのzipファイルをscpツールやscpコマンドでインスタンスの`/tmp`へ転送します。
```
sudo apt install unzip -y

cd /tmp

unzip <ウォレットのzipファイル>.zip -d wallet
```

ウォレットをDifyのdocker-worker-1コンテナにコピーします。
```
docker cp wallet docker-worker-1:/app/api/storage/wallet
```

以上でDifyのインストールおよびADBとの接続設定が完了しました。

## おまけ：RAGができていることを確認する
OraBoosterという架空のロケットエンジンの概要が記載されたrocket.txtをアップロードし、埋め込みモデルにOCIで提供されている`cohere.embed-multilingual-v3.0`を利用してナレッジを作成しました。

チャットボットに質問をすると、期待通りの回答が返ってくることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3742484/b2acb7b9-32b7-4c55-bea7-ce19c43a0cb3.png)