สองวิธีในการใส่ LLM ฟรีลงในสคริปต์ Python
เมื่อผู้คนค้นหา llms ฟรีสำหรับ python พวกเขาหมายถึงสิ่งใดสิ่งหนึ่งจากสองสิ่ง ประการแรกคือโมเดลแบบเปิดน้ำหนักที่คุณดาวน์โหลดและรันเอง โดยใช้เครื่องมือเช่น Ollama llama.cpp หรือไลบรารี Hugging Face transformers ประการที่สองคือเอนด์พอยต์แบบโฮสต์ที่มีค่าใช้จ่ายต่ำมาก หรือมีเครดิตทดลองใช้เพียงพอจนรู้สึกเหมือนฟรีสำหรับโปรโตไทป์ ทั้งสองอย่างถูกต้องและเหมาะสำหรับงานที่แตกต่างกัน
การรันแบบท้องถิ่นหมายถึงไม่มีบิลต่อโทเคนและไม่มีข้อมูลออกจากระบบของคุณ นอกจากนี้ยังหมายถึงคุณต้องมี RAM หรือหน่วยความจำ GPU เพียงพอสำหรับโมเดลที่คุณเลือก คุณต้องรอดาวน์โหลด และโมเดลขนาดเล็กที่พอดีกับแล็ปท็อปให้คำตอบที่แย่กว่าโมเดลขนาดใหญ่ API แบบโฮสต์ตัดปัญหาฮาร์ดแวร์ออก แต่คุณต้องจ่ายต่อโทเคนเมื่อเครดิตทดลองใช้หมด หน้าหน้านี้ครอบคลุมทั้งสองอย่างอย่างตรงไปตรงมา จากนั้นแสดงโค้ด Python สำหรับตัวเลือกโฮสต์บนเว็บไซต์นี้ ซึ่งเข้ากันได้กับ OpenAI และทำงานกับแพ็คเกจ openai มาตรฐาน
โมเดลท้องถิ่นและ API แบบโฮสต์เปรียบเทียบเคียงข้างกัน
| คำถาม | รันด้วยตัวเอง | API แบบเติมเงินล่วงหน้าแบบโฮสต์ |
|---|---|---|
| ต้นทุนต่อโทเคน | ไม่มี แต่คุณจ่ายค่าฮาร์ดแวร์และไฟฟ้า | $0.15 ต่อ 1M input, $0.50 ต่อ 1M output |
| เวลาตั้งค่า | ติดตั้ง runtime ดาวน์โหลดน้ำหนักโมเดล และปรับการตั้งค่า | ติดตั้งแพ็กเกจเดียว วางคีย์ |
| ความยาวของบริบท | จำกัดโดยหน่วยความจำของคุณ | 100,000 โทเคน, พรอมต์รวมกับผลลัพธ์ |
| คำขอพร้อมกัน | ตามความสามารถของเครื่องของคุณ | 8 คำขอพร้อมกันบนคีย์เต็ม 2 คำขอบนคีย์ทดลอง |
| การปฏิเสธ | ขึ้นอยู่กับน้ำหนักโมเดลที่คุณเลือก | ปรับแต่งให้ตอบโดยไม่มีการปฏิเสธเนื้อหาสำหรับการใช้งานผู้ใหญ่ที่ถูกต้องตามกฎหมาย |
| การใช้งานแบบออฟไลน์ | ใช่ | ไม่ |
หากคุณมี GPU ที่เพียงพอและงานของคุณเป็นแบบส่วนตัวหรือออฟไลน์ การใช้งานแบบโลคัลเป็นคำตอบที่ดีและคุณสามารถหยุดอ่านได้ที่นี่ หากคุณต้องการโมเดลที่ใหญ่กว่าโดยไม่ต้องเป็นเจ้าของเครื่อง หรือต้องการให้สคริปต์ของคุณทำงานเหมือนกันบนแล็ปท็อป เซิร์ฟเวอร์ และตัวรัน CI เส้นทางแบบโฮสต์จะง่ายกว่า โครงการจำนวนมากใช้ทั้งสองแบบ: โมเดลโลคัลขนาดเล็กขณะพัฒนา และแบบโฮสต์เมื่อใช้งานจริง โดยสลับกันด้วยการเปลี่ยน base URL เพียงค่าเดียว
ตั้งค่าเอนด์พอยต์แบบโฮสต์ในห้านาที
คุณต้องการคีย์ก่อน เข้าสู่ระบบด้วย Google หรือด้วยอีเมลและรหัสผ่าน จากนั้นขอเครดิตทดลองใช้ $0.50 ด้วยคลิกเดียวบน หน้าคีย์ API เครดิตทดลองใช้มีอายุ 7 วัน คนละหนึ่งครั้ง และไม่ต้องการการชำระเงิน จากนั้นติดตั้ง SDK และเก็บคีย์ออกจากโค้ดต้นฉบับของคุณ
pip install openai
export NOTRACK_API_KEY="sk-your-key-here"
ไคลเอนต์ต้องเปลี่ยนแปลงสองอย่างจากการตั้งค่า OpenAI มาตรฐาน: Base URL และคีย์ โมเดล ID คือ uncensored และมีโมเดลเดียวที่เสนอ
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.nsfwvideogenerator.cc/v1",
api_key=os.environ["NOTRACK_API_KEY"],
)
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": "You are a concise writing assistant."},
{"role": "user", "content": "Give me three title ideas for a noir short story."},
],
temperature=0.8,
)
print(resp.choices[0].message.content)
print(resp.usage)
การตรวจสอบสิทธิ์คือส่วนหัว Authorization: Bearer มาตรฐาน ซึ่ง SDK เพิ่มให้คุณ มีสองวิธี: POST /v1/chat/completions และ GET /v1/models คุณสามารถยืนยันการเชื่อมต่อด้วย client.models.list() ซึ่งส่งกลับโมเดล ID ที่พร้อมใช้งาน รายการพารามิเตอร์เต็มมีอยู่ใน หน้าเอกสาร
การตอบกลับแบบสตรีมมิง
สำหรับสิ่งใดๆ ที่บุคคลดู ให้สตรีม ตั้งค่า stream=True และวนซ้ำผ่านชิ้นส่วนเมื่อเหตุการณ์ที่ส่งโดยเซิร์ฟเวอร์มาถึง การใช้งานจะรายงานที่ท้ายสตรีม ดังนั้นคุณยังสามารถบันทึกจำนวนโทเคนได้
stream = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "Write a four-line poem about rain on a tin roof."}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
usage = getattr(chunk, "usage", None)
if usage:
print("\n", usage)
รายละเอียดหนึ่งอย่างที่ทำให้คนตกหลุมพราง: คำขอสตรีมจะยึดช่อง concurrent ของมันจนกว่าสตรีมจะเสร็จสิ้น บนคีย์ทดลองที่มี 2 ช่อง สองสตรีมเปิดหมายความว่าคำเรียกที่สามจะได้รับ 429 พร้อมรหัส concurrency เสมอ ควรบริโภคหรือปิดสตรีม
การเรียกใช้ฟังก์ชันและโหมด JSON
เอนด์พอยต์รองรับ tools, tool_choice, สตรีมมิง tool_calls และผลลัพธ์ที่ส่งกลับเป็น role: "tool" นี่คือรอบการทำงานเต็มรูปแบบพร้อมฟังก์ชันหนึ่งตัว
import json
tools = [{
"type": "function",
"function": {
"name": "word_count",
"description": "Count the words in a piece of text.",
"parameters": {
"type": "object",
"properties": {"text": {"type": "string"}},
"required": ["text"],
},
},
}]
messages = [{"role": "user", "content": "How many words are in: the quick brown fox jumps"}]
first = client.chat.completions.create(
model="uncensored", messages=messages, tools=tools, tool_choice="auto"
)
msg = first.choices[0].message
if msg.tool_calls:
messages.append(msg)
for call in msg.tool_calls:
args = json.loads(call.function.arguments)
result = len(args["text"].split())
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": str(result),
})
final = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
print(final.choices[0].message.content)
ควรแยกวิเคราะห์ arguments อย่างระมัดระวัง; โมเดลส่งคืนเป็นสตริง JSON และโมเดลใดๆ อาจสร้างค่าที่ผิดรูปแบบได้เป็นครั้งคราว สำหรับผลลัพธ์ที่มีโครงสร้างโดยไม่ใช้เครื่องมือ ให้ใช้โหมด JSON
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": "Reply with a JSON object with keys title and tags (list of strings)."},
{"role": "user", "content": "Describe a lighthouse keeper's diary."},
],
response_format={"type": "json_object"},
temperature=0.2,
)
data = json.loads(resp.choices[0].message.content)
print(data["title"], data["tags"])
ระบุ JSON และชื่อคีย์ในพรอมต์ของคุณ และตั้งค่า temperature ให้ต่ำ ห่อหุ้ม json.loads ด้วยบล็อก try สำหรับโค้ดการผลิต
ขีดจำกัดอัตรา ข้อผิดพลาด และการเรียกซ้ำ
คีย์เต็มอนุญาตคำขอพร้อมกัน 8 รายการและ 300 รายการต่อนาที คีย์ทดลองอนุญาต 2 และ 60 รายการ เกินแล้วได้ HTTP 429 พร้อมโค้ด rate_limited (เกินต่อนาที) หรือ concurrency (เกินพร้อมกัน) เมื่อโหลดเกินชั่วคราว API จะคืน 429 พร้อมหัว Retry-After: 5 SDK จะลองใหม่เองสำหรับข้อผิดพลาดบางรายการ; สำหรับสคริปต์ที่กระจายงาน การห่อหุ้มแบบชัดแจ้งเล็กน้อยจะชัดเจนกว่า
import time
from concurrent.futures import ThreadPoolExecutor
from openai import RateLimitError
def ask(prompt, tries=4):
for attempt in range(tries):
try:
r = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": prompt}],
max_tokens=300,
)
return r.choices[0].message.content
except RateLimitError:
time.sleep(5 * (attempt + 1))
raise RuntimeError("still rate limited")
prompts = [f"Summarize idea number {i} in one sentence." for i in range(20)]
with ThreadPoolExecutor(max_workers=2) as pool: # 8 on a full key
results = list(pool.map(ask, prompts))
การจับคู่ max_workers กับขีดจำกัด concurrent ของคีย์ของคุณป้องกัน 429 ส่วนใหญ่ก่อนที่มันจะเกิดขึ้น การตอบกลับแต่ละรายการยังส่ง X-Request-Id, X-Balance-USD และส่วนหัวขีดจำกัดอัตราสองส่วน ซึ่งคุณสามารถอ่านผ่าน client.chat.completions.with_raw_response.create(...) เมื่อคุณต้องการสำหรับดีบักหรือการสนับสนุน
วิธีการเลือกระหว่างแบบโลคัลและแบบโฮสต์
ข้ามอุดมการณ์และตอบคำถามสี่ข้อเกี่ยวกับโปรเจกต์ของคุณ
- ข้อมูลต้องอยู่บนเครื่องของคุณหรือไม่? หากสัญญาหรือนิสัยบอกว่าใช่ ให้รันแบบโลคัล พรอมต์แบบโฮสต์ไม่ได้ใช้สำหรับการฝึกที่นี่ แต่พวกมันเดินทางผ่านเครือข่าย
- คุณมีหน่วยความจำเท่าไหร่? ขนาดโมเดลขับเคลื่อนคุณภาพ แล็ปท็อปที่ไม่มี GPU เฉพาะจำกัดคุณไว้ที่โมเดลขนาดเล็ก และคำตอบจะแสดงข้อจำกัดนั้น โมเดลแบบโฮสต์ให้คุณใช้โมเดลขนาดใหญ่ที่มีหน้าต่างบริบท 100,000 โทเคน ซึ่งยากที่จะจับคู่ที่บ้าน
- คุณจะส่งคำขอจำนวนเท่าไหร่? คำขอไม่กี่ร้อยต่อสัปดาห์เป็นเรื่องเล็กน้อยทั้งสองด้าน คำขอหลายแสนต่อเดือนเปลี่ยนบิลแบบโฮสต์ให้เป็นตัวเลขที่แท้จริง และเครื่องท้องถิ่นจะเริ่มดูน่าสนใจหากมันว่างเปล่าในกรณีอื่น คำนวณผลรวม: คำขอ 100,000 คำขอที่มี 1,000 โทเคนอินพุตและ 500 โทเคนเอาต์พุตมีค่าใช้จ่าย 100,000 x $0.0004 = $40
- คุณต้องการจัดการการปฏิเสธแบบเฉพาะเจาะจงหรือไม่? โมเดลแบบเปิดน้ำหนักจำนวนมากมาพร้อมกับการปฏิเสธในตัว และอื่นๆ ถูกปรับให้ลบมันออก โมเดลแบบโฮสต์ที่นี่ถูกปรับให้ตอบโดยไม่มีการปฏิเสธเนื้อหาสำหรับการใช้งานผู้ใหญ่ที่ถูกต้องตามกฎหมาย ดังนั้นคุณไม่ต้องค้นหาน้ำหนักที่เหมาะสม
หากคำตอบของคุณชี้ไปในทั้งสองทิศทาง ให้เริ่มใช้โฮสต์ก่อนในสัปดาห์แรก การทดลองใช้ไม่มีค่าใช้จ่าย และคุณจะเรียนรู้ว่าพรอมต์ของคุณต้องการอะไรก่อนที่จะซื้อฮาร์ดแวร์หรือดาวน์โหลดไฟล์ขนาดใหญ่หลายกิกะไบต์
ข้อผิดพลาดทั่วไปในสคริปต์ Python
ปัญหาส่วนใหญ่ที่ผู้คนพบเจอเป็นปัญหาเล็กน้อยและแก้ไขได้
- URL ฐานผิด ต้องลงท้ายด้วย
/v1การขาดคำต่อท้ายให้ 404 ไม่ใช่ข้อความที่มีประโยชน์ พิมพ์client.base_urlหากไม่แน่ใจ - คีย์ในโค้ด อ่านจากตัวแปรสภาพแวดล้อม ตามที่กล่าวมา และเพิ่มไฟล์
.envของคุณไปยัง.gitignore - ชื่อโมเดลผิด ID โมเดลมีเพียง
uncensoredเท่านั้น ชื่อจากผู้ให้บริการอื่นจะใช้ไม่ได้ จึงต้องเปลี่ยนเมื่อพอร์ตโค้ด - ลูปไม่จำกัด ลูปการเรียกใช้เครื่องมือที่ไม่มีวันจบเป็นข้อผิดพลาดที่แพงมาก ควรจำกัดไว้ที่ เช่น ห้ารอบ
- เพิกเฉยต่องบประมาณหน้าต่างบริบท พรอมต์และการตอบกลับแบ่งปัน 100,000 โทเคน หากเพิ่มทุกการสนทนาตลอดไป คุณจะถึงขีดจำกัดในที่สุด ตัดหรือสรุปข้อความเก่า
- สมมติว่า JSON ถูกต้องเสมอ แม้ในโหมด JSON ให้ตรวจสอบคีย์ที่คุณต้องการก่อนใช้งาน
เมื่อมีบางอย่างดูผิดที่ฝั่งเซิร์ฟเวอร์ ให้อ้างค่า X-Request-Id จากการตอบกลับเมื่อคุณเขียนถึง support มันช่วยให้ทีมสนับสนุนพบคำเรียกที่แน่นอนของคุณ
ค่าใช้จ่ายสำหรับตัวเลือกโฮสต์สำหรับงาน Python
การเรียกสคริปต์ทั่วไปที่มี 1,000 โทเคนอินพุตและ 500 โทเคนเอาต์พุตมีค่าใช้จ่าย $0.00015 บวก $0.00025 รวมเป็น $0.0004 เครดิตทดลอง $0.50 ครอบคลุมการเรียกได้ประมาณ 1,250 ครั้ง การเติมเงินขั้นต่ำ $20 ครอบคลุม 50,000 ครั้ง เครดิตไม่หมดอายุ คำขอที่ล้มเหลวหรือถูกปฏิเสธจะไม่ถูกเรียกเก็บเงิน และพรอมต์ไม่ถูกนำไปใช้ฝึกโมเดล เติมเงินได้สูงสุด $500 พร้อมโบนัสเมื่อเติมตั้งแต่ $50 และชำระเงินด้วยคริปโต USDT บน TRC20 หรือ USDC บน Base ดูรายละเอียดที่หน้า ราคา
นี่คือข้อความเท่านั้น: ไม่มีรูปภาพ เสียง วิดีโอ การฝังตัว หรือการปรับแต่งอย่างละเอียด และกฎข้อเดียวที่เข้มงวดคือไม่มีเนื้อหาทางเพศที่เกี่ยวข้องกับผู้เยาว์ สำหรับโปรเจกต์ Python ที่ต้องการการสร้างข้อความพร้อมการปฏิเสธน้อยลง นี่คือขอบเขตทั้งหมด
