はじめに
開発経緯
先日、「生成AIで山梨を盛り上げよう」というテーマでYAMANASHI AIハッカソン2024が開催されました。そこで、私のグループは山梨県のコロナ後の観光業の回復に着目し、山梨県の魅力を伝えるAIエージェント、やまなしNAVIを開発することになりました。
アプリの概要
- 対話形式のチャットボット(というよりはエージェント)
- 現在地、移動手段、季節、やりたいこと(行く、食べる、遊ぶ)などに基づき、候補となるスポットの提案をする
- ユーザーの要求に応じて、スポットについての詳細な説明をしたり、天気などのアドバイスもできる
フロントエンド
ハッカソンでは、LINEの他にオリジナルのWEBを作成したましたが、今回はLINEのみを取り上げます。
LINE MessegingAPI
バックエンドとLINEと連携するのにLINE MessegingAPIを使用しました。
以前、GoogleAppScriptを用いてLINEチャットボットを開発したことがありましたが、今回はバックエンドにDjangoを採用したことからPythonで呼び出すことになりました。
バックエンド
フレームワーク
豊富なライブラリを備えていて、柔軟なコーディングが...というのは建前で、一番長く使っているのがDjangoだったからです(´;ω;`)
Django==4.2.0
を使用しました。APIを簡単に扱うため、REST Frameworkを採用しました。(djangorestframework==3.15.2
)
API
使用したのは
- LINEと連携するLINE MessegingAPI
- 任意の場所の画像を取得するためのGoogleMapsAPI
- 生成AIのプラットフォームとしてDify
AIプラットフォーム
選定(時系列)
- ChatGPTのカスタムモデルであるGPTs
RAGの機能を持つことから、ローカルなデータを扱うのに適していると考え採用し、回答にもそれなりの精度が得られた。が、APIを提供していないことが判明し、断念。 -
OpenAIのAssistantsAPI
こちらはAPIを提供しており、RAGも備えていました!が、GPTs程の精度が得られず、没。 -
Dify
こちらはAPIも提供しており、精度もかなりよかったので採用!!
プラットフォームの課題と工夫
LLMモデルのみによるチャットボットは情報が古かったり、ローカル情報に弱かったりしますが、Difyを採用することでRAGによるローカル情報の補完&リアルタイム検索による適時性の向上が期待されます。
Difyの特徴
- ノーコードツール
ノードを線で繋いでいくことで、簡単にAIアプリが作成できるので、プログラミング経験者でなくても開発に参画できる! - RAG機能
RAG(RAGとはなにか?)を用いることで、LLMに蓄積された一般的な情報だけでなく、ローカルな情報(例えば、〇〇レストランの営業時間、など)を出力に加味することができる! - ブラウジング機能
インターネット検索の結果から情報を補完できるから、比較的新しい情報にアクセスできて、回答の精度も向上する!今回はGoolge Search、Wikipedia、Open weather or Googleをアクション出来るようにしました - AIモデルが選べる
使用するモデルやバージョンを選べるから用途よって、速度や精度のトレードオフを簡単に反映できる! - デフォルトのフロントエンドが用意されている
モデルの作成後、簡単に挙動の確認、配布ができる!