NTTドコモR&Dの技術ブログです。

とりあえずStreamlitでたった1ヶ月で生成AIアプリ(ダッシュボード解釈支援)を作ってみた

はじめに

こんにちは、NTTドコモサービスイノベーション部の田尾と上田です。
田尾は業務では主に、社内で生成AIに関連するイベントの運営を担当しています。具体的には、生成AIを活用したアイデア創出コンテストや、社内での事例共有会を企画・実施しています。
上田は業務では主に、データ分析・機械学習に関する研究開発やビジネス適用を行っております。

今回は、自分で生成AIを活用したアプリを作ることに挑戦したく、社内のStreamlitを利用したアプリ開発コンテストに応募することに決めました。応募締め切りの1週間前に思い立ち、急遽参加することにしました。

以前、toC向けサービスを運営しているチームで、データ可視化(ダッシュボード作成)を支援していた経験があり、何のアプリを作るか考えていた際に、ダッシュボードを作成してデータを解説した際に、非常に喜ばれたことを思い出し、生成AIを活用してダッシュボードのデータ解釈をサポートするアプリを作成することにしました。

作成したアプリ

今回開発したのはダッシュボードの解釈をテキスト対話形式で簡単に行えるアプリになります。
ユーザーがデータ可視化された「ダッシュボード」のPDFファイルやPNGファイルをアップロードすると、その内容が自動的に解釈され、解説が表示されます。 さらに、チャット形式で質問することもできるため、データに関する疑問点をその場で解消することができます。 このアプリにより、データに詳しくない方でも、ダッシュボードから得られるインサイトや課題点を簡単に把握できるようになります。

アプリの対話画面は以下のようなものです。

想定読者

本記事の想定読者は以下になります。

  • Streamlitや生成AIでアプリを作ってみたい人
    • コードの記載はございません。実際に開発をしてみての知見や気をつけた方が良いことを中心に記載しております
  • LLM(大規模言語モデル)のユースケースを知りたい人
    • 生成AIサービスを作るのはまだ難しいところもあると思いますが、こういった例もあるのだと参考にしていただきたいです

開発スケジュール

応募したコンテストのスケジュールに則り、以下のようなスケジュールで必要最小限のMinimum Viable Product(以下、MVPと記載)の開発を進めました。
(コンテストのスケジュールはすごく過酷でした、、笑)

  • アイデアの決定&開発環境の申請・準備:1週間
    • どんなアプリを作るかを決め、ターゲットユーザーや機能の大枠を考えました
    • 社内申請やアプリ開発をする上での環境準備をしました
  • アプリ開発(MVP)&リリース準備:3週間
    • 最低限動作するプロトタイプ(MVP)、UIを一から検討し、勢いで開発しました
  • アプリの社内公開&発表
    • 社内でアプリの公開&発表を行い、社内フィードバックをもらいました
  • アプリ効果測定:1ヶ月
    • 現在、効果測定期間となります

アプリ全体

今回利用したStreamlit は、Pythonを使ってデータアプリケーションを簡単に作成できるフレームワークです。社内でStreamlitでアプリ開発を行うための環境は整備されており、その環境で今回はアプリ開発をしました。環境は昨年度の弊社アドベントカレンダー記事に掲載されているので、こちらも併せてご覧ください。アプリ開発にあまり慣れていなかったのですが、これらにより簡単にアプリを作ることができました。

今回のアプリではこちらを利用しつつ、対話をできるページと、お役立ち情報ということでいくつかのユーザーガイドを作成いたしました。

利用手順

対話画面の利用手順は主に以下の通りです。

  • ステップ1: ファイルアップロード
    • アップロードしたファイルを表示/非表示で確認可能
  • ステップ2: ダッシュボードと対話
    • 質問の候補ボタンを選択
    • もしくは入力欄に質問を記載

ステップ1

ファイルアップロード画面は以下になります。PDF、PNGファイルを選択またはドラッグすることでファイルのアップロードができます。

ファイルを無事にアップロードできると、以下のようにアップロードができたということと、ファイルの中身を表示/非表示できるボタンが出てきます。

これにより、アップロードしたダッシュボードの内容を手元で確認しながら、以降の対話をすることができます。

ドラッグによりPDF、PNG以外の形式のファイルを入れてしまった場合には、以下のようにエラーが出ます。

ステップ2

ダッシュボードと対話する画面は以下のような画面になります。ステップ1のファイルアップロードが成功すると、画面が出てくるようになります。

実際の対話画面については、以下の使用例でお見せします。

使用例

簡単にどういう対話ができるか試してみます。
今回はデジタル庁が公開している「マイナンバーカードの利活用に関するダッシュボード」のページをPDFにしたものを利用してみます。こちらで生成される対話は生成AIにより回答されたものであるため、必ずしも元ページの内容と一致していない可能性があることをご理解いただけますと幸いです。

ダッシュボードとしては以下のようなものが記載されています。主にコンビニ等での住民票の写しの交付や、マイナポータルでの引越し手続きに関する数値や推移といった内容があります。

まず、PDFファイルをアップロードします。アップロードが成功すると以下のような画面になります。

早速対話してみます。まずは質問候補から「ダッシュボードの概要を説明してください」を押してみます。

どのようなダッシュボードか簡単に分かりましたね。

次に、質問候補から「ダッシュボードから分かる主な課題点は何ですか?」を押してみます。

課題点を3つあげてくれましたね。利用率についてもダッシュボードを読み取って数値を含めて答えてくれています。

次の質問候補を3つレコメンドしてくれているので、そのうちの「コンビニエンスストアで取得可能な証明書の種類は具体的にどのようなものがありますか?」を聞いてみましょう。

どのような証明書を取得できるか分かりましたね。 今回はダッシュボード内に情報が書いてるのでうまく答えてくれましたが、LLMが事前に学習していないものですと正確な情報を答えてくれないので注意です。

最後に数値からどういう傾向なのか教えてもらいましょう。
マイナポータルでの引越し手続き率が増加傾向なのか、数値をもとに答えてもらうよう聞いてみます。

ダッシュボードの数値を読み取って、増加傾向ということを答えてくれました。簡単に内容が分かってとても便利ですね!

ユーザーガイド

今回3つのユーザーガイドを掲載しました。

使い方ガイド

基本的には対話画面を見れば直感的にやりたいことが分かるものになっていますが、どう利用するかをより分かりやすく説明したページとして用意しました。
一部分を抜粋したものが以下になります。

ダッシュボード一覧

ダッシュボードのPDF・PNGファイルを用意してとなっても、どこから用意するの?となる方もいると思い、社内の主要なダッシュボードを調査してリンク一覧という形で掲載しました。 見たいデータだけでなく、こんなダッシュボードもあったのか見てみようということも、追加の価値としてあると想定しております。
以下で一部分を抜粋しましたが、他にもかなりの数のダッシュボードリンクを掲載しており、それぞれに簡単にどんな内容かも記載しております。

アプリ品質説明書

使い方ガイドには掲載していないその他の必要な内容を掲載しています。

  • 想定ユースケース
  • 本アプリで実現したいこと
  • 処理ロジック
  • 試験項目
  • 消費クレジット目安
  • お問い合わせ先

一部分を抜粋したものがこちらになります。

Streamlit・生成AIアプリ開発の際に気をつけたこと

今回Streamlitで生成AIアプリを開発したのは開発者2人ともに初めてでしたが、Streamlit・生成AIそれぞれで気をつけたことを記載します。

Streamlit

session_stateの活用

Streamlitでは何らかの処理が走るたびに、プログラムが上から再度実行されます。そのため、普通に変数を保持しようとしても毎回初期化されるため、処理がうまくいかなくなることがあります。それを防ぐために、変数を保存できる機能として session_state というものがあり、これを駆使する必要が出てきます。

主に以下の部分がやや大変でした。

  • 前の対話内容の保持
    • 連続して質問した際は前の回答が保持され、新しいファイルをアップロードした場合には前の回答が消えて新しく対話を始められるようにしたいが、新しいファイルを入れたのに前のファイルの対話の続きから始まってしまう
  • ファイル表示/非表示のボタンの部分
    • ボタンを2回押さないとファイルが表示/非表示されない
  • PDF・PNGファイルでの分岐
    • サンプルPDFファイルを読み込むボタンを用意しようとしたが、アップロードされたPDFとの区別をつけづらい(結局今回は未実装)

開発期限的にいくつか細かい実装内容を削るくらい、最後まで親友にはなれないまま終わりました笑

session_stateやその他Streamlitについて、昨年度の弊社アドベントカレンダー記事でまとまっているため、こちらも併せてご覧ください。

アプリ画面の直感的な使いやすさ

基本的に対話画面のみで操作を実施するのですが、直感的に使い方が分かるようなものでないと、アプリにアクセスしてくれた人でもすぐに離脱してしまいます。(自分も普段からよくあります)
そのため、以下のことを意識しました。

  • 対話画面の導線は少なくする
    • ファイルのアップロード→ファイルの表示/非表示→ダッシュボードと対話とシンプルな構成にしました
  • 対話画面に出す情報は少なくする
    • 使い方の詳しい説明やダッシュボードのリンクといったアプリを動かす際に直接必要でないものは、全てサブページを作成してそちらに記載するようにしました
  • ボタンを押すだけでできるようにする
    • ファイルの表示/非表示や質問候補を選択するところはボタンとし、使い方を見なくてもこのようにすれば良さそうというのが分かるようにしました

生成AI

社内のガイドラインに沿っているかの確認

生成AIを活用する際には、社内のセキュリティガイドラインや使用ルールに従うことが重要です。データの取り扱いやプライバシーを守るため、必要なチェックを行いました。

回答の信頼性について注意書き

生成AIはハルシネーションと呼ばれる事実に基づかない情報を生成する現象により、誤った回答をする場合があります。生成AIを頻繁に利用する人はそういったことが起きることを把握していますが、普段から生成AIをあまり使わない人でも回答を完全に信頼し切らないように、生成AIを利用しているため回答が正しくないこともあるという内容を、対話画面の最初に記載するようにしています。

どのようなプロンプトを書いたらいいのか分からない方向けのサポート機能

生成AIを初めて使う方や、どのようにプロンプトを設計するべきか分からない方のために、ダッシュボードを解釈する際に有用である質問候補として、5つ用意しました。

マークダウン記法を使う等良いプロンプトの書き方と言われているものがありますが、あまり利用したことがない人でも簡単に利用できるように”できるだけシンプルに”を心がけ、あえて短文のプロンプトを選択肢として設定しました。

深掘り質問サポート機能

さらに、”うまい深掘り質問”ができるように、各回答の後には「次の質問の候補」を3つ表示する機能を用意しました。ここでも質問候補ボタンと同じく、短文のプロンプトが選択肢として出るよう設定しました。

プロンプトの事前設定

どのようなプロンプトでも、きちんとダッシュボードに基づいて、データサイエンティストが回答しているような回答が返ってくるよう、設定を入れました。

今後の展望

今回は1ヶ月というとても短い期間であったため、ダッシュボードの入力から自由に対話をして理解を深めるというところまでという、必要最小限のMVP開発としました。

最終的には、以下のような情報も踏まえた対話ができると望ましいと考えております。

  • 社内データ基盤に格納されているデータ
  • サービス方針資料
  • 施策内容
  • 各種用語の定義
  • 制約条件

イメージとしてはこちらのように、社内データを利用した傾向を取り入れつつ、社内の情報も踏まえた返答をしてもらえたらと考えています。

他にも以下の改善を考えています。

  • 回答の高精度化
    • 生成AIの仕様上、誤った内容を返すことが起きるため、回答内容の精度を向上していきたいです
  • ファイル表示機能の高精度化
    • 元ファイルで契約数xx人のように小さい文字が含まれている部分があると、その部分は内容がぼやけて出てくるため、改善したいと考えています
    • 画素数を上げることである程度は改善できたのですが、ファイルの読み込みがかなり重くなるため悩ましいところです

さいごに

今回は1ヶ月でStreamlitを利用した生成AIアプリを開発した内容をご紹介しました。
このようなユースケースがあるのかということや、アプリ開発の際に何を注意したら良いのかといったことの参考にしていただけますと幸いです。