Webエンジニアの入江です。息子(4)の難しい要求仕様に対応するため、日々アジャイルでプラレールを作っています。AIレイアウトシミュレータとか需要あるんじゃないかと思っています。
さて、少し時間が経ってしまいましたが、2023年7月に「AI就活相談」という機能をリリースしたので、情報をまとめたいと思います。
どんな機能?
OpenWorkでは、就活を終えた先輩からのアドバイスとして、「就活レポート」という機能を提供しています。 techblog.openwork.co.jp
今回は、ユーザの入力した相談事項に対して、就活レポートをベースに先輩AIがアドバイスしてくれる機能を実装しました。データソースとなった就活レポートを提示することで、その後の回遊につなげることも期待しました。
実際の動作を見ていただくとわかりやすいので、gifを貼っておきます。
技術要素
・回答生成にはOpenAI API
・近傍探索にはfaiss
・phpのライブラリはopenai-php/client
・チャット風の返答にはStreamedResponse
を利用しました。
処理の流れ
1.就活レポートの一部項目をベクトル化して保持しておく
2.ユーザからの質問をベクトル化
3.近傍探索で、2と近い就活レポート上位5件を取得
4.取得した文章と質問文を元にプロンプトを生成し、回答を得る
5.回答後、参照した就活レポートを表示する
プロンプト例
あなたは大学の先輩です。 以下の文章をもとに、後輩からの相談に回答してください。 # 文章1 XXXXXX # 文章2 YYYYYY # 文章3 ZZZZZZ # 相談 AAAAAAAAAAAAAAA # 制約事項 xxxxxxxxxxな回答は絶対にしない
どんな工夫をした?
当たり前のような事項もありますが、参考になれば幸いです。
就活に関係のある質問かどうかを事前にChatGPTに判定してもらう
本命のプロンプトに「就活に関係がない場合は答えない」という制約をかけても、無視して答えてしまうケースがあったため、事前に0/1で判定してもらい、0の場合は固定メッセージを返却することにしました。
プロンプト例
次の文字列が就職活動や進路、会社に関する話題であれば1を、そうでなければ0を返してください。迷う場合は1にしてください。
回答中に追加で質問させないよう制御する
ストリーム形式でサーバからデータを受信して表示するので、連続で質問されると回答が混ざってしまいます。(本家のChatGPTも同様の制御がなされています。)
レート制限
利用料金は従量課金のため、無限にリクエストされると料金が高騰するリスクがあります。1回のリクエストにかかる料金を試算し、上限を決めておくのが良いと思います。
文字数制限
要件によりますが、今回は5〜30文字の制約を課すことで、いたずら質問やプロンプトインジェクションのリスク軽減を図りました。
管理画面から機能をON/OFFできるようにする
AIが不適切な回答をしたり、APIの安定性など、リスクを読みきることができなかったため、すぐに機能を止めることができるようにしていました。実際、OpenAI APIが半日以上不通になった時期があり、即時メンテナンス状態にすることで被害を軽減しました。
リリースしてみてどうだったか?
就活レポートをより活用してもらうために、実験的に「AI」というキーワードで機能リリースしユーザの反応を見てみましたが、結果としてはあまり機能を利用していただくことはできませんでした。時期要因の可能性も考えられるため、もう少し様子を見ることも検討しましたが、OpenAI社のAPIが不安定な時期が続いたことから、一度機能をクローズすることとなりました。
個人的には、セマンティック検索のようなイメージでユーザの自然言語に対して関連する就活レポートを提示してくれる機能はありがたいと感じるので、また再チャレンジしたいと考えています。(AIによる回答はなくても良いかもしれない)
あとがき
2023年末現在(まさに今)、ChatGPTをテーマとした社内ハッカソンが開催されています。 AWSからもBedrockやKendraなどAIプロダクトがリリースされており、弊社でも検証を進めています。今後のUX改善にご期待ください。
We're hiring!