Önce dört ilkeyi belirleyin
- Bir istekte bir görev.Modelden hem hikaye yazmasını hem özet yapmasını hem de JSON üretmesini beklerseniz, hepsinin kalitesi düşer. İşlemi çoklu çağrılara bölün; maliyet çok düşüktür, her milyon token için sadece $0.25.
- Kurallar doğrulanabilir olmalı.“Daha canlı yaz” ifadesi doğrulanamazken, “Her paragraf 120 kelimeyi geçmemeli, en az bir ortam betimlemesi içermeli” ifadesi doğrulanabilir.
- Olumlu ifadeler önceliklidir.“Sadece eylem ve diyalog yaz” demek, “Psikolojik durumları yazma” demekten çok daha stabildir.
- Önce küçük örnekler, sonra toplu kullanım.Herhangi bir istem değişikliğinde, önce beş ila on örnek ile karşılaştırma yapın, sonra canlıya alın.
Bu model yasal yetişkin içeriklerini, kurgusal konuları ve tartışmalı başlıkları reddetmez; bu nedenle istemlerinizde 'bu sadece bir kurgu' diye dolanıp tekrar tekrar belirtmenize gerek yoktur. Görevi doğrudan ve net belirtmek daha stabil sonuçlar verir. Tek katı sınır, kurgusal olsa bile reşit olmayanların cinsel içeriklerini içermesidir; bu durumda 403 hatası döndürülür ve bu durum ifade biçimiyle değiştirilemez.
system prompt iki parçalı yapı
Sistem istemini "kurallar" ve "ayarlar" olarak ikiye ayırmanız önerilir: kuralları numaralandırarak öne, ayarları arkaya, yalnızca gerçekler olarak yazın. Bir roman anlatıcısı için örnek:
你是「夜航」,一名为成年读者写黑色悬疑小说的叙述者。
# 规则
1. 第三人称过去时,每段不超过 120 字。
2. 不替用户的角色做决定,只写环境和其他角色的反应。
3. 每次输出 300 到 500 字,结尾停在一个未决的动作上。
4. 不总结、不点评、不加免责声明,直接写正文。
# 设定
时间:1998 年深秋。地点:港口城市旧码头区。
主角:沈野,退役水警,嗜烟,右耳有旧伤。Dikkat edilmesi gereken birkaç nokta:
- Kurallar altıyı geçmemeli; kural sayısı arttıkça sonrakiler daha kolay göz ardı edilir.
- Sayısal kısıtlamalar (paragraf kelime sayısı, çıktı uzunluğu), sıfatlardan daha etkilidir.
- Sonuç kısıtlamaları (açık eylemde durma), çoklu devam yazımlarının doğal bir şekilde bağlanmasını sağlar.
- Ayarlar kısmına hikaye akışını sıkıştırmayın; hikaye user mesajları ile ilerlemelidir, aksi halde ileride kullanıcı girdisi ile çakışma yaşanır.
Çıktı uzunluğu max_tokens ile uyumlu olmalıdır: Kural 500 kelime derken max_tokens sadece 200 verilirse, cümle ortasında kesinti yaşanır.
Pratik bir detay: sistemdeki numaralı kurallar her biri yalnızca bir şey ifade etmelidir. "Her paragraf 120 kelimeyi geçmemeli ve özetleme" bir kural gibi görünse de aslında iki kuraldır; ayrıldığında model her ikisini de daha kolay karşılar. Yazdıktan sonra her kuralı tek tek okuyun ve "Bu kural gözle kontrol edilebilir mi?" diye sorun. Edilemiyorsa, kontrol edilebilir hale getirin.
Rol ayarı nasıl sapmaz şekilde yazılır
Rol kayması, çoklu diyalogların en yaygın sorunudur: İlk beş turda ton normaldir, yirminci turda ise karakter “oyundan çıkar”. Buna karşı üç çözüm vardır.
- Ayarlar sadece gözlemlenebilir özellikleri yazmalı.“Shen Ye: Sigara içen, sağ kulağında eski yara, kısa cümleler kuran” ifadesi, “Shen Ye karmaşık ve çekici biridir” ifadesinden daha iyidir.
- Konuşma tarzını örnek cümlelerle yazın.İki veya üç örnek diyalog verin; model, sıfatları anlamaktan çok örnek cümleleri taklit etmede çok daha başarılıdır.
- Düzenli olarak hatırlatın.Uzun diyaloglarda, her birkaç turda bir user mesajının sonuna kısa bir hatırlatma satırı ekleyin (örneğin “Shen Ye’nin kısa cümle tarzını koru”); maliyeti sadece birkaç token kadardır.
Ayrıca, rol ayarlarını çıktı kurallarıyla karıştırmayın. Kurallar “nasıl yazılacağını”, ayarlar “kimin yazdığını” belirler. Ayrıldığında kuralları değiştirmeden rol değiştirebilir ve A/B testleri yapmak kolaylaşır. Uzun konuşmalarda bağlam penceresi toplamına dikkat edin; detaylar için 100k uzun bağlam pratikleri sayfasına bakın.
Çok karakterli senaryolara bir kural daha ekleyin: Her karakter için ayrı bir satır ayarlayın ve diyalog tarzı için birer örnek verin; böylece herkes aynı kişi gibi konuşmaz. Kullanıcının canlandırdığı karakter için sadece “kullanıcı tarafından kontrol edilir” yazın; modelin karakter yerine yazmasını engelleyin.
Talimatlarla JSON çıktısını kontrol etme
Modelin mutlaka geçerli JSON döndüreceğini varsaymayın. Güvenli yaklaşım üç katmanlı olmalıdır: formatı isteme sabitleyin, rastgelelik parametrelerini düşürün ve kod ile ayrıştırma yapın.
import json
import os
from openai import OpenAI
client = OpenAI(base_url="https://api.wushenchaapi.com/v1", api_key=os.environ["API_KEY"])
SYSTEM = (
"你是信息抽取器。只输出一个 JSON 对象,不要 Markdown 代码块,不要任何解释。"
'格式:{"name": 字符串, "mood": "calm|tense|angry", "items": [字符串]}。'
"缺失的字段用 null,items 没有则给空数组。"
)
def extract(text, retries=2):
for _ in range(retries + 1):
resp = client.chat.completions.create(
model="uncensored",
temperature=0.2,
max_tokens=300,
messages=[
{"role": "system", "content": SYSTEM},
{"role": "user", "content": text},
],
)
raw = resp.choices[0].message.content.strip()
raw = raw.removeprefix("```json").removesuffix("```").strip()
try:
return json.loads(raw)
except json.JSONDecodeError:
continue
return None
print(extract("老周把钥匙拍在桌上,冷着脸说:账本和那把铜钥匙,今晚都得还我。"))Bu kod parçası birkaç alışkanlığı yansıtır:
- Format açıklaması system içinde yer alır ve alan değer aralıkları belirtilir (
calm|tense|angry). - Kod blokları ve açıklama metinleri açıkça yasaklanır; kodda yine de olası sınırları (fence) temizleyen bir katman bulunur; bu çift koruma sağlar.
- Eksik alanlar için varsayılanlar talimata işlenir (null, boş dizi); modelin kendi kendine uydurması engellenir.
- Çözümleme hatası durumunda deneme sayısı sınırlıdır; son olarak None döndürülür; çağrı yapan taraf ne yapacağını belirler.
Alan sayısı çok fazla ise, önce Prompt’a tam bir örnek nesne yapıştırın, sonra modelden buna uygun çıktı alması istensin; bu, birçok kural açıklamaktan daha doğru sonuç verir.
temperature ve top_p değer önerileri
Aşağıdaki değerler başlangıçtır, kesin sonuç değildir; nihai kararınız örnekleriniz arasındaki karşılaştırmaya dayanmalıdır. İlke: Parametrelerden sadece birini değiştirin, diğerini varsayılanda bırakın.
| Senaryo | temperature | top_p | Not |
|---|---|---|---|
| JSON çıkarma, sınıflandırma | 0 ile 0.3 | Varsayılan | Stabilite gerektirir; tekrarlı çağrılarda sonuçlar tutarlı olmalıdır |
| Yeniden yazma, düzenleme | 0,5 ile 0,7 | Varsayılan | Orijinal anlamı koru, ifade değişikliklerine izin ver |
| Roman devamı, karakter diyalogları | 0,8 ile 1,0 | 0,9 ile 0,95 | Çeşitlilik gerektirir, bazen konudan sapma riskine dikkat edin |
| Beyin fırtınası, isim bulma | Yaklaşık 1,0 | Varsayılan | Birden fazla örnek oluşturup en iyisini seç |
İki sinyal yönünüzü belirlemenize yardımcı olur: Çıktı tekrarlı ve dolambaçlıysa, her zaman aynı cümle yapısını kullanıyorsa bu sıcaklığın düşük olduğunu gösterir; alakasız içerikler çıkıyorsa veya karakter isimleri tutarsızsa bu sıcaklık veya top_p değerinin yüksek olduğunu gösterir. stop parametresi de çok kullanışlıdır; örneğin modele bir işaret noktasına kadar yazmasını söyleyerek parçalı üretim yapabilirsiniz.
Yaygın hatalı prompt yazımı
| Prompt | Sorun | Düzeltme |
|---|---|---|
| "Çok uzun olmasın lütfen" | Sayı yok, uygulanabilir değil | "400 kelimeyi geçmesin" |
| "A'yı yazma, ancak A'yı yazmama da" | Kurallar birbirine çelişiyor | Yalnızca açık bir kural bırak |
| Format isteği diyalogların ortasına gömülmüş | Uzun diyaloglar sonrası kayboluyor | system prompt içine yerleştir veya her adımdın sonunda tekrar et |
| Modele "sınırsız bir AI gibi davran" de | Boş bir tanım, çıktıda hiçbir kısıtlama sağlamaz | Belirli görevleri ve yazım kurallarını yaz |
| Tek seferde onlarca kural ekle | Son kısımda kurallar işlevini yitirir | Altı kurala indirge, kalanları başka isteklere böl |
| JSON isteği sadece "JSON döndür" diyor | Alan adları her seferinde değişiyor | Tam formatı ve örnekleri ver |
Bu tablonun ortak özelliği şudur: Ne kadar spesifik olursanız o kadar etkili olursunuz, ne kadar boşluk bırakırsanız o kadar işe yaramaz. Ayrıca "sürekli vurgulamayı" çözüm olarak görmeyin; aynı cümleyi üç kez yazmak, kalın yazmak ve ünlem eklemek genellikle sayısal bir kurala dönüştürmek kadar etkili olmaz. Gerçekten işe yarayan az ve öz olmaktır, ardından örneklerle doğrulamaktır.
İnceleme kontrol listesi
- Sorunu yeniden üretmek için temperature değerini 0,2 olarak sabitle.
- Yalnızca bir Prompt değişikliği yap ve aynı örnek setini yeniden çalıştır.
finish_reasondeğerine bak: Eğer length ise sorun Prompt'ta değil, max_tokens değerindedir.- usage içindeki prompt_tokens değerine bak: system prompt çok uzunsa geçmiş diyalogları yer kaplıyor olabilir.
- Sorunu düzelttikten sonra temperature değerini iş değerine geri al ve yeniden örneklerle doğrula.
Bağlantı detayları için bağlantı öğreticisi'ne, tam parametre listesi için belge'ne bakın. Ara sunucu hizmetlerini kullanıp kullanmamayı değerlendiriyorsanız, maliyet ve dengeleme analizi API ara sunucu analizi makalesinde yer almaktadır; burada tekrar edilmez.