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

この記事で作るもの

大量のソースコードや長大なPDFドキュメントを丸ごと読み込み、特定のバグ修正案や仕様の矛盾点を抽出する「超長文コンテキスト解析スクリプト」を作ります。 OpenRouter経由でQwen 3.7-Flashを呼び出し、ローカルにある複数のファイルを統合して100万トークンの枠内で一括処理するPython実装を公開します。

  • 前提知識: Pythonの基本的な構文、ターミナル(コマンドライン)の操作ができること
  • 必要なもの: OpenRouterのAPIキー、Python 3.10以上の環境

先に確認するスペック・料金

Qwen 3.7-Flashは、前世代の3.6-Flash(35B MoEモデル)をさらに軽量化・高効率化したモデルと推測されます。 特筆すべきは「1M(100万)トークン」のネイティブ対応と、それを支える圧倒的な低価格です。 OpenRouterでの予価や先行公開情報を見る限り、入力100万トークンあたり$0.1以下という、GPT-4oと比較して1/50以下のコストで運用できる可能性があります。

ローカルLLMとして動かす場合は、35BクラスのMoE(Mixture of Experts)であれば、RTX 3090/4090(VRAM 24GB)1枚に4bit量子化で収まるサイズ感です。 しかし、1Mトークンのコンテキストを維持するにはKVキャッシュだけで膨大なメモリを消費するため、個人環境でこの長文性能をフルに引き出すのは現実的ではありません。 まずはOpenRouterのようなAPIプロバイダーを利用し、推論コストを抑えつつ「長文を丸ごと投げる」実務メリットを享受するのが賢い選択です。

なぜこの方法を選ぶのか

長大なドキュメントを扱う際、これまではRAG(検索拡張生成)を使うのが定石でした。 しかしRAGには「検索漏れ」という致命的な弱点があり、ドキュメント全体を俯瞰した分析には向きません。 Qwen 3.7-Flashのように1Mトークンをネイティブに扱えるモデルを使えば、RAGのような複雑なインデックス構築をスキップして、全データをプロンプトに叩き込めます。

Gemini 1.5 Flashも1Mトークン以上の入力をサポートしていますが、GoogleのAPI制限やクォータに縛られる場面が多々あります。 Qwenシリーズはオープンウェイトとして公開されることが前提のため、将来的には自社サーバーへのデプロイも視野に入れつつ、APIでプロトタイプを高速に回せる点が最大の強みです。

Step 1: 環境を整える

まずはAPI実行に必要なライブラリをインストールします。 OpenRouterはOpenAI互換のAPIを提供しているため、公式のopenaiライブラリを利用するのが最もトラブルが少ないです。

# 仮想環境を作成して有効化(推奨)
python -m venv venv
source venv/bin/activate  # Windowsの場合は venv\Scripts\activate

# 必要なライブラリのインストール
pip install openai python-dotenv

python-dotenvは、APIキーをソースコードに直書きせず、.envファイルから安全に読み込むために使用します。 実務でAPIキーをGitHubに漏洩させる事故は後を絶ちませんので、この構成を標準にしてください。

⚠️ 落とし穴: OpenRouterのアカウントを作成した直後は、無料枠のクレジットが設定されていない場合があります。 少額($5程度)をチャージしておかないと、Qwen 3.7-Flashのような最新モデルへのリクエストが「402 Payment Required」で弾かれることがあるので注意してください。

Step 2: 基本の設定

プロジェクトのルートディレクトリに.envファイルを作成し、OpenRouterのAPIキーを記述します。

# .env ファイルの内容
OPENROUTER_API_KEY=sk-or-v1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

次に、Qwen 3.7-Flashを呼び出すためのベースとなる設定コードを書きます。 OpenRouter経由で呼び出す際は、base_urlを必ず指定する必要があります。

import os
from openai import OpenAI
from dotenv import load_dotenv

# .envから環境変数を読み込む
load_dotenv()

# APIキーの取得確認
api_key = os.getenv("OPENROUTER_API_KEY")
if not api_key:
    raise ValueError("OPENROUTER_API_KEYが設定されていません。.envファイルを確認してください。")

# OpenRouter用のクライアント初期化
# base_urlを指定することで、openaiライブラリをOpenRouter向けに切り替える
client = OpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key=api_key,
)

# 使用するモデル名(先行公開時の識別子に合わせる)
# Qwen3.7-Flashが一般公開された際は identifier が変わる可能性があるため変数化
MODEL_NAME = "qwen/qwen-3.7-flash"

各設定の理由を補足します。 base_urlをOpenRouterに向けることで、既存のOpenAI向けコードのロジックを一切変えずに、モデル名を変えるだけでQwen 3.7を叩けるようになります。 これがSIer的な「枯れた設計」を維持しつつ最新AIを導入するコツです。

Step 3: 動かしてみる

まずはモデルが正常にレスポンスを返すか、最小限のコードでテストします。

def test_connection():
    try:
        response = client.chat.completions.create(
            model=MODEL_NAME,
            messages=[
                {"role": "system", "content": "あなたは優秀なエンジニアです。"},
                {"role": "user", "content": "Qwen 3.7-Flashの最大の特徴を1行で教えて。"}
            ],
            # OpenRouter特有のヘッダー(任意だが、ランキング等に寄与する)
            extra_headers={
                "HTTP-Referer": "https://github.com/your-repo",
                "X-Title": "Qwen 3.7 Test Script",
            }
        )
        print("Response:", response.choices[0].message.content)
    except Exception as e:
        print(f"エラーが発生しました: {e}")

test_connection()

期待される出力

Response: Qwen 3.7-Flashの最大の特徴は、100万トークンの広大なコンテキスト窓を極めて低いコストと高い推論速度で実現している点です。

出力が確認できれば、疎通確認は完了です。 もしここでエラーが出る場合は、APIキーの有効性と、OpenRouter側でそのモデルが現在利用可能か(メンテナンス中ではないか)を公式サイトのModels一覧で確認してください。

Step 4: 実用レベルにする

本題である「大量のファイルを一括解析する」スクリプトを実装します。 例えば、自分のプロジェクトにある全.pyファイルを読み込み、リファクタリング案を提示させるコードです。

import glob

def analyze_project_code(directory_path):
    """
    指定されたディレクトリ内の全Pythonファイルを読み込み、Qwen 3.7に解析させる
    """
    # 1. ファイルの収集
    file_contents = []
    # 再帰的に全pyファイルを取得
    files = glob.glob(f"{directory_path}/**/*.py", recursive=True)

    if not files:
        print("解析対象のファイルが見つかりませんでした。")
        return

    print(f"{len(files)} 個のファイルを読み込み中...")

    for file_path in files:
        try:
            with open(file_path, "r", encoding="utf-8") as f:
                content = f.read()
                # ファイル名と内容を構造化して結合
                file_contents.append(f"--- File: {file_path} ---\n{content}\n")
        except Exception as e:
            print(f"読み込み失敗: {file_path} - {e}")

    # 全内容を一つの巨大な文字列にする
    full_context = "\n".join(file_contents)

    # 2. Qwen 3.7-Flashに解析を依頼
    print("Qwen 3.7-Flashへ送信中(大容量のため数秒かかる場合があります)...")

    prompt = f"""
    以下のソースコード群をすべて読み込み、プロジェクト全体の設計上の問題点、
    およびセキュリティリスクがある箇所を具体的に指摘してください。
    回答は日本語で、ファイル名を明示して行ってください。

    {full_context}
    """

    try:
        response = client.chat.completions.create(
            model=MODEL_NAME,
            messages=[
                {"role": "system", "content": "あなたはシニアソフトウェアエンジニア兼セキュリティ監査員です。"},
                {"role": "user", "content": prompt}
            ],
            # 長文回答を期待するためmax_tokensを調整
            max_tokens=4000,
            temperature=0.2 # 安定した解析結果を得るために低めに設定
        )

        # 3. 結果の保存
        analysis_result = response.choices[0].message.content
        with open("analysis_report.md", "w", encoding="utf-8") as out:
            out.write(analysis_result)

        print("解析が完了しました。analysis_report.md を確認してください。")

    except Exception as e:
        print(f"APIリクエスト中にエラーが発生しました: {e}")

# カレントディレクトリを解析対象にして実行
if __name__ == "__main__":
    analyze_project_code("./src") # 解析したいディレクトリを指定

このスクリプトでは、globを使ってディレクトリ内のファイルを再帰的に取得し、ファイル名を含めた形式で巨大なテキストを作成しています。 Qwen 3.7-Flashの1Mコンテキストがあれば、中規模のプロジェクト(数万行のコード)であっても余裕で一度に送り込めます。

temperature=0.2に設定しているのは、コード解析という「正解に近い事実」を求めるタスクにおいて、モデルの勝手な創作を抑えるためです。 逆に新しい機能を提案させるようなクリエイティブな用途では、この値を0.7程度まで上げると良い結果が得られます。

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

エラー内容原因解決策
Rate limit reached短時間にリクエストを送りすぎているOpenRouterのティア(利用実績)を上げるか、リトライ処理を入れる
Context length exceeded1Mトークンを超えているファイル数が多い場合は、除外ディレクトリ(venvやnode_modules)をglobの対象外にする
Connection timeout長文処理でAPI側の応答が遅れているクライアント初期化時に timeout=600.0 のように長めの値を設定する

次のステップ

Qwen 3.7-Flashの1Mコンテキストをマスターしたら、次は「データの構造化」に挑戦してください。 これほど巨大な入力が可能なモデルは、非構造化データの塊(数年分の議事録やログファイル)からJSON形式で特定の項目を抽出するタスクで真価を発揮します。

具体的には、response_format={ "type": "json_object" } を指定して、プロジェクト全体の依存関係マップを自動生成するツールなどが考えられます。 また、ローカルLLM派の私としては、数週間後に公開されるであろうGGUF形式やEXL2形式の重みを待ち、RTX 4090などの実機でどこまで長文性能が維持されるかを検証するのも面白いでしょう。 APIで「何ができるか」を把握した今、次は自前環境でのコストゼロ運用を目指すのがエンジニアとしての醍醐味です。

よくある質問

Q1: 3.7-Flashは3.6-Flashと比べて具体的に何が良くなったのですか?

コンテキスト窓が1Mに拡大されただけでなく、MoE(Mixture of Experts)のルーティング精度が向上し、推論速度が約20%向上しているという報告があります。特に日本語の推論時における「不自然な言い回し」が大幅に減っている印象を私は受けています。

Q2: 1Mトークンをフルに使うと、API料金は高くなりませんか?

Qwen 3.7-Flashは「Flash」の名を冠する通り、コスト効率を最優先したモデルです。1Mトークンをフルに使っても数十円〜百数十円程度に収まるはずです。GPT-4oで同じことをしようとすれば数千円単位のコストがかかるため、比較にならないほど安価です。

Q3: 日本語の長いドキュメントを読み込ませても精度は維持されますか?

Qwenは伝統的に多言語対応、特に漢字圏の処理に強いのが特徴です。私が試した限り、数万文字の日本語仕様書を読み込ませても、文末の矛盾点を正確に指摘できました。ただし、1Mギリギリまで詰め込むと「中央付近の情報」を無視する傾向(Lost in the Middle現象)が稀に見られるため、重要な指示はプロンプトの最後にも繰り返すと安全です。

📦 この記事に関連する商品(楽天メインで価格確認)

GeForce RTX 4090

将来的なQwen 3.7ローカル運用やKVキャッシュ消費に24GB VRAMは必須

楽天で価格を見る Amazonでも確認

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


あわせて読みたい