オープンソース Chatbot UI の魅力とローカル環境構築

# はじめに
本記事ではOSS Chatbot UI の魅力と、ローカル環境で手軽に試すまでの手順を分かりやすくまとめていきます。
※記載内容は2024/03/31時点のものです。

# Chatbot UI とは
ChatGPTライクなユーザインタフェースのオープンソース生成AIチャットアプリです。
MITライセンスなので改変や商用利用もできます。

https://github.com/mckaywrigley/chatbot-ui

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567948/fda6e1d0-6107-381d-d419-6066e2dabd0f.png)

# 特徴
１．利用方法は３種類 [サーバデプロイ、ローカルデプロイ、公式ホスト版利用 ]

２．ChatGPT等のAPIキーの情報を設定することで、様々なLLMを利用できる
　　※カスタマイズして利用したいLLMを追加することも可能

３．会話履歴を保存できる

４．よく利用する設定（モデル/プロンプト/Temperature/Context Length等）を定義できる

５．RAG が利用できる

６．APIキーを指定することで以下のLLM が利用可能

// OpenAI Models (UPDATED 1/29/24)
export type OpenAILLMID =
　  | "gpt-4-turbo-preview" // GPT-4 Turbo
　  | "gpt-4-vision-preview" // GPT-4 Vision
　  | "gpt-4" // GPT-4
　  | "gpt-3.5-turbo" // Updated GPT-3.5 Turbo

// Google Models
export type GoogleLLMID =
　  | "gemini-pro" // Gemini Pro
　  | "gemini-pro-vision" // Gemini Pro Vision

// Anthropic Models
export type AnthropicLLMID =
　  | "claude-2.1" // Claude 2
　  | "claude-instant-1.2" // Claude Instant
　  | "claude-3-haiku-20240307" // Claude 3 Haiku
　  | "claude-3-sonnet-20240229" // Claude 3 Sonnet
　  | "claude-3-opus-20240229" // Claude 3 Opus

// Mistral Models
export type MistralLLMID =
　  | "mistral-tiny" // Mistral Tiny
　  | "mistral-small-latest" // Mistral Small
　  | "mistral-medium-latest" // Mistral Medium
　  | "mistral-large-latest" // Mistral Large

export type GroqLLMID =
　  | "llama2-70b-4096" // LLaMA2-70b
　  | "mixtral-8x7b-32768" // Mixtral-8x7b

// Perplexity Models (UPDATED 1/31/24)
export type PerplexityLLMID =
　  | "pplx-7b-online" // Perplexity Online 7B
　  | "pplx-70b-online" // Perplexity Online 70B
　  | "pplx-7b-chat" // Perplexity Chat 7B
　  | "pplx-70b-chat" // Perplexity Chat 70B
　  | "mixtral-8x7b-instruct" // Mixtral 8x7B Instruct
　  | "mistral-7b-instruct" // Mistral 7B Instruct
　  | "llama-2-70b-chat" // Llama2 70B Chat
　  | "codellama-34b-instruct" // CodeLlama 34B Instruct
　  | "codellama-70b-instruct" // CodeLlama 70B Instruct
　  | "sonar-small-chat" // Sonar Small Chat
　  | "sonar-small-online" // Sonar Small Online
　  | "sonar-medium-chat" // Sonar Medium Chat
　  | "sonar-medium-online" // Sonar Medium Online

※ブログの末尾に機能一覧をまとめていますので詳細はそちらを参照してください

# ローカル環境構築
Windows10、WSL2(Ubuntu) でローカル環境構築する手順を解説します。
※Supabase というDBをDokcerで動作させる構成になっています。Docker Desktopについては一定の会社規模になると有料となるため、WSL2を利用されている方が多いと思いますので、今回はWLS2を利用した手順にしてます。

#### １．WLS2(Ubuntu)・Docker Enjineインストール
@nujust さんの記事が分かりやすかったのでリンクさせていただきました。

https://qiita.com/nujust/items/d7cd395baa0c5dc94fc5

※ WSL2インストール後に以下コマンド実行しておいてください
sudo apt update && sudo apt upgrade　：　パッケージ更新
sudo apt-get install curl unzip　：　curlとunzipインストール

sudo npm install -g n　：　Node.js最新インストール
sudo n latest

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"　：　Homebrewインストール
※実行後に表示されるNext steps:に記載されている手順を実行して環境変数設定もしてください

#### ２．Chatbot UI 設定

##### ステップ１．git clone
コマンド：
git clone https://github.com/mckaywrigley/chatbot-ui.git
```terminal:Ubuntu
~/ChatbotUI # git clone https://github.com/mckaywrigley/chatbot-ui.git
Cloning into 'chatbot-ui'...
remote: Enumerating objects: 4990, done.
remote: Total 4990 (delta 0), reused 0 (delta 0), pack-reused 4990
Receiving objects: 100% (4990/4990), 3.26 MiB | 10.09 MiB/s, done.
Resolving deltas: 100% (2807/2807), done.
~/ChatbotUI # ls -l
total 4
drwxrwxr-x 15 devkita devkita 4096 Apr  8 09:27 chatbot-ui
~/ChatbotUI #
```

##### ステップ２．依存関係インストール
コマンド：
cd chatbot-ui
npm install
```terminal:Ubuntu
~/ChatbotUI/chatbot-ui # npm install
長いので省略
~/ChatbotUI/chatbot-ui #
```

##### ステップ３．Supabase インストール
コマンド：
brew install supabase/tap/supabase

```terminal:Ubuntu
~/ChatbotUI/chatbot-ui # brew install supabase/tap/supabase
==> Auto-updating Homebrew...
Adjust how often this is run with HOMEBREW_AUTO_UPDATE_SECS or disable with
HOMEBREW_NO_AUTO_UPDATE. Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> Tapping supabase/tap
Cloning into '/home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/supabase/homebrew-tap'...

～ 長いので省略 ～

==> supabase
Bash completion has been installed to:
  /home/linuxbrew/.linuxbrew/etc/bash_completion.d
~/ChatbotUI/chatbot-ui #
```

##### ステップ４．Supabase 起動
コマンド：
supabase start
```terminal:Ubuntu
~/ChatbotUI/chatbot-ui # supabase start
15.1.0.147: Pulling from supabase/postgres

～ 長いので省略 ～

Digest: sha256:3537ae89d217432a27fae5b76ce1a2147a0ce1692cc9858a3fcddf5a55c93460
Status: Downloaded newer image for public.ecr.aws/supabase/studio:20240326-5e5586d
Started supabase local development setup.

         API URL: http://127.0.0.1:54321　← ★(1)
     GraphQL URL: http://127.0.0.1:54321/graphql/v1
          DB URL: postgresql://postgres:postgres@127.0.0.1:54322/postgres
      Studio URL: http://127.0.0.1:54323
    Inbucket URL: http://127.0.0.1:54324
      JWT secret: super-secret-jwt-token-with-at-least-32-characters-long
        anon key: XXXXXXXXXX　← ★(2)
service_role key: YYYYYYYYYY　← ★(3)
~/ChatbotUI/chatbot-ui #
```

##### ステップ５．環境設定
.env.local ファイルを用意して設定していきます。
cp .env.local.example .env.local

必須設定項目
・NEXT_PUBLIC_SUPABASE_URL　← ★(1)を設定
・NEXT_PUBLIC_SUPABASE_ANON_KEY　← ★(2)を設定
・SUPABASE_SERVICE_ROLE_KEY　← ★(3)を設定

設定後
```terminal:Ubuntu
~/ChatbotUI/chatbot-ui # diff .env.local.example .env.local
2,3c2,3
< NEXT_PUBLIC_SUPABASE_URL=
< NEXT_PUBLIC_SUPABASE_ANON_KEY=
---
> NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:54321
> NEXT_PUBLIC_SUPABASE_ANON_KEY=XXXXXXXXXX
6c6
< SUPABASE_SERVICE_ROLE_KEY=
---
> SUPABASE_SERVICE_ROLE_KEY=YYYYYYYYYY
12c12
< OPENAI_API_KEY=
---
> OPENAI_API_KEY=ZZZZZZZZZZZ　← オプション項目（今回はOpenAI API利用するために設定しています）
36c36
~/ChatbotUI/chatbot-ui #
```

これで環境設定は終わりです。

#### ３．Chatbot UI 起動

コマンド：
npm run chat
```terminal:Ubuntu
~/ChatbotUI/chatbot-ui # npm run chat

> chatbot-ui@2.0.0 chat
> supabase start && npm run db-types && npm run dev

supabase start is already running.
Run supabase status to show status of local Supabase containers.

> chatbot-ui@2.0.0 db-types
> supabase gen types typescript --local > supabase/types.ts

Connecting to db 5432
(node:1) ExperimentalWarning: Importing JSON modules is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)

> chatbot-ui@2.0.0 dev
> next dev

   ▲ Next.js 14.1.0
   - Local:        http://localhost:3000
   - Environments: .env.local

Attention: Next.js now collects completely anonymous telemetry regarding usage.
This information is used to shape Next.js' roadmap and prioritize features.
You can learn more, including how to opt-out if you'd not like to participate in this anonymous program, by visiting the following URL:
https://nextjs.org/telemetry

> [PWA] Compile server
> [PWA] Compile server
> [PWA] Compile client (static)
> [PWA] Custom worker found: /home/devkita/ChatbotUI/chatbot-ui/worker/index.js
> [PWA] Build custom worker: /home/devkita/ChatbotUI/chatbot-ui/public/worker-development.js
> [PWA] Auto register service worker with: /home/devkita/ChatbotUI/chatbot-ui/node_modules/next-pwa/register.js
> [PWA] Service worker: /home/devkita/ChatbotUI/chatbot-ui/public/sw.js
> [PWA]   url: /sw.js
> [PWA]   scope: /
> [PWA] Build in develop mode, cache and precache are mostly disabled. This means offline support is disabled, but you can continue developing other functions in service worker.
 ✓ Ready in 2.9s
 ⚠ GenerateSW has been called multiple times, perhaps due to running webpack in --watch mode. The precache manifest generated after the first call may be inaccurate! Please see https://github.com/GoogleChrome/workbox/issues/1790 for more information.
```

#### ４．Chatbot UI にアクセス
ブラウザから「 http://localhost:3000/ 」にアクセスして「Start Chatting →」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567948/b7a875a0-cdc7-c732-2e51-50da0480f0a2.png)

EmailとPasswordを入力して Sign Up クリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567948/a7c05611-4870-6623-f396-fe285e4b1d10.png)

ユーザ名を入力して Next クリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567948/0539a0b3-efd7-d321-d0f5-5bd217506432.png)

利用するLLM の APIキーを必要に応じて設定します。
※前の手順で.env.localを直接設定しているので、ここでは何も設定せず Next をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567948/7aac1379-ce96-0de9-2ec7-a3fdfbb27276.png)

設定完了です。Next をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567948/b856728b-dc44-06c3-5851-31d020b76379.png)

#### ５．Chatbot UI を利用
あとは利用するだけです。
画面右上にモデル選択欄があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567948/341385e0-0cf2-6085-afc4-c1634b228d98.png)

質問を投げてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567948/a86539e5-64a6-f7a3-e9c1-bc9c6de22802.png)


各機能についてGit上にあまり記載が少なかったので、簡単にまとめてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567948/fd5642b1-6385-003d-2dcc-016ee8ff183c.png)


# カスタマイズについて
Chatbot UI から Amazon BedrockのナレッジベースAPIを呼び出す方法として以下に書いているので、良かったら見てください。

https://qiita.com/devKita/items/1d370e2afe2b2a82ce9d


# 最後に
いかがでしたでしょうか？
オープンソースなのでカスタマイズが自由にできるので、生成AI開発者の検証環境や企業独自の生成AIチャットツールとして活用できそうですね。