【画像認識VLモデルの活用引継ぎ書】

目的
SillyTavern →uvicorn → LM Studio の構成で、VL(Vision-Language)モデルを使用し、画像入力を含めた会話が正常に動作するようにする。
既存の「記憶挿入・文脈補強ロジック」を壊さず、テキストのみ加工し、画像データはそのまま通す設計に改修する。

現状の問題整理
・テキストのみの前提で処理が組まれている
・VLモデルでは message[“content”] が文字列ではなく配列になる
・uvicorn側で content を文字列として扱うことで image_url が消えている
・結果として LM Studio に画像が届かず、画像認識が動かない
・一部VLモデルはGPUではなくCPUで動作するため、挙動が重くなる(正常)

VLリクエストの構造理解(重要)
通常のテキスト
content = “こんにちは”
VLの場合
content = [
{type: “text”, text: “これは何?”},
{type: “image_url”, image_url: {url: “data:image/png;base64,…”}}
]
この「配列構造」を壊さないことが最重要

改修の基本方針
・contentは「文字列または配列」として扱う
・配列の場合は分解してテキストのみ抽出する
・加工はテキスト部分のみに適用する
・image_urlは一切触らずそのまま通す
・最終的に元の構造に戻してLM Studioへ送信する

改修ポイント(優先順)

1. テキスト抽出部分の修正
対象箇所例
texts.append(msg[“content”])
修正方針
・contentがstrならそのまま追加
・listなら中のtype==”text”だけ拾う

2. join処理の安全化
ref_text = “\n”.join(texts)
これはそのままでOK
(ここに入る時点でテキストのみになるようにする)

3. 記憶挿入ロジックはそのまま利用
load_external_text や internal_state などは変更不要
テキストだけを扱う前提に維持する

4. 再構築処理の追加(重要)
message[“content”] を直接上書きしない
・元が文字列 → そのまま置き換え
・元が配列 → text部分のみ置き換え、imageは維持

処理の流れ(完成形イメージ)
・messages受信
・各messageごとに
・contentの型を判定
・text部分のみ抽出
・抽出テキストを使って記憶挿入処理
・加工済みテキスト生成
・元のmessage構造に戻す
・textだけ差し替え
・image_urlはそのまま保持
・LM Studioへ送信

最小対応(とりあえず動かす)
・contentがlistの場合は一切加工せずそのまま通す
・これだけで画像認識は動くようになる
・ただし記憶挿入は効かなくなる

推奨対応(本来やりたい形)
・textだけ抽出して記憶処理
・再構築して戻す
・これで「画像+記憶付き応答」が可能になる

注意点
・contentを join しない(画像破壊)
・contentを文字列に変換しない
・message全体を再生成しない(image消失の原因)
・必ず「構造維持」を優先する
・OpenAI互換APIの仕様を崩さない

パフォーマンスに関する補足
・VLモデルは通常LLMより重い
・特にVision部分はCPUで動く場合がある
・VRAMに収まらないモデルは極端に遅くなる
・基本は「VRAM内に収まる軽量モデル」を使うのが安定
・MiniCPM-VなどはCPUでも動作しやすい

uvicorn側の役割整理
・本来は「加工+中継」
・VL対応では「壊さない中継」が最優先
・最悪は完全パススルーでもOK

今後の拡張余地
・画像内容を元に記憶検索する(高度)
・画像とテキストの両方をコンテキストに使う
・Vision結果を一度テキスト化して再投入する二段構成

作業の進め方(おすすめ)
・Step1 contentがlistのときはスキップして通す
・Step2 text抽出ロジックを追加
・Step3 再構築処理を実装
・Step4 全体統合

ゴール状態
・SillyTavernから画像送信可能
・uvicornで記憶挿入が機能
・LM Studioで画像認識+文脈応答が成立
・既存機能(記憶・感情など)を維持したまま拡張完了

コメント