朝日ネットで技術部門の執行役員をしている草場です。
前回に引き続き、社内用ChatGPTについての取り組みを紹介します。
前回記事はこちら techblog.asahi-net.co.jp
6月以降のできごと
前回、GPT-4対応予定としていましたが、あれからの出来事はこのような感じです。
- 7月:Azure OpenAI ServiceからGPT-4 オンボードのメールが届く(見落とす)
- 8月~10月:OktaとSlack Enterpriseの導入に忙しくChatGPTのことをすっかり忘れる。(全く別件ですが全社にSlack導入しました!)
- 11月:Azureからのメールに気付く。既に全ユーザーにGPT-4が開放されている。
GPT-4 turboなどが発表される。 - 11月6日:社内用ChtaGPTクローンの言語モデルをGPT-4に変更
- 11月29日:社内用ChtaGPTクローンをchatbot-uiからLibreChatに変更
以前からGPT-4の利用リクエストは多かったのですが、利用可能になっていることに気付かずメンバーを待たせてしまいました。
コスト予測のためGPT-3.5 Turboでの利用実績がほしかったという背景もありましたが、図らずもそれが達成されたこともありGPT-4の開放を決めました。
コスト
記事の流れとして技術的な話しを纏めたいので、
まずは11月6日にGPT-4に切り替えた結果コストがどうなったかから。
金額を伏せているので全く分からないと思いますが、下図が5月~10月の実績です。
GPT-4導入にあたってはAPI利用料の差額から7月、10月の利用が多い月の20~30倍で試算しています。
GPT-4に変更すると実際どのくらい変わるかというと、下図の通りです。
約18倍になっています。
推測値よりは下振れしているため、メンバーも利用を遠慮したのかな?という印象ですが、それでもなかなかのインパクトです。
コスト面での対策としては以下の2点が考えられます。
- 言語モデルの使い分けの推奨
- GPT-4 turboの早期導入
しかし前者はchatbot-uiでは実現できません。
全メンバーに利用を推進する立場ですので、コスト面の対策もしっかり行っておいた方がみんなが気兼ねなく使い易いだろうという考えで、OSSの更改も行うことを決めました。
OSS選定(LibreChat選定)
幾つか調べた上でLibreChatの導入を決めました。
主に使い勝手とコスト対策がモチベーションですが、OSSの選定基準は以下の通りです。
- Azure OpenAI Serviceでも言語モデルの変更が可能。
- アカウント機能と認証オプション(当社ではGoogle認証を採用しました)
- コンフィグでの機能制御
- メンテナンス・更新頻度
Azure OpenAI Serviceでも言語モデルの変更が可能
これはchatbot-uiではAzure OpenAI Serviceを使用時に言語モデルの切替が出来ず、GPT-4を提供しようとするとGPT-4しか使えないという状況になります。 GPT-4しか選べないというのはコスト面でインパクトがありますし、 GPT-3.5 Turboの方がレスポンスが圧倒的に早いなど実は使い勝手にも影響します。
認証オプション
正確にはチャット履歴機能(違う環境でもチャット履歴が見れる)のニーズがあり、実現するには必ずアカウント登録・認証機能が必要です。しかし、百人規模の利用者に個別アカウント発行はしたくないため、外部アカウントとの連携を必須要件としました。 当社ではGoogle WorkSpaceを採用しているため、Google認証に対応していれば全社員がスムースに利用開始できます。
コンフィグでの機能制御
情報統制やガバナンスの面から、利用させたくない機能を制限できるかは非常に重要なポイントになります。
ChatGPT(クローン)はプラグインが非常に有用ですが、一方でどこに情報が流れているか、その情報がどのように扱われるのかを管理するのが非常に難しいため、
現時点では当社では会社として契約・管理しているAzure OpenAI Service以外のAPIやプラグインなどは全て禁止しています。
OSSの基本機能としてそういった環境を実現できることが望ましいですが、LibreChatでつい最近素晴らしいアップデートが入り、エンドポイントを制限できるようになりました。
やり方としては以下の両方を満たせば良いようです。
1.各API認証パラメータ(OPENAI_API_KEY, CHATGPT_TOKEN, BINGAI_TOKEN, PALM_KEY, ANTHROPIC_API_KEY)を無効化(空白に)する(従来通り)
2..envでENDPOINTSを指定
github.com
例えば、ENDPOINTSを以下のように設定し、各API認証パラメータを空白にすると、Azure OpenAI ServiceしかUI上で選択できないようにすることができます。
# ENDPOINTS=openAI,azureOpenAI,bingAI,chatGPTBrowser,google,gptPlugins,anthropic ENDPOINTS=azureOpenAI
何が変わったかというと、ENDPOINTSオプションが提供される以前はgptPluginsが.envから無効化できませんでした。
メンテナンス・更新頻度
これは説明は要らないと思います。
変化が激しい領域ですので、新しい機能を取り入れていく、将来的な選択肢を増やすためにも盛り上がっているOSSが良いのは間違いないでしょう。
システム構成
相変わらずGoogle CloudからAzure OpenAI Serviceを実行しています。
Azureを勉強できてないというのもありますが、複数のクラウド環境をしっかり管理するのが手間だという理由もあります。
構成としては、前回はサーバ部分がCloudRunでしたがCompute Engineになっています。これはLibreChatがDocker Composeでのインストール手順を公開していることと、MongoDBが必要ですが一旦ローカルインストールで進めたためです。
苦労話
Azureでのモデル切替の設定方法
いまいち理解出来ず若干ハマりました。
要は以下のようにすれば動きます。
AZURE_OPENAI_MODELS=gpt-35-turbo,gpt-4,gpt-35-turbo-16k,gpt-4-32k
AZURE_OPENAI_MODELSの設定はドットは自動削除されるらしいですが、明示的にした方が後から見て分かり易いと思います。
また、Azure OpenAI ServiceではGPT-4に自身の言語モデルを聞いても正しく答えてくれないため、言語モデル切替が上手く動いているかを識別するのに適切な質問を投げるか、ログなどから追う必要があります。
Azure OpenAI
GPT-3.5でもGPT-4でもGPT-3と回答します。
これはAzure OpenAIのよくある質問にも載っているケースです。
ChatGPT GPT-4
本家ChatGPTはGPT-4 turboが適用されていて、2023年4月までの情報が含まれるようになったため正しい回答ができているようです。
ChatGPT GPT-3.5
ちなみにChatGPTのGPT-3.5はお喋りです。
Automated Moderation System
ログイン試験を社内で頼んだらAutomated Moderation Systemに引っかかりログインできなくなりました。
社内用途であればBAN_VIOLATIONSは無効化するか、適切にチューニングしましょう。
Google認証
ユーザーの種類として [外部] を選択しますとありますが、Google WorkSpaceの内部ユーザーだけで使うなら「内部」を選びましょう。
- Click on "Configure consent screen" and select "External" as the user type.
https://github.com/danny-avila/LibreChat/blob/main/docs/install/user_auth_system.md#google-authenticationgithub.com
今後について
当たり前ですが、GPT-4 turboがAzure東京リージョンで開放されたら速やかに提供したいと思います。
ChatGPTクローンについては、社内的に非常に好評で、開発現場からの好感触なフィードバックが多いのですが、ほぼ単体テストを書かなくて良くなったなどの声も聞くため、どこかで生産性評価などもしてみたいと思っています。
また、開発現場からは同じくらいGitHub Copilotも優秀だと声が上がっているため、これは両輪でいこうと思っています。
その他ではSlack GPTにも期待が高まります。スレッドの要約機能や文章の提案などは技術部門以外の生産性にも貢献してくれると期待しています。
最後に
朝日ネットでは新卒採用・キャリア採用を行っております。
興味を持っていただけた方は是非ご応募お待ちしています。
付録(.env diff)
diff .env.example .env 5c5 < APP_TITLE=LibreChat --- > APP_TITLE="タイトル表記を変えられます" 9c9 < # CUSTOM_FOOTER="My custom footer" --- > CUSTOM_FOOTER=空白だとフッターが消える 16a17 > ENDPOINTS=azureOpenAI 24c25 < HOST=localhost --- > HOST=0.0.0.0 48c49 < BAN_VIOLATIONS=true # Whether or not to enable banning users for violations (they will still be logged) --- > BAN_VIOLATIONS=false # Whether or not to enable banning users for violations (they will still be logged) 69c70 < LIMIT_CONCURRENT_MESSAGES=true # Whether to limit the amount of messages a user can send per request --- > LIMIT_CONCURRENT_MESSAGES=false # Whether to limit the amount of messages a user can send per request 72c73 < LIMIT_MESSAGE_IP=true # Whether to limit the amount of messages an IP can send per MESSAGE_IP_WINDOW --- > LIMIT_MESSAGE_IP=false # Whether to limit the amount of messages an IP can send per MESSAGE_IP_WINDOW 100c101 < OPENAI_API_KEY=user_provided --- > OPENAI_API_KEY= 192,193c193,194 < # AZURE_API_KEY= < # AZURE_OPENAI_API_INSTANCE_NAME= --- > AZURE_API_KEY="自分のキー情報" > AZURE_OPENAI_API_INSTANCE_NAME="自分のインスタンス名" 195c196 < # AZURE_OPENAI_API_VERSION= --- > AZURE_OPENAI_API_VERSION="2023-05-15" 207c208,209 < AZURE_OPENAI_MODELS=gpt-3.5-turbo,gpt-4 --- > # AZURE_OPENAI_MODELS=gpt-3.5-turbo,gpt-4 > AZURE_OPENAI_MODELS=gpt-35-turbo,gpt-4,gpt-35-turbo-16k,gpt-4-32k 231c233 < CHATGPT_TOKEN=user_provided --- > CHATGPT_TOKEN= 256c258 < BINGAI_TOKEN=user_provided --- > BINGAI_TOKEN= 272c274 < DEBUG_PLUGINS=true # Set to false or comment out to disable debug mode for plugins --- > DEBUG_PLUGINS=false # Set to false or comment out to disable debug mode for plugins 313c315 < PALM_KEY=user_provided --- > PALM_KEY= 325c327 < ANTHROPIC_API_KEY=user_provided --- > ANTHROPIC_API_KEY= 372c374 < ALLOW_REGISTRATION=true --- > ALLOW_REGISTRATION=false 375c377 < ALLOW_SOCIAL_LOGIN=false --- > ALLOW_SOCIAL_LOGIN=true 378c380 < ALLOW_SOCIAL_REGISTRATION=false --- > ALLOW_SOCIAL_REGISTRATION=true 389,390c391,392 < GOOGLE_CLIENT_ID= < GOOGLE_CLIENT_SECRET= --- > GOOGLE_CLIENT_ID="Google認証情報" > GOOGLE_CLIENT_SECRET="Google認証情報" 426c428,429 < GITHUB_CLIENT_ID=your_client_id --- > # GITHUB_CLIENT_ID=your_client_id > GITHUB_CLIENT_ID= 434c437,438 < DISCORD_CLIENT_ID=your_client_id --- > # DISCORD_CLIENT_ID=your_client_id > DISCORD_CLIENT_ID= 447,448c451,454 < DOMAIN_CLIENT=http://localhost:3080 < DOMAIN_SERVER=http://localhost:3080 --- > DOMAIN_CLIENT="https://公開URL" > DOMAIN_SERVER="https://公開URL"