Python 編程最佳本地 LLM:本地還是託管 API?
沒有單一的贏家,因為最佳選擇取決於你的 GPU、任務以及模型拒絕回答的頻率。以下是如何決定,以及在本地硬體不足時如何測試託管選項。

重點摘要
- 在你的任務上評估編程模型:Python 版本、函式庫、儲存庫大小以及處理測試的方式。
- GPU 記憶體設定了本地模型的天花板。在 4 位元下,權重大約需要每個參數半個位元組,加上上下文所需的空間。
- 此網站是託管 API,而非本地執行環境。它具有 100,000-token 上下文,每 1M token 成本為 $0.15 和 $0.50。
- 小型測試套件和試用金鑰能告訴你的資訊比任何排行榜都多。
從你的限制條件開始,而不是模型名稱
問題Python 編程最佳本地 LLM沒有固定答案,因為模型變化很快,而你的機器才是真正的限制。在比較名稱之前,請寫下四件事:
- GPU 記憶體。這決定了你可以運行哪些模型大小。
- 上下文需求。 編輯單一函式與對整個套件進行推理不同。
- 隱私規則。某些代碼不能離開你的機器,這是留在本地的正當理由。
- 拒絕容忍度。安全工具、爬蟲、逆向工程和模糊測試器可能會觸發高度過濾模型的拒絕。
如果嚴格離線操作是硬性要求,你需要自己運行的模型。如果不是,託管 API 消除了硬體問題。此網站屬於第二類:它是託管的 OpenAI 兼容 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 的餘量,如果你計劃貼上大型檔案,則需要更多。更重的量化可以節省記憶體,但可能會損失一些準確性,這對於代碼很重要,因為一個錯誤的字符就會導致程式崩潰。
如何公平比較編程模型
公開排行榜衡量的是他人的任務。更好的方法需要一小時,並使用你自己的代碼。
- 收集 15 到 20 個真實任務:包含失敗測試的錯誤、根據 docstring 撰寫的函式、重構、以及新增型別提示的請求。
- 使用相同的提示詞、相同的溫度(0.2 是代碼的合理起點)以及在支持的環境下使用相同的種子運行每個模型。
- 通過運行測試來評分,而不是閱讀答案。它是否匯入了真實的模組?它是否通過了測試?
- 單獨記錄拒絕情況。一個在程式碼上好 5% 但拒絕你的 連接埠掃描器 任務的模型,對你來說更差。
- 記錄每個任務的時間,以及託管模型每個任務的成本。
將測試框架保存在文件中,以便在新模型出現時重新運行。這種重用比任何單一結果都更有價值。
在相同任務上測試託管選項
由於 API 與 OpenAI 相容,你的測試框架只需不同的 Base 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 個 token,包含提示詞與補全內容。這足以在單一請求中容納一個大型模組、其測試程式碼以及堆疊追蹤記錄。
- 函式呼叫。你可以定義
run_tests或read_file等工具,並讓模型在迴圈中呼叫它們,並將結果以role: "tool"訊息的形式回傳。 - JSON 模式。 透過
response_format: {"type":"json_object"},你可以取得結構化的程式碼審查結果,例如帶有行號的問題清單。 - 安全任務的拒絕率較低。 該模型經過微調,能以無內容拒絕的方式回答合法成人用途的問題,這包括對你擁有或獲授權測試的系統進行安全測試。
權衡很明顯:你的程式碼會離開你的機器,且你需要網路連線。提示詞不會用於訓練,但若你的政策禁止將程式碼發送給任何第三方,請留在本地。
讓模型透過函式呼叫執行測試
函式呼叫將一次性回答轉變為迴圈:模型要求執行測試,看到失敗後修正程式碼。定義一個工具並自行處理呼叫。
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:]})
迴圈限制在五輪以內,以免混淆的模型無限期運行。保持工具輸出簡短,因為你返回的所有內容都會在下一輪作為輸入計費。將其截斷為最後 4,000 個字元可使每一輪更便宜。
編碼工作的費用
程式碼提示詞輸入量大:你貼上程式碼並獲得較短的答案。以包含 6,000 輸入 token 和 1,500 輸出 token 的重構請求為例,每 1M token 價格分別為 $0.15 和 $0.50:
- 輸入:6,000 / 1,000,000 x $0.15 = $0.0009
- 輸出:1,500 / 1,000,000 x $0.50 = $0.00075
- 總計:每次請求 $0.00165
一千次此類請求成本為 $1.65。$0.50 的試用額度可涵蓋約 303 次請求,足以多次運行 20 個任務的基準測試。大量請求時本地 GPU 可能更便宜,但需前期成本,且在你未使用時不會歸零。價格頁面 有完整表格。
程式碼生成的實用設定
- 溫度 0.1 到 0.3。 較低的值會減少發明的 API 和隨機的風格變化。
- 比較提示詞時固定種子,以確保差異來自提示詞而非採樣過程。
- 在系統訊息中聲明 Python 版本和函式庫:"Python 3.11,僅限標準函式庫" 可減少大量猜測。
- 要求附上程式碼的測試。 撰寫自身測試的模型在執行測試時,通常會發現自身的 差一錯誤。
- 發送失敗的追蹤記錄,而非對其的描述。
要試用,請在 API 金鑰頁面 領取試用,然後遵循 快速入門。聊天風格用途請見 無審查 LLM 聊天指南。服務供合法成人使用,且不生成涉及未成年人的性內容。
編碼模型的常見陷阱
- 發明的匯入和函式名稱。 執行程式碼。模型可能描述一個不存在的庫方法,因此測試是唯一的評判標準。
- 過時的語法。 如果你需要現代功能(如結構化模式匹配),請在提示詞中指明 Python 版本。
- 上下文過多。 更大的視窗不代表你應該貼上所有內容。發送重要的檔案以及錯誤訊息。
- 信任產生的安全程式碼。 手動審查任何涉及身份驗證、加密或輸入解析的內容。
- 盲目執行輸出結果。 生成的程式碼可能會刪除檔案或發起網路呼叫。請使用沙箱環境。
更多指南
問答
哪種本地 LLM 最適合 Python 程式碼?
這取決於你的 GPU 記憶體和任務,因此請在你的程式碼上測試兩到三個符合你硬體容量的模型,並透過執行測試來評分。排行榜僅供參考。
這個網站是本地 LLM 嗎?
不是。這是一個託管的、與 OpenAI 相容的 API,模型 ID 為 uncensored。如果你能將程式碼發送到遠端服務,這將適合你。
14B 模型需要多少 GPU 記憶體?
權重本身在 16-bit 下約需 28 GB,8-bit 下約需 14 GB,4-bit 下約需 7 GB,此外還需要額外空間用於上下文快取。
我可以從現有的 Python 工具中使用它嗎?
可以。只要將 Base URL 設定為 https://api.uncensoredlocalllm.com/v1 並使用你的金鑰,任何 OpenAI SDK 或客戶端均可運作。
我如何免費測試?
註冊後在 API 金鑰頁面領取 $0.50 試用額度。有效期為 7 天,無需提供付款資訊,且每人限領一次。