はじめに
リンクアンドモチベーションの大塚です。 普段はプラットフォーム機能開発チームでプロジェクトマネージャーとバックエンドエンジニアをしています。
リンクアンドモチベーションではLLM Boot CampというLLMを使った新たな機能を3週間でリリースするイベントを行なっています。
(LLM Boot Campの詳細はこちらをご覧ください!)
今回、そのイベントの中の1つである社内の録画データの活用にフォーカスしたプロジェクトにジョインさせてもらいましたので、その3週間の内容とそこから得た学びをお伝えさせていただければと思います!
プロジェクトの概要
タイトルがほぼ全てなのですが、ZOOMの録画データからこれまで人が議事録を作成していましたが、それらをやめてLLMを使い議事録と要約を作成させる社内向けの機能をリリースするというものです!
プロジェクトメンバーは以下のPJMとインフラ担当のGさん、フロント担当のKさん、バックエンド担当の私の3名が中心に開発を行いました!
開発プロセス
1週目
プロジェクトキックオフ
プロジェクトの目的説明。メンバーの役割分担、スケジュール擦り合わせを行いました。
Kさんと私は普段同じチームで開発していますが、PJMのGさんと一緒に働くのは初めてでしたが、チームビルディングはほぼなくてもスムーズに開始できました!
技術検証
文字起こし、要約をするために有効なライブラリなどを選定するために技術検証を行いました。
検証ではひたすらGoogle Colaboratory
上で実際の録画データを読み込ませ正答率と処理時間を計測しました。
この期間で試したものは以下になります。
概要 | 構築コスト | セキュリティ | 実行速度 | 精度 | 拡張性 | |
---|---|---|---|---|---|---|
whisper | openAI社が提供するpythonライブラリ | × GPU環境を用意する必要あり | ◎ データは内部のみで利用 | 8m | ○ 誤字はあるが読める | ◎ initial prompt, greate recorderによる単語重みづけ、およびモデルのfine tunitgが可能 |
faster-whisper | whisperをwrapした高速ライブラリ | × GPU環境を用意する必要あり | ◎ データは内部のみで利用 | 5m | △ 所々ごっそり文字起こしできていない | ○ モデルのfine tunitgが可能 |
whisper-api | openAI社が提供する文字起こしAPI | ○ サーバーレスで完結可能 | ○ openAI社のAPIにリクエストされるが学習はされない | 2m | ○ 誤字はあるが読める (whisperと同程度) | △ promptのみ指定可能 |
*実行速度はColab Pro(GPU、メモリ24GB環境)上のものです。メモリ上限により本来の速度を出せなかった可能性があります。
*○×などは感覚値です。
今回はMUST要件として以下の項目を軸にwhisper-apiを利用するという意思決定を行いました。
- 構築・実行コスト
- 残り2weekで実装可能
- 実行速度
- 15m以内(lambdaで完結可能)
- セキュリティ
- 外部モデルの学習に利用されない
- 精度
- ある程度、漏れなく文字起こしできて読めるレベル
whisperなどのライブラリ版はGPU ・メモリのリソース利用が大きくwhisper-apiのコストと比較して大きな優位性はありませんでした。
fine turningなどで精度の向上は見込めましたが、今回のプロジェクト期間のMVPレベルではwhisper-apiが妥当だろうと判断をしました。
2週目
プロジェクトの全体像を決める
技術検証した結果からプロジェクトの全体像を全員で話し合い、どのような機能を実装するか、どこまでのスコープをMUSTとし、どこからをWANTとするかを決定しました。 またその決定事項からバックログの一覧を作成して、ざっくりとプロジェクトのマイルストーンを作成しました。 実は3人ともプロジェクトマネージャーを経験していたので、スケジュール組みはかなりスムーズにいきました。
設計
設計においてMUST要件として、以下を置いていました。
①LMI内部ネットワークからのみログイン可能であること
②証跡を残せること ※社内情報を扱うため
③エンジニア以外のユーザが扱えること
①は社内VPNを使うことでクリアできたのですが、問題は②でした。
操作ユーザの履歴を残す為にはどうしてもログイン機能が必要になるのですが、検証後の2weekという限られた期間を可能な限り文字起こしや要約の実装に割く為には、なるべくそれ以外の開発は避けたい想いでした。
ここで、既存の社内リソースを最大限利用する方法を考えた際に出てきたのがGoogle workspace addonという選択肢でした。自社のグループウェアであるGoogleのログイン機能を用いることで、実装コストを殆どかけずに証跡取得の要件を満たすことができました。 これは、3weekという時間の制約があったからこそ出てきた案の一つだと思っています。
また、Google workspace addonを利用は、フロント実装のフレームワーク、ユーザ管理が不要、完全サーバレスでコスト0な環境など、結果として大きなメリットを享受することができました(その分、GASの利用制限というデメリットもありましたが)
最終的に以下の構成で開発を進めることになりました。
以下のようにGoogleドキュメントの拡張アドオンから使用でき、会議を検索・パスコードを入力すると文字起こしをドキュメント上に書き込みしてくれます。
文字起こし機能実装
約1日で以下の機能のプロトをフロント、バックで実装しました。
- 録画データの検索
- 録画データから文字起こし
いざデプロイし、動かそうとした結果、、、 動きませんでした!!!
録画データから文字起こしする際に、whisper apiではデータサイズの制限があるため、分割してからリクエストしているのですが、分割するために使用した音声データの編集ライブラリとOSの相性が悪かったようです。 この週はこの原因がパッとわからず、結局次週への持ち越しとなりました、、、
最終週
文字起こし機能動作確認、バグ修正
Gさんに試行錯誤していただき、やっと実装した機能が動作するようになったためフロントと繋ぎこみ動作確認を行い、認識もれによるバグ修正をひたすら行いました。 結果、無事に文字起こし結果が出力されるようになりました🎉
要約機能実装
文字起こし機能ができたので続いて要約機能の実装に着手しました。 要約機能はシンプルに文字起こしした後に表示される「要約する」ボタンを押すと文字起こしした結果を簡単にまとめ直して、出力してくれる機能です。
要約機能については、色々とし試行錯誤した結果、以下のようなフォーマットで出力することになりました。 最初に全体の要約と決定事項などを出力し、その後にどのようなトピックが話し合われたかを出力します。
議事を閲覧するようによっては要約してほしい粒度が異なるのでこのような形になっています。
# サマリー 1. サマリー ... 2. 決定事項 ... 3. 宿題事項 ... # トピックメモ 【トピックのタイトル】 トピックの要約 【トピックのタイトル】 トピックの要約 ...
上記のようなフォーマットで出力するために、以下のような実装を行いました。
- langchain.text_splitterで文字起こし結果を適切なチャンクにする
- openaiのEmbeddingでチャンクごとに意味上の類似度が高いものをトピックとしてまとめる
- 上記のトピックごとに以下のようなプロンプトを指定し、トピックごとのタイトルをつける(これが
# トピックメモ
の内容になります)
あなたはプロの編集者です。 次の文章の内容が分かりやすくなるよう、文章を30字以内で要約してください。 その際、以下の制約に従うこと。 制約: ・適切なタイトルが無い場合、トピックなしというタイトルをつけてください 文章: "{text}" 30文字以内のタイトル:
- トピックの一覧とトピックを結合した結果を再度要約させる(これが
# サマリー
の内容になります)
以下の「フォーマット」に従い「会議内容」の要点を「出力結果」にまとめてください。 まとめ方は「出力例」を参考にしてください。 # フォーマット 1. サマリ 2. 決定事項 3. 宿題事項 # 出力例 1. サマリ - この会議は株式会社リンクアンドモチベーションと株式会社XXXの会議の一部です。 - 今回の会議の目的は、株式会社XXXの課題を解決することです。 - 株式会社XXXの課題は、社内のコミュニケーションが円滑に行われていないことです。 - 株式会社XXXの理想は、社内のコミュニケーションが円滑に行われていることです。 2. 決定事項 - 決定事項1. 株式会社XXXの課題を解決するために、社内のコミュニケーションを円滑にするためのツールを提供します。 3. 宿題事項 - 宿題事項1. 株式会社XXXの課題を解決するために、社内のコミュニケーションを円滑にするためのツールを提供します。期限は2021年12月31日です。
要約機能動作確認、バグ修正
時間の許す限り動作確認とバグ修正を行いました。
最終的には以下のような内容が出力されるようになっています。
いい感じにトピックの分割と要約ができていそうです🎉
プロジェクトを終えて
今回のプロジェクトでは消化不良に終わってしまった部分もあります。 例えば
- 文字起こしをした際に、話者ごとに分離して表示
- 文字起こし精度の改善
- 要約フォーマットをユーザが選択できるようにする
などやりたいと思っていましたが、時間の都合上できませんでした。
一方でこのプロジェクト自体はとても楽しかったです🔥
流行りの技術に触れられてることもありますが、全員がプロジェクトマネージャーを経験していたため不確実なプロジェクトでもどうにか期日を守ろうという意識が高くスピード感を持って進められていたからだと思います。
そのためメンバー全員がバックログを管理し、3weekで価値のある機能をリリースするためのMUST/WANTを明確にしながらプロジェクトを進行させ、1日進むごとに機能が追加されていてプロジェクトが成長していく感覚が嬉しかったです!
この感覚は自分のプロジェクトでもしっかり浸透させていきたいです!
最後に、LLMはまだ発展途上で昨日出来なかったことが今日できているということが多々あります。 今後もしっかり技術動向をキャッチアップし、発信できればと思います!