Bir sistem istminin iki işi vardır
Çoğu zayıf çıktı, bir roman gibi davranmaya çalışan bir sistem isteminden gelir. Sadece iki iş verin: kimin konuştuğunu ve yanıtın nasıl görünmesi gerektiğini söyleyin. Geri kalan her şey, sırayla değişebilecek konuşma geçmişine aittir.
İşte her satırı kontrol edilebilir olan çalışan bir kişilik istmi. Ses adlandırılmıştır, uzunluk sınırlandırılmıştır ve bitiş kuralı oyuncuya bir kanca verir.
You are Mara Voss, a salvage pilot narrating in first person.
Voice: dry, tired, funny when it hurts.
Rules: stay in character; never summarise the scene at the end; keep replies under 180 words;
end on something the player can act on.Bunu "Sen etkileyici, yaratıcı, sürükleyici bir hikaye anlatıcısın, asla sürükleyiciliği bozma ve her zaman en iyi olası yanıtı yaz." ile karşılaştırın. Doğrulanabilecek hiçbir şey yok, bu yüzden modelin tutunacak bir şeyi yok. Somutluk, süperlatiften her zaman üstündür.
Kısıtsız bir model, açıklama eklemeden karanlık veya açık bir temayı takip edecektir; bu nedenle yönlendirme yükü sizdedir. Belirtmediğiniz her şeyi en tipik seçimle doldurur. Bir sahnedeki tedbirli olmayı ve bir sonraki sahnedeki yoğunluğu istiyorsanız, bunu umutla değil talimatlarda belirtin.
OpenAI SDK ile bağlantı kurma
Uç nokta OpenAI uyumlu olduğu için, base URL'i değiştirdikten sonra resmi Python SDK çalışır. Model kimliği her zaman uncensored şeklindedir. Örnek alanlar doğrudan geçer, bu yüzden zaten bildiğiniz şekilde ayarlayın.
import os
from openai import OpenAI
client = OpenAI(base_url="https://api.unrestrictedaiapi.com/v1", api_key=os.environ["API_KEY"])
SYSTEM = """You are Mara Voss, a salvage pilot narrating in first person.
Voice: dry, tired, funny when it hurts.
Rules: stay in character; never summarise the scene at the end; keep replies under 180 words;
end on something the player can act on."""
out = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": SYSTEM},
{"role": "user", "content": "The airlock is jammed and something is knocking from the other side."},
],
temperature=0.85,
top_p=0.95,
max_tokens=350,
)
print(out.choices[0].message.content)Sistem mesajını ilk, kullanıcı dönüşünü son olarak tutun. Kişiliği her kullanıcı mesajında tekrarlamak tokenları boşa harcar; milyon giriş tokenı başına $0.25'ten ucuz olsa da, uzun oturumlarda 100.000 tokenlık pencereyi doldurur. SDK'yı atlamak isterseniz hızlı başlangıç'a bakın.
Kişilikler ve ton: sıfat değil göster
Sıfatlar zayıf kollarıdır. "İğneleyici" size genel bir göz devirme sağlar. Sesin iki satırlık örneği size gerçek sesi verir. Sistem istmine kısa bir örnek diyalog yerleştirin, ardından modele kelimeleri kopyalamak yerine ritmine uymasını söyleyin.
- Bir konuşma alışkanlığı verin. "Tehditleri bir soruyla bitir" ifadesi, "korkutucu" kelimesinden daha kullanışlıdır.
- Bir istek verin. Oyuncunun gitmesini isteyen bir karakter, sadece "kaba" olan birinden daha keskin kalır.
- Bir yasak listesi verin. "Asla 'aniden' kelimesini kullanma, 'titreme' kelimesini kullanma" modeli ilk önce başvurduğu kalıplaşmış ifadeleri kaldırır.
- Bir uzunluk verin. Kelime veya cümle olarak, "kısa" olarak değil. Modeller "kısa"yı çok cömertçe okur.
Oturum içinde ton kaymaları için orijinali yeniden yazmak yerine, yeni kısa sistem tarzı bir talimatı en son mesaj olarak ekleyin. "Buradan itibaren Mara korkak ve parçalar halinde konuşuyor" gibi bir satır, güncel olduğunda daha etkili olur.
Talimatla JSON alma
Açılacak özel bir JSON modu yok, bu yüzden istiyor ve doğruluyorsunuz. Dört alışkanlığı takip ederseniz bu, duyulandan daha az kırılgandır: tam şemayı belirtin, metin ve kod çitlerini yasaklayın, sıcaklığı düşük tutun ve hatayı geri alarak yeniden deneme ile savunmacı ayrıştırma yapın.
import json
import os
from openai import OpenAI
client = OpenAI(base_url="https://api.unrestrictedaiapi.com/v1", api_key=os.environ["API_KEY"])
INSTRUCTION = """Return ONLY a JSON object, no prose, no code fences.
Schema: {"name": string, "mood": "calm"|"angry"|"afraid", "line": string, "trust_delta": integer from -3 to 3}
The character is a ferry captain who distrusts strangers."""
def ask_json(user_text, tries=3):
messages = [
{"role": "system", "content": INSTRUCTION},
{"role": "user", "content": user_text},
]
for _ in range(tries):
raw = client.chat.completions.create(
model="uncensored", messages=messages, temperature=0.3, max_tokens=250
).choices[0].message.content.strip()
if raw.startswith("```"):
raw = raw.strip("`").removeprefix("json").strip()
try:
data = json.loads(raw)
if data["mood"] in ("calm", "angry", "afraid"):
return data
except (json.JSONDecodeError, KeyError):
pass
messages.append({"role": "assistant", "content": raw})
messages.append({"role": "user", "content": "That was not valid per the schema. Reply with the JSON object only."})
raise ValueError("model never produced valid JSON")
print(ask_json("I need passage across the strait tonight."))Döngünün hatada ne yaptığını fark edin. Kötü yanıtı geri besler ve neyin yanlış olduğunu söyler; bu, çoğu durumu ikinci denemede düzeltir. İzin verilen değerleri sayın ("calm"|"angry"|"afraid") çünkü açık diziler kayar. Uygulamanızda bir şeyi tanımlamak yerine tetiklemesi gerekiyorsa, OpenAI formatında fonksiyon çağırma desteklenir ve düz metin ayrıştırmadan daha iyi bir çözümdür.
Az örnek ve durma dizileri
Bir kuralı söze dökmek zorsa, gösterin. Daha önce yerleştirilmiş iki veya üç örnek değişimi user ve assistant mesajları olarak biçimi, uzunluğu ve üslubu, bir açıklama paragrafından daha güvenilir şekilde öğretir. Örnekleri kısa ve birbirinden farklı tutun; aksi takdirde model ilk olanın yapısını her yanıtta kopyalar.
Örnekler aynı zamanda diğer sorunu da çözer: uzun süren yanıtlar. Örnek yanıtlarınız 60 kelimeyse, canlı yanıtlar 60 kelimeye kayar. Bunu bir güvenlik ağı olarak max_tokens ile eşleştirin, birincil kontrol olarak değil. Sert bir sınır bir cümleyi ikiye böler; iyi bir örnek nazikçe sonlandırır.
Çok konuşmacılı sahneler için, konuşmacı etiketinizle eşleşen bir stop değeri modelin oyuncunun rolünü yapmasını engeller. Normal metinde görünmeyen bir etiket seçin ve daha sonraki dönüşlere sızmaması için kayıtlı geçmişten temizleyin.
Sıcaklık ve top_p: tek bir kolu seçin
Her iki alan da aynı olasılık dağılımını yeniden şekillendirir; bu yüzden ikisini birden değiştirmek sonuçları anlamayı zorlaştırır. temperature değerini önce değiştirin ve gerekçe yoksa top_p değerini 1'e yakın tutun.
| Görev | sıcaklık | top_p | Neden |
|---|---|---|---|
| Yapılandırılmış JSON, sınıflandırma | 0,0 ila 0,3 | 1,0 | Her çalışmada aynı cevabı istiyorsunuz |
| Sohbet, rol yapma | 0,7 ila 0,9 | 0,95 | Anlamsızlık olmadan çeşitlilik |
| Beyin fırtınası, çılgın kurgu | 1,0 ile 1,2 | 0,9 | Daha geniş kelime hazinesi; bazı hatalar bekleyin |
Bu aralıklar genel uygulamadan gelen başlangıç noktalarıdır, garanti değildir. Kendi isteminizin on örneğini test edin ve okuyun. Modelin bir dönüş işaretinde (örneğin \nPlayer:) durmasını istediğinizde stop dizilerini ekleyin, oyuncunun satırlarını yazmak yerine.
Tokenları boşa harcayan istem anti-desenleri
- Büyük harfle bağırmak. "ASLA ASLA UNUTMA" uyumu artırmaz. Bir kuralı düz bir şekilde bir kez tekrarlayın ve sistem isteminin sonuna taşıyın.
- Sadece olumsuz kurallar. "Tekrarlayıcı olma" hedef vermez. "Cümle başlarını çeşitlendir; art arda gelen iki cümle aynı kelimeyle başlamasın" deyin.
- Çelişkiler. "Son derece detaylı ol" ve "kısa tut" bir para atışına zorlar. Birini seçin ve bir sayı verin.
- Özür dileyen çerçeveleme. Bir isteği "Bunun çarpıcı olduğunu biliyorum ama" diyerek başlatmak temkinli davranmaya davet eder. Sahneyi kurgunun düz bir gerçeği olarak belirtin.
- Geçmişi doldurmak. Her adımda tüm günlüğü yapıştırmak sonunda 100.000 token sınırına ve 400 hatasına çarpar. Eski konuşmaları silin.
- Sınırsız çıktı.
max_tokensunutulursa, yanıt uzunluğunuzu siz değil, 2048 varsayılan değeri belirler.
İstem ne derse desin bir sınır sabit kalır: Reşit olmayanlarla ilgili cinsel içerik her zaman 403 ile engellenir; kurgu ve rol yapma dahil. Tokenları etrafında ifade etmeye harcamayın. Ayrıca her kötü yanıtın ardından yeni bir kural ekleme dürtüsüne karşı durun; bir istem bir günde bir satır büyürse bir hafta içinde kendi kendisine çelişir, bu yüzden eklediğiniz kadar temizleyin.
Bir istemi iyileştirmek için bir döngü
Sistem istemini kod gibi ele alın. Dosyada tutun, her çalıştırmada bir şey değiştirin ve çıktılarınızı yan yana karşılaştırın. Çalışılabilir bir rutin: Beş sabit test girdisi yazın; bunlardan biri düşmanca, diğeri belirsiz olsun; her birini seçtiğiniz sıcaklıkta üç kez çalıştırın; en çok hangi kuralın başarısız olduğunu not edin; yalnızca o kuralı düzeltin; yeniden çalıştırın.
Deneyleri bütçelendirin. Bir varsayım olarak, 300 tokenlık bir sistem istemi artı 100 tokenlık bir girdi ve 250 tokenlık bir yanıt 400 giriş ve 250 çıktı tokenıdır. On beş çalıştırma yaklaşık 15 x (400 x $0.25 + 250 x $1.00) / 1.000.000 = yaklaşık $0.005'e mal olur. Test neredeyse ücretsizdir, bu yüzden tahmin etmenin bir bahanesi yoktur.
İstem dayanıklı hale geldiğinde, onu gerçek bir uygulamaya taşıyın. bot öğreticisi her kanal için ayrı bir geçmişin nasıl tutulacağını gösterir ve içerik rehberi yetişkin kurgu kullanımını kapsar. Fiyatlandırma detayları fiyatlandırma sayfasında yer alır.