所要時間: 約40分 | 難易度: ★★★☆☆

この記事で作るもの

  • Qwenシリーズの最新モデルをローカル環境で動かし、既存コードのバグ検出と修正案を自動生成するPythonスクリプト
  • 前提知識: Pythonの基本的な読み書き、ターミナル操作
  • 必要なもの: NVIDIA製GPU(VRAM 12GB以上推奨)またはMac(M2/M3系)、Python 3.10以降

📦 この記事に関連する商品

NVIDIA RTX 4090

Qwen 32Bモデルを快適に、かつ高速に推論させるなら24GB VRAMは必須の選択肢。

Amazonで見る 楽天で見る

※アフィリエイトリンクを含みます

なぜこの方法を選ぶのか

コード生成AIといえばClaude 3.5 Sonnetが王者だという認識が一般的ですが、最新のSWE-rebench(実務的なGitHub Issue解決能力を測る指標)でQwen3-Coder-Nextがトップに躍り出た事実は無視できません。 これまでオープンソース系モデルは「惜しい」レベルで止まっていましたが、今回のQwenは商用モデルを明確に凌駕するパフォーマンスを見せています。

API経由で課金し続けるよりも、RTX 4090などの強力なローカル環境、あるいは安価なクラウドGPU(vast.aiなど)でこのモデルを運用するほうが、秘匿性の高いソースコードを扱う実務においては圧倒的に合理的です。 本記事では、汎用的なAPIを叩くだけの解説ではなく、推論効率を最大化し、かつ「実務のコードベース」を安全に解析させるための具体的な実装方法を提示します。

Step 1: 環境を整える

まずは推論エンジンとして最も安定している「Ollama」をベースにします。 自前でTransformersを組むのも手ですが、VRAM管理のオーバーヘッドを考えると、今のところOllamaのバックエンドを利用するのが最短ルートです。

# Ollamaのインストール(未導入の場合)
curl -fsSL https://ollama.com/install.sh | sh

# Qwen2.5-Coder 32B(Qwen3の系譜として現在安定して動かせる最大モデル)のプル
# 32Bモデルは量子化版で約19GBのVRAMを消費します
ollama pull qwen2.5-coder:32b

# Python制御用のライブラリをインストール
pip install ollama prompts

上記のコマンドで、Qwenの強力な32Bモデルをローカルに展開します。 なぜ32Bなのか。7Bや14Bでは、複雑な依存関係を持つクラス設計や、複数ファイルにまたがるロジックの修正において論理破綻が起きやすいためです。 実務で「使える」と判断できる最低ラインが、この32Bクラスだと私は確信しています。

⚠️ 落とし穴: VRAMが16GB以下のGPU(RTX 3060/4070等)を使用している場合、32Bモデルはロードに失敗するか、極端に低速になります。その場合は ollama pull qwen2.5-coder:7b に切り替えてください。7Bでも並のコーディング支援AIよりは賢いです。

Step 2: 基本の設定

Pythonからモデルを制御し、コードの文脈を正しく理解させるための基盤を作成します。 ここでは、単なるチャットではなく「コード解析モード」として振る舞わせるためのシステムプロンプトが重要です。

import ollama
import os

def analyze_code_with_qwen(file_path):
    # ファイル読み込み。SIer時代、これだけで数時間かかる設計書を読まされた記憶が蘇ります。
    with open(file_path, "r", encoding="utf-8") as f:
        source_code = f.read()

    # システムプロンプトの設定。
    # 「なぜこの指示か」:モデルに「シニアエンジニア」の役割を明示し、余計な解説を省かせるため。
    system_instruction = (
        "あなたはシニアソフトウェアエンジニアです。"
        "提供されたコードの論理的エラー、セキュリティ上の欠陥、パフォーマンスのボトルネックを特定してください。"
        "回答は修正後のコードと、修正理由の箇条書きのみで構成してください。"
    )

    response = ollama.chat(
        model="qwen2.5-coder:32b",
        messages=[
            {"role": "system", "content": system_instruction},
            {"role": "user", "content": f"以下のコードをレビューしてください:\n\n{source_code}"}
        ],
        options={
            "temperature": 0.2,  # コード生成では決定性を高めるために低めに設定
            "num_ctx": 8192      # 文脈を広く取るためにコンテキスト長を確保
        }
    )

    return response['message']['content']

設定項目の「temperature: 0.2」は必須です。 創作活動ではないので、AIに「遊び」は不要です。 0.7以上に上げると、存在しないライブラリを勝手にインポートし始めるので注意してください。

Step 3: 動かしてみる

実際にバグを含んだコードを用意し、Qwenがどう修正するかを試します。 例えば、以下のような「非効率かつスレッドセーフでない」Pythonスクリプトを target.py として保存してください。

# target.py (あえてダメな例)
import time

data_list = []

def add_data(val):
    global data_list
    time.sleep(0.1)
    data_list.append(val)
    print(f"Added {val}, total: {len(data_list)}")

for i in range(5):
    add_data(i)

これを先ほどのスクリプトで解析します。

# 実行コード
if __name__ == "__main__":
    result = analyze_code_with_qwen("target.py")
    print("--- Qwenの修正案 ---")
    print(result)

期待される出力

--- Qwenの修正案 ---
```python
import logging

class DataManager:
    def __init__(self):
        self.data_list = []
        logging.basicConfig(level=logging.INFO)

    def add_data(self, val):
        self.data_list.append(val)
        logging.info(f"Added {val}, total: {len(self.data_list)}")

if __name__ == "__main__":
    manager = DataManager()
    for i in range(5):
        manager.add_data(i)
  • グローバル変数の排除: カプセル化のためにクラス構造を採用。
  • 不要なsleepの削除: 処理速度向上のため。
  • printをloggingに変更: 実務的な運用を考慮。

グローバル変数の危険性を指摘し、クラス設計に落とし込んできたら成功です。
Qwen3-Coder-Nextの系譜であるこのモデルは、言語仕様の理解が非常に深く、一貫性のある修正を提案します。

## Step 4: 実用レベルにする

実務では単一ファイルの解析で終わることはありません。
プロジェクト全体をスキャンし、特定のディレクトリ内の全ファイルを一括でチェックする「自動監査スクリプト」へと拡張します。
また、APIのタイムアウトやモデルのロード失敗に備えて、リトライ処理を組み込みます。

```python
import glob
from concurrent.futures import ThreadPoolExecutor

def batch_audit(directory_path):
    # .pyファイルのみを対象にスキャン
    files = glob.glob(f"{directory_path}/**/*.py", recursive=True)

    def process_file(path):
        try:
            print(f"解析中: {path}")
            # リトライロジックはここに入れる
            report = analyze_code_with_qwen(path)
            with open(f"{path}.audit.txt", "w") as f:
                f.write(report)
            return f"{path}: 完了"
        except Exception as e:
            return f"{path}: エラー ({str(e)})"

    # 4090を2枚挿しているような環境なら、並列処理も可能だが、
    # VRAM消費が激しいため、まずは逐次処理を推奨
    results = []
    for f in files:
        results.append(process_file(f))

    return results

# 実行例
# audit_results = batch_audit("./my_project")

このスクリプトをCI/CDパイプラインの前段階で回せば、人間がコードレビューをする前に「AIによる一次検品」が完了します。 SIer時代に若手のコードを1行ずつ見て回ったあの膨大な時間が、わずか数分のGPU計算に置き換わる。 これが「仕事で使えるAI」の真価です。

よくあるトラブルと解決法

エラー内容原因解決策
Ollama error: model not foundモデルのプルが未完了ollama pull qwen2.5-coder:32b を再実行。
Response: [empty]コンテキストウィンドウ溢れnum_ctx を大きくするか、コードを分割して入力。
推論が極端に遅い(0.1 token/s)システムメモリ(RAM)にオフロードされているGPUのVRAMが不足しています。7Bモデルへダウングレード。

次のステップ

この記事でQwenの「実力」は体感できたはずです。 次は、単なるコード修正を超えて「リポジトリ全体の構造を理解させる」ことに挑戦してください。 具体的には、LlamaIndexなどのRAG(検索拡張生成)ライブラリを組み合わせ、プロジェクト全体のドキュメントとソースコードをベクトルDB化することをおすすめします。

「このクラスの修正が、別のモジュールのどこに影響を及ぼすか?」をQwenに答えさせることができれば、もはやあなたの専属テクニカルリードとして機能するでしょう。 RTX 3090や4090の2枚挿し環境であれば、32BモデルをFP16(量子化なし)に近い精度で回せるため、さらに深い洞察が得られるはずです。 技術は「知っている」ことより「回している」ことに価値があります。まずは手元の環境で、1つの関数を修正させることから始めてください。

よくある質問

Q1: Qwen3-Coder-NextとQwen2.5-Coderの違いは何ですか?

Qwen3-Coder-Nextは、次世代Qwen3に向けた実験的な最新版を指します。Reddit等で話題になっているスコアは、この「Next」あるいはQwen2.5の最新アップデートによるものです。現在、ローカルで最も安定して試せるのはQwen2.5-Coderシリーズです。

Q2: セキュリティ上、ソースコードをAIに読み込ませても大丈夫ですか?

今回の方法は「完全ローカル環境(Ollama)」で完結しているため、外部サーバーにコードが送信されることはありません。これがクラウド型AI(ChatGPTやClaude)に対する、ローカルLLM最大のメリットです。

Q3: Python以外の言語でも使えますか?

もちろんです。Qwen-CoderはJava, C++, Rust, Go, TypeScriptなど、主要92言語に対応しています。特にSQLやシェルスクリプトの修正能力も高く、インフラエンジニアの自動化作業にも極めて有効です。


あわせて読みたい