Python betiğine ücretsiz bir LLM ekleme yolları
Ücretsiz llms for python araması yapanlar genellikle iki şeyden birini kastediyor. İlki Ollama, llama.cpp veya Hugging Face transformers kütüphanesi gibi bir şey kullanarak indireceğiniz ve çalıştıracağınız açık ağırlıklı bir modeldir. İkincisi ise prototip için ücretsiz gibi hissettirecek kadar ucuz veya yeterli deneme kredisi olan sunulan bir uç noktadır. İkisi de meşrudur ve farklı işler için uygundur.
Yerel çalıştırma, token başına fatura olmaması ve verilerinizin makinenizden çıkmaması anlamına gelir. Ayrıca seçtiğiniz model için yeterli RAM veya GPU belleğine sahip olmanız, indirmeleri beklemeniz ve dizüstü bilgisayara sığan küçük modellerin büyük modellere göre daha zayıf yanıt vermesi demektir. Barındırılan bir API donanım sorununu ortadan kaldırır, ancak deneme süresi bittikten sonra token başı ödeme yaparsınız. Bu sayfa her iki seçeneği de dürüstçe ele alır, ardından bu sitedeki barındırılan seçenek için Python kodunu gösterir; bu API OpenAI ile uyumludur ve standart openai paketiyle çalışır.
Yerel modeller ve sunulan API yan yana
| Soru | Kendi başınıza çalıştırın | Sunulan ön ödemeli API |
|---|---|---|
| Token başına maliyet | Yok, ancak donanım ve elektrik için ödeme yaparsınız | 1M giriş için $0,15, 1M çıkış için $0,50 |
| Kurulum süresi | Çalışma zamanını yükleyin, ağırlıkları indirin, ayarları ince ayarlayın | Bir paket yükleyin, bir anahtar yapıştırın |
| Bağlam uzunluğu | Belleğinizle sınırlıdır | 100.000 token, istem ve tamamlama |
| Eşzamanlılık | Makinenizin kaldırabildiği her şey | Tam anahtarda eşzamanlı 8 istek, deneme anahtarında 2 |
| Redler | Seçtiğiniz ağırlıklara bağlıdır | Yasal yetişkin kullanımı için içerik reddi olmadan yanıt verecek şekilde ayarlanmıştır |
| Çevrimdışı kullanım | Evet | Hayır |
Kapasiteli bir GPU'nuz varsa ve işiniz gizli veya çevrimdışı ise yerel bir çözüm iyidir ve okumayı burada bitirebilirsiniz. Makineye sahip olmadan daha büyük bir modele ihtiyacınız varsa veya betiğinizin dizüstü bilgisayarda, sunucuda ve CI çalıştırıcısında aynı şekilde davranmasını istiyorsanız sunulan yol daha basittir. Birçok proje hem geliştirme sırasında küçük bir yerel model hem de üretimde sunulan modeli, tek bir temel URL değiştirerek kullanır.
Sunulan uç noktayı beş dakikada kurun
Önce bir anahtara ihtiyacınız var. Google veya e-posta ve şifre ile kaydolun, ardından API anahtarı sayfası üzerinde tek tıkla $0.50 deneme kredisi talep edin. Deneme 7 gün boyunca geçerlidir, kişi başı bir kez ve ödeme gerektirmez. Ardından SDK'yı yükleyin ve anahtarı kaynak kodunuzun dışında tutun.
pip install openai
export NOTRACK_API_KEY="sk-your-key-here"
İstemci, varsayılan OpenAI kurulumundan iki değişiklik gerektirir: base URL ve anahtar. Model ID'si uncensored'dir ve yalnızca bir model sunulur.
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)
Kimlik doğrulama, SDK'nın sizin için eklediği standart Authorization: Bearer başlığıdır. İki yöntem vardır: POST /v1/chat/completions ve GET /v1/models. Bağlantıyı client.models.list() ile onaylayabilirsiniz; bu kullanılabilir model kimliğini döndürür. Tam parametre listesi belgeleme sayfasında yer alır.
Akış yanıtları
Bir insanın izlediği her şey için akış kullanın. stream=True ayarlayın ve sunucu gönderilen olaylar geldikçe parçalara göre yineleyin. Kullanım akışın sonunda raporlanır, böylece token sayılarını hala günlüğe kaydedebilirsiniz.
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)
İnsanları yakalayan bir ayrıntı: akışlı bir istek, akış bitene kadar eşzamanlılık yuvasını tutar. 2 yuvalı bir deneme anahtarında, iki açık akış üçüncü bir çağrıda concurrency koduyla 429 hatası alır. Her zaman akışı tüketin veya kapatın.
Araç çağırma ve JSON modu
Uç nokta tools, tool_choice, akışlı tool_calls ve role: "tool" olarak gönderilen sonuçları destekler. İşte bir fonksiyonla tam istek-cevap döngüsü.
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'i her zaman savunmacı olarak ayrıştırın; model bunu bir JSON dizgesi olarak döndürür ve herhangi bir model bazen hatalı bir tane üretebilir. Araçlar olmadan yapılandırılmış çıktı için JSON modunu kullanın.
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 kelimesini söyleyin ve isteminizdeki anahtarları adlandırın, sıcaklığı düşük tutun. Üretim kodu için json.loads'i bir try bloğu içine alın.
Hız limitleri, hatalar ve yeniden denemeler
Tam anahtar 8 eşzamanlı istek ve dakikada 300 istek yapmanızı sağlar. Deneme anahtarı 2 ve 60 yapmanıza izin verir. Aşıp geçerseniz HTTP 429 alırsınız: rate_limited (dakikada çok fazla) veya concurrency (aynı anda çok fazla). Geçici aşırı yüklenmede API ayrıca 429 döndürür ve Retry-After: 5 başlığı gönderir. SDK bazı hataları kendi başına yeniden dener; dallanan bir betik için küçük bir açık sarmalayıcı daha nettir.
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'i anahtarınızın eşzamanlılık limitine eşleştirmek çoğu 429'u önler. Her yanıt ayrıca X-Request-Id, X-Balance-USD ve iki hız limiti başlığı taşır, bunları hata ayıklama veya destek için ihtiyaç duyduğunuzda client.chat.completions.with_raw_response.create(...) üzerinden okuyabilirsiniz.
Yerel ve sunulan arasında nasıl seçim yapılır
İdeolojiden kaçının ve projeniz hakkında dört soruyu yanıtlayın.
- Verilerin makinenizde kalması mı gerekiyor? Bir sözleşme veya alışkanlık evet diyorsa, yerel çalıştırın. Barındırılan istemler burada eğitim için kullanılmaz, ancak ağ üzerinden iletilirler.
- Ne kadar belleğiniz var? Model boyutu kaliteyi belirler. Dahili GPU'suz bir dizüstü bilgisayar sizi küçük modellere sınırlar ve yanıtlar bunu gösterecektir. Sunulan bir model size 100,000 token bağlam penceresi ile büyük bir model verir, bu evde eşleşmesi zordur.
- Kaç istek göndereceksiniz? Haftada birkaç yüz her iki tarafta da önemsizdir. Ayda yüz binlerce, sunulan faturayı gerçek bir sayıya dönüştürür ve makine boşta duruyorsa yerel bir kutu çekici görünmeye başlar. Toplamı hesaplayın: 100.000 istek, 1.000 girdi ve 500 çıktı tokeni 100.000 x $0.0004 = $40'a mal olur.
- Reddettiği durumların belirli bir şekilde ele alınmasını ister misiniz? Çoğu açık ağırlıklı model yerleşik reddetme davranışıyla gelir, diğerleri ise bunu kaldırmak için ayarlanmıştır. Burada sunulan model, yasal yetişkin kullanımı için içerik reddetmeleri olmadan yanıt verecek şekilde ayarlanmıştır, bu yüzden doğru ağırlıkları aramanıza gerek yoktur.
Yanıtlarınız her iki yöne de işaret ediyorsa, ilk hafta için sunulan ile başlayın. Deneme ücretsizdir ve donanım satın almadan veya başka bir çok gigabytlık dosya indirmeden önce istemlerinizin neye ihtiyaç duyduğunu öğreneceksiniz.
Python betiklerinde yaygın hatalar
İnsanların karşılaştığı sorunların çoğu küçük ve düzeltilebilirdir.
- Yanlış base URL.
/v1ile bitmelidir. Eksik sonek bir 404 verir, yardımcı bir mesaj değil. Şüphe halindeclient.base_urlyazdırın. - Anahtar kodda. Yukarıdaki gibi bir ortam değişkeninden okuyun ve
.envdosyanızı.gitignoredosyasına ekleyin. - Yanlış model adı. Tek model ID'si
uncensored'dir. Diğer sağlayıcılardan isimler çalışmaz, bu yüzden kodu aktarırken değiştirin. - Sonsuz döngüler. Sonlanmayan bir fonksiyon çağırma döngüsü pahalı bir hatadır. Örneğin beş tur ile sınırlayın.
- Bağlam bütçesini görmezden gelme. İstem ve tamamlama 100.000 tokeni paylaşır. Her dönüşü sonsuza kadar eklerseniz, nihayetinde limite çarparsınız. Eski mesajları kısaltın veya özetleyin.
- JSON'un her zaman geçerli olduğu varsayımı. JSON modunda bile, kullanmadan önce ihtiyacınız olan anahtarları kontrol edin.
Sunucu tarafında bir şeyler yanlış görünürse, support adresine yazarken yanıtın X-Request-Id değerini belirtin. Bu, operatörlerin tam çağrınızı bulmasını sağlar.
Python işleri için sunulan seçeneğin maliyeti
1.000 giriş ve 500 çıkış token'ı içeren tipik bir betik çağrısı $0,00015 + $0,00025 = $0,0004 tutarındadır. $0,50 deneme kredisi yaklaşık 1.250 çağrıyı karşılar. Minimum $20 bakiye yükleme 50.000 çağrıyı karşılar. Kredi süresi dolmaz, başarısız veya reddedilen istekler için ücret alınmaz ve istemler eğitim için kullanılmaz. Bakiye yükleme $500'e kadar çıkabilir, $50 ve üzeri yüklemelerde bonus sağlanır. Ödeme kripto para ile yapılır: TRC20 üzerinden USDT veya Base üzerinden USDC. Detaylar için fiyatlandırma sayfasına bakın.
Sadece metin destekler: resim, ses, video, gömme (embedding) veya ince ayar (fine-tuning) yoktur. Tek katı kural, reşit olmayanlar ile ilgili cinsel içeriklerin yasaklanmasıdır. Daha az reddedilme ile metin üretimi yapan bir Python projesi için bu, tüm yelpazeyi kapsar.
