【予測AI×生成AI】DataRobotとAzureで自分用の会話エージェントを簡単構築！

# はじめに
こんにちは。社内でデータサイエンティストを務めております@hk13です。
本記事では、DataRobot社が提供するコンテンツであるAIアクセラレータの中の「[医学研究を使用してヘルスケア会話エージェントを構築する](https://docs.datarobot.com/ja/docs/api/accelerators/gen-ai-accel/med-research.html)」を参考にして、予測AIの予測結果をもとに大量の情報の中から欲しい情報だけを抽出し、抽出した情報のみを外部の情報ソースとして用いたRAG（検索拡張生成）を構築して、生成AIを自分用にカスタマイズした会話エージェントとして活用する方法を解説します。
予測AIと生成AIを組み合わせたユースケースの一例として、ご参考になれば幸いです。

## 関連記事
[DataRobotと生成AIで顧客へのメッセージを自動作成してみた](https://qiita.com/hk13/items/a561b3a1e2ccbcbc4fd9)

# DataRobotとは
DataRobot社は、AIに対するユニークなコラボレーション型のアプローチによってユーザーをAIサクセスに導くバリュー・ドリブン AIのリーダーです。

https://www.datarobot.com/jp/

DataRobot社の製品であるDataRobotは、10年以上にわたってユーザーの自動機械学習（AutoML）活用を支援してきたAIライフサイクル・プラットフォームであり、機械学習モデルの構築、トレーニング、評価、デプロイメントを自動化することができます。複雑なデータ分析を迅速かつ簡単に実行し、優れた予測モデルの作成と管理をサポートすることが可能です。近年では生成AI機能も強化し、予測AIとのコラボレーションによってさらなるAIサクセスの実現を加速させています。

# AIアクセラレーターとは
AIアクセラレーターは、DataRobot社によって提供されているコンテンツの一つで、機械学習プロジェクトの構築と提供を成功させるためのデータサイエンスの専門知識を、反復可能なコードファーストのワークフローとモジュール化されたビルディングブロックに体系化してパッケージ化したものです。

https://docs.datarobot.com/ja/docs/api/accelerators/index.html

# 医学研究を使用してヘルスケア会話エージェントを構築する

今回は**生成AI**を活用して**RAG** (Retrieval Augmented Generation) を生成します。
RAGは検索拡張生成と訳される技術で、生成AIが回答を生成する前段階に、最新の情報や社内の情報のデータベースを外部情報として付与し、それらを検索できる工程を追加するフレームワークです（下図参照）。

RAGの概念図
![RAG_概念図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636913/b9346017-a238-0bfc-a8bc-794dba029e19.png)

RAGを構築するメリットとして、生成AIが社内規定や最新の技術動向など、学習に用いられていないデータへ対応できるようになること、生成AIのハルシネーション（虚偽の情報を事実らしく回答してしまうこと）がおさえられ、情報ソースが明確で精度の高い出力を返すことが可能になること、が挙げられます。

こうして見ると良いことだらけのRAGですが、RAGを導入する際にももちろん注意すべき点は存在します。
例えば、
- 出力結果は外部情報に依存する ⇒ 外部情報の質が重要
- 機密情報の取り扱いによるトラブルの懸念
- 独自性のあるコンテンツの生成は難しい

といった点です。（[参考](https://business.ntt-east.co.jp/content/cloudsolution/municipality/column-28.html#section-13)）
今回は、1つ目の問題を解決する手段として、**予測AI**を活用することを考えます。

予測AIとは、過去のデータを学習して未来を予測する技術のことを指します。
予測AIの目的変数を外部情報の質の向上につながるような方向性で設定してモデルを学習しておけば、RAGを構築・更新するためにいざ外部情報を集めたいとなった際に「この情報は質が高いのか？」ひいては「この情報ソースをRAGに用いてよいのか？」という問いに対して、予測AIが自動で答えを出すことができるようになります。

本記事では、医学分野の研究論文を題材として、「情報ソースが信頼に足るものであるか否か」を教師あり学習の二値分類を行う予測AIで判断し、信頼できると判断された情報のみを用いてRAGを構築していきます。

:::note info
元のノートブックは[こちら](https://github.com/datarobot-community/ai-accelerators/blob/main/generative_ai/Medical%20Research%20Agent/Medical%20Research%20Conversational%20Agent.ipynb)からダウンロードできます。
:::


## 想定シナリオ
医療専門家は、自分の専門分野以外の領域も含めて、最新の研究に常に精通している必要があります。
インターネット上には最新の研究論文が次々と発表されており、その中から信頼できる研究論文を抽出してキャッチアップを進めるのは困難です。
信頼できる論文を抽出し、質問応答エージェントを作って迅速に情報を取得できるしくみを構築することができれば、医療専門家の業務を大幅に効率化できると考えました。

## 想定する運用フロー
1. 新規に出版された医療系の研究論文が信頼できるものか、抄録の内容をもとに予測モデルで判定
1. 信頼性の高い研究論文のみを用いてナレッジベースを作成し、RAGを構築
1. 医療に関する質問をすると、最新の知見まで踏まえた内容を情報ソース付きで回答してくれるエージェントを作成

これらの工程を予測AIと生成AIを連携させて自動化し、キャッチアップに要するコストの削減を目指していきます。

## 使用するデータ
論文の抄録と信頼性（low or high）の情報が特徴量として入った、以下のようなデータを用います。
実際のデータセットは、2,500行×3列でした。
このうち1,500行を予測AIモデルの学習データに使い、残りの1,000行をテストデータとして用いていきます
|filename|abstract|trust|
|:-----------|:-----------|:-----------|
|25057153.txt|25057153 BACKGROUND Estimates of energy intake ( EI ) in humans have limited validity ...|low|
|25003264.txt|25003264 BACKGROUND The addition of glutamine in preoperative drinks may enhance the benefits of carbohydrate alone ...|low|
|24582868.txt|24582868 OBJECTIVE To evaluate the impact of contact lens ( CL ) - induced corneal swelling on the optical quality of the eye by means of the double-pass technique ...|low|
|24975869.txt|24975869 OBJECTIVE Our primary objective was to determine the proportion of patients with atrial fibrillation ( AF ) eligible for enrollment in a randomized controlled trial ...|low|
|25405390.txt|25405390 BACKGROUND Ischemic mitral regurgitation is associated with increased mortality and morbidity ...|high|

このデータの元となったデータセットは[Kaggle](https://www.kaggle.com/datasets/anshulmehtakaggl/200000-abstracts-for-seq-sentence-classification)から取得されたものであり、抄録が文章ごとにBackground, Objective, Method, Conclusion, Resultなどのタグを付けて整理されています。
この処理によって、AIモデルが複雑な抄録の内容をより適切に読みとってくれるようになることが期待されます。

ちなみに、上表ではスペースの都合上省略しましたが、実際の`abstract`列には、以下のように複数の英文が含まれています。

```
25057153 BACKGROUND Estimates of energy intake ( EI ) in humans have limited validity . OBJECTIVE The objective was to test the accuracy and precision of the intake-balance method to estimate EI during weight gain induced by overfeeding . METHODS In 2 studies of controlled overfeeding ( 1 inpatient study and 1 outpatient study ) , baseline energy requirements were determined by a doubly labeled water study and caloric titration to weight maintenance . METHODS Overfeeding was prescribed as 140 % of baseline energy requirements for 56 d. Changes in weight , fat mass ( FM ) , and fat-free mass ( FFM ) were used to estimate change in energy stores ( ES ) . METHODS Overfeeding EI was estimated as the sum of baseline energy requirements , thermic effect of food , and ES . METHODS The estimated overfeeding EI was then compared with the actual EI consumed in the metabolic chamber during the last week of overfeeding . RESULTS In inpatient individuals , calculated EI during overfeeding determined from ES in FM and FFM was ( mean SD ) 3461 848 kcal/d , which was not significantly ( -29 273 kcal/d or 0.8 % ; limits of agreement : -564 , 505 kcal/d ; P = 0.78 ) different from the actual EI provided ( 3490 729 kcal/d ) . RESULTS Estimated EI determined from ES in weight closely estimated actual intake ( -7 193 kcal/d or 0.2 % ; limits of agreement : -386 , 370 kcal/d ; P = 0.9 ) . RESULTS In free-living individuals , estimated EI during overfeeding determined from ES in FM and FFM was 4123 500 kcal/d and underestimated actual EI ( 4286 488 kcal/d ; -162 301 kcal or 3.8 % ; limits of agreement : -751 , 427 kcal/d ; P = 0.003 ) . RESULTS Estimated EI determined from ES in weight also underestimated actual intake ( -159 270 kcal/d or 3.7 % ; limits of agreement : -688 , 370 kcal/d ; P = 0.001 ) . CONCLUSIONS The intake-balance method can be used to estimate EI during a period of weight gain as a result of 40 % overfeeding in individuals who are inpatients or free-living with only a slight underestimate of actual EI by 0.2-3 .8 % .
```

また、今回予測AIモデルの目的変数（ターゲット）とする信頼性の情報（`trsut`列）については、DataRobot社の方ですでに付与されていたものになりますので、実際にどのような基準で信頼性の高い・低いを分けたのかは不明です。
実際になんらかの基準でラベルを付与したデータセットがあれば以降のフローは問題なく行えますので、その旨ご理解いただけますと幸いです。

## モデル構築
### 使用した環境
- ノートブック：DataRobot ワークベンチ
- 予測AI：DataRobot SaaS版
- 生成AI：Azure OpneAI gpt-4o（East USリージョン）

このアクセラレータでは[Langchain](https://python.langchain.com/docs/get_started/introduction.html)をエージェントの開発に、[FAISS](https://engineering.fb.com/2017/03/29/data-infrastructure/faiss-a-library-for-efficient-similarity-search/)と[Sentence](https://www.sbert.net/)をRAGに使用します。

余談ですが、DataRobotのCodespaceの環境を使ってアクセラレータのノートブックを実行すると、これらのライブラリをインストールする箇所でエラーになりました。（アウトプットの容量が大きすぎるようです。）
下記のように`--quiet`オプションを使用することでインストールを完了することができましたので、ご参考になれば幸いです。
```python
!pip install --quiet ライブラリ名
```

### フォルダ構成
```
root
├── Medical_Research_Conversational_Agent.ipynb <- 実行するノートブック
└── storage/deploy  <- （ノートブック実行時に生成）
    ├── faiss-db   <- FAISSに関わるファイルを格納（ノートブック実行時に生成）
    └── sentencetransformers  <- Sentenceに関わるファイルを格納（ノートブック実行時に生成）
```

### 接続設定
アクセラレータに倣ってDataRobotとAzure OpneAIを連携させるにあたり、必要な設定について解説します。
基本的にはAzure OpenAIとの接続に必要な情報を環境変数として設定するだけなのですが、何を設定すればいいのか分かりにくいと感じたため、以下に共有いたします。

#### 環境変数の設定
ノートブックの途中で下記のように、Azure OpenAIとの接続に必要な情報を取得する箇所があります。
```python
import os

OPENAI_API_BASE = os.environ["OPENAI_API_BASE"]
OPENAI_ORGANIZATION = os.environ["OPENAI_ORGANIZATION"]
OPENAI_API_KEY = os.environ["OPENAI_API_KEY"]
OPENAI_API_TYPE = os.environ["OPENAI_API_TYPE"]
OPENAI_API_VERSION = os.environ["OPENAI_API_VERSION"]
OPENAI_DEPLOYMENT_NAME = os.environ["OPENAI_DEPLOYMENT_NAME"]
```
それぞれが何を表すのかということですが、
```yaml
OPENAI_API_BASE: Azure OpenAIのエンドポイント
OPENAI_ORGANIZATION: 不要のため、削除
OPENAI_API_KEY: Azure OpenAIのAPIキー
OPENAI_API_TYPE: "azure"
OPENAI_API_VERSION: "2024-02-01"
OPENAI_DEPLOYMENT_NAME: Azure OpenAIでデプロイした生成AIモデルのデプロイ名
```
このような感じで設定したところ、私の環境では動作しています。
Azureに関連する情報を取得する際は[こちら](https://www.desknets.com/neo/download/doc/chatgpt/chatgpt_azure.html)を参考にしてください。


#### DataRobot外からアクセスする場合
今回はDataRobotの機能であるワークベンチでノートブックを動かしていますが、ローカル、あるいは他のクラウド環境などからDataRobotのAPIを利用しようとする場合にはDataRobotの権限情報が必要になります。
権限情報の取得に関して、詳しくは[こちら](https://docs.datarobot.com/ja/docs/api/api-quickstart/index.html)をご覧ください。

### 予測AIモデルの作成
[データセット](#使用するデータ)を元に、論文の信頼性を判断する予測モデルをDataRobotで構築します。
今回は[DataRobotX](https://drx.datarobot.com/)というライブラリを使い、数行のコードのみでモデルを構築しました。

```python
import datarobotx as drx
import pandas as pd
from sklearn.model_selection import train_test_split

# DataRobotのプラットフォームの外から実行する場合は接続の確立が必要です
# drx.Client()

df = pd.read_csv(
    "https://s3.amazonaws.com/datarobot_public_datasets/ai_accelerators/medical_agent/medical_papers_trust_scoring.csv"
)
df_train, df_test = train_test_split(df, test_size=0.4, random_state=42)
model = drx.AutoMLModel()
model.fit(df_train, target="trust")
deployment = model.deploy(wait_for_autopilot=True)
```
上記のコードを実行すると、モデリングとデプロイまでが自動で行われます。

実際のリーダーボード画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636913/6743a6d4-22b8-91ab-2f44-026f6afb44a2.png)

上図リーダーボード中のデプロイ推奨モデルでのデプロイが行われています。
もちろん、2回目以降はモデリングとデプロイの過程を経ずに、すでにデプロイしたモデルを使うことも可能です。その場合は、
```python
import datarobotx as drx

DEPLOYMENT_ID = "xxxxxx" # DataRobotのデプロイ画面に表示されている「デプロイ名ID」
deployment = drx.Deployment(DEPLOYMENT_ID)
```
として、前述のモデル構築の部分をコメントアウトすればOKです。

### RAGの構築
RAGの構築自体はノートブックのセルを順番に実行するだけなので、解説は割愛します。

## 実際に使ってみる

### 予測AIモデルの解釈
まずは論文の信頼度を判定するために作成した予測AIモデルについて見ていきます。

DataRobotではモデルの解釈を助ける様々なツールが実装されています。
分類がどれだけ精度よく行えているかを確認するためにROC曲線を見てみると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636913/481b635e-598b-49e9-5d5c-122dbca7100f.png)
かなり精度よく予測できているのが分かります（リーケージを疑うレベルです笑）。

今回の予測モデルにおいて特徴量として用いたのは`Abstract`のみですので、この`Abstract`について深掘りをして、どのような抄録の論文を信頼性が高い（もしくは低い）と判断しているのか、探ってみましょう。

今回デプロイ推奨になっているElastic-Netは線形回帰のモデルであり、下図のようにDataRobot上でそれぞれの変数の係数を見ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636913/e6ac5be6-3a5f-6122-a564-4266aa50ae81.png)
一般的にはたくさんの特徴量をもつデータを使ってモデリングし、各特徴量に対する係数を見るために用いる機能ですが、今回は`Abstract`をDataRobotが自動で自然言語処理し、それぞれの要素に対する係数を算出しています。
このように自然言語処理を自動で行ってくれる[Text AI](https://docs.datarobot.com/ja/docs/modeling/special-workflows/textai-resources.html)を内蔵しているのもDataRobotの強みです。

さて、上図では可視化されているものが少ないので、「エクスポート」からcsvをダウンロードして詳細を確認してみます。

係数の値が大きい要素の上位10個は、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636913/5eb9ceb7-5013-f290-35bd-a3a64bb5f454.png)

下位10個は、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636913/10ad7d72-dc9c-6406-e037-0d26edf9dd5d.png)
のようになりました。

上位10個には**gov**という単語がよく見られます、
これはおそらくアメリカの行政機関向けに用意されているドメインのことで、信頼できる機関からの情報が入っていると予測値が大きくなるということだと推測できます。
一方で、下位10個のほうではパッと見た感じ統一感が見られませんが、上位10個に比べて係数（`Coefficient`列）の絶対値が小さめです。したがって、今回の信頼度予測モデルではいかに係数の大きい上位の要素が含まれているか、というのが大事になりそうです。

以上をまとめると、今回作成した予測AIモデルは、**行政機関からの情報に言及している抄録を持つ論文を信頼度が高いと予測している**のではないかと解釈することができます。

### 情報ソースのフィルタリング
実際に予測AIモデルの結果をもとに、ナレッジベースの構築に用いる情報ソースをフィルタリングしていきます。

下記のコードで、予測AIでテストデータに対し信頼性の予測と予測結果の出力を行っています。
```python
import datarobotx as drx

# デプロイが取得出来ていれば以下２行は不要
# DEPLOYMENT_ID = "xxxxxx" # DataRobotのデプロイ画面に表示されている「デプロイ名ID」
# deployment = drx.Deployment(DEPLOYMENT_ID)

predictions = deployment.predict(df_test)
df_test["predictions"] = predictions.prediction.values
```

続いて下記のコードで予測された信頼性をもとにデータのフィルタリングを行っています。
```python
from tqdm import tqdm

approved_docs = []
for i in tqdm(range(len(docs))): # docs: 適切なchunk_size（チャンクサイズ）とoverlap（重なり）を指定して分割したテキスト
    if (
        docs[i].metadata["source"].split("/")[-1]
        in df_test[df_test.predictions == "high"]["filename"].tolist()
    ):
        approved_docs.append(docs[i])
len(approved_docs)
```
今回、テストデータには1,000レコード、すなわち1,000個の論文の情報が含まれていましたが、**信頼性予測AIの予測結果によるフィルタリングによって146個まで情報ソースを絞り込んでいます。**

### RAGの応答の確認

#### ナレッジベースに答えのある質問
それではRAGの応答をチェックしてみましょう。
まずは、"How to treat obesity? Please provide conclusions from papers where the methodology is robust."（肥満はどのように治療できますか？ 方法論がしっかりした論文をもとに回答してください。）という質問を投げかけてみます。

今回のアクセラレータのノートブックを実行すると、以下のようなフォーマットで回答が返ってきます。
（本来は英語で返ってきますが、分かりやすいよう和訳しています。）

|question|肥満はどのように治療できますか？ 方法論がしっかりした論文をもとに回答してください。|
|:-----------|:-----------|
|answer|提供された文脈に基づき、肥満治療に関する信頼性の高い研究からいくつかの結論を以下に示します。<br>1. 減量手術：制御不能な2型糖尿病を持つ肥満患者において、減量手術（ルー・ワイ胃バイパス術およびスリーブ状胃切除術）と集中的な医療療法を組み合わせた場合、集中的な医療療法のみと比較して、血糖コントロールが著しく改善し、体重減少が大きくなりました。具体的には、胃バイパスグループでは平均体重減少が24.5±9.1%、スリーブ状胃切除グループでは21.1±8.9%、医療療法グループでは4.2±8.3%でした。また、生活の質の指標も手術グループで著しく向上し、手術後に大きな合併症は発生しませんでした（ClinicalTrials.gov番号、NCT00432809）。<br>2. 生活習慣介入：生活習慣介入の効果は、ベースラインのBMIに基づいて異なる場合があります。肥満または過体重で前糖尿病および/または代謝症候群を持つ成人を対象に、通常のケア、コーチ主導のグループ介入、および自己主導の個別介入を比較した研究では、ベースラインBMIが35以上の参加者は、通常のケアおよび自己主導の介入に比べて、コーチ主導のグループ介入でBMI、体重、およびウエスト周囲径の減少が大きかったことが示されました。自己主導の介入は、ベースラインBMIが25から35の参加者においてのみ、通常のケアよりも効果的でした。コーチ主導の介入では、ベースラインBMIカテゴリーに関係なく平均体重減少が5%以上に達しましたが、自己主導の介入ではベースラインBMIが35未満の参加者のみでこの減少が達成されました（ClinicalTrials.gov番号、NCT00842426）。<br>これらの結論は、減量手術および個別に調整された生活習慣介入が肥満治療に効果的であり、治療選択はベースラインBMIや2型糖尿病などの併存疾患の存在に影響される可能性があることを示唆しています|
|references|24679060<br>BACKGROUND 短期のランダム化試験（期間：1〜2年）において、減量手術は2型糖尿病の改善と関連しています。<br>METHODS 制御不能な2型糖尿病を持つ150人の肥満患者をランダムに割り当ててから3年後の結果を評価しました。<br>24369008<br>OBJECTIVE 前糖尿病および/または代謝症候群を持つ過体重または肥満の成人において、ベースラインの肥満の重症度が、プライマリケアベースの2つの異なる技術強化型生活習慣介入の効果を修正するかどうかを調査すること。<br>METHODS 変化の平均差を比較しました。<br>24679060<br>BACKGROUND 短期のランダム化試験（期間：1〜2年）において、減量手術は2型糖尿病の改善と関連しています。<br>METHODS 制御不能な2型糖尿病を持つ150人の肥満患者をランダムに割り当ててから3年後の結果を評価しました。<br>24754911<br>BACKGROUND Canola Oil Multicenter Intervention Trial（COMIT）は、腹部肥満を持つ個人において、異なるオイルおよび/またはオイルブレンドを提供する5つの食事が心血管疾患（CVD）のリスク要因に与える影響を評価するために設計されたランダム化対照クロスオーバー研究でした。|

#### ナレッジベースに答えのない質問
次にハルシネーションを防止できているか確認しましょう。
"Can high sweetener intake worsen pathogenesis of cardiometabolic disorders?（甘味料を多く摂取すると心代謝性疾患の病因となりますか？）"という質問を投げかけてみます。これはRAGを構築する際に用いた論文からは回答することができない質問です。

|question|甘味料を多く摂取すると心代謝性疾患の病因となりますか？|
|:-----------|:-----------|
|answer|提供された文脈は、甘味料を多く摂取することが心代謝性疾患の病因に与える影響について直接的に言及していません。言及されている研究は、異なる種類の食事性脂肪、ナッツの摂取、およびタンパク質補給がさまざまな心代謝リスク要因に与える影響に焦点を当てています。したがって、提供された情報に基づいて、甘味料を多く摂取することが心代謝性疾患に与える影響についての決定的な答えを提供することはできません。|
|references|25319187<br>BACKGROUND 食事性脂肪の種類が高カロリー食に対する心代謝反応を変化させるかどうかは不明です。また、中程度の体重増加による潜在的な心代謝への影響についてはさらなる研究が必要です。<br>結果　7週間の二重盲検並行群ランダム化試験において…。<br>24980134<br>BACKGROUND 　心血管リスク要因の管理は、2型糖尿病における血管合併症の軽減に重要であり、これは血糖コントロールを達成した個人においても同様です。ナッツの摂取は心血管リスクの低減と関連していますが、その証拠には混在があります。<br>24284442<br>BACKGROUND ロイシンは骨格筋タンパク質合成の調節に関与する主要なアミノ酸です。<br>OBJECTIVE 低タンパク質混合栄養飲料に対するロイシンまたは分岐鎖アミノ酸（BCAA）のさまざまな用量の補給効果を評価しました。<br>25833983<br>BACKGROUND 腹部肥満と食後過脂血症の増大は、心血管疾患（CVD）および死亡率の独立したリスク要因であり、両者は食事行動によって影響を受けます。<br>OBJECTIVE ホエイプロテインと中鎖飽和脂肪酸を含む食事補助がこれらに与える影響を調査しました。|

ハルシネーションを起こさずに回答できている様子が見て取れます。

#### ナレッジベースへの論文の追加
ここからはRAGそのものを運用する際についての補足的な内容になります。

上記の質問に関連する論文をナレッジベースに追加してみましょう。
ノートブック中の以下のコードが対応しています。

```python
# ライブラリのインポートや変数の定義部分を補足
from tqdm import tqdm
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores.faiss import FAISS

splitter = RecursiveCharacterTextSplitter(
    chunk_size=2000,
    chunk_overlap=1000,
)
db = FAISS.load_local("storage/deploy/faiss-db", embedding_function)

# 以下、ノートブック中のコード
SOURCE_DOCUMENTS_DIR = "/home/notebooks/storage/files/"
SOURCE_DOCUMENTS_FILTER = "24219891.txt"

loader = DirectoryLoader(f"{SOURCE_DOCUMENTS_DIR}", glob=SOURCE_DOCUMENTS_FILTER)
print(f"Loading {SOURCE_DOCUMENTS_DIR} directory")
data = loader.load()
print(f"Splitting {len(data)} documents")
docs = splitter.split_documents(data)
print(f"Created {len(docs)} documents")
for i in tqdm(range(len(docs))):
    docs[i].metadata["trust_level"] = "high"

texts = [doc.page_content for doc in docs]
metadatas = [doc.metadata for doc in docs]
db.add_texts(texts, metadatas)
db.save_local("storage/deploy/faiss-db")

print(f"\n FAISS VectorDB has {db.index.ntotal} documents")
```
今回は信頼度の情報が既にメタデータとして付加されているのでその情報を用いていますが、今回構築したパイプラインの運用をしていく場合には、新しい論文を追加する際も論文の信頼度を予測AIで予測することが必須になります。

#### 論文を追加したナレッジベースでの応答
再度同じ質問を投げかけてみましょう。

|question|甘味料を多く摂取すると心代謝性疾患の病因となりますか？|
|:-----------|:-----------|
|answer|はい、特に高果糖摂取を含む添加甘味料の多量摂取は、心代謝性疾患の原因になると考えられています。高果糖摂取は体重増加や低度の炎症を引き起こす可能性があり、これが2型糖尿病や心血管疾患の発症に対する独立したリスク要因となります。|
|references|24219891<br>OBJECTIVE 高い添加甘味料の摂取は、心代謝性疾患の原因になると考えられています。特に高果糖摂取は、心代謝の健康に潜在的に有害と見なされています。それは体重増加だけでなく…。 <br>25319187<br>BACKGROUND 食事性脂肪の種類が高カロリー食に対する心代謝反応を変えるかどうかは不明です。また、中程度の体重増加による潜在的な心代謝への影響についてはさらなる研究が必要です。<br>結果　7週間の二重盲検並行群ランダム化試験において…。<br>24980134<br>BACKGROUND 心血管リスク要因の管理は、2型糖尿病における血管合併症の軽減に重要であり、これは血糖コントロールを達成した個人においても同様です。ナッツの摂取は心血管リスクの低減と関連していますが、その証拠には混在があります。<br>24284442<br>BACKGROUND ロイシンは骨格筋タンパク質合成の調節に関与する主要なアミノ酸です。<br>OBJECTIVE 低タンパク質混合栄養飲料に対するロイシンまたは分岐鎖アミノ酸（BCAA）のさまざまな用量の補給効果を評価しました。|

論文追加前から大きく回答が変わりました。追加した論文の内容をふまえて質問に回答していますね。
referenceのほうでも、追加した論文（24219891）に言及できています。

# まとめ
本記事では、抄録の内容から信頼性が高いと判断できる研究論文のみを使ってナレッジベースを作成し、医療専門家からの質問に答える対話型エージェントを構築・更新するためのパイプラインについてご紹介しました。
今回は学習データの準備段階で「論文が信頼できるか否か」というラベル付けをしたデータを用いましたが、ご自身のニーズに沿ったラベル付け（例えば、「機密情報が含まれるか否か」、「○○に関連する情報か否か」など）をして予測AIを作成し、パイプラインを構築することで、適切な情報ソースのみを用いたRAG構築を簡単に実現できます。
生成AIと予測AIとの組み合わせ方の一例として、ご参考になれば幸いです。

## 仲間募集

NTTデータ テクノロジーコンサルティング事業本部 では、以下の職種を募集しています。

<details><summary>1. クラウド技術を活用したデータ分析プラットフォームの開発・構築(ITアーキテクト/クラウドエンジニア)</summary>

クラウド／プラットフォーム技術の知見に基づき、DWH、BI、ETL領域におけるソリューション開発を推進します。
https://enterprise-aiiot.nttdata.com/recruitment/career_sp/cloud_engineer

</details>

<details><summary>2. データサイエンス領域（データサイエンティスト／データアナリスト）</summary>

データ活用／情報処理／AI／BI／統計学などの情報科学を活用し、よりデータサイエンスの観点から、データ分析プロジェクトのリーダーとしてお客様のDX／デジタルサクセスを推進します。
https://enterprise-aiiot.nttdata.com/recruitment/career_sp/datascientist

</details>

<details><summary>3.お客様のAI活用の成功を推進するAIサクセスマネージャー</summary>

DataRobotをはじめとしたAIソリューションやサービスを使って、
お客様のAIプロジェクトを成功させ、ビジネス価値を創出するための活動を実施し、
お客様内でのAI活用を拡大、NTTデータが提供するAIソリューションの利用継続を推進していただく人材を募集しています。
https://nttdata.jposting.net/u/job.phtml?job_code=804

</details>

<details><summary>4.DX／デジタルサクセスを推進するデータサイエンティスト《管理職/管理職候補》</summary>
データ分析プロジェクトのリーダとして、正確な課題の把握、適切な評価指標の設定、分析計画策定や適切な分析手法や技術の評価・選定といったデータ活用の具現化、高度化を行い分析結果の見える化・お客様の納得感醸成を行うことで、ビジネス成果・価値を出すアクションへとつなげることができるデータサイエンティスト人材を募集しています。

https://nttdata.jposting.net/u/job.phtml?job_code=898

</details>


## ソリューション紹介

<details><summary> Trusted Data Foundationについて</summary><div>

～データ資産を分析活用するための環境をオールインワンで提供するソリューション～
https://enterprise-aiiot.nttdata.com/tdf/
最新のクラウド技術を採用して弊社が独自に設計したリファレンスアーキテクチャ（Datalake+DWH+AI/BI）を顧客要件に合わせてカスタマイズして提供します。
可視化、機械学習、DeepLearningなどデータ資産を分析活用するための環境がオールインワンで用意されており、これまでとは別次元の量と質のデータを用いてアジリティ高くDX推進を実現できます。

</div></details>


<details><summary> TDFⓇ-AM（Trusted Data Foundation - Analytics Managed Service）について</summary><div>

～データ活用基盤の段階的な拡張支援（Quick Start) と保守運用のマネジメント（Analytics Managed）をご提供することでお客様のDXを成功に導く、データ活用プラットフォームサービス～
https://enterprise-aiiot.nttdata.com/service/tdf/tdf_am
TDFⓇ-AMは、データ活用をQuickに始めることができ、データ活用の成熟度に応じて段階的に環境を拡張します。プラットフォームの保守運用はNTTデータが一括で実施し、お客様は成果創出に専念することが可能です。また、日々最新のテクノロジーをキャッチアップし、常に活用しやすい環境を提供します。なお、ご要望に応じて上流のコンサルティングフェーズからAI/BIなどのデータ活用支援に至るまで、End to Endで課題解決に向けて伴走することも可能です。

</div></details>


<details><summary>NTTデータとTableauについて </summary><div>

ビジュアル分析プラットフォームのTableauと2014年にパートナー契約を締結し、自社の経営ダッシュボード基盤への採用や独自のコンピテンシーセンターの設置などの取り組みを進めてきました。さらに2019年度にはSalesforceとワンストップでのサービスを提供開始するなど、積極的にビジネスを展開しています。

これまでPartner of the Year, Japanを4年連続で受賞しており、2021年にはアジア太平洋地域で最もビジネスに貢献したパートナーとして表彰されました。
また、2020年度からは、Tableauを活用したデータ活用促進のコンサルティングや導入サービスの他、AI活用やデータマネジメント整備など、お客さまの企業全体のデータ活用民主化を成功させるためのノウハウ・方法論を体系化した「デジタルサクセス」プログラムを提供開始しています。
https://enterprise-aiiot.nttdata.com/service/tableau

</div></details>


<details><summary>NTTデータとAlteryxについて </summary><div>
Alteryxは、業務ユーザーからIT部門まで誰でも使えるセルフサービス分析プラットフォームです。

Alteryx導入の豊富な実績を持つNTTデータは、最高位にあたるAlteryx Premiumパートナーとしてお客さまをご支援します。

導入時のプロフェッショナル支援など独自メニューを整備し、特定の業種によらない多くのお客さまに、Alteryxを活用したサービスの強化・拡充を提供します。

https://enterprise-aiiot.nttdata.com/service/alteryx

</div></details>

<details><summary>NTTデータとDataRobotについて </summary><div>
DataRobotは、包括的なAIライフサイクルプラットフォームです。

NTTデータはDataRobot社と戦略的資本業務提携を行い、経験豊富なデータサイエンティストがAI・データ活用を起点にお客様のビジネスにおける価値創出をご支援します。

https://enterprise-aiiot.nttdata.com/service/datarobot

</div></details>

<details><summary> NTTデータとInformaticaについて</summary><div>

データ連携や処理方式を専門領域として10年以上取り組んできたプロ集団であるNTTデータは、データマネジメント領域でグローバルでの高い評価を得ているInformatica社とパートナーシップを結び、サービス強化を推進しています。
https://enterprise-aiiot.nttdata.com/service/informatica

</div></details>

<details><summary>NTTデータとSnowflakeについて </summary><div>
NTTデータでは、Snowflake Inc.とソリューションパートナー契約を締結し、クラウド・データプラットフォーム「Snowflake」の導入・構築、および活用支援を開始しています。

NTTデータではこれまでも、独自ノウハウに基づき、ビッグデータ・AIなど領域に係る市場競争力のあるさまざまなソリューションパートナーとともにエコシステムを形成し、お客さまのビジネス変革を導いてきました。
Snowflakeは、これら先端テクノロジーとのエコシステムの形成に強みがあり、NTTデータはこれらを組み合わせることでお客さまに最適なインテグレーションをご提供いたします。

https://enterprise-aiiot.nttdata.com/service/snowflake

</div></details>