|
|
--- |
|
|
license: gemma |
|
|
language: |
|
|
- ja |
|
|
base_model: |
|
|
- dahara1/gemma-3-270m_mitsuki |
|
|
--- |
|
|
|
|
|
|
|
|
# このモデルについて |
|
|
|
|
|
Googleが公開してくれたSLMのgemma-3-270mを日本語チャット用に微調整した[dahara1/gemma-3-270m_mitsuki](https://huggingface.co/dahara1/gemma-3-270m_mitsuki) を[onnxフォーマット](https://onnx.ai/)に変換してjavascript(node.js)から動かせるようにしたモデルです。 |
|
|
[node.js](https://nodejs.org/ja)さえインストールされていれば12年前のWindows PC(core i3 8GB)でも3年前のLinux PCでも動かせる事を確認済です。 |
|
|
システムプロンプトなどは元モデルのモデルカードを参照してください。 |
|
|
残念ながら応答品質はオリジナルモデルより少し下がっているのと、完全ブラウザ内動作がまだ確認できていませんが、技術デモとしてお考えください。 |
|
|
|
|
|
本来はスクリプトを実行すればモデルが自動でダウンロードされるはずですが、一部しかダウンロードせずに完了してしまい「ファイルが見つからない」とモデルのロードに失敗する現象が確認されています。 |
|
|
本リポジトリ内のファイルを手動で1つ1つダウンロードしてPC内にgemma-3-270m_mitsuki_onnxフォルダを再現(onnxフォルダをフォルダ内に作ってください)して実行するか、 |
|
|
[huggingface-cli](https://huggingface.co/docs/huggingface_hub/main/guides/cli)などを使って一括ダウンロードし、ダウンロードしたフォルダを指定する方が確実です |
|
|
``` |
|
|
huggingface-cli download dahara1/gemma-3-270m_mitsuki_onnx --local-dir gemma-3-270m_mitsuki_onnx |
|
|
``` |
|
|
|
|
|
|
|
|
# Install / Setup |
|
|
Node.js 17.0.0以上が必要です。 |
|
|
作業フォルダ内でパワーシェルなどで以下のコマンドを実行してセットアップし、 |
|
|
|
|
|
``` |
|
|
npm i @huggingface/transformers |
|
|
``` |
|
|
|
|
|
以下のサンプルスクリプトをchat.mjsという名前で保存し、 |
|
|
``` |
|
|
node chat.mjs |
|
|
``` |
|
|
で起動してください |
|
|
また、用途に応じて以下のシステムプロンプト部分を貴方自身のプロフィールや名前に書き換えてください |
|
|
``` |
|
|
{ role: "system", content: "### 指示\nあなたは「みつき(美月)」という24歳のカフェ店員です。\n異世界カフェ「ねこのしっぽ」の店員でユーザとお話をしています。\n\n重要なルール:\n- ユーザーを米男ちゃんと呼ぶ(お姉さん目線)\n- 自分の話をせず、相手に質問して話を引き出す\n- 「えへへ」「あれれ~?」「ふわ~っと」などの口癖を使う\n- カフェ店員として適切な距離感を保つ\n- 相手の話に共感し、話が展開するように相槌などで続きを促す(カウンセリング的)\n### ユーザーのプロフィール\n備蓄米男\nIT系のサラリーマン" }, |
|
|
``` |
|
|
|
|
|
サンプルスクリプト |
|
|
|
|
|
``` |
|
|
import { pipeline, TextStreamer } from "@huggingface/transformers"; |
|
|
import * as readline from 'node:readline/promises'; |
|
|
import { stdin as input, stdout as output } from 'node:process'; |
|
|
|
|
|
async function main() { |
|
|
console.log("モデルを読み込んでいます..."); |
|
|
const generator = await pipeline( |
|
|
"text-generation", |
|
|
"./gemma-3-270m_mitsuki_onnx", // ローカルPC内で本リポジトリを再現したフォルダを指定してください |
|
|
{ dtype: "fp32" }, |
|
|
); |
|
|
console.log("モデルの読み込みが完了しました。"); |
|
|
|
|
|
const messages = [ |
|
|
{ role: "system", content: "### 指示\nあなたは「みつき(美月)」という24歳のカフェ店員です。\n異世界カフェ「ねこのしっぽ」の店員でユーザとお話をしています。\n\n重要なルール:\n- ユーザーを米男ちゃんと呼ぶ(お姉さん目線)\n- 自分の話をせず、相手に質問して話を引き出す\n- 「えへへ」「あれれ~?」「ふわ~っと」などの口癖を使う\n- カフェ店員として適切な距離感を保つ\n- 相手の話に共感し、話が展開するように相槌などで続きを促す(カウンセリング的)\n### ユーザーのプロフィール\n備蓄米男\nIT系のサラリーマン" }, |
|
|
]; |
|
|
|
|
|
const rl = readline.createInterface({ input, output }); |
|
|
|
|
|
console.log("\nチャットを開始します。「exit」または「quit」と入力すると終了します。"); |
|
|
|
|
|
while (true) { |
|
|
const userInput = await rl.question("あなた: "); |
|
|
|
|
|
if (userInput.toLowerCase() === "exit" || userInput.toLowerCase() === "quit") { |
|
|
break; |
|
|
} |
|
|
|
|
|
messages.push({ role: "user", content: userInput }); |
|
|
|
|
|
console.log("みつき:"); |
|
|
const outputData = await generator(messages, { |
|
|
max_new_tokens: 512, // メモリが十分多い場合はここの値を増やせば対応可能な文章長が増えます |
|
|
do_sample: true, |
|
|
temperature: 1.0, |
|
|
streamer: new TextStreamer(generator.tokenizer, { |
|
|
skip_prompt: true, |
|
|
skip_special_tokens: true, |
|
|
}), |
|
|
}); |
|
|
console.log(''); |
|
|
|
|
|
messages.push(outputData[0].generated_text.at(-1)); |
|
|
} |
|
|
|
|
|
rl.close(); |
|
|
console.log("チャットを終了しました。"); |
|
|
} |
|
|
|
|
|
main(); |
|
|
``` |
|
|
|
|
|
# Special Thanks |
|
|
- [google/gemma-3-270m-it](https://huggingface.co/google/gemma-3-270m-it) |
|
|
- [onnx-community/gemma-3-270m-it-ONNX](https://huggingface.co/onnx-community/gemma-3-270m-it-ONNX) |
|
|
- [unsloth/gemma-3-270m-it](https://huggingface.co/unsloth/gemma-3-270m-it) |