はじめに
こんにちは、Insight Edgeで開発エンジニアをしているニャットです。
入社から1年以上が経ちましたが、まだまだ学ぶことが多く、日々、社内の勉強会やリソースをフル活用して新しい技術の習得に挑戦し続けています。
今回は、勉強会の時間を活用しつつ「社内用の議事録自動作成アプリ」を少しずつ開発し、半年間社内で運用しながら改善を重ねたので、その開発経緯と得られた学びを紹介します。
開発経緯
2024年5月頃、Google社が発表した「Gemini 1.5」モデル(Pro/Flash)は動画文字起こしの精度と速度が大幅に改善されたことから、SNSや様々なプラットフォームで話題となり、当社メンバーの間でもこのモデルの可能性に対する関心が非常に高まりました。
また、当社では多数のプロジェクトや勉強会、R&Dが同時進行しており、情報を社内全体に共有することが文化として根付いていますが、オンライン会議はGoogle Meetを使用しており、現時点ではMicrosoft Teamsのような標準機能としての日本語対応の文字起こし機能(※英語は対応可能)や自動議事録生成機能がないため、情報を共有したい場合は手動で議事録を作成して共有するしかない状況です。たくさんある会議から会議ごとに議事録を作成して展開する作業はメンバーにとって大きな負担となっており、何かいい方法がないかと常にメンバー間で模索していました。
こうした状況の中、ある日に当社のリードエンジニアTさんが開発チームのSlackチャンネル上で「会議後に自動で議事録を作成し、Slackに投稿できるアプリがあれば効率的なのでは?」と呟き、このアイデアに挑戦するメンバーを募り始めました。
私自身、当時は生成AIを活用するプロジェクトに関わる機会が少なかったため、Geminiを用いたアプリを一から構築してみたいと思いはじめ、 かつ、「やってみる」という弊社のValueの1つを実現できることをアピールしたく、Tさんの募集に挙手したのが開発のきっかけになります。笑
作成したアプリの構成および議事録作成手順
作成したアプリの構成と動作について紹介します。
構成
このアプリでは、フロントエンドにNext.js(App Router)、バックエンドにFastAPIをフレームワークとして使用しております。
FastAPIのバックエンドアプリ内では、Vertex AI SDK for Pythonを用いて議事録生成処理を行い、Slack SDKを使って、生成された議事録をSlackに自動投稿できるようにしています。議事録生成はGemini APIを直接利用することも可能ですが、社内の会議データを扱うため、データが学習に使われないVertex AI経由で利用しました。
議事録生成に使用するファイルはGoogle Cloud Storageにアップロードし、VertexAIから参照しています。この理由は、Vertex AIのプロンプトに直接7MB以上のファイルを挿入できず、一旦Cloud StorageにアップロードしてからプロンプトからCloud Storageからインポートする方法しか使えないからです。
なお、フロントエンドのフレームワークとして、Next.jsのApp Routerを選んだ特別な理由はありませんでしたが、ちょうどその時期に私が主催するNext.js(App Router)の勉強会を開催していたため、実践も兼ねてNext.jsを使って開発することにしました。勉強会の参加メンバーに「現在検証中の議事録自動生成アプリでApp Routerを一緒に試してみませんか?」と提案したところ、協力を得られたため、勉強会のメンバーで開発を進めました。
議事録作成手順
会議の録画
社内のあらゆる会議で、会議の主催者に会議開始時から録画してもらうように依頼しました。 会議終了後には録画データおよびチャット履歴ファイルは会議の主催者の個人ドライブに届くため、私がダウンロードできるように主催者にデータを共通ドライブに移動してもらっています。
なお、私がカレンダーの主催者である場合は、共通ドライブに移動しなくてもダウンロード可能ですが、データの一元管理を目的として、すべてのデータを共通ドライブに移動する運用としました。
ファイルのアップロードと議事録の投稿
フロントエンドアプリを使って議事録の作成と投稿を行います。操作は至って単純ですが、主に以下の流れで行います。
① 会議のファイル選択、会議情報入力
- 録画動画、チャット履歴ファイル、会議中にメンバーが共有したメモファイルなどを選択します。これらのファイルは後、Google Cloud Storageにアップロードされ、議事録生成に使用されます。
- 議事録をSlackに送信する場合は、Slackチャンネルも選択します。
- 日付、会議名、Google Drive(共通ドライブ)のURLなど、会議に関する基本情報も入力します。日付や会議名は議事録作成時の補完に使われ、Google DriveへのURLはSlack通知の際に動画の視聴リンクとして付け加えています。
② 生成ボタン押下
画面上では生成ボタンを押すだけで議事録が自動的に生成され、Slackチャンネルに送信されますが、裏側ではFastAPIアプリへのAPIリクエストが行われています。具体的な処理は
- FastAPIアプリにAPIリクエストを送信し、各ファイルをGoogle Cloud StorageにアップロードするためのPresigned URLを生成します。
- PresignedURLを取得できた後、FrontendアプリからPresignedURLを使ってGoogle Cloud Storageへアップロードをアップロードします。
- ファイルアップロード完了後、再度FastAPIにリクエストを送り、議事録をVertex AIで生成し、生成された議事録をSlackに投稿します。
といった流れになっています。
プロンプトに関してはまだ最適案ではないですが、以下のようなものを使用しました。
あなたはプロフェッショナルな会議議事録作成者です。 あなたのタスクは、インプットデータを使用して、会議の議事録を作成することです。 # インプットデータ - 会議の録画動画: 会議中に録画された動画ファイル。 - チャット履歴: 会議中に送信されたチャットメッセージの履歴を含むPDFファイル。各メッセージには発言者名とタイムスタンプが含まれています。 - メモ: 会議中に作成されたメモ - その他資料: 会議中に使用されたその他の資料 会議の録画動画: [録画動画のURI] チャット履歴:[チャット履歴のURI] メモ: [メモのURI] その他資料: [その他資料のURI] # Steps 1. **会議内容の把握:** 会議の録画動画、チャット履歴、メモなどを参照し、会議の内容を把握してください。 - 会話と会議録画に投影された内容から主なトピックを特定し、内容を抽出してください。 - チャット履歴、メモ、その他資料を参照して、会議の内容を理解してください。 - トピックが変わるタイミングを検知し、トピックごとに発話内容を発言者に紐づけてグループ化してください。 - 決定事項やアクションアイテムを特定してください。 2. **情報の整理**: 抽出した情報をわかりやすいセクションに整理します。関連する情報をひとつのセクションにまとめて、読みやすさを優先します。 3. **議事録の作成**: Markdown形式で議事録を作成します。重要なポイントを適切な階層の見出し(#)で整理し、段落や箇条書きなどを活用して情報を明瞭に表現します。 4. **レビューと修正**: 完成した議事録を確認し、誤りや不足があれば修正してください。 # Output Format - 議事録はMarkdown形式で出力してください。 - タイトルやセクションには見出し(#)を使用し、適切な階層を設定する - 箇条書きや番号付きリストを適宜使用し、情報を整理する
③ 議事録を確認:
生成された議事録はSlackに送信されると同時に、画面上でも表示されます。Slackへの送信したイメージは以下です。
半年間使用する中で、自動生成された議事録に調整が必要と感じる部分が多かったため、次の2つの方法で対応しました。
- Slackへの自動送信機能を使用せず、画面上に表示された議事録をコピーし、VSCodeなどのエディターで修正してから正式な議事録を展開する。
- Slackへの自動送信機能で議事録を自動的に送信し、送信後のスレッド上で内容を修正する。
半年間運用して得られた学び
議事録自動生成の精度がどうだったか?
今回、プロンプト設計についての深い調整は行いませんでしたが、ある程度質の高い議事録が生成できたと感じています。
生成AI特有のハルシネーション(生成AIによる誤情報や虚偽の提示)も一部見られましたが、会議に参加していなかったメンバーでも、会議で交わされた内容が把握できるレベルの議事録が生成されました。また、アクションアイテムや次回の予定も概ね正確だったと思います。
さらに今回は、音声データを使用するだけではなく、録画動画やチャット履歴ファイル、その他のメモファイルの情報を全て合わせてインプットし、マルチモーダルAIによる議事録生成を行ったため、会議中に投影された資料やチャット内容も参考情報として使用され、いい感じに議事録に統合されました。そのため、議事録の正確性がかなり向上できたと思います。
使用したモデルおよびコストについて
モデル
検証開始時は議事録生成にマルチモーダル対応の Gemini-1.5-Pro-001
モデルを使いました。
Gemini 1.5 Flash
と Gemini 1.5 Pro
モデルの主な違いはコンテキストウィンドウの大きさ、処理速度、コストにありますが、その中で Gemini 1.5 Pro
が優れているものがコンテキストウィンドウの大きさだけだと思います。Gemini 1.5 Pro
は最大200万トークンのコンテキストウィンドウに対応しているのに対し、Gemini 1.5 Flash
は、100万トークンまでしか対応していないのです。
今回検証で使用した会議はほぼ30分や1時間の会議のため、Gemini 1.5 Flash
を使うとどうしても上限の100万トークンに引っかかってしまい、動画の分割などを行わないとそのまま使えませんでした。一方で、Gemini 1.5 Pro
を使うと、トークン上限にかかることがほぼなく、精度に関してもそこそこ良い結果のものが得られたので、今回はコスト面を多少無視して、Gemini 1.5 Pro
を使いました。ちなみに、1時間の会議で試した場合、約101万トークン(Flashモデルの上限に対して、約1万トークンオーバー)がかかりました。
また、2024年9月にGoogle社が Gemini-1.5-Pro-002
と Gemini-1.5-Flash-002
の新バージョンをリリースした時も、即座に Gemini-1.5-Pro-002
に切り替えて運用してみました。001バージョンとはしっかり比較できていないですが、生成速度および生成された議事録の質が多少改善されたように感じています。
コスト
Gemini-1.5-Pro-002
を使った場合のコストについてですが、例えば1時間の会議の議事録を取得する場合、1時間の動画入力(録画動画)、1枚の画像(チャット履歴等のファイルをPDF化したもの、PDFは画像としてカウントされるため)、1000文字のテキスト入力(プロンプト等)、3000文字のテキスト出力(議事録の結果)が必要になります。
VertexAIの料金 に基づいて、以下のように計算できます。
- 動画入力: 1時間(3600秒)× $0.00263/秒 = $9.468
- 画像入力: 1枚 × $0.00263/枚 = $0.00263
- テキスト入力: 1000文字 × $0.0025/1000文字 = $0.0025
- テキスト出力: 3000文字 × $0.0075/1000文字 = $0.0225
合計で、約$9.50(約1,500円程度)が1回の議事録の生成にかかっていることが分かりました。
これを見ると、1回の議事録の生成に約1,500円もかかることは正直少し高く、コスパが悪いと感じました。今回は学習目的も含めて社内検証のために使用していたため、このコストは許容範囲内でしたが、実運用に移行する際には、コスト面も考慮しなければならないと感じました。
一方で、もしインプットデータのサイズが100万トークン以内に収まることができたら、Gemini 1.5 Flash
を使用し、コストをビックリするほど削減できます。
- 動画入力: 1時間(3600秒)× $0.00004/秒 = $0.144
- 画像入力: 1枚 × $0.00004/枚 = $0.00004
- テキスト入力: 1000文字 × $0.0000375 /1000文字 = $0.0000375
- テキスト出力: 3000文字 × $0.00015/1000文字 = $0.00045
なんと、合計で約$0.145(約22円程度)しかかからないのです。このコストであれば、すごく魅力的だと思いました。
安全フィルターについて
検証初期には、安全フィルター の基準が高く、社内の会議で使用している動画が安全フィルターの「少量をブロック(BLOCK_ONLY_HIGH
)」設定でも PROHIBITED_CONTENT
エラーに引っかかり、何度か議事録生成に失敗しました。当初、公式のドキュメントには「ブロックなし(BLOCK_NONE)」レベルの設定も可能とありましたが、設定しても 400 Bad Request
エラーが発生し、VertextAIのコンソール画面上でもこの選択ができない状態を確認しました。
その後、2024年9月の Gemini-1.5-Pro-002
がリリースされた時点と同時期に、BLOCK_NONE
が設定できるようになったという情報を受け、この設定で運用したところ問題なく生成が成功するようになりました。
プロンプトおよび生成過程について
検証初期から、特別にプロンプト設計を意識するや、「文字起こしをしてから議事録を生成する」や「議事録生成後に事実チェックを行う」といった複数ステップの手順は導入せず、ほぼ一発で議事録を生成する方法を試してきました。この手順でも、社内での情報共有用途としてはある程度機能しましたが、半年にわたり様々な会議で試したところ、やはりハルシネーションが多少目立つように感じています。内容の90%程度は正確であるものの、残り10%に誤情報が含まれていると、議事録の信頼性が損なわれてしまうため、社内利用はできるものの、複数のステークホルダーに展開するプロジェクト議事録として使用するには難しいと感じました。
こうした点からも、プロンプトの調整やステップを踏むプロセスの重要性を実感しています。現在は、生成AI案件を多く手がける社内メンバーや、生成AIに特化した技術研究チームのメンバーにも意見を聞きながら、このプロンプトを改善し、さらに信頼性を高めた生成過程を模索していきたいと思っています。
VertexAI Geminiの凄さについて
今回、コスト面ではまだ改善されるべきなところもありますが、何よりもVertex AI Geminiの凄さを実感できました。
通常、議事録生成には音声データテキスト変換(文字起こし) を行い、そのテキストデータを元に議事録の生成処理をする必要がありますが、Vertex AIではこの変換を個別に行う必要がなく、録画動画やチャット履歴、メモなどをそのままインプットでき、直接議事録を生成できる点から、特に複雑なシステムを構築する必要がなく、簡単な構成とプロンプトで議事録を生成できる点が大きなメリットだと感じました。
録画動画から会議中に投影された資料の内容も参照されて、議事録作成に使用されるで議事録の内容がよりリッチになっていることも、とても感動しました。
議事録を投稿できるまでの手順の制限について
今回のアプリができたことによって、議事録を展開するところまでは少し楽になりましたが、主催者でない人が操作する場合、録画動画を共通ドライブに移動(または権限変更)しなければならない点や、各種ファイルを一度ダウンロードしてから、アプリを使って再度アップロードする手順がかなり手間と感じました。会議終了後、誰でもアプリから該当のカレンダー予定を指定するだけで、あとは自動的に処理されることが理想ですが、Google Meetでは録画がカレンダー主催者のマイドライブに保存される点や、Vertex AIがCloud Storageのみ参照できる点がボトルネックになってしまっています。
Google Workspace APIを使用して、Google Calendar、Google Meet、Google Driveと上手く連携できる仕組みを早く構築しなければと感じました。 また、Cloud Storageの料金もかかりますので、コスト面も配慮しなければならないですね。
まとめと今後の期待
VertexAI Geminiを使って社内用AI議事録生成アプリの開発と個人的に学んだことについて紹介させていただきました。
半年運用してみた結果、実用性のある成果を得られましたが、まだ改善点が多いと感じています。今後は以下の点を意識しながらアプリの向上を目指したいと思います。
- プロンプトおよび生成過程の改善による精度向上
- Google DriveやGoogle Calendarとの連携によるアプリ操作簡略化
- 社内のエンジニアだけでなく全メンバーが使えるようなホスティング環境とアクセス制限の整備
まだまだやることが多いですね。笑
やるべきことは多いですが、正直のところ、そのうちにGoogle Workspaceのコアサービスとしてこの機能がリリースされるのではないか!とその日をずっと期待しています。
標準機能のリリースを期待しつつ、せっかくある程度開発できたので、まずは社内での活用を広げ、改善を重ねていきたいと思います。