Power Automate から Azure OpenAI にリクエストをする際に文字列を分割する

# はじめに

これまで、本ブログの沢山の記事で、Power Platform と Azure OpenAI 連携をする方法について紹介してきました。

https://qiita.com/Takashi_Masumori/items/5356622854d113ac4e70

https://qiita.com/Takashi_Masumori/items/8a07fb6d1869967ce1f9

https://qiita.com/Takashi_Masumori/items/975ed38be5879e2ee5c8

https://qiita.com/Takashi_Masumori/items/173cb84a860b491f885b

https://qiita.com/Takashi_Masumori/items/410e7e92e6f93ec823c2

https://qiita.com/Takashi_Masumori/items/3ac1b28d4de539f9952a

基本的にはそのまま利用できるようなケースもあると思いますが、リクエストする文字数が多すぎる場合、最大要求 (トークン) に達してしまう場合があるため、今回は、Power Automate からリクエストする際に、文字列を分割した上でリクエストするアプローチを紹介します。

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/models

# アプローチ

今回は、長文を要約するリクエストをする際に、事前に決められた文字数で文字列を分割をした上でリクエストをするという例をベースに説明します。

まず、フローの全体像は以下のような感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/f2904b55-df9b-2815-3c19-b18541f3016f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/15f90a54-9bd8-c3f2-e290-c1b99659355e.png)

コアな部分を説明していきます。

まず、以下の部分で、文字列を分割しております。今回は、500 文字ずつ分割しておりますが、こちらは変数にして適宜調整してもよいかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e53f0b45-46b8-7576-42ea-0c5222918934.png)

このケースの場合、1 回目は先頭から 500 文字抽出する感じになります。最後には、残りの文字数が 500 より小さくなるため、その場合は、500 文字ではなく、残りの文字数分抽出する感じになります。実際に使用する場合は、目的に応じてシステムメッセージも変更ください。

```
substring(triggerBody()['text'], variables('counter'), min(500, sub(length(triggerBody()['text']), variables('counter'))))
```

分割したメッセージを ChatGPT に依頼して要約を依頼しており、結果を配列に格納しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/41dad55d-a48c-a48a-f5f8-63e1b6fff8d9.png)

その後、カウンター値を分割したい文字数分増やします。このケースの場合、次は、500 文字目から 500 文字抽出する感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/cc03f3ad-2aa8-3fe2-dd11-1a8e4e0e460d.png)

Do Until で、カウンター値が元の文字列より大きくなったら、つまり、最後の文字まで分割が完了したら終了するようにしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/bf76d42f-b26e-0d29-bd78-4fbb8deda1e5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/4e953ab6-0f0c-9e2f-72f8-2881943d506c.png)

そして、一応、最後に結合した後にもう一度要約を依頼しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/3200029f-63f9-91e3-2552-b9971b4bf85f.png)

動かしてみます。

**元の文章**

```
論文タイトル: 都市交通システムの持続可能性における多面的最適化

著者:

要約:
本研究は、都市交通システムの持続可能性を実現するための多面的最適化アプローチを提案します。交通効率、環境への影響、社会的利益を考慮に入れ、都市交通の改善策を提供します。最適化モデルと実地調査データを組み合わせ、持続可能な都市モビリティの実現に向けた新たなアプローチを提案します。

導入:
現代の都市化において、都市交通は持続可能性の観点から重要な課題です。交通混雑、大気汚染、エネルギーの浪費などの問題が環境への負荷を増加させ、市民の生活に影響を与えています。本研究の目的は、交通システムを多面的に最適化し、持続可能な都市モビリティを実現するための新たなアプローチを提供することです。

方法:
我々は都市交通システムを包括的にモデル化し、多面的最適化モデルを開発しました。以下の要素を考慮に入れました。

交通効率の最適化: 交通流の効率を向上させるために、信号制御、交差点設計、道路改良などの要素を最適化しました。

環境への影響の最小化: 大気汚染、騒音、温室効果ガスの排出など、環境への影響を最小限に抑えるための施策を検討しました。電動車の導入、公共交通機関のエコフレンドリーな運行などが含まれます。

社会的利益の最大化: 交通アクセスの向上、安全性の向上、バリアフリーな交通環境の提供など、市民の社会的利益に焦点を当てました。

結果:
研究の成果により、多面的最適化が都市交通システムの持続可能性向上に寄与することが明らかになりました。交通効率の最適化により、交通混雑が減少し、通勤時間が短縮されました。環境への影響の最小化により、大気汚染と温室効果ガスの排出が削減されました。社会的利益の最大化により、交通アクセスが向上し、市民の生活品質が向上しました。

議論:
多面的最適化は都市交通システムの改善において有望なアプローチであるが、実施には政策立案、投資、技術革新など、多くの要因を考慮する必要がある。将来の研究では、持続可能な都市モビリティの実現に向けた実施戦略を探求することが重要である。

結論:
都市交通システムの持続可能性向上は、都市化が進行する現代社会における重要な課題であり、多面的最適化がその達成に向けた新たなアプローチを提供する可能性が高いことが示されました。政策立案者、都市計画者、研究者、市民の連携が求められ、持続可能な都市モビリティの実現に向けた取り組みが必要です。
```



**結果**

それっぽい感じで動きました。1000 文字ちょっとなので、500 文字で分割し、3 回リクエストしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/accbfee0-5b49-2618-3f0e-2581c1bf8bd6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/490e2437-f029-ca88-edae-6277563a2235.png)


```
この論文は、持続可能な都市モビリティへのアプローチについて提供しており、交通効率、環境への影響、社会的利益を考慮した最適な改善策を提供することを目的としています。特に、最適化モデルと実地調査データを組み合わせ、持続可能な都市モビリティを実現するための新しいアプローチを提案しています。これにより、交通事故の減少や大気汚染の緩和など、都市交通システムに関連する様々な側面の改善が見込まれます。

しかしながら、多面的最適化実現には、広範囲にわたる要因を考慮する必要があります。政策立案や技術革新、市民の協力、市計画者と研究者のリーダーシップなどが必要です。これらの要素を組み合わせ、持続可能な都市モビリティを実現するための実践戦略を探求することが必要です。
```
# まとめ

今回は、Power Automate で文字列を分割して Azure OpenAI にリクエストをするアプローチについて紹介しました。

それ以外にも、先に英語に翻訳して、その上で分割して再度日本語に戻すというアプローチなども考えられますかね。

いずれにせよ、リクエストする文字数が多い場合は、モデルのトークン数を踏まえ、何かしらの対策が必要になると思いますので、一つの対策として、少しでも参考になれば幸いです。