はじめに
AI開発のプラットフォームであるDify。素晴らしいツールですよね。
そんなDifyが「OCIで色々使えたらなぁ」っと横目で見ていたのですが、いつの間にか色々対応していたので試してみました!
Oracleずくめというタイトルの通り、
・OCI上のOracle Linuxインスタンスで、
・LLMにOCI GenAI(Cohere)を利用し、
・Vector StoreにOracle DB23ai(Container)
っという構成で組んでいきます。
「そもそもDifyってどんなことができるの?」という方は早速アプリを作ってみよう
を見てみてください!
「へぇ、DifyでOracle使えるんだ」って思っていただいた方はぜひ手順
をみて、OCIでDifyを使ってみてください!
本記事で記載する範囲
くわしく言及しないこと
以下については、チュートリアルなど良い手順書がありますのでそちらをご案内いたします。
- OCIアカウントの取得方法
- OCIのVCNやインスタンス作成などの基本的な手順
- DocketやDocker Composeについて
説明すること
- コンピュートインスタンスでのDifyのセットアップ
- DifyでOCI GenAIやOracle DBの利用設定
必要なもの
- OCIのアカウント
手順
VCN作成
以下のチュートリアルを参考に作成をしましょう。
Difyは80ポートでのアクセスが必要になるので、作成されたPublic SubnetのSecurity ListでIngress Ruleで許可しましょう。
Source CIDRは接続元のIPで絞れるなら絞りましょう。ここでは0.0.0.0/0
としています。
インスタンス作成
以下のチュートリアルを参考に作成しましょう。
ShapeはデフォルトのVM.Standard.E4.Flexで1コア(OCPU)の12GBメモリで十分です。OSもデフォルトのOracle Linux8で、Boot Volのサイズもデフォルトの50GBでまずは良いでしょう。
OS事前準備
Dockerのインストール
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker opc
exit
もう一度ログインしましょう。
docker-composeのインストール
sudo wget -O /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/v2.31.0/docker-compose-linux-x86_64
sudo chmod 755 /usr/local/bin/docker-compose
difyのインストール
sudo dnf install -y git
git clone -b 0.13.1 https://github.com/langgenius/dify
cd dify/docker
cp .env.example .env
Vector StoreにOracle DBを使いたいので.env
ファイル修正します。
vi .env
VECTOR_STORE=weaviate
を
VECTOR_STORE=oracle
へ変更します。
合わせてdocker-compose.yaml
も修正します。
vi docker-compose.yaml
VECTOR_STORE: ${VECTOR_STORE:-weaviate}
を
VECTOR_STORE: ${VECTOR_STORE:-oracle}
へ変更します。
以下コマンドで環境を立ち上げます。
docker-compose up -d
oracle dockerが展開されていることがわかります。
[opc@dify docker]$ docker-compose up -d
[+] Running 76/30
⠦ redis [⣿⣿⣿⣿⣿⣿] 117.2kB / 11.02MB Pulling 95.7s
⠦ web [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 67.11MB / 105.5MB Pulling 95.7s
⠦ ssrf_proxy [⣿⣿⣿] 70.36MB / 84.35MB Pulling 95.7s
⠦ sandbox [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 141.8MB / 186.6MB Pulling 95.7s
⠦ api Pulling 95.7s
⠦ oracle [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 3.203GB / 3.214GB Pulling 95.7s
⠦ nginx [⣿⣿⣿⣿⣿⣿] 39.23MB / 43.85MB Pulling 95.7s
⠦ db [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 96.79MB / 98.31MB Pulling 95.7s
⠦ worker [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 900.3MB / 953.7MB Pulling
Oracle Linuxではfirewalldでポートを制御しているので、以下で80ポートを解放します。
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --reload
これでDifyにアクセスできるようになるはずです。
OCI Gen AIの設定
早速ブラウザでDifyにアクセスしましょう。
http://<インスタンスのPublic IP>
正常に起動していれば以下の画面になるはずです。
以下のように項目を任意で記入してセットアップをクリックします。
以下の画面に遷移するので、上記で入力したメールアドレスとパスワードでサインインします。
モデルプロバイダーを選択し、したの方にスクロールするとOracle
がありますのでセットアップをクリックします。
ここではOCIのAPI情報とAPI秘密鍵を入力します。
ここがちょっとややこしいので、以下を流れでAPIキーの取得とDifyへの入力形式へ変換を行なってください。
OCIコンソールから画面右上の人アイコンをクリックし、自身のメールアドレスまたはユーザー名をクリックします。
画面が切り替わったら下へスクロールし、画面右側のResourcesからAPI keys
をクリックし、Add API key
をクリックします。
Generate API key pairを選択し、Download private keyをクリックしてファイルをダウンロードし、Addをクリックします。
以下のpreviewが表示されるのでCopy
をクリックしてクリップボードにコピーして、メモ帳などに貼り付けて残しておきます。これでAPIキーの取得は完了です。
続いてこのAPIキーの情報から先ほどのDifyの画面で登録する文字列を生成する必要があります。
ダウンロードしたAPI秘密鍵(ここではhogehoge.pemとしています)と以下のスクリプトをインスタンスにコピーして、user, fingerprint, tenancy を先ほどメモ帳に貼り付けた情報を記入します。
#!/bin/bash
#以下を書き換える
user="ocid1.user.oc1..hogehoge"
fingerprint="xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
tenancy="ocid1.tenancy.oc1..hogehoge"
pem_file_path="hogehoge.pem"
#以下は変更しない
compartment_ocid=$(oci-metadata |grep compartment | awk '{print $3}')
region="us-chicago-1"
combined_string="$user/$fingerprint/$tenancy/$region/$compartment_ocid"
encoded_combined_string=$(echo -n "$combined_string" | base64 --wrap=0)
echo "[Dify: oci api key config file's content]"
echo "$encoded_combined_string"
if [ ! -f "$pem_file_path" ]; then
echo "PEM file not found: $pem_file_path"
exit 1
fi
encoded_pem_content=$(base64 --wrap=0 "$pem_file_path")
echo
echo "[Dify: oci api key file's content]"
echo "$encoded_pem_content"
スクリプトを実行します。
sh code.py
塗りつぶしておりますが、以下のような感じで二行表示されます。
各モデルを有効、無効にできるので以下の2つのみ有効としておきましょう。
またシステムモデル設定
としてもそれぞれ登録しておきましょう。
早速アプリを作ってみよう
ここではシンプルなチャット
とRAGチャット
を作ってみましょう。
チャット
チャットボット
を選択し、基本
を選び、アプリのアイコンと名前
にOCI GenAI Chatbot
と入力して作成する
をクリックしましょう。
デバッグとプレビュー
で動作確認をしましょう。ここでは以下を入力しています。
こんにちは!あなたの自己紹介をしてください
問題なければ、以下のような回答が得られます。Coralと返ってきましたのでCohereのモデルであることが確認できます。
あとは公開する
をクリックし、アプリを実行
をクリックすればチャットアプリの完成です。
新たなページで以下のようなページが開くので、そのURLでアクセスして利用することができます。
先ほどと同じ質問をしてみます。同じような回答があり、問題なく動作していることがわかります。
RAGチャット
続いてRAGを利用したチャットボットを作成しましょう。
その前にRAGを組み込んでいない上記で作成したチャットに以下のような質問をしてみました。
答えはRoCEv2なのですが、InfinibandとLLMモデルが持っている知識からそれらしい誤った回答をしてしまっています。
これから作成するRAGチャット
ではOracle DB
に入った正しい情報をもとにRoCEv2
と回答できるアプリを作りましょう。
VectorStoreに入れる情報としては以下のBlogをPDFにしたものを利用します。
https://blogs.oracle.com/cloud-infrastructure/post/now-ga-largest-ai-supercomputer-oci-nvidia-h200
上記のブログには以下の情報があるのでこれを参照して正しい回答が得られることを期待します。
OCI’s custom-designed cluster network that uses RDMA over Converged Ethernet Version 2 (RoCE v2)
ナレッジの作成
画面上部のナレッジ
をクリックし、ナレッジを作成
をクリックします。
テキストファイルからインポート
を選択し、アップロード
で先ほどのブログをPDFにしたファイルをアップロードし、次へ
をクリックします。
チャンク設定で、自動とカスタムがありますが、ここではカスタムを選択
します。最大チャンク長
を128
にして、チャンクのオーバーラップ
を20
にします。
インデックスモード
は高品質
として、埋め込みモデル
はcohere.embed-multilingual-v3.0
が選択されているので、そのままとします。
検索設定
はハイブリッド検索
を選択し、保存して処理
をクリックします。
RAGチャットの作成
続いて、上記ナレッジを利用したチャットを作成していきます。
先ほどと同様に画面上部のスタジオ
から最初から作成
をクリックします。
ここも先ほどと同じように、チャットボット
、基本
を選択し、名前
にRAGチャットボットと記入して作成する
をクリックします。
まず手順のところに以下を記入します。
- ユーザーの入力に回答するために、コンテキストの内容を検索した結果に忠実に回答を生成してください。
- あなたの事前知識で回答はしないでください。
参照する知識が選択できるので、先ほど作成したナレッジを選択し、追加
をクリックします。
手順とコンテキストが設定できたので、これでRAGチャットの設定は完了です。
デバッグとプレビューでただのチャットボットでは回答できなかった以下の質問をします。
OCIのGPUクラスタのインターコネクトは何を採用していますか?
あとは先ほどと同様に公開して利用することができます。
最後に
以上のようにDifyからOCI GenAI(Cohere)やOracle DB23aiを利用することができました。
ただ、実用に向けてはいくつか課題があることがわかっています。
- ナレッジの作成でチャンク設定を
自動
やカスタム
でも最大チャンク長
が大きいとナレッジの作成ができない(裏ではエラーが発生している) - Oracle DB23aiをContainerではなく、OCIのPaaSを使った構成方法の確認ができていない
- OCI GenAIの最新モデルへの追従ができていない
- OCI GenAIが大阪リージョンでリリースされたが、大阪リージョンでモデル追加するとエラーになる
などなど
今後、上記の調査を含めより良くOCIでDifyを利用する方法を確認していきたいと思います。