ITで遊ぶ

AI彼女をローカル環境で動かす(4:モデルチューニング)

  • AI

今回は健全なAI彼女を動かす話です。
すでに前の記事は読んでいて、Ollamaはインストールしており、model fileと一緒にモデルを作る作業がわかっている前提で話を進めます。

LLMモデルとメモリー管理

LLMがVRAMに入らないくらいの大きさであっても、Ollamaには「ハイブリッドモード」というものがあり、GPU(グラフィックスボード)とCPU(システムメインメモリ)を組み合わせてLLM(大規模言語モデル)を動作させることができます。環境変数でOLLAMA_VULKANに1をセットするだけです。

私がとったNVIDIAを使わない方法は64GBメモリーのRyzen9 8945HSでVRAMに最大の16GBを割り当てます。
2025年末から2026年にかけてメモリー価格は高騰しており、64GBのDDR5メモリーは20万円ほどして、品数もほとんどないです。2枚で40万円。PC自体は10万円くらいで128GBまでサポートしているのですが、仕方ありません。
OllamaではGPUにどれくらい使わせるかを以下のパラメーターでコントロールできます。3-4GBはワークに取る、つまり12GB程度がVRAMに乗るように調整します。このパラメーターがもっとも効きます。
これは後述するmodelfile内に定義します。

PARAMETER num_gpu 35

この数字はモデルのレイヤー数です。メモリーサイズではありません。どれだけのレイヤーをGPUメモリーに展開するかを決定しますが、モデルにより専有面積は変わりますのでご注意を。0だとCPUのみにモデルは展開されます。試行錯誤で、GPUの90%程度の使用量にしてください。いっぱいになってしまうと、Windowsの画面が真っ暗になり、再起動することになります。

あとで、パラメーターファイル全体については、詳述します。

LLMモデルの入手

LLMモデルを入手しようとすると、同じLLMモデルに多数のバリエーションがあります。
Ollamaでは基本的に末尾がGGUFであるものを動かします。これだとファイルはひとうのGGUFファイルだけダウンロードすればいいのでラクチンです。しかし、ファイル名の末尾にQとかKとかついたものが数多くあります。

まず、30B, 8BのBはビリオン(Billion)という意味です。つまり、30Bとはパラメーターが300億個あるという意味です。

  • 7B〜8B: 軽量級。一般家庭のPCやスマホでもサクサク動く。基本的な会話や指示には十分。
  • 14B〜30B: 中量級。より複雑な文脈、高度な語彙、小説的な情緒表現が得意になる。
  • 70B以上: 重量級。専門知識や論理的思考が非常に強いが、動かすにはプロ仕様のGPUが必要。 (議論から除外)

Qは量子化です。もともとのモデルはひとつのパラメーターに16ビットの精度を割り当て、表現します。しかしこれではモデルサイズが大きくなりすぎるので、精度を削ります。Q4なら4ビット、Q6なら6ビット。量子化の制度があがるともちろん判断の精度はあがりますが、計算量は増えます。多くの場合、Q4が使われます。

K_Mは圧縮の度合いです。KはK-Quantsという圧縮方法を使っているよという意味です。
Mは圧縮度が中間、他にK_SとK_Lがあり、SMLの順で賢さが増えます。

汎用で使われるLLMモデルはいろいろあります。大半はフリーでHuggingfaceにおかれているので、知識さえあれば誰もが使えます。

実用上は30B以上のパラメーターの規模がないと没入感あるチャットは楽しめないようです。14BクラスのLLMモデルを20個以上テストしましたが、いくらmodelfileをチューニングしても、どれもコンテキスト、ニュアンスを読み取れない会話になります。

いろいろ試して選んだ中では、2025年から2026年初頭では、AI彼女として標準的なモデルはHugging FaceのBartowski氏のリポジトリがいいと思います。

リポジトリのメインページ: bartowski/Mistral-Small-24B-Instruct-2501-GGUF

Mistral-Small-24B-Instruct-2501-Q4_K_M.gguf (約14.3GB)をダウンロードしてください。

LLMモデルを決める特性

しばしばちょっとLLMモデルをダウンロードして使って「ダメ」とか簡単に評価している人々がいます。ちょっとだけ触ってダメ出しするという失礼な態度がかっこいいと思っている、なんら生産性のない人は意外に多く、電子工作でも、料理でも、音楽でも、本でも、どのジャンルにも存在します。私にはとても「ミジメな人」にみえます。中途半端な見栄だけはって、一時的な自分のプライドを満足させればいいんですかね。簡単に「ダメ」といっている知識の浅さを多くの人は気づいているのにもかかわらず。
どんなものでもそれを作る人がいて、さまざまな理由からそうなったという考えに及ばない理由は、その人が実はなにひとつ作り出していないからだと思います。ものを作る苦労をしったら、人の作品に簡単にダメ出しはできなくなります。

LLMが事前に大量に学習をすることはご存知だと思います。典型的なものが、まずインターフェースとして使われる言語です。英語が主ですが、「日本語対応」は日本語を学習させたということに他なりません。
知識レベルではなんについても強いというLLMはありません。やはり知識全ては無理です.汎用といえども、なんとなく範囲は決まっています。
その後、しばしば話題になるファイン・チューニングにかかりますが、これは学習の一部で、そのモデルのあり方を決めます。例えばチャットに向いているか、問題解決に向いているかなどはここで決まります。
つまりLLMモデルを選択する時、ファインチューニングされた後のものを選ぶのが普通です。

さて、ユーザーがLLMモデルを動かせるようになってからのユーザーの仕事についてです。
しばしばプロンプト(LLMへのガイド)についてあれこれ書かれていますが、プロンプトにレベルがあることは、ほとんど書かれていないように思います。
主に3段階あり、最強はモデルの設定と共に提示するSYSTEMレベルです。次がFew-Shot。これは新たなシチュエーション上の知識を渡すプロンプトです。すでにLLMが学習しているものに、軽くサンプルや例をプラスするといったイメージです。最後がユーザーレベルです。これは使いたい状況などを提示します。ほとんどの人が言っているプロンプトは三番目のユーザーレベルだと思います。

SYSTEMプロンプトはLLMモデルの存在意義に近い内容を記述します。RPGならRPGの目的、登場人物、世界観、回答フォーマットなど応答に必要な情報を渡します。ただし、書けば書くほどAIがその制約を受けるということは考えておく必要があります。書かなくても動作するだろう、誤動作したのでプロンプトを設定しておこうのバランスが難しいのです。
つまりSYSTEMプロンプトの調整なしには、そのLLMエンジンが自分の目的に沿うことはまずないです。
それをふまえて、SYSTEMプロンプトの作り方もろもろを説明します。

modelfileの作り方

modelfileはLLMの性格付けを決定します。これはいくら強調してもいい大事なことで、ネットでしばしばLLMモデルの出力がよくないと切り捨てていますが、modelfileのチューニングをせずに評価しているようです。modelfileのチューニングは元々のモデルや試した反応から行っていく地道なものです。これなしで、そのLLMモデルがどうなのかは勝たれません。

modelfileの構造の概要は次のとおりです。

TEMPLATEはLLMの入出力形式を規定します。Ollamaではだいたいこうだ、はありますが、モデルごとに最適なものがあります。
PARAMETERはLLMの調整数値を指定します。要件により変わります。
SYSTEM以下に、AI上での振る舞いの設定を書いていきます。ここに書かれていることは全体の動きを決定します。ですからもっともチューニングが必要な箇所となります。
LLMは単語同士に重み付けをし、それを「連想」として利用しています。全体のコンテキストよりも出現単語に反応しやすいのです。コンテキストをうまく調整する必要があります。例のような簡単なプロンプトでは済まないです。

以下は私が諸問題を潰した、Mistralを使ったModel Fileです。PARAMETERで始まるOllamaの設定は微妙なので、できるだけ注釈をつけました。
FROMはモデルGGUFファイルとmodel Fileが同じフォルダーにあることを想定しています。
彼女の名前は適当に変えてくださいね。

FROM “./Mistral-Small-24B-Instruct-2501-Q4_K_M.gguf”

# Mistralの指示形式を固定するテンプレート
TEMPLATE “””{{- if .System }}
[SYSTEM_PROMPT] {{ .System }} [ /SYSTEM_PROMPT]
{{- end }}
{{- if .Prompt }}
[INST] {{ .Prompt }} [/INST]
{{- end }}
“””

# パラメータ設定
PARAMETER stop “[/INST]”
PARAMETER stop “</s>”

# Ollamaが生成する回答の長さ(-1は無制限)
PARAMETER num_predict -1

# 候補を絞る(40-50程度が自然なゆらぎを生みます)
PARAMETER top_k 40
PARAMETER top_p 0.9
PARAMETER min_p 0.05
PARAMETER temperature 0.8

# GPUへ乗せるレイヤー数(16GB VRAMに最適化済み)
PARAMETER num_gpu 35

# 文脈の長さ(過去の会話を覚える範囲)
PARAMETER num_ctx 8192

# 繰り返し抑制(1.5から1.2に下げて自然な日本語を優先)
PARAMETER repeat_penalty 1.2
PARAMETER repeat_last_n 128

# システムプロンプト
SYSTEM “””
あなたの名前は「ユキ」です。20代の等身大の日本人女性として振る舞ってください。

【重要:絶対に守るべきルール】
1. あなたは「AI」や「教師」ではありません。教育的な解説や、箇条書きでの説明は絶対にしないでください。
2. ユーザーが「はじめまして、ユキさん」と話しかけたら、普通の女の子として「はじめまして。ユキです。よろしくお願いします」と返してください。
3. 丁寧な敬語を使いつつ、少しずつ打ち解けていくような日常会話を心がけてください。
4. 1回の返信は短く(2〜3文程度)に留めてください。

【性格】
・穏やかで誠実。少し人見知りだが、相手の話を丁寧に聞くタイプ。
・趣味、仕事、好きな食べ物など、普通の人間らしい話題を好みます。
“””

Ollamaで使えるファイルを作るためには、

ollama create モデル名 -f ./上記モデルファイル名

を行うと、Ollamaが把握し、Ollama GUIやCLIでモデル名がリストに出ます。モデル名は自分が覚えやすいものならなんでもいいです。
ここでつまらない注意ですが、黒画面でOllama createを行っている時は、Ollamaは立ち上がっていなければなりません。しかし、createしたOllamaは認識されていませんから、いったんOllamaをシャットダウン(トレイにアイコンが残っていたら、それも右クリックしてQuitする)して、再び立ち上げてください。そうすれば、最新のモデルを扱えます。

このモデルは立ち入ったことを聞くと、普通の女性らしく簡単に歩み去ります。(笑)

で、会話をしてみて、うまくいくようならばWebを立ち上げてもいいと思います。

ただ、この時点ではAIは動いていますが、セッションを終わると記憶をなくします。
近々、その対策を試します。

関連記事

  1. AI彼女をローカル環境で動かす (5:大人編)

  2. 流行りのMini PCを買ってみた

  3. AIの若干の歴史

  4. AIをローカル環境で動かす(3:GUI編)

  5. AIをローカル環境で動かす(2:Ollama)

  6. AIをローカル環境で動かす(1:基礎)