Participate in Hackathon

Japanese
...
...

Language: Japanese

ハッカソンにについて


  • 今回はZennとGoogle Cloud Japanが一緒に共催しているハッカソンに参加しました。今回のテーマは「AI エージェント」です。今回使うツールはGoogle CloudのコンピュートとGoogle CloudのAIです。

具体的にはこちらのリンク: AIエージェントハッカソン

はじめに


  • 今回のハッカソンは私が2年生の時参加したハッカソンです。元々は大学の時にハッカソンを参加したかったので、ちょうどZennとGoogle Cloud Japanが共同でハッカソンを開催していたので、自分の能力や開発知識を試すために参加しました。いわゆる初ハッカソンですよね。今回は友達と一緒に参加しました。

  • 今回はチームで参加しました。チーム名は「新木場PJ」です。一緒に参加してくれた友達は3人です。

1.プロジェクト概要


  • 日々の授業や、会議でとったPDFファイルをこのアプリケーションにアップロードし、質問に関連する文書を検索することで、素早く過去の内容を参照することができるAIエージェントを開発しました。

pdfファイルをアップロードすれば良いだけなので、論文を効率的に読むためにも活用できます。

2.プロジェクトの説明


以下のように進んでいきます。

  • 対象とするユーザー像
  • 解決したい課題
  • 課題のソリューション
  • システムの詳細な特徴
    • RAGについて
    • UIについて
    • DocumentAIについて

対象とするユーザー像

RAGを気軽に使いたい全てのユーザー(特に学生など、メモやノートをとるユーザー)

解決したい課題

現在、社会には二つの課題、損が存在します。

  1. 日々の学習でノートをとっているが、量が多くなると、あとあと欲しい情報が書いてある部分を探すのが困難

    • ノートを使いやすくするために、綺麗に階層構造にしたり、タグ付けしたり、色分けをしたり...などしていますが、結局ノートの量が多くなってしまうと、欲しい情報は埋もれがちです。
  2. RAGを使ってみたいが、プログラミングの知識や、コストなどのハードルが高い

    • RAGは、企業で社内の情報共有のために使用されることはあっても、そのハードルの高さから、プログラミングに関わらない学生など、一般のユーザーは使用することができていません。

※ RAG(Retrieval-Augmented Generation):生成型人工知能モデルに情報検索機能を付与する技術です。大規模言語モデル(LLM)とのやり取りを変更し、モデルが指定された文書セットを参照してユーザーのクエリに応答するようにします。

課題のソリューション

課題を解決するために、RAG自体を一つのアプリケーションにしてしまえば良いと考えました。

このアプリケーションでは、RAGを活用し、ユーザーがもつPDFファイルをアップロードするだけで、それを元にユーザーの質問に回答するチャットボットを構築しました。

このアプリケーションで、ノートの情報の迅速な取得を実現します。

システムの詳細な特徴

RAGについて

  • フレームワーク:LangChain
  • テキストスプリッター:RecursiveCharacterTextSplitter
  • エンべディングモデル:sentence-transformers
  • ベクトルデータベース:FAISS
  • LLM:gemini-1.5-pro

RAG構築のフロー

  • ドキュメント処理

    • テキスト分割
    • チャンク化
    • ベクトル化
    • ベクトルデータベースへの格納
  • リトリーバーの作成

  • 会話セッションの管理

    • セッションごとのチャット履歴管理
    • InMemoryChatMessageHistoryによる履歴保持
    • 履歴を考慮した質問の文脈化
  • 回答生成

    • リトリーバーによる文書検索
    • LLMによる回答生成
    • 回答の返却

RAG

工夫した点 チャットボットなので、「もっと詳しく」などの主語がない質問に対応できるようにしました。

  • 普通のチャットボット(対応できる)
    • チャット履歴をプロンプトに与えるだけで、適切な回答を生成できる。
  • RAG(対応できない)
    • 質問をベクトル化するので、「もっと詳しく」という質問自体をベクトル化しても、それに対応する情報は存在しない。

→解決策として、チャット履歴と質問をLLMに与え、適切な質問を再生成させる。そして、再生成された質問でベクトル検索を行う。 うまくいくやつ

UIについて

  • ウィンドウサイズが変わっても崩れない設計

    • 全体の大きさや位置が固定されているため、スクロールやリサイズによるレイアウトの崩れがなく、どんな画面サイズでも同じ操作感で利用できます。
  • メッセージ背景の調整で読みやすい

    • メッセージの背景サイズが内容に応じて動的に調整され、長文でも見やすく折り返し表示されます。これにより、短いメッセージも長いメッセージも違和感なく表示されます。
  • モデル切り替えで柔軟な利用

    • モデル切り替え(例: Gemini モードと RAG モード)をモーダル内に配置し、クリックひとつで選択可能。複数のタスクや回答形式に対応しやすく、使い分けを直感的に行えます。
  • シンプルで使いやすい操作性:

    • 画面下部に固定されたメッセージ入力欄と送信ボタンにより、初心者でも直感的に利用可能。余計な装飾を省き、操作に集中できるシンプルなデザイン。

DocumentAIについて

  • PDFファイルに対応するため、DocumentAIを使用してPDFファイルをテキストに変換する処理を行いました。

3. システムアーキテクチャ(ⅱ)


技術スタック

  • フロントエンド:Vite + React
  • バックエンド:FastAPI
  • 認証:JWT
  • データベース:postgres
  • ベクトルデータベース:FAISS
  • 生成AIモデル:gemini-1.5-pro
  • ドキュメント処理:DocumentAI
  • RAGフレームワーク:LangChain
  • デプロイ:Google Cloud Run

下記はシステムアーキテクチャを示す概略図です。

アーキテクチャ

4. 今後の展望


  • マルチモーダル検索 現在は主にテキスト、PDFを扱っているが、ノートに埋め込みされた音声や画像、動画も検索対象にすることで、より幅広い情報を活用できるシステム。
  • ノート機能 ノートをとる機能を追加し、データが蓄積されていくようにすることで、アップロードの手間すらも省く。

5. 終わりに

本記事では、AI Agent Hackathon with Google Cloudにて開発したプロダクトについてご紹介、ご説明しました。 ご意見などありましたら、お気軽にコメントいただけると幸いです。

おまけ

だいぶ見切り発車で始まったこのプロジェクトですが、なんとか形にすることができました。 結構貴重な経験だったと思うので、感想など、思い出程度に書いてみました。

  • jacksen(Jacksen's Portfolio

  • なおき 今回、初めてチーム開発をやってみましたが、正直めちゃくちゃ大変でした…。作業の分担、コードの統合、認識のすり合わせとか、想像以上に苦戦しました。 最初は「これやればいいよね!」みたいな感じで役割分担したけど、いざ進めてみると「え、これ誰がやるの?」みたいな部分が出てきたり、作業のペースが違って調整が必要になったり…。 とはいえ、チーム開発ならではの面白さもありました!一人じゃ思いつかない実装方法を知れたり、困ったときに相談できるのがめちゃくちゃ助かりました。あと、Gitの使い方とかブランチ運用の大事さを改めて実感。最初は「マージ怖い…」ってなってたけど、慣れると「お、ちゃんと動くやん!」ってなって楽しかったです。 まだまだ課題は多いけど、今回の経験を活かして、次はもっとスムーズに開発できるようになりたい!

  • かいせ(X:@kai_ds04,Github:Kaise) アプリケーションの開発にあたり、RAGの構築を中心に担当しました。 想定するデータ量も少ないし、一番シンプルなRAGで良いだろうという仮説のもと開発しました。自分的には、情報は少なすぎず、多すぎずちょうど良い回答が生成できたと思います。 もっとデータベースやアプリケーションシステムに最適化したRAGが構築できればよかったかなと思います。

参考

RAG構築にあたり、以下の記事を参考にしました。

...
Share this post