ハイパーマッスルエンジニア

Vim、ShellScriptについてよく書く

LibreChat で Command R+ を使えるようにする

2024 年 4 月 4 日に発表された「Command R+」が GPT-4 とほぼ同じ回答精度で、レスポンスがめちゃくちゃ速く、かつ API の利用が商用利用じゃなければ無料だったので、絶対に LibreChat に組み込みたいと思った。

LibreChat はいわゆる ChatGPT クローンと呼ばれる OSS で、UI は ChatGPT とほぼ同じで、回答に利用する API を GPT4 や Gemini、Claude3 など、自分の好きなものを指定できる。ローカル上で動くのはもちろん、デプロイするのも簡単で、数ある GPT クローンの中では一番使い勝手が良いと思う。UI を忠実に ChatGPT に寄せているのが良い。

LibreChat の UI。ChatGPT とほぼ同じ

今回はこの LibreChat で、Cohere が発表した「Command R+」を動かせるようにする。
ローカルの docker-compose 上だけでなく、デプロイした先でも Command R+が使えるようにするところまでやる。
下記のように AI 選択の箇所で Cohere が選べるようになる。

Cohere が選択でき、Command R+ を指定できる

今回の変更内容は下記。

github.com

※僕のリポジトリは他の変更も入っているので、もしご自身でデプロイする際は本家のリポジトリをforkしてやったほうが良いです!

ローカルの docker-compose で動かす手順

まずはローカルの docker-compose 上で動かす方法を説明する。LibreChat のドキュメントREADME にやるべきことが書いてあり、やることも少ないので簡単だ。

  1. .envCOHERE_API_KEY=xxxxxxxxを追加
  2. librechat.yamlを作成し、Cohereの定義を追加する
  3. docker-compose.override.ymlを作成し、volumes の設定を追加

1. .envCOHERE_API_KEY=xxxxxxxxを追加

Cohere のダッシュボードで取得した API_KEY を.envに記載する。API_KEY は TRIAL のもので OK。

Cohere > ダッシュボード > API_KEYS > Trial keys

.env

COHERE_API_KEY=xxxxxxxxxxxxxxx

2. librechat.yamlを作成し、Cohereの定義を追加する

LibreChat のリポジトリにはlibrechat.example.yamlが既にあるので、コピーしてlibrechat.yamlを作成する

cp librechat.example.yaml librechat.yaml

librechat.yamlを開き、customの箇所に下記を追加する

custom:
  # Groq Example
  - name: 'groq'
    apiKey: '${GROQ_API_KEY}'
    baseURL: 'https://api.groq.com/openai/v1/'
    models:
      default: ['llama2-70b-4096', 'mixtral-8x7b-32768', 'gemma-7b-it']
      fetch: false
    titleConvo: true
    titleModel: 'mixtral-8x7b-32768'
    modelDisplayLabel: 'groq'

+  - name: "cohere"
+    apiKey: "${COHERE_API_KEY}"
+    baseURL: "https://api.cohere.ai/v1"
+    models:
+      default: ["command-r","command-r-plus","command-light","command-light-nightly","command","command-nightly"]
+      fetch: false
+    modelDisplayLabel: "cohere"
+    titleModel: "command"
+    dropParams: ["stop", "user", "frequency_penalty", "presence_penalty", "temperature", "top_p"]

今回追加した定義はREADMEに書いてある。

3. docker-compose.override.ymlを作成し、volumes の設定を追加

最後に docker-compose.yml に設定を追加する。
docker-compose.override.yml.exampleをコピーしdocker-compose.override.ymlを作成。このdocker-compose.override.yml.exampleもリポジトリに既に用意されている。

cp docker-compose.override.yml.example docker-compose.override.yml

このdocker-compose.override.ymlに以下を記載(というかコピーした時点で既に記載してあるのでコメントアウトで OK)

version: '3.4'

+ services:
+   api:
+     volumes:
+     - type: bind
+       source: ./librechat.yaml
+       target: /app/librechat.yaml

これで準備は完了。Docker コンテナを立ち上げ直す。

docker-compose up

docker のログで下記のようにcustom config file loadedと表示されていたら OK!

「custom config file loaded」の後に今回追加した librechat.yaml の内容が出力されている

http://localhost:3080にアクセスし、AI 選択の箇所に Cohere が表示される!

Cohere が選択できるようになっている

ここでもし選択できない場合、ローカルでnpm run backendを実行してしまっていないかを確認したい。
自分はこれをやってしまっていて、既にhttp://localhost:3080が npm の方に食われているのに docker を立ち上げ、localhost:3080 にアクセスしても変化がない、と悩んでた。npm で立ち上げた方には今回追加した定義が適用されないので当然であった。

デプロイ先で動かす手順

続いてデプロイ先でも Cohere を選択できるようにする。ローカルでは docker-compose を使っているので上記の設定で OK だが、デプロイ先では Dockerfile を指定して起動していると思うので、そちらでも動くようにする。
ちなみに自分はRender.comにデプロイしている。LibreChat ドキュメント通りにデプロイしたので、Render の設定も特に変えず下記のような感じ。Render じゃなくてもデプロイ先で Dockerfile を指定して起動しているなら今回の対応でいけるはず。

デプロイ先では Dockerfile を指定して起動

やることは単純で、要はlibrechat.yamlをDockerfileのbuild時に含められればいい。
手順 1 はローカルと同じ、手順 2 は.envではなくデプロイ先で環境変数の設定。手順 3 は.gitignore.dockerignoreを修正。

1. `librechat.yaml`を作成し、`Cohere`の定義を追加する
2. デプロイ先に環境変数`COHERE_API_KEY=xxxxxxxx`を追加
3. `.gitignore`と`.dockerignore`から`librechat`の定義をコメントアウト

.gitignore

#config file
+ # librechat.yaml
librechat.yml

.dockerignore

# Specific patterns to ignore
data-node
meili_data*
+ # librechat*
Dockerfile*
docs

デプロイ先で環境変数をセットするのも忘れずに。

デプロイ先 にも環境変数 COHERE_API_KEY をセット

これでリポジトリにlibrechat.yamlを push できるようになり、Dockerfile のビルド時にlibrechat.yamlを読み込めるようにできた。変更内容をpushし、デプロイ先でRebuildしよう。

デプロイ先でも Cohere を指定できるようになった!

終わりに

Command R+はレスポンスがとにかく速い。商用利用でなければ無料というのも正直信じられないし、商用利用したとしても値段が GPT の 1/3 なのが驚き。近い内に自分のやっているサービスにも確実に組み込むと思う。トライアル版の制限はあるが、API呼び出しが月に5000回はOKという太っ腹ぶりなのでそう困ることはないと思う。
また、LibreChat の対応もマジで早くて、Command R Plus が発表されてから 1 日ぐらいで対応されていた。自分が組み込もうと思ったその19 時間前に作られた PRがあって、ハンバねえなと思った。対応の速さの肝は設計にあって、エンドポイントやレスポンスの仕様が異なるサービスであっても、「カスタムエンドポイント」という仕組みを用意しておくことで、いろいろなサービスに柔軟に対応できるようになっている。
LibreChat はコミュニティも活発で、Discord で毎日ワイワイやり取りされているので見ていて楽しい。自分も手元で LibreChat に追加した機能を Discord で共有したらすぐコメントもらえて嬉しかったことがある。
ChatGPT から LibreChat に乗り換えてから 3 ヶ月ぐらい経つが、今のところ不満はないし毎回のアップデートでワクワクさせてくれるので、乗り換えて良かったと思う。

参考