前回、Power AppsでスマートフォンアプリにOCRの機能を追加しました。OCRとしては100%の認識率はなかなか難しいところですが、文章としての概要を把握する場合にはある程度の認識率でも十分許容できる範囲です。今回は、OCRとしては難易度の高い縦書き日本語の新聞記事を読み取ってChatGPTを使っての要約にチャレンジしてみます。
Power Automateフローの作成
まずは、Power Appsから呼び出すPower Automateのフローを作成します。以前の記事(ChatGPTを利用してTeamsでチャットボットを開発してみる)ではAzure AutomationからChatGPTのAPIを呼び出していましたが、今回はPower Automateのフローからの呼び出し方法を実装します。フローの全体は以下となります。
アクションを一つずつ確認していきましょう。Power Appsから呼び出されたタイミングで、OCRで取得されたテキストを取得します。
Open AIのAPIキーを取得したものを変数に格納しています。(参考:APIキーの取得 https://developers.gmo.jp/31137/)
APIに渡すプロンプトを作成します。
#命令書\n\n
以下の文章は前後の順番が逆になっていたり、余分な文章が含まれています。意味が分かるように概要を日本語で教えてください。\n\n
#文章\n\n
@{triggerBody()['text']}
HTTPアクションでAPIにPOSTします。
URIhttps://api.openai.com/v1/chat/completionsヘッダーContent-Typeapplication/jsonAuthorizationBearer @{variables('API_Key')}本文{ "model": "gpt-3.5-turbo-0301", "messages": [ { "role": "user", "content": "@{variables('プロンプト')}" } ] }
ChatGPTからの回答を格納する変数を定義します。
受け取った回答本文はJSON形式となるので解析を実施します。受け取ったJSONのサンプルから生成したスキーマはこちらです。
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"object": {
"type": "string"
},
"created": {
"type": "integer"
},
"model": {
"type": "string"
},
"usage": {
"type": "object",
"properties": {
"prompt_tokens": {
"type": "integer"
},
"completion_tokens": {
"type": "integer"
},
"total_tokens": {
"type": "integer"
}
}
},
"choices": {
"type": "array",
"items": {
"type": "object",
"properties": {
"message": {
"type": "object",
"properties": {
"role": {
"type": "string"
},
"content": {
"type": "string"
}
}
},
"finish_reason": {
"type": "string"
},
"index": {
"type": "integer"
}
},
"required": [
"message",
"finish_reason",
"index"
]
}
}
}
}
回答は分割されているので、変数に格納してまとめます。
まとめた回答をPower Appsに戻ります。
Power Appsのアプリ作成
これまでの記事を参考にAI Builder テキスト認識エンジンを実装したアプリを作成します。ラベル「Label1」を配置して、「Text」プロパティーに変数「_Text」を設定します。最初にOCRで取得した文字列を表示します。解析ボタンを選択した後、Power Automateからの実行結果=要約内容を受け取りこちらに表示します。
左メニューの「フローの追加」から作成した「PowerApps_OCR4」を選択して追加します。要約ボタンを追加して、「OnSelect」に以下を設定します。
Set(_Answer,PowerApps_OCR4.Run(_Text));
Set(_Text,_Answer.回答);
ボタンを選択すると、“_Answer”変数にはPower Automateのフロー実行結果が格納されます。“_Text”変数に、“_Answer.回答”を設定することで、要約内容を取得して、ラベルに表示されます。
テスト
こちらの新聞記事をスマホで撮影して要約してみました。
OCRで認識された文字としては縦書きということもあり、文脈が入り乱れて意味が分からない状態です。
ChatGPTによってきれいに分かりやすまとめられた文章となっています。OCRから新聞記事の要約チャレンジに成功しました!
以上、Power AppsのOCRとChatGPTを組み合わせて難易度の高い新聞記事の要約にチャレンジしました。今回はうまくいきましたが、記事や撮影範囲によっては、うまくいかない場合もありますが一応実用範囲の結果は得ることができました。OCRのエンジンがどうしても左上から認識を開始するので、横書きの文章であればかなりの確立で的確に内容を要約できるようですが、縦書きの場合はなかなかの難易度になります。各ワードの位置情報も取得できているのですが、並べ替えも難易度が高そうです。そのあたりは要点となる単語を拾ってChatGPTの文章生成能力におまかせといったところですが、さすがです。