LLM API'sinden Chatbot Oluşturma: Python Eğitimi
Abliterated modeller, güvenlik reddetme mekanizmaları kaldırılmış büyük dil modelleridir; bu sayede model, içerik filtresine takılmadan tartışmalı, yetişkin veya niş soruları yanıtlayabilir. Bu yaklaşım, geliştiricilere modelin üslubunu ve bilgi kesme noktasını tam kontrol imkânı sunar; bu da standart güvenlik önlemlerinin yararlı çıktıları engelleyebileceği kodlama, rol yapma ve yaratıcı yazım alanlarında özellikle değerlidir.
Güncellendi

Temel noktalar
- API durum bilgisi taşımaz, bu yüzden konuşma geçmişi kodunuzda bulunur ve her istekte gönderilir.
- Akış, fonksiyon çağırma ve JSON modu standart OpenAI parametrelerini kullanır.
- 100.000 token penceresine yaklaştığında geçmişi kısaltın veya özetleyin.
- 1.000 sohbet, 2.000 giriş ve 400 çıkış token içerir ve yaklaşık $0,50 tutar.
Temel fikir: bir chatbot bir döngü ve bir listedir
Bir dil modeli istekler arasında hiçbir şeyi hatırlamaz. Her POST /v1/chat/completions çağrısı bağımsızdır. Hafıza gibi görünen şey, programınızın önceki mesajları tekrar göndermesidir; her biri bir rol taşır: sabit talimatlar için system, kullanıcı girdisi için user ve önceki model yanıtları için assistant.
Bu nedenle mimari küçüktür. Bir liste tutun. Kullanıcı mesajını ekleyin. Listeyi gönderin. Yanıtı ekleyin. Tekrarlayın. Bu eğitimdeki akıştan araçlara kadar her şey bu döngünün bir varyasyonudur.
Buradaki API OpenAI uyumludur, bu yüzden standart openai paketini kullanırsınız. Base URL'i https://api.abliterated.cc/v1 olarak ayarlayın, anahtarınızı kullanın ve modeli uncensored olarak belirleyin. API anahtarı sayfasından bir anahtar alın; $0,50 deneme kredisi birçok kısa test mesajı için yeterlidir.
Adım 1: çalışan bir sohbet botu
SDK'yı pip install openai ile yükleyin ve bunu çalıştırın.
from openai import OpenAI
client = OpenAI(
base_url="https://api.abliterated.cc/v1",
api_key="YOUR_KEY",
)
messages = [
{"role": "system", "content": "You are a concise, friendly support assistant for a bike shop."}
]
while True:
text = input("you: ")
if text.strip() in {"quit", "exit"}:
break
messages.append({"role": "user", "content": text})
resp = client.chat.completions.create(
model="uncensored",
messages=messages,
temperature=0.7,
)
answer = resp.choices[0].message.content
messages.append({"role": "assistant", "content": answer})
print("bot:", answer)
Bu, tam bir sohbet botudur. Sistem mesajı görevini belirler, liste belleği taşır ve temperature yanıtların çeşitliliğini kontrol eder. Gerçeklere dayalı destek botları için 0,2'ye yakın değerler kullanın, yaratıcı botlar için 1,0'a yükseltin.
Görevi belirleyen bir sistem istemi yazın
Sistem mesajı, bir sohbet botunu geliştirmenin en ucuz yeridir. Kısa ve öz tutun. Rolü, hedef kitleyi, yanıt uzunluğunu ve tonunu belirtin; bot bilmediğinde ne yapması gerektiğini yazın. "Bir bisiklet dükkanı için soruları yanıtlıyorsunuz. Yanıtlarınızı en fazla üç cümleyle sınırlayın. Onarım fiyatı hakkında soru sorulursa, bir tamircinin bisikleti incelemesi gerektiğini söyleyin" gibi bir istem, genel erdemleri sıralayan bir sayfadan daha etkilidir.
İki alışkanlık işe yarar. Birincisi, kuralları tutum yerine eylem olarak verin: "yardımcı olun" yerine "belirsiz isteklerde bir netleştirici soru sorun". İkincisi, boş mesaj, çok uzun bir yapıştırma veya ürününüzle ilgili olmayan bir istek gibi düşmanca girdilerle test edin. Gördüklerinize göre istemi düzeltin ve bu girdileri bir regresyon listesi olarak saklayın.
Sistem mesajı her adımda yeniden gönderildiğinden, içindeki her kelime her istek için faturalandırılır. 400 tokenlik bir istem, 5 adımlık 1.000 sohbet üzerinden 2.000.000 giriş tokeni ekler; bu da 2 x $0,15 = $0,30 eder. Bu küçük bir tutardır ancak hacimle birlikte şişkin istemlerin birikimini gösterir.
Adım 2: yanıtı akış olarak alın
Tam bir yanıt için beklemek bir sohbet penceresinde yavaş hissettirir. stream: true ayarlayın ve parçaları geldikçe yazdırın. Akış sunucu tarafından gönderilen olayları (SSE) kullanır ve kullanım bloğu ile biter, böylece token sayılarını loglayabilirsiniz.
from openai import OpenAI
client = OpenAI(base_url="https://api.abliterated.cc/v1", api_key="YOUR_KEY")
messages = [{"role": "user", "content": "Explain tire pressure in two sentences."}]
stream = client.chat.completions.create(
model="uncensored",
messages=messages,
stream=True,
)
reply = ""
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
part = chunk.choices[0].delta.content
reply += part
print(part, end="", flush=True)
if getattr(chunk, "usage", None):
print("\ntokens:", chunk.usage.prompt_tokens, chunk.usage.completion_tokens)
Birleşmiş reply değerini geçmişinize eklemeyi unutmayın, yoksa sonraki adım botun ne dediğini bilemez.
Adım 3: büyümeden önce bağlamı yönetin
Pencere 100.000 tokenlik bir alandır ve istem ile tamamlama arasında paylaşılır. Çoğu chatbot buna yaklaşmaz, ancak her adımda tüm istem için ödeme yaptığınız için maliyet geçmişiyle artar. Hem maliyeti hem de boyutu kontrolde tutmak için basit bir politika izleyin:
- Sistem mesajını her zaman koruyun.
- Son 10 ile 20 mesajı aynen koruyun.
- Liste seçtiğiniz bir boyut sınırını (örneğin 8.000 tahmini token) aştığında, en eski bloğu modele "bu konuşmayı 150 kelimenin altında özetle" talimatıyla gönderin ve o bloğu bir sistem mesajı olarak özetle değiştirin.
Dört İngilizce karakter başına bir token şeklindeki kaba tahmin yeterlidir. Her yanıtın kullanım sayıları, limitinizi kalibre etmenizi sağlayacak kesin rakamı sonradan verir.
En eski mesajları atarak kısaltma yapıyorsanız, bunları user ve assistant çiftleri halinde atın. Sorusuz bir yanıt veya cevapsız bir soru, modelin kafasını beklenenden daha fazla karıştırır.
Adım 4: bota araçlar verin
Fonksiyon çağırma, modelin kodunuzdan sipariş aramak gibi bir işlem yapmasını istemesini sağlar. Fonksiyonları tools ile tanımlarsınız, model tool_calls girdisiyle yanıt verir, fonksiyonu çalıştırırsınız ve sonucu role: "tool" mesajı olarak gönderirsiniz.
import json
from openai import OpenAI
client = OpenAI(base_url="https://api.abliterated.cc/v1", api_key="YOUR_KEY")
tools = [{
"type": "function",
"function": {
"name": "get_order_status",
"description": "Look up the status of an order by its id",
"parameters": {
"type": "object",
"properties": {"order_id": {"type": "string"}},
"required": ["order_id"],
},
},
}]
def get_order_status(order_id):
return {"order_id": order_id, "status": "shipped"}
messages = [{"role": "user", "content": "Where is order A1042?"}]
resp = client.chat.completions.create(
model="uncensored", messages=messages, tools=tools, tool_choice="auto"
)
msg = resp.choices[0].message
if msg.tool_calls:
messages.append(msg)
for call in msg.tool_calls:
args = json.loads(call.function.arguments)
result = get_order_status(**args)
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": json.dumps(result),
})
final = client.chat.completions.create(
model="uncensored", messages=messages, tools=tools
)
print(final.choices[0].message.content)
Yan etkilere sahip herhangi bir şeyi çalıştırmadan önce her zaman argümanları doğrulayın. Model bir çağrı önerir; kodunuz bunu çalıştırıp çalıştırmama konusunda karar verir.
Adım 5: JSON modu ile yapılandırılmış çıktı
Programınızın bir sonraki adımı metin yerine veri gerektiriyorsa (örneğin bir mesajı bir kategoriye sınıflandırmak), response_format ile JSON modunu kullanın. İsteminizde JSON kelimesini ve beklenen anahtarları da belirtin.
curl https://api.abliterated.cc/v1/chat/completions \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "uncensored",
"response_format": {"type": "json_object"},
"messages": [
{"role": "system", "content": "Reply with JSON: {\"intent\": string, \"urgent\": boolean}"},
{"role": "user", "content": "My brakes squeal and I ride tomorrow morning."}
]
}'
Hâlâ json.loads işlevini bir try bloğu içine alın. Ayrıştırma başarısız olursa, hata metnini ekleyerek bir kez yeniden deneyin; başarısız istekler ücretlendirilmez.
Hatalar, maliyet ve dağıtım notları
Hataları, yeniden denemeleri ve hız limitlerini yönetin
Gerçek kullanıcılar istekleri beklenmedik zamanlarda gönderir ve ağlar hata verir. Kötü bir yanıtın konuşmayı çökertmemesi için çağrıyı sarmalayın.
import time
from openai import OpenAI, APIError, RateLimitError
client = OpenAI(base_url="https://api.abliterated.cc/v1", api_key="YOUR_KEY")
def chat(messages, tries=3):
for attempt in range(tries):
try:
resp = client.chat.completions.create(
model="uncensored", messages=messages, temperature=0.7
)
return resp.choices[0].message.content
except RateLimitError:
time.sleep(2 ** attempt)
except APIError as exc:
if attempt == tries - 1:
raise
time.sleep(1)
return "Sorry, the assistant is busy. Please try again in a moment."
Tam anahtar 8 eşzamanlı istek ve dakikada 300 istek izni verir; deneme anahtarı 2 ve 60 izni verir. Botunuz aynı anda birçok kullanıcıya hizmet ediyorsa, yeniden denemelere güvenmek yerine istekleri 8'in altında bir worker limitiyle bir kuyruğa koyun. Başarısız istekler ücretlendirilmediğinden, yeniden denemenin token maliyeti yoktur. Gerçek bir kesinti durumunda hızlı başarısız olması için yeniden deneme sayısını küçük tutun.
Ayrıca her konuşma adımında X-Request-Id başlığını loglayın. Bir yanıt yanlış görünürse, bu kimlik daha sonra kesin isteği bulmanızı sağlar.
Maliyet ve dağıtım
Fiyat 1M giriş tokeni başına $0,15 ve 1M çıkış tokeni başına $0,50'dir. Diyelim ki bir destek sohbeti toplam 2.000 giriş tokeni ve 400 çıkış tokeni kullanıyor.
- Giriş: 0,002M x $0,15 = $0,0003
- Çıkış: 0,0004M x $0,50 = $0,0002
- Bir sohbet: $0,0005, yani 1.000 sohbet $0,50 tutar.
Güncel oranları ve bakiye yükleme bonuslarını fiyatlandırma sayfasında görüntüleyin. Üretim ortamında anahtarı sunucunuzda tutun, tarayıcı kodunda asla kullanmayın ve kredi bitmeden uyarı almak için X-Balance-USD yanıt başlığını izleyin. Tam anahtar 8 eşzamanlı istek ve dakikada 300 istek izni verir; bu nedenle tüm istekleri aynı anda göndermek yerine sıraya alın. Dokümantasyon desteklenen her parametreyi listeler.
Daha fazla kılavuz
Sorular ve cevaplar
Bir chatbot oluşturmak için bir çerçeveye ihtiyacınız var mı?
Hayır. Çalışan bir bot için OpenAI SDK'sı ve bir mesaj listesi yeterlidir. Ekstra özelliklere ihtiyacınız olursa çerçeveyi sonra ekleyin.
API, önceki mesajları hatırlıyor mu?
Hayır. Her istek bağımsızdır, bu nedenle kodunuz her seferinde geçmişi yeniden göndermelidir.
Geçmişin çok uzun olmasını nasıl engellerim?
Sistem mesajını ve son konuşmaları koruyun; liste, belirlediğiniz bir boyutu aştığında eski olanları kısa bir özet haline getirin.
Bot kendi işlevlerimi çağırabilir mi?
Evet. Araçları ve tool_choice parametresini iletin; yanıt tool_calls içerdiğinde fonksiyonu çalıştırın ve sonucu bir tool mesajı olarak döndürün.
Anahtarınız tek bir formun uzağında
Bir hesap oluşturun, anahtarı kopyalayın ve base URL'yi değiştirin. Kurulum bu kadar basit.