12
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Oracle Cloud InfrastructureAdvent Calendar 2024

Day 11

Oracle(OCI)ずくめでDifyしよう!

Last updated at Posted at 2024-12-10

はじめに

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としています。
image.png

インスタンス作成

以下のチュートリアルを参考に作成しましょう。

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>

正常に起動していれば以下の画面になるはずです。
以下のように項目を任意で記入してセットアップをクリックします。
image.png

以下の画面に遷移するので、上記で入力したメールアドレスとパスワードでサインインします。
image.png

まず、LLMなどの利用するモデルを設定します。
image.png

モデルプロバイダーを選択し、したの方にスクロールするとOracleがありますのでセットアップをクリックします。
image.png

ここではOCIのAPI情報とAPI秘密鍵を入力します。
ここがちょっとややこしいので、以下を流れでAPIキーの取得とDifyへの入力形式へ変換を行なってください。

OCIコンソールから画面右上の人アイコンをクリックし、自身のメールアドレスまたはユーザー名をクリックします。
image.png

画面が切り替わったら下へスクロールし、画面右側のResourcesからAPI keysをクリックし、Add API keyをクリックします。
image.png

Generate API key pairを選択し、Download private keyをクリックしてファイルをダウンロードし、Addをクリックします。
image.png

以下のpreviewが表示されるのでCopyをクリックしてクリップボードにコピーして、メモ帳などに貼り付けて残しておきます。これでAPIキーの取得は完了です。
image.png

続いてこの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

塗りつぶしておりますが、以下のような感じで二行表示されます。
image.png

それぞれを以下に貼り付けて保存をクリックします。
image.png

問題なければ以下のように登録されます。
image.png

各モデルを有効、無効にできるので以下の2つのみ有効としておきましょう。
image.png

またシステムモデル設定としてもそれぞれ登録しておきましょう。
image.png

早速アプリを作ってみよう

ここではシンプルなチャットRAGチャットを作ってみましょう。

チャット

画面上部のスタジオから最初から作成をクリックします。
image.png

チャットボットを選択し、基本を選び、アプリのアイコンと名前OCI GenAI Chatbotと入力して作成するをクリックしましょう。
image.png

デバッグとプレビューで動作確認をしましょう。ここでは以下を入力しています。

こんにちは!あなたの自己紹介をしてください 

image.png

問題なければ、以下のような回答が得られます。Coralと返ってきましたのでCohereのモデルであることが確認できます。
image.png

あとは公開するをクリックし、アプリを実行をクリックすればチャットアプリの完成です。
image.png

新たなページで以下のようなページが開くので、そのURLでアクセスして利用することができます。
image.png

先ほどと同じ質問をしてみます。同じような回答があり、問題なく動作していることがわかります。
image.png

RAGチャット

続いてRAGを利用したチャットボットを作成しましょう。

その前にRAGを組み込んでいない上記で作成したチャットに以下のような質問をしてみました。
答えはRoCEv2なのですが、InfinibandとLLMモデルが持っている知識からそれらしい誤った回答をしてしまっています。
これから作成するRAGチャットではOracle DBに入った正しい情報をもとにRoCEv2と回答できるアプリを作りましょう。
image.png

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)

ナレッジの作成

画面上部のナレッジをクリックし、ナレッジを作成をクリックします。
image.png

テキストファイルからインポートを選択し、アップロードで先ほどのブログをPDFにしたファイルをアップロードし、次へをクリックします。
image.png

チャンク設定で、自動とカスタムがありますが、ここではカスタムを選択します。最大チャンク長128にして、チャンクのオーバーラップ20にします。
image.png

インデックスモード高品質として、埋め込みモデルcohere.embed-multilingual-v3.0が選択されているので、そのままとします。
image.png

検索設定ハイブリッド検索を選択し、保存して処理をクリックします。
image.png

問題がなければ埋め込み処理が完了しましたとなります。
image.png

RAGチャットの作成

続いて、上記ナレッジを利用したチャットを作成していきます。

先ほどと同様に画面上部のスタジオから最初から作成をクリックします。
image.png

ここも先ほどと同じように、チャットボット基本を選択し、名前にRAGチャットボットと記入して作成するをクリックします。
image.png

以下の画面になります。
image.png

まず手順のところに以下を記入します。

- ユーザーの入力に回答するために、コンテキストの内容を検索した結果に忠実に回答を生成してください。
- あなたの事前知識で回答はしないでください。

image.png

続けてコンテキスト+追加をクリックします。
image.png

参照する知識が選択できるので、先ほど作成したナレッジを選択し、追加をクリックします。
image.png

手順とコンテキストが設定できたので、これでRAGチャットの設定は完了です。
デバッグとプレビューでただのチャットボットでは回答できなかった以下の質問をします。

OCIのGPUクラスタのインターコネクトは何を採用していますか?

image.png

RoCEv2と正しい回答を得られました。
image.png

あとは先ほどと同様に公開して利用することができます。

最後に

以上のようにDifyからOCI GenAI(Cohere)やOracle DB23aiを利用することができました。

ただ、実用に向けてはいくつか課題があることがわかっています。

  • ナレッジの作成でチャンク設定を自動カスタムでも最大チャンク長が大きいとナレッジの作成ができない(裏ではエラーが発生している)
  • Oracle DB23aiをContainerではなく、OCIのPaaSを使った構成方法の確認ができていない
  • OCI GenAIの最新モデルへの追従ができていない
  • OCI GenAIが大阪リージョンでリリースされたが、大阪リージョンでモデル追加するとエラーになる
    などなど

今後、上記の調査を含めより良くOCIでDifyを利用する方法を確認していきたいと思います。

12
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?