バイセル Tech Blog

バイセル Tech Blogは株式会社BuySell Technologiesのエンジニア達が知見・発見を共有する技術ブログです。

バイセル Tech Blog

バイセルの新卒エンジニア研修〜ChatGPTを全社で安全に利用できるサービスの開発〜

はじめに

初めまして、私たちはテクノロジー戦略本部の23卒エンジニアです。

バイセルでは、入社後に毎年新卒エンジニアが協力して「プロダクト開発研修」というものを行っています。
新卒11人はAチームとBチームに分けられ、私たちの所属するBチームのテーマは「ChatGPTを全社で安全に利用できるサービスの開発」でした。

プロダクト開発研修とは

まず、バイセルのテクノロジー戦略本部の新卒研修であるプロダクト開発研修について説明します。

新卒エンジニア研修というと、コードの書き方を学んだりGitを使ってみたりするものや、チームでのハッカソンなど何か手を動かしてものを作るもの、という印象を持たれる方もいるかと思われます。
バイセルのプロダクト開発研修は、業務の課題解決や全社を巻き込んだ新たなプロジェクトを立ち上げる、という形で行います。

プロダクト開発研修の目的は次の2点です。

  1. ユーザの課題を解決するまでのプロセスを学ぶ
    エンジニアの仕事は、技術の力でユーザーの課題を解決することです。 ユーザーが抱える本質的な課題を発見し、どのような課題をどのようなプロダクトで解決するべきか、解決までのプロセスを理解することが大切です。

  2. リーダーシップとチームワークの重要性を学ぶ
    会社において仕事はチームですすめるものであり、一人で仕事はできません。 チームの中でどのような役割分担をし、どのようなリーダーシップを発揮するべきか、そして協力して課題解決する重要性を学びます。

プロダクト開発研修ではまず初めにテーマが与えられ、ゼロから要件定義をして、開発、ユーザーフィードバックの収集、それを受けてのロードマップ作成などを行います。
新卒でプロダクト開発を初期段階から経験したことのあるメンバーは少ないので、もちろん進めていく上で多くの先輩エンジニアから助言を貰いつつ開発していきます。

また、テーマの深掘りや課題の発見はエンジニアだけで行うのではなく、バイセルグループ内の事業部のメンバーにヒアリングやアンケートで情報をもらいつつ行っていきます。

さらに、期間内だけ取り組んで終わりではなく、プロダクト開発研修期間の2週間が終わった後もフィードバックを貰いながら開発は続いていきます。
「業務に活かせるものを作る」という目的と、作って終わりではなくそれがスタートラインである、というエンジニアとしての心構えを学べるものとなっています。

この記事を読むことで、バイセルで行う新卒エンジニア研修への解像度を高め、バイセルが大切にするエンジニア像について知ってもらえれば幸いです。

背景

今回のBチームのテーマ「ChatGPTを全社で安全に利用できるサービスの開発」が出された背景は次の通りです。

  • ChatGPTを活用することで、全社員の生産性を向上させる必要がある。
  • 社内情報の漏洩を防ぐために、ChatGPTを社内で安全に使えるようにする必要がある。

特に前者はCTOのキュンさんも、全社員がChatGPTを使いこなせるような会社にならなければ、使いこなせる会社との生産性の差は非常に大きくなると言及していました。
私たちもその認識は同じであり、ChatGPTの有効活用は今後の業務に欠かせないものとなると感じています。

やったこと

調査

今回私たちが開発するプロダクトには、全社員がChatGPTを使えるようにする必要がある、という要件があります。
その要件をみたすためには現状の把握が必要だと考え、以下の2種類の調査を実施しました。

  1. 全社内のChatGPT利用状況についてのアンケート
  2. ChatGPTを利用していない社員に対するヒアリング

1. 全社内の ChatGPT 利用状況についてのアンケート

社内のコミュニーケーションツールであるSlackにおいて、ChatGPTの利用状況のアンケートを取りました。

Slackのスタンプを使用した全社内のChatGPT利用状況調査

スタンプを押してくれた人の中でChatGPTを継続的に利用している人は約9.6%でした。
回答必須のアンケートではないので多少のバイアスはあるものの、社内ではChatGPTはあまり認知されていない、もしくは利用されていないことが分かりました。

2. ChatGPT を利用していない社員に対するヒアリング

アンケートで「使ったことがない」「1回以上使ったが継続して使ってはいない」と回答していただいた社員に向けて、「なぜ継続して利用していないのか」という点についてヒアリングしました。
その結果、以下のような回答をいただきました。

  • ログインのハードルが高い
  • 英語が多くてわかりづらい
  • ブラウザ版のChatGPTが使いづらい(2023年4月時点)
  • 用途がわからない

ヒアリングを踏まえると、インタフェースが使いづらい、使用用途が不明確という問題が浮かび上がってきました。
したがって、全社員にプロダクトを使用してもらうためには以下の2点が必要である、ということがわかりました。

  • ユーザーにとって使いやすいインタフェースの提供
  • ユースケースの提示

アプローチ策定

ユーザーに対してアンケートとヒアリングを行うことによって課題が明確となったので、次はこれらの課題を解決するためにどのようなプロダクトを制作するべきか、エンジニアの視点も交えつつ考えました。

使いやすいインタフェースを考えるために各事業部へヒアリングを行った結果、事業部ごとによく使用するデバイスやソフトウェアが異なる、ということがわかりました。
例えば、買い取りのためにお客様と直接やりとりを行うフィールドセールスの査定員は、PCではなくスマートフォンやタブレットなどのデバイスを使用しています。
また、業務中によく使うソフトウェアについても、Slack・Googleスプレッドシート・社内開発したシステムなど、事業部によってさまざまでした。
したがって、「ユーザーにとって使いやすいインタフェースの提供」を実現するためには、特定のデバイスやソフトウェア上でのみ使いやすいインタフェースを1つだけ用意するのではなく、それぞれのユーザーに合わせた多様なインタフェースを用意する必要があります。

一方で、プロダクト開発研修の期間は2週間しかないので、限られた時間でそれら全てを用意するのは難しいと判断しました。
最終的に私たちは、インタフェースの礎となる基盤「BuySell Buddy」および、インタフェースの第1弾としてSlackからBuySell Buddyを利用できる「Slack Buddy」を開発することに決めました。
Slackを第1弾に選んだ理由は、全社で利用されているコミュニケーションツールであり、チャット形式のUIなのでChatGPTと親和性があると考えたからです。

ユースケースの提示については、現在ChatGPTを利用している社員にヒアリングを行い、その中で「業務効率が上がった」と感じているプロンプトを収集し、インタフェースの中で提示することにしました。

アプローチをまとめると、以下のようになります。

  • 様々なインタフェースに対応できる基盤「BuySell Buddy」を開発する
  • インタフェースの第一弾としてSlackを使用したインタフェース「Slack Buddy」を開発する
  • ヒアリングを行い効果の高いユースケース、プロンプトを集め、「Slack Buddy」の中で提示する

Buysell Buddyインフラ構成図

開発したプロダクト

今回開発したSlack Buddyは、全社員がSlackから気軽にChatGPTを利用できるSlackアプリです。

まず基本的な使い方ですが、メンションをイベントトリガーにし、質問を受け取ります。

Slack Buddyにメンションして自由に質問

すると、ChatGPTに問い合わせた結果をスレッドに返します。
同一スレッド内でメンションされた場合、本家ChatGPTと同様に質問回答履歴の文脈を踏まえた回答を得ることができます。

また、上手く質問する方法が分からないというユーザーのために、ユースケースの提示としてテンプレートをいくつか用意しました。
プロンプトエンジニアリングにより、各テンプレートごとに良い回答が得られるような質問文を生成します。

Slack Buddyのテンプレート選択画面

以下のように指定のテンプレートを選択することで、専用の質問フォームに遷移します。

Slack Buddyのテンプレートを使った質問

以上が基本的なSlack Buddyの機能です。

開発

BuySell Buddy

BuySell BuddyはChatGPTとやりとりをするためのAPIの提供し、多様なインタフェースから呼び出せるようにした基盤です。
基本的にはLangChain(後ほど説明します)が提供するOpenAI APIのラッパーを使用してOpenAIのChat Modelとやり取りをしています。
その途中でModeration APIを使用して不適切表現のチェックを行ったり、集計のためにログをFirestoreに残したり、送信するトークン数をコントロールしたりしています。
また、送信するデータが学習されないようにするためにはオプトアウトが必要ですが、OpenAIのAPIはデフォルトでオプトアウトされているため、API経由でChatGPTを利用することでこの要件を満たすことができます。

具体的な技術としては以下のものを採用しました。

  • インフラ環境:Cloud Run + Firestore
  • 言語:Python
  • フレームワーク:FastAPI
  • ライブラリ:LangChain

LangChainはPythonのライブラリであり、LLMを利用したアプリケーションの開発を容易にしてくれるものです。
LLM(Large Language Model)のAPIのラッパーを提供しており、複数のLLMを組み合わせて利用するアプリケーションを作ることができます。
また、自前のデータから回答を作らせるようにしたり、ChatGPT自身にWeb検索させたりする機能を実装できます。
他にも様々なことができるので、ChatGPTにできることを知るという意味でも、ぜひ一度公式ドキュメントに目を通してみてください。

python.langchain.com

現在、LangChainはJavaScriptやGoに移植されている一方で、本家のPython版には開発が追いついていない部分があるため、BuySell Buddyの開発言語にはPythonを採用しました。
軽量なフレームワークが必要だったので、FastAPIを選び、インフラには知見があるGoogle Cloudを採用することにしました。
スケーラビリティに富むCloud Run、非構造化データを扱えて高速なFirestoreに加えて、柔軟に集計が可能なBigQueryも採用し、API認証にはGoogle CloudのAPI Gatewayを使用することとなりました。

Pythonはバイセル社内ではあまり使われていないので苦労した部分もありましたが、FastAPIやLangChainのおかげで開発は比較的スムーズに進みました。
FastAPIはデフォルトで、OpenAPI(OpenAIではない)準拠のスキーマファイルをコードから自動生成してくれるという特徴があり、Swagger UI を見ることができるのでかなり快適にAPI開発ができました。

API Gatewayを作成する際も、自動生成されたスキーマファイルを参考にできました。
※API Gatewayは、Swagger2.0 にしか対応していないので注意が必要です。

Slack Buddy

Slack Buddyは、BuySell BuddyのAPIを経由し、SlackからChatGPTを呼び出すためのSlackアプリです。
Slackアプリを開発するためのフレームワークには、Slack公式が提供しているライブラリであるBoltを採用しました。

Slackはスレッド毎に一意のIDが振られているので、それを元に過去の会話履歴を取得できます。
機能自体は一見シンプルに見えますが、Slackはどこからメンションされるかによってデータ構造が変わるので、うまく対応する必要がありました。
例えばスレッド内からメンションされた場合は、thread_tsというフィールドが存在しますが、通常の投稿内でメンションされる場合はthread_tsが存在しないといった具合です。

インフラに関しては、Slackアプリの環境設定などを整えてCloud RunにBoltサーバーをデプロイしました。
実際にユーザーに公開する前には、テクノロジー戦略本部の協力の元、本番環境で負荷テストを実施しました。
Slack Buddyが利用可能になり、アナウンスした直後はたくさんのアクセスが予想されます。
そこでもしサーバーダウンなどが起こり、利用できなくなってしまうと印象を悪くする恐れがあります。
この懸念を事前に対処する必要がありました。

Slackでテスト用のチャンネルを作成し、昼休みの時間に呼びかけて大量にメンションをしてもらいました。
一分間に何百件もの投稿をし、実際のデータを用いて初期のスパイクに耐えうるようなサーバーの要件を調整しました。

研修を終えて

リリース以降、ピーク時には一日に100人程のユニークユーザーが利用するなど、一定の反響が得られました。

ユーザーからの FB

ユーザーからのフィードバックを得るために、Slack Buddyを使用してくれた人に対してアンケートを実施しました。

業務効率化については、以下のような結果が得られました。

業務効率化についてのアンケート結果グラフ

結果を見ると、3/4以上のユーザーが、Slack Buddyの使用が実際に生産性向上に寄与したと回答しています。

また、アンケートの自由回答部分で得られた具体的なコメントは以下の通りです。

  • ポジティブな意見
    • スプレッドシートの関数やGAS、SQL作成の補助として役立った
    • 新たなアイデアが必要なときに有用だった
  • 改善要望
    • バイセルの特有の情報を活用したChatGPTの機能、例えば社内情報の提供などが欲しい
    • 有効な回答を得るための質問方法や、その反対の有効でない質問方法のガイドラインが欲しい

私たちが収集したユーザーフィードバックは、今後の開発方向性を見据える非常に重要な指針となります。
具体的には、先述した改善要望の1点目にあるように、社内情報を返すことが出来る機能をBuySell Buddyに組み込む予定です。
ユーザーの声を直接開発に活かし、更なるプロダクトの改善を進めていきます。

研修の感想

2週間という限られた期間において、開発業務だけにとどまらず、アンケート・ヒアリングから始め、検証・分析し、ユーザーフィードバックまで包括的に経験できました。
さらに、テクノロジー戦略本部以外の事業部の方々と接することで、他事業部についての理解も深まりました。
メンバー各自の配属プロジェクトで事業部との連携は必要不可欠なので、今回得た知見と経験は、そこで必ず活きてくると感じています。

おわりに

この研修を通じて、チームで1つの物を作り上げるという貴重な経験を得ることができ、これを入社して間もない時期に得られたことは、大きな自信となりました。
さらに、時代に合わせた技術やトレンドを迅速にキャッチアップし、それらを活用して課題解決に取り組む経験を通じて、エンジニアとしての醍醐味を深く実感しました。
今後はこれらの経験を活かし、ユーザーに寄り添った開発を続けていきたいです。

また、今回の取り組みの概要はPR TIMESにもまとめています。
6月25日号のリサイクル通信にも掲載されましたので興味がある方は御覧ください。

最後に、バイセルでは新卒エンジニアを随時募集しております。
興味のある方はぜひ以下の採用サイトをご覧ください。

recruit.buysell-technologies.com