自社サービスにAIチャットを組み込む!huggingface/chat-uiの機能とカスタマイズ方法
これは、Hugging Faceが提供するチャットアプリケーション「HuggingChat」の基盤となっている、オープンソースのチャットUIコードベースです。大規模言語モデル(LLM)との対話インターフェースを、自分の環境で構築・カスタマイズしたい場合に非常に強力なツールとなります。
このコードベースは、単なるチャット画面のデモに留まらず、プロダクトレベルのチャットUIに必要な要素が詰まっています。
完成されたUIの活用
ゼロからチャットUIを作る手間を省き、すぐに会話ロジックやバックエンドとの連携に集中できます。
TypeScriptとSvelteKit
TypeScriptのおかげで、大規模なコードベースでも型安全性が確保され、メンテナンス性やリファクタリングのしやすさが向上します。
SvelteKitは、高速で軽量なUIフレームワークであり、優れたユーザー体験を提供できます。特に、コンパイル時に多くの処理を行うため、実行時のオーバーヘッドが少ないのが魅力です。
ブランディングとテーマ
環境変数を通じて、アプリ名、説明、アセットなどを簡単にカスタマイズでき、自社のブランドに合わせたチャットインターフェースを構築できます。
機能拡張 Web検索機能やOpenID認証などのオプション機能も組み込まれており、これらを参考に独自の認証方法や新しい対話機能(例ツール利用、RAG機能)を追加しやすい構造になっています。
多様なLLMへの対応
基本的にOpenAI互換のAPIと通信するように設計されているため、Hugging Faceのインファレンスプロバイダーだけでなく、独自のLLMエンドポイントや他の互換サービスとも接続しやすいです。
ベストプラクティス
大手プラットフォームが実際に運用しているコードから、LLMフロントエンドの設計、State管理(Svelteストアなど)、バックエンド連携(WebSocketなど)のノウハウを学べます。
最新技術の採用
Svelteというモダンなフロントエンド技術とTypeScriptの組み合わせを、実践的なプロジェクトで学ぶ絶好の機会です。
huggingface/chat-uiは、SvelteKitで構築されたアプリケーションであり、バックエンドとの連携にはMongoDBを必要とします。
Node.jsとnpm (または yarn/pnpm) がインストールされていること。
MongoDBのインスタンス(ローカルコンテナまたはMongoDB Atlasなどのマネージドサービス)が利用可能であること。
LLMエンドポイント(OpenAI互換API)が必要です。Hugging Face Inference ProvidersやローカルのLLMサービスなどが考えられます。
# リポジトリをクローン
git clone https://github.com/huggingface/chat-ui.git
cd chat-ui
# 依存関係をインストール
npm install
# または pnpm install
プロジェクトのルートディレクトリに、.env.local ファイルを作成し、必須の環境変数を設定します。
# .env.local の例
# 必須: MongoDB 接続URI
# (例: Atlasの場合) MONGODB_URL="mongodb+srv://<user>:<password>@<cluster-url>/<dbname>?retryWrites=true&w=majority"
# (例: ローカルの場合) MONGODB_URL="mongodb://localhost:27017"
MONGODB_URL="あなたのMongoDB接続URI"
# 必須: LLM API キー (Hugging FaceトークンまたはOpenAI APIキー)
OPENAI_API_KEY="あなたのAPIキー"
# LLMエンドポイントのベースURL。Hugging Face Inference Providersルーターなどが設定可能です。
# OPENAI_BASE_URL="https://your-llm-router-url/v1"
# オプション: アプリケーションの表示名を設定
PUBLIC_APP_NAME="私のカスタムAIチャット"
環境変数を設定したら、以下のコマンドで開発サーバーを起動できます。
npm run dev
通常、http://localhost:5173 などでチャットUIにアクセスできるようになります。
huggingface/chat-ui は、コンポーネント指向で設計されており、特にSvelteでの開発に慣れているエンジニアには非常に分かりやすいです。
たとえば、チャットメッセージの表示部分をカスタマイズしたい場合、src/lib/components/chat/Message.svelte などのファイルを参考にします。
カスタムのアバターアイコンを使いたい場合、src/lib/components/Icon.svelte コンポーネントなどを確認し、新しいアイコンを定義したり、既存のコンポーネントを修正したりできます。
例
カスタムフッターの追加
すべてのチャットウィンドウに特定の免責事項を表示するフッターを追加したいとします。
<script lang="ts">
// 必要なインポート
</script>
<div class="flex flex-col h-screen">
<main class="flex-grow">
<slot />
</main>
<footer class="p-2 text-center text-xs text-gray-500 border-t">
これはカスタムの注意書きフッターです。
このサービスは学習目的でのみ使用してください。
</footer>
</div>
Chat UIは、OpenAI互換APIを通じてモデルを取得しますが、特定のモデルを明示的に設定したい場合は、環境変数または設定ファイルで調整します。
アプリケーションのコード内で、LLMへのリクエストを処理している部分(通常はバックエンドAPIルートやサービス)を見つけ、例えばプロンプトの形式やパラメータをカスタマイズすることで、新しいLLM(例
Llama 3)に最適化できます。
例server/routes/api/v1/chat/completions/+server.ts(仮想的なファイルパス)
このファイルでは、ユーザーのメッセージを受け取り、LLMエンドポイントにリクエストを投げる処理が行われています。
// 実際のコードはSvelteKitのAPIルートにあります
// LLMに送信するリクエストボディの構造を調整する例
const body = await request.json();
const { messages, model } = body;
// Llama 3のプロンプト形式に合わせるための変換処理を実装
const convertedMessages = convertToLlama3Format(messages); // ← ここがカスタマイズポイント
const llmResponse = await fetch(`${OPENAI_BASE_URL}/chat/completions`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${OPENAI_API_KEY}`,
},
body: JSON.stringify({
model: model,
messages: convertedMessages, // 変換後のメッセージを使用
stream: true,
// その他のパラメータ (temperature, top_pなど)
}),
});
// ... レスポンスの処理