ローカル LLM エージェントが「まともに動く」時代 ── Vicki Boykis の Gemma 4 12b-qat + Pi + LM Studio ワークフローを 5 年モノ Mac で再現する

1. 「ローカル LLM は使えるようになった」 ── 840pt HN 議論の争点 2026 年 6 月 15 日、機械学習エンジニアの Vicki Boykis が公開した「Running local models is good now」は、Hacker News フロントページに 2 日以上居座り、最終的に 840pt / 276 コミットメント (Boykis 自身の hacklog note 集計 値) を獲得した。記事の中核テーゼはこうだ。 「12 ヶ月前まで『ゴミ』だったローカル LLM が、Gemma 4 ファミリの登場でフロンティアモデルの約 75% の精度と速度でエージェンティック・コーディングのループが回るようになった」 しかし同じ日に、Hashicorp 共同創業者 Mitchell Hashimoto が X 上で明確に反論している (Boykis 記事へ vickiboykis.com 経由で参照)。 「『ローカルモデルはゴミ』から『ローカルモデル使えるじゃん』への変化は 12 ヶ月で起きた。でも、まだ十分 (good enough) とは思っていない。Opus 4.5 クラスのローカルモデルが必要。それが実現したら、世界がひっくり返る」 二人の議論は正反対に見えるが、実はどちらも正しい。違いは「何を基準にするか」だけだ。本稿は Boykis の 「ローカル LLM + Pi コーディングエージェント + LM Studio + Docker」ワークフロー を、当ブログ 6/16 の Open-Weight Frontier 日本企業ハブ が扱わなかった 「agentic harness セットアップ」軸 で完全に再現する。読者が得るべき結論は 1 つだ。 ...

June 18, 2026 · 41 min · 8070 words · Appwright

Forge guardrails入門:ローカル8Bモデルのエージェント精度を53%→99%に引き上げるオープンソースガードレールフレームワーク

Forge guardrailsとは ForgeはTexas InstrumentsのAI DirectorであるAntoine Zambelliが開発したオープンソースのPythonフレームワーク(MITライセンス)で、ローカルLLMのエージェントタスク精度を劇的に向上させる。その主張はシンプルで強力だ:ローカルLLMの信頼性問題はモデル問題ではなくフレームワーク問題である。 2026年5月のShow HNでデビューし、686ポイント・252コメントを獲得、7日間にわたってHNフロントページを維持した。ACM CAIS 2026(サンノゼ、5月26-29日)でも論文が採択されており、97のモデル/バックエンド構成、18シナリオ、各50回の実験に基づく評価結果が学術的に裏付けられている。 なぜローカルLLMのエージェント精度が低いのか 8BクラスのローカルLLMをエージェントとして使うと、生の状態では精度が53%程度に留まる。これはモデルの知識不足ではなく、推論ループのエラーハンドリング不足が原因だ。Forgeの開発チームが発見した最も驚くべき事実は、同一のモデル重みでもバックエンド(推論サーバー)の違いによって7%〜83%の精度差(76ポイント差) が生じるという点である。モデル自体の改善ではなく、推論パイプラインの設計次第で精度が大きく変わることを示している。 5層のガードレールアーキテクチャ Forgeはモデル自体を一切変更せず、推論ループのラッパーとして5層のガードレールを挿入する。 1. リトライナッジ(Retry Nudges) ツール呼び出しが失敗した際に、失敗理由を説明して最大3回まで再試行させる。アブレーション実験ではこのレイヤーを無効にすると24〜49ポイントの精度低下が発生する — Forge全体で最も影響の大きいレイヤー。 2. ステップ強制(Step Enforcement) ワークフローにrequired_stepsとprerequisitesを定義し、依存関係のあるツールの実行順序を強制する。たとえば「検索→参照→回答」のような必須フローを守らせる。 3. エラー回復(Error Recovery) ツール実行エラー(例外・タイムアウト等)をモデルにフィードバックし、自己修復を促す。約10ポイントの精度貢献。 4. レスキュー解析(Rescue Parsing) JSONコードフェンスの誤記、Mistral括弧記法の混入など、フォーマット異常を救済する。あらゆるモデル・バックエンドで発生する問題に対応。 5. VRAM認識コンテキスト管理 nvidia-smiを参照してVRAM残量に応じたトークン予算を動的計算する。古いターンの階層的圧縮(Tiered Compaction:最新2ターンを完全保持、古いターンを予算内に圧縮)により、CPUフォールバックを防止する。 3つのデプロイモード Forgeは導入パターンに応じて3つのモードを提供する。 モード ユースケース 特徴 WorkflowRunner 新規プロジェクト バッテリー同梱。ツール定義・バックエンド接続・ガードレールを一貫提供。SlotWorkerによるマルチエージェントGPU共有スロット管理を含む Proxyサーバー 既存ツールチェーンへの透過導入 OpenAI互換API + Anthropic Messages API対応。opencode・Continue・aider・Claude Codeと連携可能 ガードレールMiddleware 独自オーケストレーションループ ResponseValidator・StepEnforcer・ErrorTrackerを個別コンポーネントとしてimport コード例で見る3パターン WorkflowRunner:最小構成 import asyncio from pydantic import BaseModel, Field from forge import ( Workflow, ToolDef, ToolSpec, WorkflowRunner, OllamaClient, ContextManager, TieredCompact, ) def get_weather(city: str) -> str: return f"72°F and sunny in {city}" class GetWeatherParams(BaseModel): city: str = Field(description="City name") workflow = Workflow( name="weather", description="Look up weather for a city.", tools={ "get_weather": ToolDef( spec=ToolSpec( name="get_weather", description="Get current weather", parameters=GetWeatherParams, ), callable=get_weather, ), }, required_steps=[], terminal_tool="get_weather", system_prompt_template="You are a helpful assistant.", ) async def main(): client = OllamaClient( model="ministral-3:8b-instruct-2512-q4_K_M", recommended_sampling=True, ) ctx = ContextManager( strategy=TieredCompact(keep_recent=2), budget_tokens=8192, ) runner = WorkflowRunner(client=client, context_manager=ctx) await runner.run(workflow, "What's the weather in Paris?") asyncio.run(main()) Proxyモード:ツール透過導入 # 自分でllama-serverを起動して連携 python -m forge.proxy --backend-url http://localhost:8080 --port 8081 # クライアント側(OpenAI互換API) from openai import OpenAI client = OpenAI(base_url="http://localhost:8081/v1") # → 以降、通常のOpenAI API呼び出しでForgeガードレールが透過適用 # Claude Code連携 ANTHROPIC_BASE_URL=http://localhost:8081 ANTHROPIC_AUTH_TOKEN=anything claude Middleware:独自ループへの組み込み from forge.guardrails import Guardrails guardrails = Guardrails( tool_names=["search", "lookup", "answer"], required_steps=["search", "lookup"], terminal_tool="answer", ) while True: response = my_custom_llm_call(messages) result = guardrails.check(response) if result.action == "retry": messages.append({"role": result.nudge.role, "content": result.nudge.content}) continue if result.action == "step_blocked": messages.append({"role": "user", "content": result.nudge.content}) continue if result.action == "fatal": raise RuntimeError(result.reason) execute(result.tool_calls) if guardrails.record([tc.tool for tc in result.tool_calls]): break ベンチマークとコスト Forgeの評価ハーネスは以下の結果を公表している: ...

May 27, 2026 · 12 min · 2303 words · Appwright

5年前のMacBookでGemma 4 31Bを動かし、1年分の動画をローカルAI検索可能にする実践ガイド

問題:編集者がいない、ラベルもない動画アーカイブ マサイマラでサファリロッジを運営しながらソフトウェアエンジニアとしても活動するNJ氏は、ある矛盾に直面していた。日々撮影される映像は増え続けるが、編集のボトルネックは解消されない。SNSアカウントは「コンテンツ不足」ではなく「編集時間不足」で更新が止まっていた。 初期の解決策はSaaSの組み合わせだった。Eddie AI、Higgsfield MCP、Submagic、Buffer — 月額約140ドルのスタック。しかし生成AIビデオを本物の旅行ブランドで使うリスク(TripAdvisorで致命的)と、週3〜5投稿の現実的な目標に阻まれた。 ここで著者は重要な気づきを得る。すべてのAI動画編集ツールは、映像がすでにラベル付けされている前提で設計されている。 しかし実際のアーカイブは IMG_1103.MOV が Mara june 2024 backup final FINAL に放り込まれているだけ。本当に必要なのは編集ツールではなく、検索可能なインデックスだった。 アーキテクチャ:1,400行のPythonローカルパイプライン 8つのステップで1クリップあたりのメタデータを抽出し、.description.md のサイドカーファイルとして保存する。 ffprobe — コーデック、解像度、フレームレートなどの基本メタデータを取得 exiftool — iPhone、DJI、ドローンのGPS緯度経度・高度を抽出 逆ジオコーディング — Nominatimで座標を地名に変換 ffmpeg — 5フレームを均等間隔で抜き出し、1920pxにリサイズ WhisperX — 単語レベルのアラインメント付き文字起こし + pyannote話者分離(97言語対応) insightface — 顔検出、512次元ArcFace埋め込みをSQLiteデータベースに保存 Gemma 4 31B — フレーム + 文字起こし断片 + フォルダコンテキストからYAMLフロントマターと説明文を生成 サイドカーファイルを書き出し # Gemma 4 が IMG_1103.MOV に対して生成したメタデータ lighting: bright_daylight time_of_day: midday color_palette: warm_greens people: 1 faces: [512次元埋め込みベクトル...] location: "-1.234, 35.678" description: | サファリテントのデッキに立つエリー。 背景にサバンナが広がる。カメラが 室内から室外へパンする。 このサイドカーファイル形式の利点は3つある:プレーンテキストでgrep可能、ドライブを移動しても壊れない、中央データベースが不要。 ...

May 23, 2026 · 17 min · 3374 words · Appwright