LLM ท้องถิ่นที่ดีที่สุดสำหรับโค้ด Python: ท้องถิ่นหรือ API แบบโฮสต์?
ไม่มีผู้ชนะเพียงรายเดียว เพราะตัวเลือกที่ดีที่สุดขึ้นอยู่กับ GPU งานของคุณ และความถี่ที่โมเดลปฏิเสธ นี่คือวิธีตัดสินใจ และวิธีทดสอบตัวเลือกแบบโฮสต์เมื่อฮาร์ดแวร์ท้องถิ่นไม่เพียงพอ

ประเด็นสำคัญ
- ประเมินโมเดลการเขียนโค้ดด้วยงานของคุณเอง: เวอร์ชัน Python ไลบรารี ขนาด repo และวิธีจัดการกับเทสต์
- หน่วยความจำ GPU กำหนดขีดจำกัดสูงสุดสำหรับโมเดลท้องถิ่น ที่ 4-bit น้ำหนักโมเดลต้องการพื้นที่ประมาณครึ่งไบต์ต่อพารามิเตอร์ รวมถึงพื้นที่สำหรับบริบท
- เว็บไซต์นี้คือ API แบบโฮสต์ ไม่ใช่รันไทม์ท้องถิ่น มีหน้าต่างบริบท 100,000 โทเคน และราคา $0.15 และ $0.50 ต่อ 1M โทเคน
- ชุดเทสต์ขนาดเล็กและคีย์ทดลองจะบอกคุณมากกว่าลีดเดอร์บอร์ดใดๆ
เริ่มจากข้อจำกัดของคุณ ไม่ใช่ชื่อโมเดล
คำถาม โมเดล LLM ท้องถิ่นที่ดีที่สุดสำหรับโค้ด Python: ท้องถิ่นหรือ API แบบโฮสต์?เขียนโค้ด Python ไม่มีคำตอบตายตัว เพราะโมเดลเปลี่ยนแปลงอย่างรวดเร็ว และเครื่องของคุณคือข้อจำกัดที่แท้จริง ก่อนเปรียบเทียบชื่อ ให้บันทึกสี่สิ่งนี้:
- หน่วยความจำ GPU สิ่งนี้กำหนดขนาดโมเดลที่คุณสามารถรันได้
- ความต้องการด้านบริบท. การแก้ไขฟังก์ชันเดียวแตกต่างจากการให้เหตุผลข้ามทั้งแพ็กเกจ
- กฎความเป็นส่วนตัว. โค้ดบางรายการไม่สามารถออกจากเครื่องของคุณได้ ซึ่งเป็นเหตุผลที่ชอบธรรมที่จะใช้งานแบบท้องถิ่น
- ความทนทานต่อการปฏิเสธ เครื่องมือด้านความปลอดภัย scraper การ reverse engineering และ fuzzer สามารถกระตุ้นการปฏิเสธในโมเดลที่กรองเนื้อหาอย่างหนัก
หากการทำงานแบบออฟไลน์เข้มงวดเป็นข้อกำหนดที่จำเป็น คุณต้องการโมเดลที่คุณรันเอง หากไม่ใช่ API แบบโฮสต์จะขจัดคำถามเกี่ยวกับฮาร์ดแวร์ออก เว็บไซต์นี้เป็นของกลุ่มที่สอง: เป็น API ที่เข้ากันได้กับ OpenAI แบบโฮสต์ ไม่ใช่รันไทม์แบบท้องถิ่น และคุ้มค่าที่จะทดสอบควบคู่กับการตั้งค่าท้องถิ่นของคุณ
ปริมาณหน่วยความจำ GPU ที่คุณต้องการ
กฎโดยประมาณสำหรับน้ำหนัก: พารามิเตอร์คูณด้วยไบต์ต่อพารามิเตอร์ ที่ความแม่นยำ 16-bit คือ 2 ไบต์ต่อพารามิเตอร์; ที่ 8-bit คือ 1 ไบต์; ที่ 4-bit คือประมาณ 0.5 ไบต์
| ขนาดโมเดล | 16-bit | 8-bit | 4-bit |
|---|---|---|---|
| 7B | 14 GB | 7 GB | 3.5 GB |
| 14B | 28 GB | 14 GB | 7 GB |
| 32B | 64 GB | 32 GB | 16 GB |
ตัวเลขเหล่านี้เป็นเพียงน้ำหนักโมเดล คุณยังต้องการหน่วยความจำสำหรับ context cache ซึ่งขยายตามขนาดของ prompt และสำหรับตัว runtime เอง ควรเผื่อพื้นที่หน่วยความจำไว้สักสองสาม GB และมากขึ้นหากคุณวางแผนที่จะ paste ไฟล์ขนาดใหญ่ การ quantization ที่หนักกว่าช่วยประหยัดหน่วยความจำแต่อาจทำให้ความแม่นยำลดลง ซึ่งสำคัญมากสำหรับโค้ดที่ตัวอักษรผิดเพียงตัวเดียวก็ทำให้โปรแกรมทำงานผิดพลาดได้
วิธีการเปรียบเทียบโมเดลเขียนโค้ดอย่างยุติธรรม
ลีดเดอร์บอร์ดสาธารณะวัดผลงานจากงานของคนอื่น วิธีที่ดีกว่าใช้เวลาหนึ่งชั่วโมงและใช้โค้ดของคุณเอง
- รวบรวมงานจริง 15 ถึง 20 งาน: bug ที่มีการทดสอบล้มเหลว ฟังก์ชันที่ต้องเขียนจาก docstring การ refactor คำขอเพิ่ม type hints
- รันแต่ละโมเดลด้วย prompt เดียวกัน temperature เดียวกัน (0.2 เป็นจุดเริ่มต้นที่เหมาะสมสำหรับโค้ด) และ seed เดียวกันเมื่อรองรับ
- ให้คะแนนโดยการรันเทสต์ ไม่ใช่โดยการอ่านคำตอบ โมเดลนำเข้าโมดูลจริงหรือไม่? และเทสต์ผ่านหรือไม่
- บันทึกการปฏิเสธแยกต่างหาก โมเดลที่ดีกว่า 5% ในงานเขียนโค้ดแต่ปฏิเสธงานสแกนพอร์ตของคุณ ถือว่าไม่ดีสำหรับคุณ
- บันทึกเวลาต่องานและค่าใช้จ่ายต่องานสำหรับโมเดลแบบโฮสต์
เก็บ harness ไว้ในไฟล์เพื่อให้คุณสามารถรันใหม่เมื่อมีโมเดลใหม่ปรากฏ การนำกลับมาใช้ใหม่นี้มีค่ามากกว่าผลลัพธ์ใด ๆ เพียงอย่างเดียว
การทดสอบตัวเลือกแบบโฮสต์ บนงานเดียวกัน
เนื่องจาก API เข้ากันได้กับ OpenAI harness ของคุณจึงต้องการเพียง 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())
รันรายการงานเดียวกันกับโมเดลท้องถิ่นของคุณและเปรียบเทียบอัตราการผ่าน โค้ดรันเอาต์พุตที่สร้างขึ้นมา ดังนั้นควรใช้ไดเรกทอรีชั่วคราวหรือ container สำหรับตัวอย่างที่เกินกว่าตัวอย่างเล็ก ๆ น้อย ๆ
จุดที่โมเดลแบบโฮสต์ ช่วยนักพัฒนา Python
endpoint แบบโฮสต์ ไม่ได้ดีกว่าในทุกกรณี แต่มีงานบางประเภทที่เหมาะกับมัน:
- บริบทขนาดใหญ่ หน้าต่างบริบทมีขนาด 100,000 โทเคน รวม prompt และ completion ซึ่งพอดีกับโมดูลขนาดใหญ่ เทสต์ของมัน และ stack trace ในคำขอเดียว
- การเรียกใช้ฟังก์ชัน คุณกำหนดเครื่องมือเช่น
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 โทเคนและเอาต์พุต 1,500 โทเคน ที่ราคา $0.15 และ $0.50 ต่อ 1M:
- อินพุต: 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 ในเครื่องอาจมีค่าใช้จ่ายต่อคำขอที่ถูกกว่าเมื่อใช้งานปริมาณมาก แต่มีต้นทุนเริ่มต้นและไม่ลดลงเหลือศูนย์เมื่อคุณไม่ได้ใช้งาน หน้าราคามีตารางราคาเต็ม
การตั้งค่าที่ใช้งานได้จริงสำหรับการสร้างโค้ด
- Temperature 0.1 ถึง 0.3 ค่าที่ต่ำกว่าลด API ที่แต่งขึ้นเอง และการเปลี่ยนแปลงสไตล์แบบสุ่ม
- ตรึง seed เมื่อคุณเปรียบเทียบพรอมต์ เพื่อให้ความแตกต่างมาจากพรอมต์ ไม่ใช่จากการสุ่มตัวอย่าง
- ระบุเวอร์ชัน Python และไลบรารี ในข้อความระบบ: "Python 3.11 ใช้เฉพาะไลบรารีมาตรฐาน" ช่วยลดการคาดเดาได้มาก
- ขอการทดสอบพร้อมกับโค้ด โมเดลที่เขียนการทดสอบด้วยตัวเองมักจะจับข้อผิดพลาด off-by-one ของตัวเองได้เมื่อคุณรันการทดสอบเหล่านั้น
- ส่ง traceback ที่เกิดข้อผิดพลาด ไม่ใช่คำอธิบายของมัน
เพื่อลองใช้งาน ให้รับเครดิตทดลองใช้ใน หน้า API key จากนั้นทำตาม คู่มือเริ่มต้นใช้งานด่วน สำหรับการใช้งานแบบแชท ดู คู่มือแชท LLM uncensored บริการนี้สำหรับการใช้งานผู้ใหญ่ที่ถูกต้องตามกฎหมาย และไม่สร้างเนื้อหาทางเพศที่เกี่ยวข้องกับผู้เยาว์
จุดบกพร่องทั่วไปกับโมเดลเขียนโค้ด
- import และชื่อฟังก์ชันที่แต่งขึ้นเอง รันโค้ด โมเดลสามารถอธิบายไลบรารีเมธอดที่ไม่มีอยู่จริง ดังนั้นการทดสอบจึงเป็นผู้ตัดสินเพียงอย่างเดียว
- ไวยากรณ์ที่ล้าสมัย หากคุณต้องการฟีเจอร์สมัยใหม่ เช่น การจับคู่รูปแบบโครงสร้าง ให้ระบุเวอร์ชัน Python ในพรอมต์
- บริบทมากเกินไป หน้าต่างบริบทที่ใหญ่กว่าไม่ได้หมายความว่าควรวางทุกอย่าง ส่งไฟล์ที่สำคัญพร้อมกับข้อผิดพลาด
- การไว้วางใจโค้ดความปลอดภัยที่สร้างโดยโมเดล ตรวจสอบด้วยตนเองทุกสิ่งที่เกี่ยวกับการตรวจสอบสิทธิ์ คริปโต หรือการแยกวิเคราะห์อินพุต
- การรันเอาต์พุตโดยไม่ตรวจสอบ โค้ดที่สร้างสามารถลบไฟล์หรือเรียกใช้เครือข่ายได้ ใช้ sandbox
คู่มือเพิ่มเติม
ถาม-ตอบ
LLM ในเครื่องแบบใดดีที่สุดสำหรับโค้ด Python?
ขึ้นอยู่กับหน่วยความจำ GPU และงานของคุณ ดังนั้นให้ทดสอบโมเดลสองหรือสามโมเดลที่มีขนาดเหมาะกับฮาร์ดแวร์ของคุณบนโค้ดของคุณเอง แล้วให้คะแนนโดยการรันการทดสอบ ลีดเดอร์บอร์ดเป็นเพียงจุดเริ่มต้นเท่านั้น
นี่คือ LLM แบบติดตั้งในเครื่องหรือไม่?
ไม่ใช่ เป็น API ที่โฮสต์และเข้ากันได้กับ OpenAI โดยมีโมเดล ID uncensored เหมาะสำหรับคุณหากคุณสามารถส่งโค้ดไปยังบริการระยะไกลได้
ฉันต้องการหน่วยความจำ GPU กี่ GB สำหรับโมเดลขนาด 14B?
ประมาณ 28 GB ที่ 16-bit, 14 GB ที่ 8-bit และ 7 GB ที่ 4-bit สำหรับน้ำหนักโมเดลเพียงอย่างเดียว รวมถึงพื้นที่เพิ่มเติมสำหรับแคชบริบท
ฉันสามารถใช้มันจากเครื่องมือ Python ที่มีอยู่ได้หรือไม่
ได้ SDK หรือไคลเอนต์ OpenAI ใดๆ ก็ใช้งานได้หลังจากที่คุณตั้งค่า Base URL เป็น https://api.uncensoredlocalllm.com/v1 และใช้คีย์ของคุณ
ฉันจะทดสอบฟรีได้อย่างไร
รับเครดิตทดลองใช้ $0.50 ที่หน้าคีย์ API หลังสมัครสมาชิก มีอายุการใช้งาน 7 วัน ไม่ต้องระบุข้อมูลการชำระเงิน และจำกัดเพียงหนึ่งต่อบุคคล
uncensoredlocalllm.com
คีย์ของคุณอยู่ห่างแค่แบบฟอร์มเดียว
สร้างบัญชี คัดลอกคีย์ และเปลี่ยน base URL นั่นคือการตั้งค่าทั้งหมด