RooCodeでバイブコーディング 完全ローカルは実用的か? Gemma4 Qwen3.5使用
こんにちはRcatです。
今回はローカルLLMとVSCode拡張機能のRooCodeについてやっていきます。
今までもGeminiに関数を書いてもらったりはしてましたが、コード全体を見てAI駆動的なのはやってなかったんですが、高性能なモデルがどんどん出てくる昨今、ローカルでも回せそうな感じがするので試そうと思います。

次回予告
はじめに
利用規約
情報や作品の活用時は事前に利用規約をご確認ください。
コメントについて
利用規約のガイドラインを確認の上コメントしてください。
則っていないコメントは削除します。
概要
バイブコーディングとは
AIに指示してプログラムを書かせることです。
実装の方向感が決まったら、コーディングはAIに投げたり、改修を投げたり…。
チャットで関数単位で書いてもらうのではなく、AIをプロジェクトに参加させて書いてもらう感じになります。
そのためうまくいけば非常に効率よく作業できたり、プロジェクト全体を見通した整合性のとれたコードを得られたりします。
普通にチャットでやってもらう場合は、前提情報を絞って渡さないといけなかったり、手直ししたところを再UPするとコンテキストみ切れて履歴消えたりと面倒ですが、バイブコーディングならそういった悩みから解放されます。
RooCodeとは
VSCodeの拡張機能で、好きなLLMプロバイダをアサインしてワークスペース内でサポートしてくれるAIエージェントを実行するものです。
なので、RooCodeがAIではない点は注意してください。
あくまでもRooCodeは器であり、魂(AIに魂とかw)の部分は私たちが選択します。
なので結果がダメだったとしてもRooCodeがすべて悪いわけではありません
RooCodeを導入すると、「このエラーみて」「差分確認して」「OOの機能入れて」などを言うだけで勝手にコードを見て分析してくれるようにAIを誘導して実行してくれます。
必要に応じて書き換えリクエストもしてくれるので、作業効率が大幅にUPします。
最近はプログラミングよりも、システムを作り上げるほうに面白みを感じているので、ちょうどいいですね。
なぜこのタイミングで?
Qwen3.5やGemma4などのやばいモデルが出たからです。今までと一味違うらしいじゃないですか。
では早速使っていきましょう
準備
AIプロバイダーの用意
対応している場合は好きなクラウドサービスまたはローカルから選択できます。
今回は外部に持ち出さなく、トークンを気にせず使えるローカル実行とします。
使用するのはllama.cppです。
ビルド云々が難しい人はOllamaでもOK。というか多くの人はこっちを選んでるのかな?
私はllama-cpp-pythonの時代からの付き合いなので断然llama.cpp派です。
Ollamaの内部の推論エンジンはllama.cppなのでほぼ同じ。難しいけどカスタム効くのがllama.cppって感じですかね。この前のBonsaiとか速攻試せましたし。
この記事で登場するモデルは下記です
Gemma4 26BA4 Q8
Gemma4 31B Q8
Qwen3.5 122BA10 Q4
Qwen3.5 9B Q8
AI計算機は下記です
EVO-X2
CPU Ryzen AI MAX+ 395
iGPU Radeon8060S (RTX4060~4070相当)
DDR5 8000MHz 128GB (うち96GBをVRAMへ)
Ubuntu 24.04
メインPC
RTX5070 Ti
Qwen3.5 9B Q8のみ実行
拡張機能のインストール
VS Codeの拡張機能から検索してインストールするだけ。簡単。

RooCodeの初期設定
まずは使うAIを選択します。
llama.cppの場合はOpenAI Compatible。それ以外はOllamaやLM Sutudioなどよく聞く名前のはそろってますね。llama.cppはニッチかw

次に接続先とAPIキー
ローカルなので適当でOK。wasdとかでw
コンテキストは最低48k。これでも作業は詰まるので64kとかあるといい。
なお、ここだけではなくAIを立ち上げてる方できちんと設定して合わせてください。

少し使った感じ、32kだと少しファイル読み込むだけで埋まって圧縮→読み込みなおし→圧縮の無限ループになります。もう何も進みません。
48kでもタスクによってはなるんですが、これ以上になってくるとローカルAIでは繰り返し始めたりして安定しません。まぁこの辺りはモデルによるところが大きいですが。
なので量子化もQ8か、できればしないことをお勧めします。
私も基本はQ8。122BだけどうしようもないのでQ4にします。
あとは自動承認ですね。
何かアクションを起こす際にユーザーに確認してくるのですが、読み込み如きで毎回確認されても困りますので、読み取りは許可。
コマンド実行もdir /bなど読み取り系は基本許可。
roocodeが一覧表示ツールとか提供してるはずなのに、AIはdir使ったりするのでw

コンテキストの圧縮
これ70~80%にしてください。
ギリギリの状態でタイミング悪く巨大ファイル読むとコンテキストオーバーして強制終了になりかねません。なので、7割くらいで圧縮をトリガーしてください。
ちなみにこの機能は、今までの会話履歴を要約して短くすることでコンテキストを節約するという機能です。
ローカルでは必須ですが時間がかかるので、これは10分以内に終わるくらいのコンテキスト長にしておかないとタイムアウトして意味をなさないことがあります。

タイムアウト
これだけはVSCodeの設定から検索しないと出ないです。
"roo-"で検索します。
限界まで引き延ばしておきましょう。
3600と言いつつなぜか900秒でブチぎられるのは仕様?バグ?
コンテキストの圧縮時に900秒を超えないように注意しましょう。

なので、現実問題コンテキスト長には余裕のあるモデルでも、圧縮時に応答できなくて長いコンテキストを用意できないという方が多いかと。
プロキシでも作って5分に一回空文字返すとかした方がいいかな?
OpenAI互換APIコールを書かせてみた
では実際に使ってみます。
今回は自作LLM推論サーバーからllama-cpp-pythonを外して、素のllama.cppのAPIを叩きに行く方式に変えます。
その作業を初のバイブコーディングの対象とします!
なお、まずはGemma4 26B-A4 Q8を使います。
実はこの記事を書き始める前にQwen3.5 32BA3で使ってたんですが、結構繰り返しするので、ちょうど出たGemma4を試すことにします。
新規ファイルを作成の相談
まずはopen ai 互換apiを叩くモジュールを作れるか相談します。
チャットでやりたいことを入力すると開始です。
動作はこんな感じ。内容もいい感じやってくれそう。

モードについて
RooCodeは複数のモードというものが存在します。
私はまずArchitectで相談を開始して、実装時は自動でCodeに切り替えという感じで使うことが多いです。
Debugはそのまま、不具合ある?とかコミット前の内容調べて?とかに使います。

Askはコードについて質問できるのですが・・・
ローカルではファイル読む=コンテキストバガ食い=>圧縮で情報消えるを繰り返すのでぶっちゃけ微妙。
コードベースを有効にしないとまともに使えない。仮に有効にしたとしても、対象のファイルがデカいと即終了!
話がそれました。最終的な応答はこんな感じ。

どんなライブラリを使うのか、ストリームはどうするのか、どこに作るのかといった内容を求められました。

次は質問に答えてあげます。
とりあえずopenai公式クライアントを使い、ストリームは一応搭載しつつブロッキングも併用。関数のインターフェースはDB構造に合わせるように指示を追加します。上の提案は一般的ですが私のDB構造に合いません。
指示が長いのでめっちゃ考えてますw

ちなみにここまでのパフォーマンスはこちら。
出力が35トークン出てますね。快適。

DBの部分についてですが、きちんとファイルを読み込んで対応するようにしてくれるようです。

結果ですが何をするかを挙げてくれました。
これで問題ないと思いますが、とりあえずやってもらってどこまでできるか見るのが目的なので文句は言いません。

で、ここまで来て止まりました。
TODO作って、これでよろしいでしょうか?と言っときながら最初のライブラリチェックまで突っ走りました。ぶっちゃけここ自分でやろうと思ってたからやらなくていいのに。コンテキストの無駄。

TODOリストから実際に製造開始!?
だんだん考える時間が長くなってきました…
画面動かないのでつまんないですね

結果がこちら。いった通りの設計を返してきてますので、ここでモードをチェンジさせてコーディングさせていきます。

結果がこちら。
コーディングは画面に変化がなくて面白くなかったのでgifは無しです!
内容は後で確認するのでいったんこれで保存っと!

コードを保存すると、TODOが完了になりました。
が、なんか最後の方出力が怪しいですね。コンテキストもだんだん長くなってきたのでそろそろまずいか?

確定してやると、今度はエラーハンドリングの見直しに進みました。
こんな感じで、先ほどのファイルに対して追加や変更を行ってくれます。
差分で見られるのがいいですね。まぁ新しいファイルなのでどこがどう変わろうがまだどうでもいいんですがw

こちらを承認すると、今度はテストコードを作るといってきました。
個人では正常系が動けばよかったので作ってなかったんですが、丁寧ですね。

なんと作ったテストを実行しようとしているではないですか!
で、venvなので実行失敗w。自分のターミナルはvenvになってるのだが、それではだめなのか?

せっかく作ってくれたので、代わりに実行します。
通ったっぽいですね。まぁこのテストの内容が妥当なのか知りませんが。

というわけで結果を報告するとタスク完了。
ちなみに、@terminalをつけるとアクティブなターミナルの内容をそのまま転送できます。
これにてモジュールが完成しました。

実際に使ってみる
というわけで、さっきまでRooCodeで使っていたllama-cpp-serverに対してこのモジュールで応答を得られるのか試してみます。
結果
お、きちんと動いてますね!
完成したし動作も大丈夫みたいです。
(venv) C:\Programing\AI\llama-cpp-proxy>py
Python 3.11.9 (tags/v3.11.9:de54cf5, Apr 2 2024, 10:12:12) [MSC v.1938 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Ctrl click to launch VS Code Native REPL
>>> import openai_client as oc
>>> result = oc.call_openai_api("","http://192.168.0.4:8082","gemma-4-26B-A4B-it-Q8_0.gguf",[{"role": "user", "content": "Hello"}])
>>> print(result)
{'job_id': None, 'resp': 'Hello! How can I help you today?', 'gen_time': 2.059424900000522, 'first_token_time': -1.0, 'token_input': 16, 'token_output': 79, 'responce_model': 'gemma-4-26B-A4B-it-Q8_0.gguf'}
>>> 最終的なパフォーマンス
最後まで出力30トークンを割りませんでした。早いですねぇ。

リソースの使用状況はこちら。
上限64kに対して46k。結構ギリギリ。

Gemma4は262144トークンのウィンドウがあるらしいのでもっとあげようと思えば上げられるのですが、あんまり長くなってくると量子化の影響か不安定になってくる傾向があるので絞っています。

ちなみに、これを超えそうになるとコンテキストの圧縮が入ります。
簡単に言えば今までの話の流れの要約を作って、履歴を全消去して軽くする感じ。
なので、外部のファイルを読んだもののもういらない場合は結構減る。
しかし、積みあがってくると要約しきれなくなるので、これから読もうとしていたものが消されてまた読んでの無限ループになることがある。
なので、意外と"ファイルを読んで構造を教えてください"的なのはローカルでは難しい。
既存ファイルの変更をしてみた
次に既存ファイルの変更ですね。
さっき作ったapi呼び出しモジュールを使います。
現在は自分でllama-cpp-pythonを使って推論を行いますが、それを完全に排除してさっき作ったAPIに置換します。
なお、このワーカーにはJob管理プロセスがあるのでそれは残したいので変更になります。
変更依頼開始
というわけでさっそく変更概要を伝えて依頼します!
Rooはシステムプロンプトが長いので、初回の応答遅いんですよね…
(さっきメモリアクセス違反でllama-cpp落ちてキャッシュ消えたw)

提案内容はひとまず良さそうなので、承認して進めてみます。

Codeに切り替え
画面は面白くないのでGifなし!

書き換え開始と不穏な気配
ここで不穏な気配が…
めっちゃ時間かかると思ったら編集に失敗。これ繰り返してるかもですね。
コンテキスト圧縮が来るということは無駄に長文を出してきた可能性が高い…

要約は通ったっぽい…ふぅ

あ、死んだ…
うまく書き換えができないようです…

押し通したら何とか復活!編集が進みました。
ちなみに今は余計なところを削除するフェースなので、書き換えというよりただの削除です。

何とか書き換え成功
あんまり期待してなかったのですが、続行したら書き換えが進みました。
ぱっと見問題なさそう。動かさないとわからないかなw

裏で次の手を準備…
もしダメになったら31B Q8に切り替えますw
これだと5token出るかどうか位になりそうなので使いたくないですけどね。

む・・・もう無理か?
コンテキスト長超えたようなので確実に繰り返してる・・・

が、また要約で復活!

しっかり復活してやがる。
繰り返しが入ってバグったプロンプトを要約に掛けても生きてるのがすごい・・・

ダウンの繰り返し
さらに数回進んだところでまたダウン
ちょっとまずそうなので指示を追加して軌道修正できるか試します。

この後も何度か問題発生→圧縮で治るを繰り返し…
これもう駄目ですね…
Q8かつコンテキスト絞っているのですが、繰り返しちゃいますかぁ。

選手交代
Gemma4 31B Q8に交代です。
うまく続きが出ればいいんですが…
あ、ちなみに26B-A4 BF16はなぜか最初っから繰り返し始めますwwおい

ちなみに、チェックポイント機能というのがあり、選んだところに巻き戻れます。
さっきの繰り返し発言はいらないので、少し戻ったところから交代です。
31Bからしてみれば身に覚えのない指摘をされるというw

パフォーマンスはこちら。
ガタ落ちですね・・・。まぁ4B => 31Bなのでサイズは8倍近いので妥当ではあります。

放置してたので途中ですがこんな感じ。めっちゃ遅い!

そのまま放置した結果・・・編集せず完了。
ファイルは読んだっぽいので一応見ての判断か?

その後確認したのですが、いろいろ消し切れてない部分があり完了とは言えない状態でした。
パフォーマンスも遅いので、このモデルはあきらめます。
100B級 重戦車を召喚!
こうなったら奴を召喚するしかありません。
何とか個人で立ち上げることができつつ、パフォーマンスもギリいけそうなこいつです。
Qwen3.5 122B-A10 Q4
もうこの個人最強モデルを出すしかなさそうです…。
さっきよりでかいじゃんとツッコミがありそうですが、こちらMoEなので、10Bモデル程度の計算量で動きます。なのでさっきの3倍くらい早いはずです。

来ました! 驚異のVRAM73GBです。
なお、さっきまで64GだったのでBIOSで割り当て変えてきました。
Sys:32G / GPU:96Gです。

続きからだとなんか汚染されてる気がするので、新しくタスクを投げます。
前の人がいなくなっちゃったのでやってくれという感じににします。

この時のパフォーマンスはこちら。
122Bですが、アクティブは10Bなので驚異的なパフォーマンスです。

で結果がこれ。きちんと現状を把握したうえで、修正プランを立てるための質問をしてきました。いい感じですよ!

修正プランの作成を依頼しますが…

落ちた

もーこれ何とかして…何がハングだよ。
バッチサイズも下げて、GPUの応答なしも10秒許容に変えてるのに。
ドライバか?ROCmか?カーネルか?どれも手を出したくないんですが…。
再起したのでそのまま継続。
私が完全に忘れてたモデル一覧取得APIもやってくれるみたいです。

しかしこの後も頻繁にGPUがハングします…
ネットでもLLMやるとAMDのGPUがハングするという人はいるみたい。安定するの待つしかないか?でもこれだと大きいモデル運用できないではないか。
※いろいろ探したところ、Ubuntu26.04で治る予定らしい?
なお、3回落ちた後はなぜか安定。放置します。数回編集リクエストがあったので承認。
追記:KVキャッシュを4Bitに量子化するとパフォーマンスと引き換えに安定します。Q8やF16は引きつづきハングします。
コンテキストの圧縮が長い…これだけでも軽いモデルにやらせられないか考えないと。
で、ここからですがとにかく待ちが多いので結果だけのせます。
完了しました。

ただし一時間以上かかってます。自分でやれば10分くらいで終わる気がする。
デバッグ
さて、一応完成させたので今度はデバッグさせます。
作業を伴わないので、Qwen3.5 9B Q8にやらせてみます。

このサイズならRTX 5070Tiにも収まるのでこっちでホスト。
パフォーマンスはこんな感じ。爆速w

結果として、ずっと見逃していたタイプミスを指摘されましたが、動作に問題があるレベルの不具合は見つからなかったようです。
requirements(ライブラリリスト)を作る
いろいろ消したのもあるので、一旦まっさらにしてライブラリを入れなおしたいと思います。
で、何を入れるかですがここもAIに丸投げします。
依存ライブラリは出されても私がわからないので、メインのライブラリだけにしてもらいます。どうせ依存は勝手に入ってくるのでw

ぱっと見大丈夫そうですが、ひっかけのあいつがないですね。
mysql-connector-python。sqlalchemyはあくまでも親玉なので、mysql-connector-pythonは自分で入れないと動きません。さすがにここまでは気づかないか。
動かしてみる
一発目
撃沈!
これわかりやすそうなものだけど認識できなかったのか。

二発目
起動は成功したが、なんかエラーが出てる。そういえばモデル取得って後付けなので動作見てない。
RooCodeがモデルを取りに行けるのでAPI自体はllama.cppに存在するはず。

ひとまず、実際にllama.cppのエンドポイントにアクセスして得たJSONを渡して確認させたが正しいらしい。

ちなみに生のjsonはこんな感じです
{
"models": [
{
"name": "Qwen3.5-9B-Q8_0.gguf",
"model": "Qwen3.5-9B-Q8_0.gguf",
"modified_at": "",
"size": "",
"digest": "",
"type": "model",
"description": "",
"tags": [
""
],
"capabilities": [
"completion"
],
"parameters": "",
"details": {
"parent_model": "",
"format": "gguf",
"family": "",
"families": [
""
],
"parameter_size": "",
"quantization_level": ""
}
}
],
"object": "list",
"data": [
{
"id": "Qwen3.5-9B-Q8_0.gguf",
"aliases": [],
"tags": [],
"object": "model",
"created": 1775653626,
"owned_by": "llamacpp",
"meta": {
"vocab_type": 2,
"n_vocab": 248320,
"n_ctx_train": 262144,
"n_embd": 4096,
"n_params": 8953803264,
"size": 9516533760
}
}
]
}でも動かないので私が自分で見ると、キーが間違っていることが判明!!
models => nameが正しいのに、AIは models => idとしていた。それdataの方な。
間違ってるじゃないか!!
三度目の正直
ひとまずエラーもなく立ち上がった。
さて、ちゃんと動くかな?

ではRcatオリジナルの旧APIたたきます。
動きましたね。今までの使い方でちゃんと応答してます。
>>> import requests
>>> url = "http://localhost:25610/CGI_DoChat"
>>> resp = requests.post(url,json={"user_prompt":"ねこはかわいいですか?"})
>>> resp.json()
{'first': 7.58, 'model': 'Qwen3.5-9B-Q8_0.gguf', 'response': 'はい、ねこはかわいいですね。', 'time': 7.68816, 'tokens': 0}
>>>ちょっとバグがありました。
ここ、_call_streamはyieldでジェネレーターなんですが、それreturnしてるんですね。これダメです。

というわけでピンポイントで見てもらうとAIも気づいたみたい。yield fromに直してもらい修正完了です。

と思ったらyieldとreturnが混在してカオスに…
もうAIはこれくらいにして後は自分で直します。
とまぁこんな感じです。
最後の感想はまとめの方で!
とても便利に思った使い方
README作る
個人開発なので整備してなかったのですが、ちゃんと書いた方が後々見た時のためにもなりますね。
ただ構文とか慣れてないので・・・
これを丸投げw
これはコードベース用のDockerfileの話ですが、一瞬で生成されてます。楽でいいw

冒頭でもやりましたが、新規で小さいファイルを作るのは得意そうなので、こういうの丸投げできるのはいいかも。
gitのコミットメッセージなんかも今後は丸投げか!?
コードベースを有効にすると何が変わる?
コードベースを使う
さて、ずっと無視してきましたが、右下のデータベースマークについてご存じでしょうか?
実はこの記事では最初っから有効でした。

これはRooCode用RAGのようなもので、コードの意味検索を行うためのデータベースです。
下記をご覧ください

私は認証処理あったっけ?と一言聞きました。
普通はその処理を見つけるために全ファイルを読みにいかないといけないのですが、今回はコードベース検索を使っています。
結果はこちら。6件認証処理らしきものがヒットしたらしい。
このように、認証処理の可能性があるコードがどのファイルのどこに書いてあるか検索できるのがコードベースです。
これによりAIは全ファイルを読まずにピンポイントで見に行くことができます。
ローカルでファイルを大量に読み込むのはまず無理なので、必須の機能です。

準備方法
コードベースには2つの前提があります。
ベクトルデータベース
Qdrantを用意する必要があります。埋め込みモデル
専用の少し特殊なLLMです。
llama.cppでホストできます。
私はこれらを推論用のマシンでDockerを使いサクッとホストしました。
モデルやパス、ポートはご自身のに合わせて変えてください。

モデルはこの辺りのが軽いです。このくらいならCPUで回せるので、コーディング用のエージェントの邪魔をすることもなく共存できます。
逆にGPUビルドではないので、そうしたい方はDockerfileを編集してください。
まとめ
快適か?
ローカル環境では自分で書いた方が多分早い。ゲームしながら、「あ、う~ん、いいよ?」くらいのノリでやるならまぁアリ?
しかし、全く知らないもののたたき台を作らせるのはあり。
ローカルは現実的か
そして30B程度のモデルでは現段階では実用的ではない。MoEでは能力に限界がみられるし、密モデルではパフォーマンスで実用とはいいがたい。
MoEではあるが、100B越えなら遂行能力がみられるが、それでもパフォーマンス的にギリギリ。
まぁ31B => 122BA10なので中間のものはどうかわかりませんが、いずれにしてもこれ以上アクティブパラメータが多いと個人運用ではストレス。
ローカルで動作させられるモデルではこれが限界でしょうかね。
荒らしまわった挙句ループに陥って消滅されるのが一番面倒。本当に簡単なことだけを並行依頼したり、レビューやデバッグに使うのは行けそうですが、修正を行うようなコーディングを任せるのは個人のローカルLLMではまだ難しいか、ストレスありな感じです。
いや、GPUがハングさえしなければ122Bはギリ許せるがw
なんにしても、Geminiとかに関数かクラス単位でぱっと書いてもらった方がぶっちゃけ早いというのが今回の印象でした。
なので、完全に初期の段階で丸投げして枠を作らせるとかなら、自動承認で回すのもいいでしょうけど、確認が必要な改修をやらせるのは厳しいです。
追記:ちょっとミスってた
llama.cppのですね…。-reaがoffになってたんですよ。
自分の環境全体で使うモデルだったので、思考OFFにしてたのですが、それが災いしてモデルが本領を発揮できてなかったというw
あとで試したんですが、Gemma4 26B-A4 Q4でも部分的なコーディングが可能であることがわかりました。
llama.cppをリビルドしたり、モデルのデータが更新されてたので持ってきなおした影響もありそうですが、前半でやったほど悲惨な感じにはならなそうです。
ローカルバイブコーディングに必要なもの
今回はRyzen AI MAX+ 395を使いましたが、快適にとなるともっといいものを用意しないといけないと思います。
Nviidiaの90万ミニPC(EVO-X2 30万だから3倍かよ)とか、intel arc pro b70 4枚差し(60万)とか(できるのかは知らん)とか。
いずれにしても個人では…という領域。ミドルガチ勢の私には無理ですね。はい。
このレベルでは企業がどうしても外に出せないからローカルでというレベルですね。100万もこれだけのために出せませんよw
先日発表されたGoogleの新KV量子化技術や、Bonsaiの1Bit LLMなどの技術に期待ですね。転送コストや演算コストが下がれば早くなります。
噂ではBonsaiはQwen3 8Bベースらしいので、この122B A10を1Bit化してくれたら試したいんですがw
ちなみにもっとパフォーマンス上がんないの?ということでちょっとこの後試しました。
配布
コードベース用Dockerファイルセット
リンク集
感想投稿フォーム
コメントは公開で恥ずかしい!! Rcatだけに送りたい人向け
Pythonのインストール方法
ミニPCにLinuxをインストール
コピペエリア
ここから先は
情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。
