エキサイトの Booost!!! 5daysインターンシップに参加してきました!
インターンの内容を振り返りつつ、行ったことや感想などを記事にします!
インターン概要
Booost!!!はエキサイトがリリース する/している サービスが抱える課題に対して、インターン生でチームを組んで5日間で解決していくというインターンでした。
私がアサインされた課題は、経営管理クラウドサービスに実装されているChatGPTを活用したAIアシスタント機能の精度向上が主題でした。
インターン詳細
AIアシスタント機能は、
- ユーザーが質問文を送信
- Lambda上で動くPythonアプリケーションが質問文を受け取り、その内容とDB情報をOpenAIのAPIに送信する
- OpenAIのAPIにあるGPTモデルからクエリ文が返却される
- そのクエリを元にDBへ計算を依頼する
- DBから計算結果が返却される
- 得られた結果をユーザーへ出力する
という流れになっていました。
実際はもっと複雑なプロセスがありますが記事では省略しています。
GPTは計算が苦手なので、クエリ文を出力してもらいDBで計算を行っていました。
予めインターンの課題として、ユーザーから想定される6つの質問文が用意されていました。
例: 2022年度のXXXの広告収入の前月比を月ごとに教えてください
これらの質問文に対する正答率を基準に精度向上を行いました。
プロンプトエンジニアリング
基本的にインターンでは、精度向上のためにプロンプトエンジニアリングを行いました。
Few-Shot Learning
複雑な計算をさせるクエリ文を出力させることは難しく、それを解決するためにFew-Shot LearningとしてSQLのテンプレートをプロンプトに記述するようにしました。
その結果、安定してテンプレートに沿ったクエリ文を出力するようになりました。
システムプロンプトの導入
既存の実装でユーザープロンプトに書いてあるいくつかの条件を、システムプロンプトに移行しました。
ある質問文の正答率がどうしても改善せず、ユーザープロンプトに条件を追記しても不安定だったため、システムプロンプトに移行した結果、安定して指示通りのクエリ文を出力できるようになりました。
システムプロンプトは最初に読み込まれて、人格や役割を与える重要なプロンプトであり、そこに条件を書くことでユーザープロンプトで記入するよりも、条件の重要度が上がっているのではないかと考えています。
また、トークン消費量を考えた際に、ユーザプロンプトで毎回条件を書いていると、その分のトークンが消費されてしまいます。
しかしシステムプロンプトであれば最初の文章だけなので、会話が増えても同じ記述が発生しなくなり、トークン数を節約できるという副次効果を得ることができました。
注意点として、システムプロンプトによくある人格を与えるプロンプト(例:「あなたはSQLに精通したDBAです」)は誤った内容が返される傾向にありました。そのため、「問い合わせに対して最適なSQLを提示することができます」といった、役割のみを明確にするプロンプトのみを採用しました。
6つの質問文に対して各10回ずつテストを実施した結果、97%の精度で正しい内容が返却されるようになりました。
シェルスクリプト
ローカル環境を整えていた際に、デバッグ実行で時間がかかっていることに若干のストレスを抱えていました。
既存の実装ではPythonコード内にて、質問文の箇所を一回一回変更してテストしなくてはいけませんでした。
そこで質問文をコマンドライン引数からも受け取れるようにして、簡単に質問文を変更できるようにしました。
コマンドライン引数が使用できるようになったことで、
シェルスクリプトから質問文を配列にしてforループ実行ができるようになりました。
ですが、ただforループ実行してしまうとGPT4のレスポンスが遅いため、何分も待つ羽目になりました。
この問題を解決するために、プロセス毎にバックグラウンドで実行して並列処理を行うようにしました。
一つの質問に対する繰り返し実行数も定義できるように実装していましたが、あまりにも大きい数字だとGPTの Rate limits エラーになってしまうため、Rate limitsに届かないように計算を行ってからから並列処理を行うように実装しなおしました。
結果的に並列処理を用いて大体3.86倍の高速化に成功しました(core数が4だったから?)。
またログファイルを作成するようにしたことで実行結果を簡単に比較できるようになりました。
他に
他にも以下のような内容をチームで行いました。
- 計算結果の出力をマークダウンで表形式にして描画
- 過去のトークン使用量を元にあと何回分会話ができるか計算して描画
- テンプレートを使わない汎用的なシステムプロンプトの考案
- ユーザーからの質問文にてEmbeddingを活用した部門名のあいまい検索
苦労した点
プロンプトエンジニアリングでは、正解が決まっておらず、少し言い回しを変えるだけで全く違った結果になるので中々苦労しました。
仮説・検証・考察のサイクルを回したかったですが、一流の研究者ですらLLMの完璧な仕様がわからないため、はたして仮説や考察が正しいのかわからず、ずっとモヤモヤしていました。
最終的にはあまり深く考えることをやめて、少しずつプロンプトを変更してひたすら実験回数を増やすことにしました
感想
チームメンバーがとっても面白い方々で、5日間ずっとおもしろおかしく課題に取り組むことができました!
最終日になんとメッセージ付きの修了証をいただけました。
形に残るものが頂けたのはとても嬉しかったです!飾ります!
おわりに
チームメンバーが多様なバックグラウンドで面白く優秀な人ばかりで楽しく様々な学びを得ることができました。
一緒に開発していただいたお三方、ありがとう!
チームメンターさんをはじめ、他のサポーターのみなさま、人事のみなさまには大変お世話になりました!
ありがとうございました!!