繁中 ▾
取得 API 金鑰

uncensoredlocalllm.com指南

Python 編程最佳本地 LLM:本地還是託管 API?

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

更新於

本地 GPU 連接到託管雲的等距插圖,代表本地與 API 編程模型

重點摘要

  • 在你的任務上評估編程模型: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 位元
7B14 GB7 GB3.5 GB
14B28 GB14 GB7 GB
32B64 GB32 GB16 GB

這些數字僅包含權重。你還需要上下文快取的記憶體,它會隨提示詞增長,以及執行環境本身的記憶體。保留幾 GB 的餘量,如果你計劃貼上大型檔案,則需要更多。更重的量化可以節省記憶體,但可能會損失一些準確性,這對於代碼很重要,因為一個錯誤的字符就會導致程式崩潰。

如何公平比較編程模型

公開排行榜衡量的是他人的任務。更好的方法需要一小時,並使用你自己的代碼。

  1. 收集 15 到 20 個真實任務:包含失敗測試的錯誤、根據 docstring 撰寫的函式、重構、以及新增型別提示的請求。
  2. 使用相同的提示詞、相同的溫度(0.2 是代碼的合理起點)以及在支持的環境下使用相同的種子運行每個模型。
  3. 通過運行測試來評分,而不是閱讀答案。它是否匯入了真實的模組?它是否通過了測試?
  4. 單獨記錄拒絕情況。一個在程式碼上好 5% 但拒絕你的 連接埠掃描器 任務的模型,對你來說更差。
  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 天,無需提供付款資訊,且每人限領一次。

uncensoredlocalllm.com

只差一張表單,即可取得金鑰

建立帳號、複製金鑰、更改 Base URL。這就是整個設定過程。