完全ローカル・オフラインの文章生成AI環境を構築した話 – Lemonade + AnythingLLM

はじめに

小説の執筆支援やブログ記事作成を、外部に一切データを送らない完全ローカル環境でできるようにしてみたい、そんな思い付きから始めた構築記録です。
構築した構成はこうです。

  • Lemonade(AMD公式のローカルAIサーバー。NPU+iGPUのハイブリッド推論に対応)
  • AnythingLLM Desktop(見本小説や設定資料、ブログの構成テンプレートなどをナレッジとして登録できるRAGフロントエンド)

どちらも無料・オープンソースで、一度モデルをダウンロードしてしまえば、以降はネットを切断しても動作します。

検証環境は以下の通りです。

項目内容
CPU/NPUAMD Ryzen AI 7 350(Radeon 860M内臓)
RAM32GB
OSWindows 11 Home 25H2

結論から言うと、最終的にQwen3-8B-Hybridという構成に着地しました。ここに至るまでに詰まった部分を記録として残します。


最終的な全体構成

[Lemonade] - NPU(プリフィル)+GPU(デコード)のハイブリッド推論でモデルを稼働
   ↓ローカルAPI (http://127.0.0.1:13305)を提供
   ↓同一PC内のAPI通信のみ(外部通信なし)
[AnythingLLM Desktop]
 ├例1:ワークスペース「小説」:見本小説 + 設定資料(Temperature 0.9前後)
 └例2:ワークスペース「ブログ」:構成テンプレート + 厳選済み情報源(Temperature 0.4前後)

例のように、AnythingLLMで用途ごとにワークスペースを分け、それぞれに合わえたTemperature(生成の多様性を決めるパラメータ)を設定することで、1つの環境を使い分けることができます。


なぜLM StudioではなくLemonadeを選んだか

当初はLM Studio(GUIが枯れていて情報も多い、対応モデル数も豊富)で構築を考えましたが、途中で「どうせならNPUを活かそう」と思い、Lemonadeに切り替えました。
この判断はトレードオフだと思います。

  • LM Studioが勝る点:対応モデル数の多さ、GUIの安定感、初心者へのやさしさ
  • Lemonadeが勝る点:Ryzen AI搭載のNPU+iGPUを実際に活用できる点

Lemonadeは開発が活発な分、まだ粗削りな部分がある印象です。基本的にはLM Studioでいいと思います。


ハマったポイント

ここからが本題です。時系列に沿って、実際にぶつかった問題と解決策を紹介します。

1. Hugging Gace APIの429エラー(2回発生)

モデルをダウンロードしようとすると、以下のようなエラーが出ることがありました。

Error: Hugging face api returned status 429 for AMD/Qwen3-〇B-onnx-ryzenai-1.7-Hybrid
※〇の部分は、ダウンロードしようとしたバージョンで変わります。今回は14B。

これはモデルやLemonadeの不具合ではなく、Hugging Face側が匿名アクセスに課しているレート制限です。
特にModel Managerの検索欄に文字を打つたびにAPIへ問い合わせが飛ぶため、連続入力で制限に引っ掛かりやすいという事情があるようです。

対処法

  • 5~10分待って再試行する(大抵これで治る)
  • 根本対策として、Hugging Faceの無料アカウントを作りアクセストークンを発行、setx HF_TOKEN "hf_xxxx..." で環境変数に登録する(ログイン済みリクエストは制限が緩くなる)

私はトークン発行はせず、時間をおいて再試行で乗り切りました。

2. Windowsファイアウォールにブロックされていた

Lemonade Appを開き直した際、「すべてのパブリックネットワークとプライベートネットワークで、windowsファイアウォールによりlemonade-appの機能のいくつかがブロックされています」というポップアップが出ました。
Lemonadeは自分のPC内でローカルWebサーバーを立てて、画面側がそこにHTTP通信でアクセスする仕組みのため、これは許可しておいた方が良いかなと思います。

これが原因で何かエラーになったわけではありませんが(ポップアップが出てすぐに許可を出したため、これが原因でどんな不具合が起きるのか認識できていない)、一応こんなことが起こりますよという共有になります。

3. CLIコマンドが認識されない

PowerShellで lemonadelemonade-server コマンドを打っても、以下のように怒られることがありました。

用語'lemonade'は、コマンドレット、関数、スクリプトファイル、または操作可能なプログラムの名前として認識されません。

これは大抵、インストール直後にPATH(コマンドの場所の設定)がまだ反映されていない古いPowerShellウィンドウを使っているだけのようで、少し時間をおいてからウィンドウを閉じて新しく開き直すだけで解決しました。

4. アンチウイルスの誤検知

モデルをダウンロードして使おうとしたところ「loading model」から進まず、GPUなどの使用率がすべて0%のまま何時間も変化しない、という状態に陥りました。

原因を掘り下げていくと、Windowsセキュリティの「保護の履歴」に以下の検知記録が見つかりました。

Trojan:Win32/Wacatac.B!ml
影響を受けた項目:lemonade_server\bin\lemonade.exe

これは実行ファイル本体が「トロイの木馬」として検出されてブロックされていた、という状況です。とても心臓に悪かったです。

調べてみると、上記の検知名の構造(Microsoft Defenderの命名規則)は
・Trojan:種別(脅威の大分類)
・Win32:プラットフォーム(対象OS)
・Wacatac:ファミリー名(同じ挙動パターンでグループ化された脅威の名前)
・B:変種(そのファミリーの枝番)
・!で始まる接尾辞:Microsoft内部の分類インジケーター
となっていて、特に今回の接尾辞である !ml は「machine learning」の略で、「クラウド上の機械学習モデルによって検知された」ということを示すそうです。

これは新規・新興のマルウェアに対する保護を迅速に提供するための機能のようで、つまり
「このファイルの特定の中身がブラックリストに載っていたという従来型のシグネチャ照合」ではなく
「ファイルの構造・挙動パターンが過去に学習した悪性ファイル群の特徴と統計的に似ている」というような感じの推測ベースの判定みたいです。

AIに検知させているということなので、当然のごとく悪性ファイルと似ている特徴があれば誤検知することがあるみたいですね。
特に今回使っているLemonadeのような署名や実績の少ない新しめのオープンソースツールでは誤検知されやすいみたいです。

VirusTotal (https://www.virustotal.com) にlemonade.exeをアップロードして確認したところ、68個のエンジン中、ウイルスとして検知したのはMicrosoftのみという結果でした。

Kaspersky、BitDefender、ESETなど主要どころが軒並みクリーンだったことから、誤検知と判断しました。
※私ごときが「これは安全だ」と断定できるものではないので、各自でしっかり確認・判断してください

対処法

  1. Windows セキュリティの「保護の履歴」から該当ファイルを「復元」
  2. 再発防止のため、Windows Defenderの除外設定にLemonade関連フォルダを追加

ここでもう一つ落とし穴がありました。
除外設定に%LOCALAPPDATA%\lemonade_server(実行ファイルの場所)だけ追加しても、実際に読み込まれるLLMモデルのファイル本体は別の場所(%USERPROFILE%\.cache\huggingface)に保存されているため、ここも併せて除外に追加しないと巨大なモデルファイルの読み込みのたびにリアルタイムスキャンが走り、極端に重くなる(実質フリーズしているように見える)可能性があります。
実際、実行ファイルの場所だけ除外設定に追加した状態で動かそうとしたところ、一晩放置しても動いてくれず、ログを確認したら以下の行で止まっていました。

[Info] (Server) Ensuring model loaded: Qwen3-14B-Hybrid

この後に続くはずのバックエンドプロセスがログ上は全く動いておらず、完全にフリーズしているような状態でした。
LLMモデルのファイルが置かれているフォルダも除外設定に追加したら動いてくれたので、おそらく上記の理由で処理が重くなりすぎていたものと思われます。

教訓:アンチウイルスの除外設定は「実行ファイルの場所」と「データ・モデルファイルの場所」の両方をセットで確認すること。

5. 14Bハイブリッドモデルが半日以上ハングした

上記の対策をすべて講じた後も、Qwen3-14B-Hybridだけは動きませんでした。ログを確認すると、以下の行で止まっていました。

[Info] (Server) Post/api/v1/chat/completions - streaming

Postで止まっているので、LLMに投げることはできたが返答が来ないという状態です。
– streaming となっているので、モデルが一語生成するたびにリアルタイムで返してくる仕組みなはずですが、一文字も返ってこなかったので、生成処理が完全にストップしていたんだと思います。

Qwen3-8B-Hybridではすぐに回答が返ってきたので、今回はこのモデルを採用しました。

モデルメモリ使用量今回使用したPCでの適合性
Qwen3-4B-Hybrid約4~5GB快適、速度重視・動作確認用
Qwen3-8B-Hybrid約8~9GB(今回採用)実用速度と文章品質のバランスが良さげ
Qwen3-14B-Hybrid約16GB(非推奨)ハングし、半日以上放置しても動作しなかった

単純な処理能力不足で何時間も音沙汰なしになるとは思えないので、性能不足というよりは「特定のモデルサイズ・ハードウェアの組み合わせに起因する何らかのバグ」みたいなものだったりするのかなという気がします。
ただ、Ryzen AI 7 350がRyzen AI 300シリーズの中で中位クラスの性能であることを考えると、まぁ妥当なラインかなと。

6. AnythingLLMの接続設定でちょっと戸惑ったこと

LLMモデルをLemonadeにしてBase URLを http://localhost:13305/v1 にしたところ、モデルが「not found」になってしまいました。
http://127.0.0.1:13305 (127.0.0.1 は「自分自身」を示す特別なアドレス)と入力することで解決しましたが、上記URLでもいけると思っていたのでちょっと焦りました。

※知識が無い人向けに、上記のURLは「自分自身を指すアドレス」「13305というLemonadeがデフォルトで使うポート番号」の組み合わせで、公開しても問題ないURLになります。
そもそもLemonadeが、「明示的に外部からのアクセスを許可する設定を行う」ということをしない限り、自分自身を指し示す 127.0.0.1 にしか開かれないようになっているので、セキュリティ的な部分はそこまで意識する必要はないのかなと。
(開発が活発に行われているので、いずれこの辺りは変わるかもしれません。触る際は都度チェックするようにした方が良いかと思います。)

「…/v1」まで入力するものだという認識があったのでそうしたのですが、どうやらAnythingLLMは内部で自動的に「/v1」を付け足す仕様になっているみたいです。
実際、後で http://localhost:13305 だけ入力したらモデルを選択できました。

おわりに

完全ローカル・無料での文章生成AI環境は、ちょこちょこつまりどころがありましたが、冷静に原因分析して対処していけばそれほど難しいものではありませんでした。

私は原因分析の際にClaudeを使い倒したのですが、かなり的確な回答が返ってきてくれたのがとても大きかったです。
ですが、これは一般的にもよく言われることですが、AIの言ってることをうのみにするのは危険だと感じる場面もありました。

例えば、5. アンチウイルスの誤検知 のところで言うと、最初にAIが言っていたのは「公式サイトからダウンロードしたmsiファイルをVirusTotalにアップロードして確認」でした。
いやいや、msiファイルを見せたところで意味ないだろと思って指摘したら、アップロードするファイルをlemonade.exeに訂正してくれました。
結果として、msiファイルは68個すべてのエンジンでクリーンだったのが、lemonade.exeは上述の通りMicrosoft Defenderだけ検知しました。

今回はおそらく大丈夫そうなファイルだったし気づいて指摘できたので良かったですが、これが本当にトロイの木馬だったとして、
私が指摘せずにmsiファイルをアップロードしてオールクリーンだねってファイルを復元していたら、地獄になっていました。
考えれば考えるほど恐ろしくなってきます。

「AIを使うと逆に仕事が増える場合もある」であったり、「AIに頼りきりになるのは危険である」
的な話はよく聞きますが、今回私が思ったのは「そんなものはシチュエーションと個人の力量次第である」ということです。

例えば、ある特定のタスクを処理する場合を考えると
・その道のプロ、上級者:AIに頼らず自分でサクサク進めた方が効率的な場面も多い。場合によってはより効率化するために自動化できる部分を選定しAIに任せる・AIにコーディングさせてアプリを作るなどできる。(そういうことを見極める能力も高い)
   →AIの活用方法を考えることができる
・ほどほどに慣れてきた中級者:わからないことがあったらAIに聞く・壁打ちするといったことをすると、AIを使わない場合に比べてより効率的に進められる場面が多い。基礎知識があるからこそ、AIの言うことをうのみにせず正確な判断ができる。
   →定められた活用方法に則って、AIをガンガン使い倒すことができる
・何も知らない初心者:AIに聞くことで作業効率は高まる可能性が高いが、基礎知識が無いゆえに地雷を踏む可能性も高い。AIの嘘(ハルシネーション)に気付けないリスクが高い。
   →情報収集や研修など特定用途での利用や、組織内で作成されたAIツールの利用など、限定的な範囲でのAI利用に留まる(留めるべき)
という感じかなと。

上記は「業務理解度」を軸にした視点ですが、これが「AIに対する理解度」を軸にしても似たような感じの住み分けになるのかなと思っています。

ただし、初心者であっても、なんとなく「ん?」って思えるセンスがある人なら問題なくAIを使いこなせるのかなとも思います。
ここでのセンス = 「合理的・論理的に考えたらそれ間違ってね?知らんけど」ができる思考力
というのが私の中の定義。

世の中の大半はロジカルに組み立てられていると思うので、センスがあれば知識が薄くてもAIを活用できる(AIに知識を正しく補わせられる)という考えです。
まぁ、セキュリティ関連とかリスクが大きすぎる部分はセンスある人でも一人で手を出すのは避けるべきですが…

長くなりましたが、構築した生成AIを使ってみた感触や感想などはありません。
(書きたいものがあるわけではなく、作ってみたくなったから作っただけなので…)

感触はぜひ自分で好きな環境を構築して確かめてみてください。

コメント

タイトルとURLをコピーしました