Pythonコーディングに最適なローカルLLM:ローカルかホストAPIか?
正解は一つではありません。最適な選択はGPU、タスク、モデルの拒否頻度によって異なります。判断方法と、ローカルハードウェアが足りない場合のホストオプションのテスト方法をご紹介します。

主要ポイント
- Pythonのバージョン、ライブラリ、リポジトリのサイズ、テストの処理方法など、実際のタスクでコーディングモデルを評価してください。
- GPUメモリがローカルモデルの上限を決定します。4ビットでは、重みはパラメータあたり約0.5バイトを必要とし、コンテキスト用の領域も必要です。
- このサイトはローカルランタイムではなくホストAPIです。100,000トークンのコンテキストウィンドウを持ち、1Mトークンあたり$0.15と$0.50の料金です。
- 小さなテストスイートとトライアルキーは、いかなるリーダーボードよりも多くのことを教えてくれます。
モデル名ではなく制約から始める
Pythonのコーディングに最適なローカルLLMには固定の答えがありません。モデルは急速に進化しており、実際の制限要因はあなたのマシンだからです。名前を比較する前に、次の4つを明確にしてください:
- GPUメモリ これにより、実行可能なモデルのサイズが決まります。
- コンテキストのニーズ。 1つの関数を編集する場合と、パッケージ全体で推論を行う場合では異なります。
- プライバシールール 一部のコードはマシンの外に出せないため、ローカルで運用する正当な理由になります。
- 拒否の許容度 強力なフィルタリングがかかるモデルでは、セキュリティツール、スクレイパー、リバースエンジニアリング、ファズテストが拒否をトリガーすることがあります。
厳密なオフライン動作が必須の場合は、自分で実行するモデルが必要です。そうでない場合、ホスト型APIはハードウェアの問題を解消します。このサイトは後者に分類され、ローカル環境の隣でテストする価値があります。
必要なGPUメモリ
重みのための大まかなルール:パラメータ数 × パラメータあたりのバイト数。16ビット精度ではパラメータあたり2バイト、8ビットでは1バイト、4ビットでは約0.5バイトです。
| モデルサイズ | 16ビット | 8ビット | 4ビット |
|---|---|---|---|
| 7B | 14 GB | 7 GB | 3.5 GB |
| 14B | 28 GB | 14 GB | 7 GB |
| 32B | 64 GB | 32 GB | 16 GB |
これらの数値は重みのみです。プロンプトに応じて増大するコンテキストキャッシュ用メモリと、ランタイム自体のメモリも必要です。数GBの余裕を持たせ、大きなファイルを貼り付ける場合はさらに多く確保してください。量子化を重くするとメモリは節約できますが、1文字の誤りでプログラムが壊れるコードでは精度の低下が影響します。
コーディングモデルの公平な比較方法
公開リーダーボードは他者のタスクを測定しています。より良い方法は1時間かけ、自分のコードを使用することです。
- 実際のタスク15〜20個を集めてください。失敗するテストがあるバグ、ドキュメントストリングから関数を書く、リファクタリング、型ヒントの追加リクエストなど。
- 同じプロンプト、同じ温度(コードでは0.2が妥当な開始値)、同じシード(サポートされている場合)で各モデルを実行します。
- 答えを読むのではなくテストを実行してスコアリングします。実際のモジュールをインポートしていますか?テストはパスしていますか?
- 拒否を別途記録してください。コードでは5%優れていてもポートスキャナタスクを拒否するモデルは、あなたにとって劣ります。
- タスクあたりの時間と、ホストモデルの場合はタスクあたりのコストを記録します。
新しいモデルが登場した際に再実行できるよう、ハーネスをファイルに保存してください。この再利用は、単一の結果よりも価値があります。
同じタスクでのホストオプションのテスト
APIはOpenAI互換のため、ハーネスには異なるベースURLのみが必要です。このスクリプトは関数を要求し、最初のPythonブロックを抽出してテストに対して実行します。モデルIDはuncensoredです。
import re
import subprocess
import tempfile
from openai import OpenAI
client = OpenAI(base_url="https://api.uncensoredlocalllm.com/v1", api_key="YOUR_API_KEY")
TASK = "Write a Python function parse_size(text) that converts '10KB' or '2 MB' to bytes."
TEST = "assert parse_size('10KB') == 10240\nassert parse_size('2 MB') == 2 * 1024 * 1024\nprint('ok')"
r = client.chat.completions.create(
model="uncensored",
temperature=0.2,
seed=7,
messages=[
{"role": "system", "content": "You write correct Python 3. Reply with one fenced code block and no commentary."},
{"role": "user", "content": TASK},
],
)
text = r.choices[0].message.content
m = re.search(r"```(?:python)?\n(.*?)```", text, re.S)
code = m.group(1) if m else text
with tempfile.NamedTemporaryFile("w", suffix=".py", delete=False) as f:
f.write(code + "\n" + TEST)
out = subprocess.run(["python3", f.name], capture_output=True, text=True, timeout=20)
print(out.stdout.strip() or out.stderr.strip())
ローカルモデルに対して同じタスクリストを実行し、パス率を比較してください。コードは生成された出力を実行するため、簡単なサンプル以外では使い捨てのディレクトリまたはコンテナを使用してください。
Python開発者にとってホストモデルが役立つ場面
ホスト型エンドポイントはすべてのケースで優れているわけではありませんが、いくつかのタスクには非常に適しています。
- 大きなコンテキスト。 ウィンドウは100,000トークンで、プロンプトと出力(completion)の合計です。これにより、1つのリクエストで大きなモジュール、そのテスト、およびスタックトレースを収めることができます。
- 関数呼び出し。
run_testsやread_fileなどのツールを定義し、モデルにループ内でそれらを呼び出させ、結果をrole: "tool"メッセージとして送信できます。 - JSON モード。
response_format: {"type":"json_object"}を使用すると、行番号付きの問題リストなど、構造化されたコードレビューを取得できます。 - セキュリティ作業での拒否が少ない。 モデルは、コンテンツ拒否なしで回答するようにチューニングされており、合法的な成人向け用途(所有している、またはテスト権限のあるシステムのセキュリティテストなど)に対応しています。
トレードオフは明白です:コードはあなたのマシンから離れ、ネットワーク接続が必要です。プロンプトはトレーニングには使用されませんが、ポリシーでコードを第三者に送信できない場合は、ローカル環境を使用してください。
関数呼び出しでモデルにテストを実行させる
関数呼び出しは、1回限りの回答をループに変えます。モデルはテストの実行を要求し、失敗を確認してコードを修正します。ツールを1つ定義し、呼び出しを自分で処理します。
import json
import subprocess
from openai import OpenAI
client = OpenAI(base_url="https://api.uncensoredlocalllm.com/v1", api_key="YOUR_API_KEY")
tools = [{
"type": "function",
"function": {
"name": "run_tests",
"description": "Run pytest in the project and return the output",
"parameters": {"type": "object", "properties": {}, "required": []},
},
}]
messages = [
{"role": "system", "content": "You fix Python bugs. Call run_tests to check your work."},
{"role": "user", "content": "The tests in this project fail. Run them and tell me the first error."},
]
for _ in range(5):
r = client.chat.completions.create(model="uncensored", messages=messages, tools=tools, temperature=0.2)
msg = r.choices[0].message
messages.append(msg)
if not msg.tool_calls:
print(msg.content)
break
for call in msg.tool_calls:
out = subprocess.run(["pytest", "-x", "-q"], capture_output=True, text=True)
messages.append({"role": "tool", "tool_call_id": call.id, "content": (out.stdout + out.stderr)[-4000:]})
ループは5ラウンドに制限されているため、混乱したモデルが永遠に実行されることはありません。ツール出力は短く保ってください。返す内容はすべて次のラウンドの入力として請求されるためです。最後の4,000文字に切り捨てることで、各ターンを低コストに保てます。
コーディング作業のコスト
コーディングプロンプトは入力が重いです:コードを貼り付け、より短い回答を取得します。6,000入力トークンと1,500出力トークンを含むリファクタリングリクエストを、1Mあたり$0.15と$0.50で処理することを考えてみましょう。
- 入力: 6,000 / 1,000,000 x $0.15 = $0.0009
- 出力: 1,500 / 1,000,000 x $0.50 = $0.00075
- 合計: 1リクエストあたり $0.00165
1,000回のリクエストで $1.65 かかります。$0.50 の無料トライアルクレジットでは約303回実行でき、20タスクのベンチマークを複数回実行するのに十分です。大量使用時にはローカルGPUの方がリクエストあたりのコストが安くなる可能性がありますが、初期費用がかかり、使用していないときにもコストがゼロにはなりません。完全な価格表は 価格ページ をご覧ください。
コード生成のための実用的な設定
- Temperature 0.1 から 0.3。 低い値は、架空のAPIやランダムなスタイルの変化を減らします。
- シードを固定 プロンプトを比較する際にシードを固定し、違いがサンプリングではなくプロンプトに由来するようにします。
- Pythonのバージョンとライブラリを明記する システムメッセージに「Python 3.11、標準ライブラリのみ」と記載することで、推測の余地を大幅に減らせます。
- コードにテストを要求する。 自分自身のテストを書くモデルは、それを実行することで、自分自身のオフバイワンエラーをしばしば発見します。
- 失敗のトレースバックを送信 説明ではなく、トレースバックそのものを送信します。
試すには、APIキーページでトライアルを申請し、その後クイックスタートに従ってください。チャットスタイルの使用については、無検閲LLMチャットガイドを参照してください。このサービスは成人による合法的な利用を目的としており、未成年者を含む性的なコンテンツは生成しません。
コーディングモデルの一般的な落とし穴
- 架空のインポートと関数名。 コードを実行してください。モデルは存在しないライブラリメソッドを記述する可能性があるため、テストが唯一の審判となります。
- 古い構文。 構造化パターンマッチングなどの最新の機能が必要な場合は、プロンプトでPythonのバージョンを指定してください。
- コンテキストが多すぎる。 ウィンドウが大きいからといって、すべて貼り付けるべきという意味ではありません。重要なファイルとエラーのみを送信してください。
- 生成されたセキュリティコードを信頼しすぎない。 認証、暗号処理、または入力のパースに関わるものは手動でレビューしてください。
- 出力の盲目的な実行。 生成されたコードはファイルを削除したり、ネットワーク呼び出しを行ったりする可能性があります。サンドボックスを使用してください。
その他のガイド
質問と回答
Pythonコードに最適なローカルLLMはどれですか?
GPUメモリとタスクに依存するため、ハードウェアに適合するサイズのモデルを2〜3つ選び、独自のコードでテストし、テストの実行によってそれらを評価してください。リーダーボードは出発点に過ぎません。
このサイトはローカルLLMですか?
いいえ。これはホスト型のOpenAI互換APIで、モデルIDは uncensored です。コードをリモートサービスに送信できる場合に適しています。
14BモデルにはどのくらいのGPUメモリが必要ですか?
重みだけでも、16ビットでは約28 GB、8ビットでは14 GB、4ビットでは7 GB必要で、さらにコンテキストキャッシュ用に追加の容量が必要です。
既存のPythonツールから使用できますか?
はい。ベースURLを https://api.uncensoredlocalllm.com/v1 に設定し、APIキーを使用すれば、任意のOpenAI SDKまたはクライアントが動作します。
無料でテストする方法は?
サインアップ後にAPIキーページで$0.50のトライアルを申請してください。これは7日間有効で、支払い情報の登録は不要で、1人1回限りの制限があります。