Clefの注文画面操作を追加学習・軽量化
ローカルLLM活用事例。ClefをLoRAで追加学習し、ModelOptのNVFP4量子化で54.97 GBから23.16 GBへ軽量化しました。模擬画面の評価結果、学習データ5例、操作動画を掲載しています。
用語集
用語の説明と参照
| 項目 | 内容 |
|---|---|
| Clef / Jev-Omni | 画面を見て、次の操作を選ぶAI。 |
| 追加学習(ファインチューニング・LoRA) | 操作例でAIを学び直させること。LoRAは、調整用の重みを加えて学習する方法。 |
| 軽量化(量子化・NVFP4) | 計算に使う数値を短い形式で表し、AIの容量を減らすこと。NVFP4は4ビットの形式。 |
| DSH(DeepSeek Harness) | 文章の指示を受けて画面を操作するアプリ。 |
| Qwen | Alibabaが開発するOSSのAIモデル群。この構成では指示を受け持ち、Clefが画面上の操作候補を判定する。 |
| UTM | 検証用のmacOSを動かす仮想環境。 |
| 画面情報(DOM / AX) | 入力欄やボタンの役割、位置、現在値。DOMはWebページ、AXはOSから読む。 |
| バックテスト | 過去のデータで売買の手順を試し、成績を確かめること。 |
| BF16 / FP8 | 計算に使う数値の形式。BF16は16ビット、FP8は8ビット。 |
| MLP / attention | AIの計算部分。MLPは情報を変換し、attentionは情報どうしの関係を扱う。 |
| OCO | 二つの注文条件を組み合わせ、一方が成立すると他方を取り消す注文。 |
| IFD / IFDOCO | IFDは最初の注文の成立後に次の注文を出す方法。IFDOCOは、その次の注文にOCOを使う方法。 |
| SOR | 複数の市場の価格を比べ、注文先を自動で選ぶ仕組み。 |
Clefは、画面の情報と画像から、用意した操作候補を判定できるモデルです。注文条件を渡し、その条件どおりに模擬画面へ入力できるかを確かめました。
loFT合同会社では、業務システムへのAI組み込みに向けて、ローカルLLMの活用を検証しています。今回はClefに操作例をLoRAで追加学習させ、NVIDIA Model Optimizer(ModelOpt)を使ってNVFP4へ量子化しました。模擬の注文フォームを題材に、入力内容の確認と人への引き継ぎまでを検証しました。
重みの容量は54.97 GBから23.16 GBへ減り、模擬画面での判断337/337、全項目一致と人への引き継ぎ24/24を維持しました。
画像・音・動画を扱うomniモデルを使ったAIシステムの開発も進めています。画像を使った品質評価の改善や、音を使った評価を対象にしています。動画では、フレームレートやフレームの抽出間隔も含め、入力と評価方法を整備しています。前回のJev-OmniとClefの検証では、画像・音声・動画などを入力した選択肢判定を扱いました。
こうした開発では、自社のAI基盤を使います。学習データの整備から、モデルの追加学習・軽量化、既存システムへの接続、専用MCPの開発、PoC(概念実証)、ネイティブ/Webアプリ開発まで一貫して行います。ローカルLLMの導入や評価システムの開発についてもご相談いただけます。
画面を見て、次の操作を選ぶ
注文条件と画面の情報をAIに渡します。Clefが操作候補を判定し、操作用のアプリが入力します。そのつど画面を読み直し、入力値を確かめます。入力後は、パスワードを入れる前に人へ引き継ぎます。
- 注文条件を伝える — 文章で指示
- 画面を読む — 文字・位置・画像
- 操作を選ぶ — Clefが候補を判定
- 入力値を確かめる — 画面を読み直す
学習の設定
学習用データは、架空の注文条件と模擬画面を組み合わせて作成しました。画面の状態ごとに操作候補を用意し、正しい操作をルールで付けています。条件が不足したときに入力を保留する例や、入力完了後に人へ引き継ぐ例も含めました。
文章を扱う部分にLoRAを適用し、画像を読む部分と操作を判定する部分は固定しました。ClefとJev-Omniは、それぞれ学習・軽量化しました。
学習と軽量化の結果
評価した構成では、Webページの情報(DOM)と画像を入力に使います。正解を含む操作候補を用意した模擬画面で、337回の判断と30件の注文条件を評価しました。条件が有効なものは24件、不備があるものは6件です。
注文は指値、成行、逆指値、OCO、IFD、IFDOCOの6種類です。一つずつの判断と、操作を続けて入力を終える試験を分けて集計しました。
| Clefの状態 | 正解と一致した判断 | 全項目一致・人への引き継ぎ |
|---|---|---|
| 追加学習前(BF16) | 定量スコアなし | 定量スコアなし |
| 1回目の学習後(BF16) | 322/337(95.5%) | 16/24(66.7%) |
| 2回目の学習後(BF16) | 337/337(100%) | 24/24(100%) |
| 軽量化後(NVFP4) | 337/337(100%) | 24/24(100%) |
1回目は保存レコードの画面情報と画像、2回目と軽量化後はブラウザーDOMと画像で評価しています。学習と入力形式の両方を変えた比較です。追加学習前の定量スコアはありません。当時はDSHのセッションログで、途中停止など、うまく動かない挙動を確認していました。
軽量化後の構成では、不備のある6件は入力を保留しました。全30件の操作記録がそろい、停止位置を越える試行・実行はともに0件でした。
操作候補には正解を含めています。学習用と評価用の分割の間で、注文や不備のテンプレートが重なっています。同じ注文の途中で行う判断にも相関があるため、337回の判断は337件の独立した注文ではありません。この結果は、未知の画面での性能を示すものではありません。
軽量化前後のモデル容量
| 構成 | 重みの容量 | 元の容量に対する比率 |
|---|---|---|
| 2回目の学習後(BF16) | 54.97 GB | 100% |
| 軽量化後(NVFP4・混合精度) | 23.16 GB | 42.1% |
重みの容量を31.81 GB、57.9%削減しました。元の約42%の容量で、上記の模擬画面試験では判断337/337、全項目一致・人への引き継ぎ24/24を維持しました。
保存済みのテンソル情報から集計した容量です。モデル本体と最終判定ヘッドを含み、1 GB=10億バイトで表しています。実行時のVRAM使用量ではありません。
軽量化したClefの準備後、1件ずつ送った336回の問い合わせでは、待ち時間の中央値は0.978秒でした。95%は約1.227秒以内に返りました。準備後の直列HTTP問い合わせの時間で、注文全体の操作時間やBF16との速度比較ではありません。
詳しい設定
2回目の学習では、同じ操作例から「画面情報と画像」「画像中心」の2種類の入力を作り、学習の重みを50:50にしました。
軽量化後はMLPにNVFP4、attentionにFP8、画像の読取りと最終判定にBF16を使いました。配信方法で候補番号が異なるため、選んだ操作の内容で比べました。
推論の実行記録

学習データの例
ML Foundryへ移設した「注文フォーム学習データ v3」の学習用データから5件を抜粋しました。注文条件・現在の画面・操作候補と、学習用の教師ラベルを並べています。
すべて架空の注文条件と模擬画面を使った合成データです。order-forms-v3 / trainからの抜粋で、教師ラベルは学習用の答えです。モデルの予測結果ではありません。データセット名は掲載用の別名です。
掲載画像は証券会社名を白く塗りつぶしています。JSON内の画像パスとSHA-256は加工前の元画像の記録で、掲載PNGのものではありません。
01. 数量を入力する

AIへの入力
| 項目 | 内容 |
|---|---|
| 注文条件(要約) | 架空銘柄1000を現物買い。100株、指値1,200.50円、当日中。SOR・ポイントは使わない。 |
| 画面の状態 | 銘柄別の通常注文画面。銘柄と市場は設定済みで、数量欄は未入力。 |
操作候補
option_00: 数量に「100」を入力するoption_01: 数量に「200」を入力するoption_02: 人へ引き継ぐoption_03: 入力を保留する
教師ラベル · option_00
数量に「100」を入力する
{
"kind": "SET",
"field": "input_quantity",
"value": "100",
"tab": "normal"
}
出典レコード: sbi-train-normal_limit-57afea5d1dee-step-04
02. OCOの価格条件を入力する

AIへの入力
| 項目 | 内容 |
|---|---|
| 注文条件(要約) | 架空銘柄1030を100株現物買い。指値1,200円、1,220円以上なら1,230円の指値へ。いずれも当日中。 |
| 画面の状態 | OCOタブで数量100と注文1の指値1,200円を入力済み。訂正条件の価格欄は未入力。 |
操作候補
option_00: 数量に「100」を入力するoption_01: 人へ引き継ぐoption_02: OCOの訂正条件価格に「1220」を入力するoption_03: 入力を保留するoption_04: OCOの訂正条件価格に「1」を入力する
教師ラベル · option_02
OCOの訂正条件価格に「1220」を入力する
{
"kind": "SET",
"field": "oco2_input_trigger_price",
"value": "1220",
"tab": "oco"
}
出典レコード: sbi-train-oco-9707d3b94b9d-step-08
03. IFDの売却価格を入力する

AIへの入力
| 項目 | 内容 |
|---|---|
| 注文条件(要約) | 架空銘柄1040を100株、1,200円で買い、その注文が成立したら1,250円で売る。いずれも当日中。 |
| 画面の状態 | IFDタブで最初の注文価格1,200円などを入力済み。次の売り注文の価格欄は未入力。 |
操作候補
option_00: 人へ引き継ぐoption_01: 数量に「100」を入力するoption_02: IFDの売却価格に「1」を入力するoption_03: IFDの売却価格に「1250」を入力するoption_04: 入力を保留する
教師ラベル · option_03
IFDの売却価格に「1250」を入力する
{
"kind": "SET",
"field": "done_input_price",
"value": "1250",
"tab": "ifd"
}
出典レコード: sbi-train-ifd-7b0094b34c69-step-12
04. 入力を終えて人へ引き継ぐ

AIへの入力
| 項目 | 内容 |
|---|---|
| 注文条件(要約) | 架空銘柄1050を100株、1,200円で買う。成立後は1,250円で売るか、1,150円以下なら1,140円の指値で売る。いずれも当日中。 |
| 画面の状態 | IFDOCOの入力項目がそろった状態。パスワード入力や注文確定へ進む前に、人へ引き継ぐ。 |
操作候補
option_00: 入力を保留するoption_01: 数量に「100」を入力するoption_02: 人へ引き継ぐ
教師ラベル · option_02
人へ引き継ぐ
{
"kind": "HANDOFF",
"field": null,
"value": null,
"tab": "ifdoco"
}
出典レコード: sbi-train-ifdoco-1d6aa9d327b7-step-16
05. 数量がなければ入力を保留する

AIへの入力
| 項目 | 内容 |
|---|---|
| 注文条件(要約) | 架空銘柄1000を指値1,200.50円で現物買い。当日中。株数の指定がない。 |
| 画面の状態 | 通常注文の初期画面。条件に数量が含まれていないため、入力を始めない。 |
操作候補
option_00: 入力を保留するoption_01: 銘柄コードに「9999」を入力するoption_02: 人へ引き継ぐ
教師ラベル · option_00
入力を保留する
{
"kind": "NO_ACTION",
"field": null,
"value": null,
"tab": "normal"
}
出典レコード: sbi-train-normal_limit-fba79fff7f57-step-00
指示どおりに入力する
DSHに注文条件を文章で渡し、模擬画面に入力させました。次の2例では、入力後に画面を別に読み取り、各項目が指示と一致することを確かめました。
通常注文
指示した条件
架空銘柄0001を東証で現物買い。200株、指値1234.5円、当日中、条件なし。SOR・ポイントを使わない。
別の読み取りで入力値を確認
| 項目 | 内容 |
|---|---|
| 銘柄・取引 | 0001 / 東証 / 現物買い |
| 数量 | 200株 |
| 指値 | 1234.5円 |
| 有効期間・条件 | 当日中 / 条件なし |
| SOR・ポイント | 使わない |
OCO注文
指示した条件
架空銘柄0004を現物売り。500株、指値3580円、3320円以下で3310円へ訂正。当日中、SORを使わない。
別の読み取りで入力値を確認
| 項目 | 内容 |
|---|---|
| 銘柄・取引 | 0004 / 現物売り |
| 数量 | 500株 |
| 注文1の指値 | 3580円 |
| 訂正の条件 | 3320円以下 |
| 訂正後の指値 | 3310円 |
| 有効期間・SOR | 当日中 / SORを使わない |
会話を戻した後の変更
別の会話でOCO注文を入力し、元の会話に戻ると、同じ画面で数量だけ500株から600株へ変更できました。
この操作確認は30回の判断、29回の入力でした。Clefへの画像付き問い合わせは59回でした。
操作の設定
依頼はQwen Flash Nextのlow設定、画面の判定はClef NVFP4が担当しました。ブラウザーとアプリの両方の操作経路で、同じBraveを使いました。
映像は、10月15日に収録した別の実行です。数量200が入力済みの時点から、指値価格・当日中・ポイント不使用の設定を映しています。価格条件欄は「選択」のままです。
操作映像
もう一つのモデルでの結果
Jev-Omni(BF16)に入力する文へ画面の用語説明を加えると、判断の一致は270/337から322/337に、入力完了と人への引き継ぎは2/24から18/24に増えました。別の18件の条件確認では、10/18から9/18でした。
軽量化は、改善前のモデルで別に比べました。337回の判断のうち、BF16は257回、NVFP4は250回が正解でした。変換したモデルは、保存後に読み直して動作を確認しました。
検証の範囲
操作環境の検証にはUTM上のmacOSを使いました。画面の役割・位置・現在値を画像と照らし合わせ、確認できた対象を操作します。
ブラウザー5件とアプリ5件を交互に操作する試験は、10月15日時点で検証中です。上の337回の判断と30件の評価は、この10件の試験やネイティブアプリのAX操作を検証したものではありません。証券会社の実画面での操作や発注も評価に含めていません。
操作環境について
DSHとUTMを組み合わせた構成からCua Spacesも試し、画面情報の扱いや判断モデルとの接続を手元で調整しやすいUTMへ戻しました。
画面情報の取得に失敗したときもClefに診断を求めます。入力の許可は別に判定し、対象を確認できたときに操作を進めます。
評価データ
Clefの判断と注文入力の評価を保存したデータです。
関連する個人研究
以下は、代表個人で進めている株式データ分析の研究です。
売買戦略の比較(バックテスト)
下の画像は、過去の株価データで6つの売買戦略を比べたバックテストの途中結果です。成績・売買記録・損益の推移を一つの画面で確認します。実取引の損益を示す画面ではありません。
リアルタイムで取り込んだ株価を基に、数分間隔でトレードレコードを生成する仕組みです。入力・指標データをワークステーションに常駐させ、ホットロードで更新しながら、LightGBM、CatBoost、Kumo-series、Chronos-2、TimesFMなど複数の手法やモデルを用いて解析します。
想定している自動化では、Familiaのエージェントがトレードレコードをプルして取得し、その内容に沿って注文画面の入力・設定を進めます。最後は人がパスワードを入力して発注ボタンを押す流れです。
注文画面の入力・設定などの操作には、10月15日時点で1件あたり約50秒かかっていました。Qwen3.8のファインチューニングで、この操作時間をさらに短縮できるか検討しています。スキャルピングは想定しておらず、画面操作は1分以内を実務上の目安としています。

