Gemini APIを使ってPower AutomateからPDF読み取りができないか試す

**Gemini APIを使ってPDFファイルの読み取りができないか・・・**

先日[Qiitaにて下記の記事](https://qiita.com/DEmodoriGatsuO/items/fdce9ab445cf06777c4c)を書きましたが、その手軽さに衝撃を受けました。

https://qiita.com/DEmodoriGatsuO/items/fdce9ab445cf06777c4c

簡単すぎて本当にいいのか🧐と思うくらいです。
どうせならもっと使いこなしたいな！ということで、今回は*Power Automate*から**Gemini APIを使ってPDF読み取りができないか**実験してみました。

# 今回の対象

[Cookbook](https://ai.google.dev/gemini-api/cookbook?hl=ja)を中心に見てみると、[Vertex AI](https://cloud.google.com/vertex-ai/generative-ai/docs/learn/overview?hl=ja)の資料がすぐに見つかります。

https://ai.google.dev/gemini-api/cookbook?hl=ja

https://cloud.google.com/vertex-ai/generative-ai/docs/learn/overview?hl=ja

今回はサクっとできる方法が目的ですので、上記ではなく、下記のエンドポイントを使って、*PDF*の読み取りを試しています。

```plaintext:エンドポイント
https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent
```

こちらのエンドポイントは、*API*利用までが本当に簡単である魅力があります。

https://aistudio.google.com/app/apikey

アクセスして、数クリックで無料で試せる・・・衝撃です。

# GitHubで事例を見てみる
[GitHubにあるCookbook](https://github.com/google-gemini/cookbook/blob/main/quickstarts/PDF_Files.ipynb)を見てみると、
1. *PDF*をライブラリで画像に変換
1. *Gemini API*を使用

上記のアプローチをしていると推察されるものが見つかりました。

https://github.com/google-gemini/cookbook/blob/main/quickstarts/PDF_Files.ipynb

*Power Automate*でもひとまず**同様のアプローチを試してみましょう！**

# Power Automateのアクションとコラボレーションする

*PDF*から[ファイルに変換する](https://learn.microsoft.com/ja-jp/connectors/onedriveforbusiness/#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%A4%89%E6%8F%9B-(%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC))アクションは、プレビュー段階ですが*Power Automate*にあります。
*OneDrive for Business*のコネクタのアクションです。

https://learn.microsoft.com/ja-jp/connectors/onedriveforbusiness/#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%A4%89%E6%8F%9B-(%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC)

この[ファイルに変換する](https://learn.microsoft.com/ja-jp/connectors/onedriveforbusiness/#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%A4%89%E6%8F%9B-(%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC))アクションを利用し、*PDF*、そしてせっかくなので*PowerPoint*の形式のファイルを織り交ぜて、*Gemini API*を使ってみることにしましょう。

[サポートされている変換のリスト](https://learn.microsoft.com/en-us/onedrive/developer/rest-api/api/driveitem_get_content_format?view=odsp-graph-online)はこちら！


https://learn.microsoft.com/en-us/onedrive/developer/rest-api/api/driveitem_get_content_format?view=odsp-graph-online

:::note info
特に`JPG`への変換は幅広いファイルの形式がサポートされています
:::

# 試してみる*Power Automateのフロー*
複数のファイルを使って、*Gemini API*を利用することから、簡単な*SharePoint Lists*を用意しました。
*OneDrive for Business*に格納している`ファイル名`です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/428e35b5-0eb7-9018-c842-cdec7fe0d4e4.png)

:::note info
SharePointの`サイト名`や`リスト名`、*Gemini*の`APIキー`はブラインドしています
:::

フローの流れは
1. [複数の項目の取得](https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/guidance/working-with-get-items-and-get-files)で*SharePoint Lists*の値を取得する
1. 繰り返し処理
    1. `OneDrive for Business`内のファイルパスを作成する
    1. [パスによるファイル メタデータの取得](https://learn.microsoft.com/ja-jp/connectors/onedriveforbusiness/#%E3%83%91%E3%82%B9%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%8F%96%E5%BE%97)で`ファイル識別子`を取得
    1. [ファイルに変換する](https://learn.microsoft.com/ja-jp/connectors/onedriveforbusiness/#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%A4%89%E6%8F%9B-(%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC))アクションで画像に変換
    1. *Gemini API*を実行、プロンプトの中で画像を[base64`形式に変換](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#base64)
    1. 結果を*SharePoint Lists*に反映

上記のアプローチです。

今回はあらかじめ、*OneDrive for Business*にいくつかの*PDFファイル*を名前を少し変更して格納してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/c7eccfc1-ce74-0acc-15be-52218dd6801f.png)

更新後に`ReadResult`列と`Status`列が更新されるフローです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/ab9b0b89-9814-7d9f-6267-582547b95816.png)

- [パスによるファイル メタデータの取得](https://learn.microsoft.com/ja-jp/connectors/onedriveforbusiness/#%E3%83%91%E3%82%B9%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%8F%96%E5%BE%97)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/5a89cf80-c10c-474c-048b-986af5309f90.png)
    - `/フォルダ名/ファイル名`
- [ファイルに変換する](https://learn.microsoft.com/ja-jp/connectors/onedriveforbusiness/#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%A4%89%E6%8F%9B-(%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC))アクション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/9322c6d8-7b0a-d1ea-3bca-7176e0e1de18.png)
    - `ID`は`パスによるファイル メタデータの取得`にて取得

# Geminiに渡すプロンプト
`HTTP`アクションは下記のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/3797bc95-4d5b-4077-5628-7bb0a7226435.png)

| 項目 | 設定値 |
|---|---|
| 方法 | POST |
| URI | https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent |

■ ヘッダー
| キー | 値 |
|---|---|
| Content-Type | application/json |

■ クエリ
| キー | 値 |
|---|---|
| key | {APIキー} |

```json:ボディ
{
  "contents": [
    {
      "parts": [
        {
          "text": "添付は画像に変換したPDFファイルです。内容を読み取り、要約してください。"
        },
        {
          "inline_data": {
            "mime_type": "image/jpeg",
            "data": "@{base64(body('ファイルの変換'))}"
          }
        }
      ]
    }
  ]
}
```

https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#base64

気を付けるのは[モデル](https://ai.google.dev/gemini-api/docs/models/gemini?hl=ja&_gl=1*1bf1uzf*_up*MQ..*_ga*MzQ2OTc5NzEwLjE3MTk0MTI5NTM.*_ga_P1DBVKWT6V*MTcxOTQxMjk1My4xLjAuMTcxOTQxMjk1My4wLjAuNjI2MDU1Mjc0)の指定のみです。
`gemini-pro`では対応していません。

https://ai.google.dev/gemini-api/docs/models/gemini?hl=ja&_gl=1*1bf1uzf*_up*MQ..*_ga*MzQ2OTc5NzEwLjE3MTk0MTI5NTM.*_ga_P1DBVKWT6V*MTcxOTQxMjk1My4xLjAuMTcxOTQxMjk1My4wLjAuNjI2MDU1Mjc0

# 結果は！
なんとなく・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/4feb4bd2-20f4-a290-0245-c1caca1244cc.png)

つかめている感はある・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/5109b5f8-77f8-7b95-a3b3-b10eb701d8d4.png)

精度は高くはないですが、ざっくりと何のファイルなのかということはつかめそうです🐟✨

*Gemini*の推論を交えて補完するとマシなのか🧐
課題あり！な印象でした。

ざっくりと内容はつかめるので、*画像の分類*に使えそうです。また今度*SharePoint*に格納した*ファイル*が何に識別されるのかを実験してみたいと思います。
今回はライトな内容ですが、**GeminiでPDFをどうやって読み取るのか**、Power Automateで画像に変換するアプローチで試してみました。
*Claude 3.5*や*GPT-4o*でも同じようなアプローチができそうですね！
工夫次第でまだまだ活用手法がありそうなので考えていきたいと思います。

本日もお読みいただき、ありがとうございました。