[LangChain編] Oracle Cloud Infrastructure Data ScienceとOracle Database 23aiで実装するRAG

本記事はOracle Cloud Infrastructure(OCI)上のサービス「Data ScienceとOracle Database 23ai」でのRAGの実装方法を検証して、手順と注意事項を纏めました。

## なぜOracle Cloud Infrastructure(OCI) Data Scienceですか？
Oracle Database 23aiリリース以来、いろんな製品組み合わせでRAGを実装した資料をネットから勉強して、今回Oracle Cloud Infrastructure(OCI) Data Scienceで実装してみました。よってData Scienceのメリットも下記で整理して、ご参考のほどよろしくお願いします。

RAGに対するメリット：
1. VM構造なので、カスタムLLMのトレニングが可能
1. LangChainアプリケーションをData ScienceモデルとしてデプロイすることでREST APIで利用することが可能
1. 製品内蔵のAI環境をワンコマンド実行でディプロすることが可能
1. RAGを行うためのPythonパッケージをインストールすることが可能

その他のメリット：

1. 統合されたデータサイエンス環境：OCI Data Scienceは、機械学習モデルの構築、トレーニング、デプロイメントを行うための統合された環境を提供します。
1. スケーラビリティとパフォーマンス：OCIのインフラストラクチャを、大規模なデータセットに対しても高速な処理が可能で、必要に応じて計算リソースを柔軟に増減できます。
1. 自動化された機械学習：AutoML（自動機械学習）の機能を提供しており、モデルの選定やハイパーパラメータのチューニングなど、複雑な作業を自動化できます。
1. セキュリティとコンプライアンス：OCIはエンタープライズ向けの高度なセキュリティ機能を提供しており、データの保護とコンプライアンスを確保できます。
1. チームコラボレーション：OCI Data Scienceは、データサイエンティストやエンジニアが共同でプロジェクトを進めやすくするためのコラボレーション機能を提供しています。共有ノートブックやバージョン管理機能を通じて、チームメンバー間での効率的な協力が可能です。
1. コスト効率：OCI Data Scienceの課金は、使用したコンピューティングリソース、ストレージ、およびOCI外部へのデータ転送に基づいて行われます。ソフトウェアが無料です。

# 構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/689908f5-0d96-46c5-03b5-de3e27d73baa.png)

# 参考資料
いくつの資料を参考して、検証を行ったため、下記で資料をリストしました。詳細の手順と製品の紹介については下記の資料をご参考にしてください。

[Oracle Database 23ai がリリースされたので作成してみてみた](https://qiita.com/shirok/items/4b5d7bd61ac3914d8be4)
[Oracle Cloud Infrastructure Data Science Service 初期セットアップ](https://qiita.com/ksonoda/items/2e7c8f711a9c6f1a71f6)
[[LangChain編] 新リリース Oracle Database 23ai で実装するエンタープライズRAG](https://qiita.com/ksonoda/items/d434aca84d6e6dacb3f1)

# 前提条件
- Oracle Cloud Infrastructure(OCI) Data Scienceのノートブックセッションを作成します。

https://qiita.com/ksonoda/items/2e7c8f711a9c6f1a71f6

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/cea6d1f2-8b76-2c63-8781-cd2e148f88be.png)

- Oracle Cloud Infrastructure(OCI) Oracle Base Database Service の23aiを作成します。

https://qiita.com/shirok/items/4b5d7bd61ac3914d8be4

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/1d405285-9e10-9705-1dc2-b85b474dbc2b.png)

# Oracle Cloud Infrastructure(OCI) Data Scienceでの実装
下記の流れで実装します。

1. Conda環境をインストール
2. langchain-community、ociとoracledbをインストール
3. RAGの実装

### Conda環境をインストール
Oracle Cloud Infrastructure(OCI) Data Scienceノートブックセッションを開き、AI関連のConda環境をインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/de102dbf-16dd-ce85-a8c9-33514ebfa9f8.png)
OCI Data Scienceで簡単にConda環境をインストールできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/4e5cbc5e-5092-57a4-167b-b9fb5c085611.png)

### langchain-community、ociとoracledbをインストール
ノートブックを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/0b6f70d6-6d4b-c21a-3051-4b2119ba789d.png)

KernelでインストールしたConda環境を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/fc99facd-2b40-3d7d-ae40-196dea426c67.png)

ファイル名を付けて保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/39550554-a9d8-98f7-7db8-2a3c8e0da058.png)

ノートブックのテンプレートに参考可能な内容があるから、ネットワークの確認するコードをコピーし、実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/6a5052ef-14af-7c58-e777-35f96b533516.png)

今回、Oracle Cloud Infrastructure(OCI) Generative AI Serviceのチャットモデルを利用するため、パッケージ`langchain-community`と`oci`をインストールします。また互換性エラーを解決するため、既存のConda環境のパッケージ`datapane`と`oci-cli`をアップグレードします。

https://python.langchain.com/v0.2/docs/integrations/chat/oci_generative_ai/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/5c1d2c4b-86e6-3aa5-a366-cb34af3df85e.png)

最後にデータベース接続用のパッケージ`oracledb`をインストールし、カーネルを再起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/b49db29c-e2d0-2eda-c0ea-0457d2aa6576.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/eb31e969-67a7-0f11-63a6-983d696d58f4.png)

### RAGの実装
続けて下記のドキュメントを参考してRAGを実装してみました。

https://qiita.com/ksonoda/items/d434aca84d6e6dacb3f1

まず、Oracle Database 23aiに接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/5096e89c-4fad-f3be-d75d-1b929f867897.png)

次には、Oracle Cloud Infrastructure(OCI) Generative AI Serviceの埋め込みモデル「embed-multilingual-v3.0」とテキスト生成モデル「command-r-plus」を利用するため、OCIサービスのアスセス認証を設定する必要となります。下記のドキュメントを参照して、認証用のconfigファイルとKeyファイルをData Scienceのサーバーにアップロードします。

https://docs.oracle.com/ja-jp/iaas/Content/Identity/Tasks/managingcredentials.htm#upload_key

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/478bc6ec-1cab-a782-162b-24d0bb5f87e7.png)

アクセス認証設定を完了してから、必要なライブラリをimportし、embedingモデルを定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/18df3c4a-496a-6374-17e8-1b49114459bc.png)

チャンクしたドキュメントの内容をembedingし、23aiベクトルデータベースにロードします。また索引を作成します。PDFファイルからのデータをチャンクする処理が参考資料にあるため、ここで省略します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/ef51dfb4-065c-34aa-3c47-9040c6f792c6.png)

これからLangChainのChainでRAGを実行します。まずは下記のChainのパーツを準備します。
1. プロンプトテンプレート
2. テキスト生成モデル
2. ベクトル検索のベクトルデータベース

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/3126546c-a14a-b82a-eaf6-5d60ec4d264e.png)

Chainのパーツが準備できてから、下記のようにChainを定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/e79c582d-4a68-dd64-c06b-7d14f803c180.png)

最後にRAGの実装結果をテストします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/b7204a5e-9fe9-7807-43bb-cd21f58cba09.png)