Participate in Hackathon
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を気軽に使いたい全てのユーザー(特に学生など、メモやノートをとるユーザー)
解決したい課題
現在、社会には二つの課題、損が存在します。
-
日々の学習でノートをとっているが、量が多くなると、あとあと欲しい情報が書いてある部分を探すのが困難
- ノートを使いやすくするために、綺麗に階層構造にしたり、タグ付けしたり、色分けをしたり...などしていますが、結局ノートの量が多くなってしまうと、欲しい情報は埋もれがちです。
-
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(対応できない)
- 質問をベクトル化するので、「もっと詳しく」という質問自体をベクトル化しても、それに対応する情報は存在しない。
→解決策として、チャット履歴と質問を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構築にあたり、以下の記事を参考にしました。
- Build a Retrieval Augmented Generation (RAG) App: Part 1
- 【連載】LangChainの公式チュートリアルを1個ずつ地味に、地道にコツコツと【Basic編#2】
- ゼロからはじめるRAG:クラウドに頼らない完全ローカル構築ガイド
- LangchainとDatabricksで(私が)学ぶLCEL: 入力まわりの挙動
- 【LangChain(LCEL)】3つのRunnable〇〇を理解する
- 【RAG】LangChainでつくるRAGチャットボット ~会話履歴を考慮する~
- langchain version0.3におけるメモリ機能の備忘録
- LangChainの新しいチャット履歴管理RunnableWithMessageHistory
- Add Memory to Chatbot and RAG Using Langchain