マルチモーダルRAG - Cohere Embed 4で画像を埋め込む

# はじめに
以下では埋め込みモデルのDenseとSparseについて記載しました。
今回はDenseの1つであるCohere Embed 4を使って、PDFやパワーポイントの資料を画像として埋め込みます。

https://qiita.com/bellshun1024/items/5427f6592bae37df30f7

## Cohere Embed 4
Cohere Embed 4は2025年4月にリリースされた最新の埋め込みモデルです。
以下のような流れでRAGパイプラインを構築します。

1. すべての画像の埋め込みを作成し、VectorDBに格納する (画像対応)
2. テキスト情報 (ユーザーからのクエリ) の埋め込みを生成 (テキスト対応)
3. 1,2をマルチモーダル対応モデルに渡すことで回答生成できる

https://cohere.com/blog/embed-4

## 特徴
埋め込みモデルによって「**最適な文書ファイルを抽出する能力**」が変わります。
Cohere Embed 4は従来埋め込みモデルと比較して、以下の観点で優れています。

| 観点 | Cohere Embed v4 の特徴 |
|------|------------------|
| **ベクトル空間の特性** | テキスト・画像・PDF・スライドなど異なるメディアを同じベクトル空間に統合。マルチモーダル検索が可能 |
| **意味理解** | 100以上の言語に対応し、クロス言語でも高精度。規制業界向けのドメイン特化型トレーニングにも対応 |
| **ベクトル次元数** | 256／512／1024／1536次元のマトリョーシカ構造により、用途やコストに応じて次元数を柔軟に選択可能 |
| **距離関数の最適化** | INT8量子化やバイナリ出力形式に対応し、検索速度とストレージ効率の最適化が可能 |
| **大規模文書対応** | 最大128kトークン（約200ページ）を一括処理可能。一貫した意味構造を保ったベクトル化が可能 |

### その他の特徴
以下のような主要クラウド環境に対応しているため、エンタープライズレベルでの実運用にも適した設計になっています。
-  Cohere’s platform 
-  Microsoft Azure AI Foundry
-  Amazon SageMaker

## 使ってみる
ローカル環境でマルチモーダルRAGを構築し、PDFやスライド検索を試してみました。
LLMはマルチモーダル対応であるGemini2.5、ベクターストアはQdrantを利用しました。

ソースコードは最後に添付します。

### 入力データ
経済産業省やIPAが公開している以下のPDFやスライドデータを入れてみます。

- [外食産業市場動向調査 令和6年（2024年）年間結果報告](http://www.jfnet.or.jp/files/nenkandata-2024.pdf)
- [2024年上期 関連産業の動向](https://www.meti.go.jp/statistics/toppage/report/minikeizai/pdf/h2amini169j.pdf) 
- [IPA デジタルスキル標準の改訂に向けた調査について](https://www.ipa.go.jp/jinzai/skill-standard/dss/nl10bi000000hzin-att/dm.pdf) 

全部で62枚のスライドを画像として埋め込みました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532866/70abe49d-6682-46a9-9088-b4c3b9b5e23f.png)


### 実行結果
入力クエリに対して、関連度の高い画像をとってこれるか試します。

※1 関連度の高いデータから正しい回答を生成するのはLLMであるGeminiのモデル精度になるため、最終的な回答精度については期待しません。回答部分はただプロンプトに画像データを含めるだけの簡易実装にしています。

※2 スコアについてもQdrantのデフォルトの距離指標(コサイン類似度計算)を用いているため、純粋な埋め込みモデルの性能比較になっていない可能性はあり、精度向上の見込みは十分にあります。
Embed 4のデフォルトに合わせてベクトル次元数は1536次元で合わせます。

#### QA1: 表中のデータを聞いてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532866/4715ab16-d1c5-4d33-a051-1b6266070667.png)

<details><summary>関連のあった画像</summary>

page2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532866/71bfceb5-efc3-4ffd-8e57-dd24333c5f68.png)

page5

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532866/6740db7f-4c15-4c4c-9d13-8a3217432ca4.png)

page1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532866/001cd9eb-2cad-4f88-a461-0fd5f362726f.png)


</details>

正解が含まれるデータは2番目のスコアであるpage5のデータでした。
しかし、回答にGeminiが5枚目のスライドを利用して正しい回答ができました。

#### QA2: ざっくり資料を聞いてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532866/30b11ba8-df84-43dc-829a-307ba9ea4a11.png)

<details><summary>関連のあった画像</summary>
page6

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532866/2573c785-5a9e-41df-9697-8bd520ea4e62.png)

page11

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532866/8f2baec3-7d2b-441a-be60-c62cf6109ae0.png)

page10

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532866/7a21ab4d-0ef1-4aca-bd8c-3b7d762592e4.png)

</details>

一番ほしかったのは3番目のスコアでしたが、大きくはぶれてなさそうです。
回答時にはpage10が1番上になってます。

#### QA3: 画像の抽象的な意味を聞いてみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532866/ec35ba1b-9861-4794-9a55-06eb388733c7.png)

<details><summary>関連のあった画像</summary>
page9

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532866/06038be9-9aa4-4cf6-9847-e1f17f6cb71e.png)


page6

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532866/4db836c8-85db-4ad1-b963-c5b61ff7c198.png)


page1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532866/cffc421c-cd63-49ea-b7c9-f9b23be71bcd.png)


</details>

スライド上に記載のテキスト情報を拾ったのかもしれませんが、欲しいものが取れました。

## ソースコード
是非ローカルで好きな資料を入れて試してみてください。
テキストRAGに比べて、実行が早いことも体感できます。

https://github.com/bellshun/Cohere_Embed4_Sample

以下のノートブックを参考に実装しました。

https://colab.research.google.com/drive/1RdkYOTpx41WNLCA8BJoh3egQRMX8fpJZ?usp=sharing#scrollTo=Aw5t1WC7qp3o