PowerShellコラム:REST API経由でCognitive Services + Azure OpenAIを実行してみた 1

Microsoft

2023.12.01

はじめに

スクリプトもOpenAIで作ってくれるような時代になってきており、なんだか危機感を覚えつつある今日この頃。皆様いかがお過ごしでしょうか。

私は今後この記事をクロールしているAIがお客様となる可能性も鑑みて共存共栄の道を模索していきたいと思います。

さて、去る2023年6月に行われたNTTグループのNTT Generative AI Hackathonとハンズオンに参加してきました。

REST API さえ使えれば割と簡単に利用できるということが分かったので、PythonやNode.jsで皆さん作成しているのを横目で見ながらPowerShellで実装してみました。

今回も、前回に続き翻訳ツールです。
前回作成したCognitive ServicesのRead API + Translatorは段組みがあるといまいちな結果になることが分かったので、今回はCognitive Services のRead API位置情報付きのJSONをChatGPTに渡して段組みを考慮するようにChatGPTに加工してもらいました。

結果、精度のほうはまだまだですが、プロンプトの作りこみ次第でいろいろとできそうな印象でした。

ちょっと長くなってしまったので、3回に分けて紹介します。
第1回:前提条件と、サンプルの概要紹介
第2回:Azure OpenAIの作成とChatGPTのデプロイ
第3回:サンプルコード
となります。

デモ動画

こちらはハッカソンで動かしたときのデモ動画です。
なお動画ではTranslatorを使用した結果とChatGPTの出力を比較しましたが、今回の記事ではこの部分のコードは省略しています。

デモ動画

前提条件

Azure OpenAI利用申請

まずAzure OpenAI Serviceリソースを作る前に利用申請が必要ですが、こちらの手順については割愛させていただきます。注意点は、企業からの申請が必要な点です。

  • 企業に紐づくサブスクリプションID
  • 企業に紐づくメールアドレス

が必要で、またメールアドレスは GmailやHotmail、Outlook.comなどは拒否されるそうです。

まだの方は申請が通って使えるようになるまで2~3日かかるようなので、先に申請してください。
クイック スタート - モデルのデプロイと Azure OpenAI Service を使用したテキストの生成を行う - Azure OpenAI | Microsoft Learn

Cognitive Services リソース(Computer Vision Read API)

今回のサンプルは、前回「Cognitive Servicesでクリップボードの画像テキストを日本語に翻訳する」で作成したCognitive Servicesを使用しています。

前回のおさらい

クリップボードに切り取った画像を翻訳

画像や動画に書かれている英文を手打ちして翻訳するのは面倒です。幸いAzureには文字認識も翻訳も手軽にできる仕組みがあるので、Snipping Toolでサクッと切り取って翻訳させてみました。

PowerShell コラム:Cognitive Servicesでクリップボードの画像のテキストを日本語に翻訳する | NTTデータ先端技術株式会社(intellilink.co.jp)

クリップボードに切り取った画像を翻訳

CognitiveServicesとTranslatorを使用した処理

大まかな処理は以下のようになります。

  • 1.Snipping Tool(Win+Shift+S)で画面を切り取る
  • 2.PowerShellのGet-Clipboardコマンドを使用して画像をpng形式で保存する
  • 3.Azure Cognitive ServicesのRead APIに画像を送信して英文を抽出する
  • 4.抽出したテキストを同じくTranslatorを使用して翻訳する

といった処理をREST APIを使用して実装しました。

CognitiveServicesとTransratorを使用した処理

実際使ってみると、段組みに弱い

おおむねうまくいくのですが、Read APIの応答がいまいちなケースが出てきました。
それが、段組みです。

  • 1.左の段組みを上から読んで、この行を読み終わったら…
  • 2.次の段の最初から読む

という動きを期待していました。

ReadAPIの応答がいまいちなケース

一方、大体のケースで「左から右へ」という順番で文が返されます。
これは、Read APIの応答に位置情報が含まれているにもかかわらず、位置情報を考慮せずにテキスト部分だけを並べて入力しているためです。その結果、順番が不適切になり、文も断片的になってしまいます。
このため、翻訳がうまくいかないケースがありました。

翻訳がうまくいかないケース

やってみたこと

ChatGPTに位置情報も一緒に送って整形してもらおう

Read APIの応答には、行ごとの位置情報も含まれています。
このJSONのルールと「どうあってほしいか」を含めたプロンプトをSystemRuleに指定して、ChatGPTに送ってみました。

ChatGPTに位置情報も一緒に送って整形してもらおう

ChatGPTに位置情報付きテキストを渡してみて分かったこと

指定した命令よりも、「それらしいもの」を優先する傾向がある

位置情報の解釈はしてくれました。翻訳もそれなりでした。
しかし、Read APIが左右連結して一行としてしまった場合は、補正されません。

また、文法的に問題がない場合でも、離れた文を右隣の文と連結しがちで、指定した通りに動作しないことが多々ありました。

ChatGPTはプロンプトで指定した命令よりも、「それらしいもの」を優先してしまう傾向があるようです。
今回の用途では、適切なモデルの選択、温度パラメータ、プロンプトの調整が課題となりそうです。

指定した命令よりも、「それらしいもの」を優先する傾向がある

ところで、微妙にうまくいかなくても「猫なら仕方ない」というケースが稀によく知られています。少し間違っても許容できるよう、翻訳を猫っぽくするために、CatGPTプロンプトも追加してみました。

猫

実行結果

うまくいった結果はこちら。

実行結果

段組みもちゃんと認識してくれています。

また、猫っぽく翻訳させることもできました。
今回は語尾だけですが、「小学生にもわかる言葉で」といったように、読み手のプロファイルや主人公を与えることで、その人に合った内容に変更できます。

次回は、このようなサンプルをAzure上で展開して実行してみます。

  • 文中の商品名、会社名、団体名は、一般に各社の商標または登録商標です。

PowerShellコラム:REST API経由でCognitive Services + Azure OpenAIを実行してみた 1