Power Automate と生成 AI で議事録作成の自動化にチャレンジしてみた所感


# はじめに

恐らく、議事録作成の効率化、自動化について、長年の課題であったと思います。特に、打ち合わせの数が多い、長い、議事録を時間をかけて丁寧に書いており、レビューにも時間を取っているような会社にとっては、もしかすると何度も夢に見てきた、また、少なからずチャレンジしてきたことかもしれません。

そして、生成 AI の進化により、より現実的になってきたという認識で、ソリューションとして提供しているケースはもちろん、生成 AI を利用した PoC などの事例、記事も見かけるようになってきたという認識です。

そのため、既にいくつか記事はあるという認識ですが、改めて、Power Automate と生成 AI (AI Builder の AI プロンプトまたは Azure OpenAI)で議事録作成にチャレンジしてみた所感を整理したいと思います。

# 結論

チャレンジする前から変わりませんが、Microsoft Teams ベースで会議をする場合は、こちらの Teams Premium を利用した方が良いと思っています。追加の費用は掛かかりますが、マイクロソフトがネイティブで提供するサービスですから、そちらを利用する方がいろんな観点で楽で効率的だと思います。

https://www.microsoft.com/ja-jp/microsoft-teams/premium

しかし、こちらが利用できないこともあり、例えば、役員や上司から生成 AI で議事録の作成を自動化できないか？という相談を受けるようなケースもあると思います。

そのような際、PoC でいいので、作成したものを見せることで、生成 AI を利用したソリューションのイメージが湧きやすくなる、身近な例として捉えられる、可能性を感じられる、同時に課題も認識できる、といったことで、ビジネスを進めやすくなるケースもあるとあると思います。

そのため、チャレンジをしてみる価値はあると考えます。

# 作成したフロー

まず、物凄くシンプルに作ると、以下のようなフローで最低限のことはできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/5b5028c2-07cf-0206-c489-d6ecfbe1f5da.png)

主要なポイントについて説明します。

## 文字起こし、トランスクリプト

まず、Teams で会議をする人はご存じだと思いますが、Teams では文字起こしを有効にすれば以下のようにファイルでダウンロードができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/3f1ee34f-9905-7dc5-da3a-7ee9e3d80106.png)

中身は以下のような感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/6df96070-9e4a-786e-1422-4191a0476069.png)

※架空の一人会議で文字起こしを有効にしました

基本的にこちらのファイルがベースになると思います。余談ですが、Teams の Copilot についても、こちらの文字起こしが前提となります。そのため、Teams 会議に関する議事録的なソリューションを自前で作るにせよ、サービスの機能を使うにせよ、コントロールは出来ませんが、こちらの文字起こしの品質が重要になると考えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/174119ce-1faa-6401-e5d7-dc4a5b8fbfeb.png)

そして、今回は、こちらのファイルが特定の SharePoint ドキュメントライブラリにアップされただ動作するようにしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/68c55ca5-a23e-dbbb-e28c-7c7e30494dd3.png)

## データの加工

こちらのトランスクリプト、上記画像の通り、時間に関する情報やタグなどの情報が入っており、文字数が増加しております。

ご存じの方が多いという認識ですが、GPT にリクエストをするにあたって、モデルによって最大要求トークンがあり、課金にも関わるため、出来る限り文字列を減らしておきたいところです。

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/7d7a9e33-1742-9ae8-a7fe-27912d0cec76.png)

そのため、リクエスト前に以下の処理を追加しております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/87f52b45-fbb6-44ea-72a6-07d0309ba324.png)

こちらは、Office スクリプトで以下のような処理をしております。市民開発者の方からすると難しく感じるかもしれませんが、ほとんど ChatGPT にお願いしております。

```
function main(workbook: ExcelScript.Workbook, inputText: string): string {
    // 改行ごとにテキストを分割して配列に格納する
    const lines = inputText.split("\n");

    // 加工後のテキストを格納する配列を初期化する
    let outputLines: string[] = [];

    // 各行をループ処理する
    lines.forEach((line) => {
        // 発言内容のみを抽出する
        const match = line.match(/<v\s+(.+?)>(.*?)<\/v>/);
        if (match) {
            // 発言者の名前と発言内容をフォーマットして配列に追加する
            outputLines.push(`${match[1]}: ${match[2]}`);
        }
    });

    // 加工後のテキストを改行で結合して返す
    return outputLines.join("\n");
}
```

こちらにより、文字数を半分くらいに減らすことが出来ました。

## GPT への依頼

今回は、AI Builder の AI プロンプトで以下のようなプロンプトを作成し、そちらを利用しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/81132082-e6dc-afaa-aabb-59de1b7f164f.png)

架空の会議で発言者が私一人であるため、情報が不足していますが、それっぽく情報が埋まりました。

```
議事録:

1. 会議タイトル: 株式会社タクマスパーのサービス紹介会議
2. 日時と場所: 不明
3. 出席者: 益森貴士
4. 会議の目的: 株式会社タクマスパーのサービスを紹介する
5. 議題と議論:
   - 議題1: サービスの紹介
     - 益森貴士: 弊社のサービスを紹介
     - 決定事項: 不明
     - 行動計画: 不明
   - 議題2: トレーニングとワークショップの提供
     - 益森貴士: 初級者向けのトレーニングとワークショップの提供について説明
     - 決定事項: 不明
     - 行動計画: 不明
   - 議題3: その他の支援
     - 益森貴士: 他の支援サービスについて説明
     - 決定事項: 不明
     - 行動計画: 不明
6. 決定事項: 不明
7. 行動計画: 不明
8. 次回会議の予定:
   - 日時: 2月中
   - 場所: 不明
   - 議題: 不明

以上が議事録の要約です。詳細な議論や決定事項、行動計画については、情報が提供されていないため記載できません。次回の会議の予定も2月中とされていますが、具体的な日時や場所、議題については不明です。

```

ということで、このレベルの PoC であればサクッと作成することが出来ます。そちらを踏まえつつ、実用化に向けた課題を整理したいと思います。

# 実用化に向けた課題

少なからず試行錯誤したみたことで感じた課題を述べます。

## ファイルをダウンロードしてファイルをアップロードする必要がある

別の会議システム自体を作成するのであれば別ですが、あくまで、Teams 会議のトランスクリプトをベースに Power Platform で作成する場合は、ファイルを一度ダウンロードしてアップロードするのが現実的かなと感じています。

特定のチャネル会議であれば、SharePoint にファイルが保存されるという認識のため、自動化できなくはないかもですが、開催される会議が全てチャネル会議とは限られないですし、その場合は録音、トランスクリプトを有効にした人の OneDrive に保存されるという認識のため、その点を加味すると、完全自動化は難しいと思っています。

https://support.microsoft.com/ja-jp/office/microsoft-teams-%E3%81%A7%E4%BC%9A%E8%AD%B0%E3%81%AE%E8%A8%98%E9%8C%B2%E3%82%92%E5%86%8D%E7%94%9F-%E5%85%B1%E6%9C%89-%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B-7d7e5dc5-9ae4-4b94-8589-27496037e8fa

そういった意味ですと、トランスクリプトファイルをアップロードする入り口となるアプリを Power Apps で作成し、議事録の作成を効率化したい人が利用するような感じが現実的な気がします。

## 文字数が多い場合、分割する必要がある

会議長いと文字数がかかなり増えるため、本番で使う場合は、その点を加味して文字列を分割してリクエストする必要があると考えます。

ただ、最近、モデルによっては最大要求トークンがかなり増えているため、その点も踏まえた実装になると思います。

こちらの分割のアプローチは以前紹介した以下のような感じで実装できます。

https://qiita.com/Takashi_Masumori/items/d05e8ae5a4056e2f81de

少しフローの処理が増えますが、そんなに難しくはないです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/1d98f057-2ee3-c84a-7f07-dc6d1431f5f4.png)

ただ、こちらももモデルによりますが、分割すると少なからず精度落ちると思います。
その点が許容範囲かどうか見極める必要があります。

そして、残念ながら、AI Builder の AI プロンプトの場合、以下のように、分割した内容を要約しようとしたら失敗してしまいました。ChtGPT の GPT4 はもちろん、GPT3.5 でも一応要約してくれているので、AI プロンプトの改善に期待、または、直接 Azure OpenAI の API にリクエストするかですかね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/01bc2cd7-4f96-de6c-b89b-248924112332.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/0846a865-beac-1da1-836a-158a670400fd.png)

## 費用

上述の通り、会議の時間が長い場合、また、利用頻度が高い場合、それなりのトークン数となり、費用も増えると思います。利用する人はあまりその辺考えずに、例えば、数時間に及ぶ会議のトランスクリプトをベースにリクエストをするでしょうし、費用が想定以上となっていないか監視をしたり何らかの上限 (例えば、あまりに長いトランスクリプトの場合は実行しない）が必要かもしれません。

# まとめ

今回は、Power Automate と生成 AI で議事録作成の自動化にチャレンジしてみた所感を整理しました。

もちろん、ちょっとしたものであれば、Power Platform で実現できますが、Teams Premium と比較すると、完全自動化、文字の分割、精度、費用など、実用化する場合色々な課題があると思います。

テクノロジーの進化は早いですし、今後、それらの課題も減っていくかもしれませんが、現時点でチャレンジしてみて感じたことを整理してみた次第です。

このようなことにチャレンジしようと思っている方、検討している方の参考になれば幸いです。