Money Forward Developers Blog

株式会社マネーフォワード公式開発者向けブログです。技術や開発手法、イベント登壇などを発信します。サービスに関するご質問は、各サービス窓口までご連絡ください。

20230215130734

まだChatGPTをプロダクトで活用してないの?

こんにちは、HiTTO株式会社でエンジニアをしてます、hongoです。 HiTTOはマネーフォワードのグループ会社で社内向けAIチャットボットを作ってる会社です。

昨今では、いろんな会社がChatGPTを活用した機能をリリースしていますが、まだプロダクトに組み込めてないという会社は多いんじゃないでしょうか。 今回はHiTTOでChatGPTを活用した機能をリリースしたので、そのことについて書いていこうと思います。

(タイトルは煽りです、すいません)

機能としては2つ追加したのでそれぞれ紹介して、最後にOpenAIのAPIを叩く時の知見を共有できればと思います。

1つ目: 質問文水増し機能

背景

HiTTOは社内向けのAIチャットボットなので、例えば総務の人に聞くような「引っ越ししたんですが、どのような手続きが必要ですか?」といった質問にチャットボットが答えることができるサービスです。(社員数が多い会社だと社内からの問い合わせも多いので重宝される)

で、この引っ越しの質問に答えるためには当然お客様ごとに回答を書いておいてもらう必要があります。 HiTTOの管理画面で「引っ越した際の手続き」という回答を登録し、その回答に想定される質問を複数追加してもらいます。 それらの質問を機械学習してモデルを作り、一番近い回答を返すという仕組みになっています。

質問を回答ごとに複数用意してもらうのが大変なので、この質問をChatGPTで作れたらハッピーじゃん? ということで開発が始まりました。

機能の紹介

想定する質問を1つ入力してもらったら、『魔法のステッキ』アイコンをクリックすると...

似た質問が5個増えます!

HiTTOはポップなキャラクターがチャットボットとして答えるという世界観なのもあり、魔法のステッキにしてみました。 (∩^o^)⊃━☆゜.* こういうイメージです。

実装面

ChatGPTに渡すプロンプトとしては、『似た質問を5つ作れ』と指示してますが、たまに英語で返してきたりします。 そして5つの質問をリストで取得したいので最終的には以下のようなプロンプトにしました。

似た質問文を日本語で5個作成して下さい。

質問文: {text}
似た質問文:
1. 
2. 
3. 
4. 
5. 

この書き方がテストした中では一番5つの改行区切りで返してくれました。

2つ目: 回答が分からない場合、ChatGPTに回答させる機能

背景

返す回答がないなど、答えられない時はチャットボットが謝るだけでしたが、何か少しでもユーザーの役に立つことを返せたらということでChatGPTの回答を返す機能の開発が始まりました。

機能の紹介

答えられない場合に、ChatGPTのAPIを叩いてその結果を以下のように表示させます。

ちなみにどちらの機能も管理者が無効にすることができます。 お客様によってChatGPTへの考え方が違うので選択できるようになっています。

実装面

最初はキャラクターの口調で喋らせようと考えましたが、実際に試してみると微妙に期待通りに喋ってくれないこともあり精度にも影響してそうだったのでChatGPTそのままで回答するようにしました。

ChatGPTに渡すプロンプトとして、『140文字以内で回答しろ』と指示してますが、これも英語で返ってくる時があるので日本語でと指示しています。 140文字と指示してますが、質問する内容次第では割とオーバーして返してきます。 数百件の質問でテストしてみたところ、最大で+100文字くらいオーバーしてました。

実装の知見

最後にOpenAIのAPIを叩いた結果を使うという点で、実装上学びがあったので書いておきます。 前提としてPythonのOpenAIライブラリを使っています。

1. OpenAIのAPIはretryを入れる

たまに接続が切れることもあるのでopenai.error.APIConnectionErrorのエラーでたまにこけた時は、1度だけretryを入れるようにしています。

2. リクエストタイムアウトを入れる

ユーザーの入力をプロンプトに使うので、結果の予測ができませんし、ChatGPTのレスポンスに時間がかかる場合もあります。 時間がかかりすぎてる場合、想定してる質問文の長さが異常に長かったりする場合もあるので、タイムアウトにして別の質問文で試してとメッセージを出してあげています。 なのでAPIを叩く時にはrequest_timeoutでリクエストのタイムアウトを設定しています。

3. max_tokensを入れる

これは生成されるトークンの最大数ですが、やはりこれも結果の予測ができないので入れておくといいと思います。

4. 非同期関数で叩く

workerが待ち状態になってタイムアウトしないように openai.ChatCompletion.acreate を使います。タイムアウトでエラーになっていたところ、同僚に教えてもらいました。感謝!

最後に

AIチャットボットのHiTTOでChatGPTを活用した機能を2つ紹介しました。 実際に組み込む際は、正確にコントロールできるものではないので色々と工夫が必要になりますね。

プロダクトに組み込むのは色んな大人の事情などあったりするかと思いますが、今だとマーケティングにも有利だし、ユーザーにとって価値のある機能になる可能性があるのであればドンドン活用していきたいですね!