生成AIへファイル添付するパターンの違いを体験しよう

ChatGPTなどの生成AIチャットサービスには、ファイルを添付することができます。

同じファイル添付でも、生成AIがファイルを扱う内部の処理には複数のパターンがあります。

- **検索（RAG）**
    - OpenAI Assistants APIでは **「File Search」** と呼ばれる
    - 添付ファイルを検索して、回答を生成
    - テキストやPDFなどの非構造化データの一部分を抽出して、定性的な処理をするのが得意
- **データ分析**
    - OpenAI Assistants APIでは **「Code Interpreter」** 、Claude.aiでは「分析ツール（analysis tool）」と呼ばれる
    - 添付ファイルをプログラムで処理して、回答を生成
    - CSVやExcelなどの構造化データの全体に対して、定量的に処理するのが得意
- **直接入力**
    - 添付ファイルをプロンプトとして直接モデルに入力
    - モデルによっては画像などの入力も扱える
        - （というか、おもにマルチモーダルモデルへの画像の入力で使われる方法だと思います）

AIチャットサービスによっては、これらを暗黙的に自動で使い分ける物もあれば、特定の操作をして切り替える必要があるものもあります。
「直接入力」は単純なので置いておいて、「検索」と「データ分析」については、どっちがどっちなのか、どう使い分ければ良いのか、分かりにくいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/74aaa3b1-ea00-833d-2163-664440a6a62e.png)

OpenAI Assistantsでは、「File search（検索）」と「Code interpreter（データ分析）」の両方にファイル添付できます。どっちを使うと良いんでしょうか。

実際に違いが出るタスクをやって体験してみましょう。

## 実験
以下のような、架空のイタリアンレストランのメニューデータを用意しました。これについて、生成AIチャットに簡単な質問をします。

| メニュー名 | 価格 |
|:--|:--|
| 渡り蟹のトマトクリームパスタ | 1,480円 |
| 4種きのこのポルチーニクリームパスタ | 1,380円 |
| ベーコンと彩り野菜のペペロンチーノ | 1,280円 |
| 牛肉とゴルゴンゾーラのピザ | 1,680円 |
| シーフードミックスピザ | 1,580円 |
| 彩り野菜とモッツァレラチーズのピザ | 1,480円 |
| 海老とブロッコリーのドリア | 1,380円 |
| 4種チーズのドリア | 1,280円 |
| スパイシーミートドリア | 1,480円 |
| 冬野菜のミネストローネ | 580円 |
| 鶏肉のハーブグリル | 780円 |
| フォンダンショコラ | 580円 |
| 焼きりんご | 480円 |

（この架空のメニューはGemini Advancedで生成しました）

このファイルをOpenAI Assistantsに添付して、簡単な以下ふたつの質問をしてみます。

- 質問1「パスタの値段は？」
    - 正解は「渡り蟹のトマトクリームパスタ1,480円」「4種きのこのボルチーニクリームパスタ1,380円」「ベーコンと彩り野菜のペペロンチーノ1,280円」です
- 質問2「いちばん高いメニューは？」
    - 正解は「牛肉とゴルゴンゾーラのピザ1,680円」です

どの手法でどれがうまく答えられるか、調べてみましょう。

### 実験条件
- モデルはgpt-4o-2024-08-06
- Temperature、Top-pなどは既定値
- システムインストラクション無し
- File SearchまたはCode Interpreterのいずれか片方を有効にして実験


### 実験1: スプレッドシートの処理
メニューをスプレッドシートにまとめます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/b0fa1bee-6b77-c8ab-e5bf-918b9f057315.png)

#### 検索（File search）
File searchのところにファイル添付します。
テキストだとアップロード時にうまく行かなかったのでPDFファイルにして添付しました。

また、今回は対象とするファイルが小さい都合上、Chunk sizeとMax num resultsを小さい値にして、小さいファイルでもちゃんとFile searchの特徴が出るようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/ed107566-cb0e-20ce-37ad-66cdce2fc645.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/20dc30c9-8366-430a-3a6e-e3914362a93a.png)

##### 「パスタの値段は？」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/1fb12be6-230b-4bf0-d793-ae6544882052.png)

成功しました。

##### 「いちばん高いメニューは？」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/0f808697-5f60-d269-b6dd-6e599f90c2d3.png)

間違えてしまいました。

#### データ分析（Code Interpreter）
Code interpreterの所にファイル添付します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/ce9a9dc3-b907-c63e-15c9-8e3afbab8fd8.png)

##### 「パスタの値段は？」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/c52166c2-1f82-aa61-4d5b-f2c89aa0644e.png)

なんか色々とプログラムが出力されて何かをしてくれましたが、ペペロンチーノが含まれていないため、不正解です。
実装されたプログラムを見てみると「パスタ」の文字列一致で調べているため、これでは「ペペロンチーノ」を検出できないことが分かります。

##### 「いちばん高いメニューは？」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/41ef2a53-2f02-db26-8efa-d8f6dbad9bdb.png)
（中略）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/9a821f4e-b712-42b4-4c98-9855ff3f60ba.png)

正解しました。

### 実験2: ドキュメントの処理
入力データをスプレッドシートではなく、文章にしてみました。こちらもGemini Advancedを用いてメニューデータを変換しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/247b38db-6260-2d6f-5999-d30befba98bd.png)

こちらをPDFにして添付してみます。

#### 検索（File Search）
##### 「パスタの値段は？」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/dbd29d3a-c385-7d93-4126-d5dafdfd2b57.png)

正解しました。

##### 「いちばん高いメニューは？」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/740313f6-da69-f957-def7-6709bec48b83.png)

失敗しました。

#### データ分析（Code Interpreter）
こちらのデータはCode Interpreterでは処理できませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/31de137d-88bb-aafd-2480-c5f36791464c.png)


### 実験結果まとめ

|  |  | File Search | Code Interpreter |
|:--|:--|:--|:--|
| スプレッドシート | 「パスタの値段は？」 | 成功 | x |
| スプレッドシート | 「いちばん高いメニューは？」 | x | 成功 |
| ドキュメント | 「パスタの値段は？」 | 成功 | x |
| ドキュメント | 「いちばん高いメニューは？」 | x | x |

きれいに分かれました。

- 検索機能を使うと、「パスタの値段は？」のように定性的な質問に回答でき、ドキュメントのような非構造化データも扱える
- データ分析機能を使うと、構造化されたデータに対して「いちばん高いメニューは？」のような定量的な質問に回答できる

これらの違いを理解して使い分けられると、より生成AIへのファイル添付を使いこなせるようになると思います。