Hugging Face: オープンMLモデルでWebアプリジェネレータを作る
Hugging Face は、テキストプロンプトを機能的な Web アプリケーションに変換する生成 AI Web サーバーを作成する方法を詳述しています。HTML、CSS、JavaScript をリアルタイムでストリーミングおよびレンダリングすることで、開発者はオープン機械学習モデルを使用した「text-to-app」パイプラインを構築できます。
技術アーキテクチャとスタック
システムはサーバー環境として NodeJS、ルーティングとストリーミング処理に Express.js を使用して構築されています。コアの生成エンジンは WizardCoder-15B で、Hugging Face Inference Endpoints API を介してデプロイされ、高性能なコード生成に必要なハードウェアアクセラレーションとメモリ(通常は 32GB 以上)を確保します。
代替の実装パスとしては、以下が挙げられます:
- Inference API: 小規模でコミュニティ主導のモデルに適しています。
- Python Bridges: Pythonia のようなライブラリを使用して、Node から Python モジュールを呼び出すことができます。
- Local LLM Libraries:
llama-node(llama.cpp)やtransformers.jsを利用してローカルで実行しますが、ハードウェアアクセラレーションがない場合はリソース消費が大きくなります。
リアルタイムHTMLストリーミング
ジェネレータは、モデルの出力を直接ブラウザへストリーミングすることで機能します。ユーザーが URL パラメータでプロンプトを提供すると、サーバーは初期の HTML ボイラープレート(<html><head></head><body>)を送信し、続いて hf.textGenerationStream を使用して生成されたトークンを HTTP レスポンスに直接パイプします。
このアプローチにより、AI がコードを書き続けている間にウェブページのレンダリングが開始され、プロンプトから機能的なインターフェースへのシームレスな遷移が実現します。
Web生成のためのプロンプトエンジニアリング
生成されたコードが機能的で視覚的にも魅力的になるよう、WizardCoder モデルに対して特定のプロンプト戦略が採用されています:
Tailwind CSS を用いたスタイリング
Tailwind CSS のユーティリティクラスを使用することで、モデルは別個のスタイルシートを必要とせずにその場でスタイルを生成できます。プロンプトは、コンテンツを中央レイアウト(例:<div class="flex flex-col items-center">)でラップするようモデルに指示し、デザイン方向を設定するために <body class="p-4 md:p-8"> のような開始点を注入します。
幻覚(ハルシネーション)の緩和
モデルが指示を繰り返したり、プレースホルダー文字列(例:"lorem ipsum")を使用したりしないように、ガイドでは命令形のトーンと明確な制約を推奨しています。例として以下の指示があります:
- "決してこれらの指示を繰り返さず、代わりに最終コードを書いてください!"
- "これはデモアプリではないので、英語を使用しなければなりません。ラテン語は使用しないでください!"
DaisyUI を用いたトークン最適化
冗長な Tailwind ユーティリティクラスによるトークン消費を削減するため、システムは DaisyUI を統合できます。プロンプト内で DaisyUI のドキュメントの小さな抜粋を提供することで、モデルは長いユーティリティクラスの文字列の代わりに、ショートハンドのコンポーネントクラス(例:<button class="btn">)を使用できます。
動的画像生成の統合
LLM が壊れた画像 URL を生成するという問題を解決するため、システムは専用の /image エンドポイントを実装しています。このエンドポイントは Stable Diffusion 2.1 モデルを Hugging Face Inference API を介して呼び出します。
モデルに <img src="/image?caption=description" /> という形式を使用するよう指示することで、LLM は説明的なキャプションを生成し、サーバーはそれをリアルタイムで実際の画像に変換します。
ユーザーインターフェース実装
ジェネレータのフロントエンドには、Alpine.js をミニマリストフレームワークとして使用し、複雑なビルドパイプラインなしでインタラクティブな UI を作成しています。インターフェースは、プロンプト用の textarea と、/app エンドポイントから生成されたアプリを読み込む <iframe> で構成され、ユーザーはウェブアプリのデザインを迅速に反復できます。