見出し画像

Transformers.js v3 で Qwen2.5-0.5B-Instruct を試す

「Transformers.js v3」で「Qwen2.5-0.5B-Instruct」を試しました。

1. Transformers.js v3

「Transformers.js v3」は、HuggingFaceが開発した機械学習ライブラリ「Transformers」のJavaScript版の最新版です。

2. Qwen2.5-0.5B-Instruct を試す

(1) エディタで「index.html」を作成。
モデルは「onnx-community/Qwen2.5-0.5B-Instruct」を使いました。

・index.html

<!doctype html>
<html>
<head>
    <title>Transformers.js Chat UI</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <style>
        .container {
            max-width: 800px;
            margin: 20px auto;
            padding: 20px;
            font-family: Arial, sans-serif;
        }
        .input-area {
            margin-bottom: 20px;
        }
        #userInput {
            width: 80%;
            padding: 10px;
            margin-right: 10px;
            border: 1px solid #ccc;
            border-radius: 4px;
        }
        #submitButton {
            padding: 10px 20px;
            background-color: #007bff;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        #submitButton:disabled {
            background-color: #cccccc;
            cursor: not-allowed;
        }
        .response-area {
            padding: 15px;
            border: 1px solid #ddd;
            border-radius: 4px;
            min-height: 100px;
        }
        #loadingIndicator {
            display: none;
            color: #666;
            margin: 10px 0;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Transformers.js Chat UI</h1>
        <div class="input-area">
            <input type="text" id="userInput" placeholder="メッセージを入力してください...">
            <button id="submitButton">送信</button>
        </div>
        <div id="loadingIndicator">処理中...</div>
        <div class="response-area" id="responseArea"></div>
    </div>

    <script type="module">
        import { pipeline } from 'https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.0.1/dist/transformers.min.js';

        let generator;
        let isProcessing = false;

        // UIの要素を取得
        const userInput = document.getElementById('userInput');
        const submitButton = document.getElementById('submitButton');
        const responseArea = document.getElementById('responseArea');
        const loadingIndicator = document.getElementById('loadingIndicator');

        // パイプラインの初期化
        async function initializePipeline() {
            try {
                isProcessing = true;
                loadingIndicator.style.display = 'block';
                submitButton.disabled = true;

                // パイプラインの準備
                generator = await pipeline(
                    "text-generation",
                    "onnx-community/Qwen2.5-0.5B-Instruct",
                    { dtype: "q4", device: "webgpu" }
                );
            } catch (error) {
                responseArea.textContent = "エラー: モデルの読み込みに失敗しました: " + error.message;
            } finally {
                isProcessing = false;
                loadingIndicator.style.display = 'none';
                submitButton.disabled = false;
            }
        }

        // メッセージを送信して応答を取得する関数
        async function generateResponse(userMessage) {
            if (isProcessing) return;
            
            try {
                isProcessing = true;
                loadingIndicator.style.display = 'block';
                submitButton.disabled = true;

                // メッセージの準備
                const messages = [
                    { role: "system", content: "あなたは役立つアシスタントです。" },
                    { role: "user", content: userMessage }
                ];

                // 推論の実行
                const output = await generator(messages, { 
                    max_new_tokens: 256,
                    do_sample: true,
                    temperature: 0.3,
                });
                const response = output[0].generated_text.at(-1).content;
                responseArea.textContent = response;
            } catch (error) {
                responseArea.textContent = "エラー: " + error.message;
            } finally {
                isProcessing = false;
                loadingIndicator.style.display = 'none';
                submitButton.disabled = false;
            }
        }

        // クリック時に呼ばれる
        submitButton.addEventListener('click', () => {
            const message = userInput.value.trim();
            if (message) {
                generateResponse(message);
                userInput.value = '';
            }
        });

        // 初期化
        initializePipeline();
    </script>
</body>
</html>

(2) Chromeで開く。
初回起動時はモデルのダウンロードに時間がかかります。



いいなと思ったら応援しよう!