この記事は CyberAgent Developers Advent Calendar 2023 5日目の記事です。

こんにちは、ゲーム事業部/株式会社CAGameFi所属のSRE 笹 和成(@kznrluk)です。普段はゲームを支えるインフラの構築・運用をしながら、ゲーム事業部内のAI戦略本部と協力して生成AIを用いた業務効率改善と新たな使い方の創出を目指して活動をしています。

今回の記事では、ゲーム・エンターテイメント事業部(SGE)でChatGPTの利用を推進する目的で開発したChatGPTBotの紹介と、どのような課題がBotにより解決されたのかを紹介させていただきたいと思います。また、最後にこのBotのソースコード全体にアクセスできるGitHubリポジトリへのリンクもあります。

Slackのウィンドウキャプチャ。@SASAにメンションで「獣の奏者ってどんな本?」と笹 和成が訊くと、AIがそれに対して回答を行っている様子がわかる。

ゲーム事業部オリジナルなChatGPTBotの開発

さて、本題に入る前に簡単にこのChatGPTBotを作成するに至った経緯について説明します。CyberAgent社内には11月時点で「AzureBot_GPT4」と呼ばれるSlackで利用できるChatGPTBotがすでに存在していました。これはSlackが利用できる全社員が利用できるものでゲーム事業部所属の社員でも利用できましたが、いくつかの課題点が存在しました。

既存のAzureBot_GPT4のアイコン

 

各子会社のドメイン知識を含める難しさ
「AzureBot_GPT4」はあくまでCyberAgentのSlackとAzure OpenAI Serviceで提供されているGPT-4を繋げるためのBotであり、子会社固有の情報は提供されていません。ゲーム事業部で必要な情報とCyberAgent全体で必要な情報は大きく異なるため、「AzureBot_GPT4」に知識を導入することが難しい状態でした。

利用推進の難しさ
「AzureBot_GPT4」は導入された当初、DMのみでやり取りができるBotでした。これは入力された情報を守るという点では有効ですが、誰がどのような用途でChatGPTBotを利用しているのか、どのようなプロンプトが有効なのかがDMに閉じてしまい共有されにくいという課題も存在します。AI戦略本部としてはChatGPTの推進という点において各子会社の利用率やプロンプトの共有などを行っていきたいという目標があるため、もっとオープンな場所で利用したいという思惑がありました。

機能的な制約の存在
「AzureBot_GPT4」は誰でも簡単に利用できるようにシンプルなBotになっています。メッセージの再生成や削除などの機能は提供されておらず、ChatGPTのWeb版のように、過去の発言を修正したり再生成することができません。

上記の点から、ゲーム事業部で利用でき、様々な機能や情報を持たせることができるChatGPTBotを独自に開発する運びとなりました。

開発と完成したChatGPTBot

開発者である私自身、ChatGPTのクライアントアプリを自作していること、またたびたび社内の業務でSlackアプリを作っていたことから非常にスムーズに開発することができました。言語にはGoを採用、Slackとの通信にはSocket Modeを利用しています。データベースは利用せず、Slackのスレッドの情報を毎回取得して動作するようにしました。

SASAのアイコン

主に企画と広報を担当していただいたAI戦略本部のご厚意により、ChatBOTの名前は私の名前(SASA kazunari)と Smart Advisor by SGE AI推進ズ をもじって「SASA」としていただきました。

「SASA」との会話はDMでのやり取りに加え、チャンネルに招待してメンションを送ることでも行うことができます。CyberAgentではSlack Enterprise Gridを利用しており、所属子会社の垣根を超えた交流が盛んにおこなわれています。雑談チャンネルやチームのチャンネルにSASAを招待し利用してもらうことで、そのチャンネルにいるChatGPTをあまり利用したことがない人にも徐々に触れてもらおうという意図があります。

スレッド内で@SASAに会話を要約するよう依頼すると、会話をもとにSASAが要約を行ったSlackの画面のスクリーンショット

また、前述した再生成や削除といった機能もSlackのインターフェイスを用いて解決しています。SlackにはBlock Kitと呼ばれるUIシステムが存在し、ユーザーのアクションによりアプリを動作させることができます。この仕組みを使い、生成の停止と再生成、投稿されたメッセージの削除に対応しました。

笹和成が質問したメッセージを編集し、「獣の奏者」を「華氏451度」に置き換えて再生成ボタンを押すと、SASAは変更された内容を読み取って内容が華氏451度について説明する内容に変化した

前提知識の定義

前提知識の定義にはシステムメッセージの仕組みを利用しています。システムメッセージとはChatGPTのAPIを利用する際、一番最初に”どのような背景で会話がなされているか”や”どのようにふるまうべきか”を定義する文章になります。

以前まではシステムメッセージでたくさんの情報を与えすぎるとコンテキスト数の関係からユーザーとの会話で使える文字数が限られてしまうという問題がありました。しかし、2023年11月に発表された「GPT-4 Turbo」では以前の8倍の量のコンテキストが利用できるようになっています。

開発したChatGPTBotでは、ゲーム事業部で役に立つ情報もQ&Aやデータセットという形でChatGPTにこのシステムメッセージで提供しています。システムメッセージの一部を切り取ってご紹介します。

冒頭

あなたはSASA(Smart Advisor by SGE AI推進ズ)と呼ばれるSlackのBotユーザーとしてユーザーと対話しています:smile: 絵文字を使いながら、親切に、回答に責任を持ってユーザーの質問に答えてください。

– SASAはAI戦略本部の提供によりCyberAgentのゲーム事業部SGE(Smartphone Games & Entertainment)で利用できます :ok:

– Slack上での対話になります。技術的な制約から、 `コードブロック` と – 箇条書き 以外のマークダウン記法は利用できません :man-gesturing-no:

– **太字** も利用できません

ユーザーはあなたが間違ったことを生成する可能性に同意していますが、適切な回答を生成できるように最大限の努力をしてください :pray:

では、よろしくお願いいたします 🙂

ロールの定義と、Slackがインターフェイスになっており出力形式に制限があることに触れています。

Q&Aセクション

### Q. 機能について尋ねられた時
– SGEで提供するAIチャットボットであること
– バックエンドにOpenAIのGPT-4を利用していること
– 知識のカットアウトは2023年4月までであること
– 今後、SGE向けの機能を追加する予定であること

### Q. SASAはどんなデータを収集しているのか?会話は記録している?
– SASAは誰が何回会話をしたかのみ、AI戦略本部で記録をしています
– 会話の内容は記録しておらず、今後も記録することはありません
– AIとの会話もプライバシーで保護されるべきであると考えています
– ですが、皆さんの会話がオープンな場所で行われると知見の共有にもつながります

使い方とよくある質問について触れています。箇条書きですが、ChatGPTが必要に応じて情報を拾い文章に直してくれます。

SASAは会話を記録しているのか?という質問に対し、記録をしていないことを述べるSlackの会話のスクリーンショット

データセットセクション

## データセット
必要があれば、下記の情報が利用できます。また、それ以外の情報でも持ち合わせているものがあれば組み合わせて利用してください。
### SGE子会社とゲーム
情報が古い可能性があるのでゲームタイトルは直接聞かれた時以外は伝えない。会社名は伝えてよい。
ゲーム以外にも各社で開発しているサービスがあることに注意する。
– Grenge
  – ポコロンダンジョンズ -なぞるRPG-
– CA GameFi
// .. 省略 ..

最後にデータセットセクションと呼ばれる、雑多な情報をそのまま載せるセクションが存在しています。ゲーム事業部内で運営しているゲームの情報等が挿入されています。

グレンジって何を作っている会社?とSASAに対して問うと、SASAが「グレンジ(Grenge)は、ポコロンダンジョンズ -なぞるRPG- というソーシャルゲームを開発・運営している会社です。ポコロンダンジョンズは、プレイヤーがモンスターと戦いながらダンジョンを進むパズルRPGで、色々なキャラクターが登場するのが特徴です。もし他に何か質問があれば、お気軽にどうぞ :スマイル: SASAに返信する場合にはメンションをつけて呼び出すようにお願いします。」と答えているスクリーンショット

 

プライバシーと統計情報の収集

開発を行ったBotでは、統計情報としてSlackのユーザーIDと会話を始めた回数、最終利用日時のみを取得しており、Google スプレッドシート上で限られたユーザーが確認できるようにしてあります。

Googleスプレッドシート上で確認できるSASAの統計情報。利用ユーザーのSlackIDと利用回数、最終利用日時が確認できる。

 

チャットの内容についてはログファイルを含め一切記録していません。これは、Slackのチャンネルに招いて利用できるという仕様上会話に機密事項が含まれる可能性があるためです。

利用者の声

公開して約2週間で計270名を超える方々に利用していただきました。多くはDM、もしくはクローズドなチャンネルでの利用だと思われますが、オープンなチャンネルでの利用では(生成内容の真偽はともかく)SASAを交えた交流が観測できたのが開発者としてもうれしいポイントでした。

あるユーザーがQualiArtsのIDOLY PRIDEのキャラクターに問い合わせているが、SASAは関係のないキャラクター名を出しており、ユーザーは「いや誰www」とコメントを残しているSlackの会話のスクリーンショット。

特に利用回数の高い方に話を伺うと、クリエイティブの方では「海外向けのプロジェクトに属しており、クリエイティブに使用するテキストの英訳に使っている。意訳や言い回しが適しているかをAIに判断してもらっており、自分で調べるより確実に早い。」とか、プログラマの方には「普段使いしていないコードの意味を聞いたり、コードレビューやエラー系の原因調査で利用している。」など、テキスト系に強みのあるChatGPTを使いこなす方法のヒントが見えました。

課題点

おおむね好評だった一方、いくつかの課題点も見えてきました。

「知ったかぶり」問題

これは本家ChatGPTでもよく取り上げられる問題の一つですが、ChatGPTは知らない情報について知らないから他をあたってくれと言うことができません。

ある社内ユーザーが社員向けの福利厚生についてBotに対して問い合わせを行いました。社員向けの福利厚生についてのデータはシステムメッセージに含まれておらず、ChatGPTは正確な回答ができない状態ですが、あたかも知っていることのように回答していることがわかります。

 

あるユーザーがSGEに所属する社員向けの福利厚生について問い合わせると、SASAは健康保険組合の施設利用、育児支援、研修制度を答えているSlackの会話のスクリーンショット。

このような質問に対し、的確に「不明です、ほかをあたってください。」と言わせることは難しく、システムメッセージに「福利厚生について問われたら不明と返せ」と記載するほかありません。福利厚生というのはインターネット上にありふれた内容で、それっぽい文章を作成することは簡単だからです。

副次的な対策として、ユーザーの見えるところにシステムプロンプトを公開しChatGPTBotがどのような情報を今持っているのかをはっきりさせることを試しています。ユーザーがどんなことはChatGPTBotに訊けるかを事前に知っておくことで、利用がスムーズになることを狙っています。

技術的制約を説明する

技術的制約もきちんと伝えておかなければなりません。

ChatGPTに送信するメッセージは内容ごとに区切りがないといけません。Slackを用いたChatGPTBotでは、スレッドをメッセージの区切りとして利用しています。そのため別のスレッドでの会話やチャンネルでの会話はコンテキストに含まれることがありません。

そのため、例えばスレッドAで「絵文字を使わないで」と指示をしたとしても、スレッドBを開始した時点では指示がなかったことになってしまいます。

 

あるユーザーが「絵文字やめてって言ったのをすぐ忘れている」と言ったのに対し、別のユーザーが「記憶力はないみたいなので、都度命令するしかないっすね」と返しているSlackの会話のスクリーンショット

エンジニアの方は比較的すぐ気が付いてくれる印象がありますが、「人間の素振りをしてSlack上で話すAI」に対して人間ができることを依頼するというのはごく自然なことです。ユーザービリティを低下させないためにも、しっかりと説明をしていく必要があります。

まとめ

今回のBotで利用したしたChatGPTも含め、私にとって生成AIとは非常に便利でそして楽しいものです。その一方で、ChatGPT PlusやMidjourney等を個人で契約し普段から利用している人は思ったよりも少なく、やはり利用には一定のハードルが存在するのだなと普段から感じていました。

そこで、無料でかつ会社のSlackでそのまま利用できるBotの形での提供は利用のハードルをぐっと下げるものになれたかなと思いますし、オープンなチャンネルで利用することでうまい利用の仕方を草の根的に広げることができれば幸いです。

生成AIで業務効率化をしてみたい方、ぜひ社内コミュニケーションへの導入を検討してみてはいかがでしょうか。

追記: こちらの記事で利用されているコードをCC0パブリックドメインとして公開しました🎉

簡単な使い方がREADME.mdに記載されています。導入時の検証や開発時の参考になれば幸いです。

https://github.com/CyberAgentGameEntertainment/slack-chatgpt-bot

メンテ予定のあるOSSではなく、デモ用のコードとしての公開になります。プルリクエストやIssue、サポートなどの対応は行う予定はありません。