TR ▾
API Anahtarını Al

Sansürsüz Model API İstemi Yazımı: system, rol, format, örnekleme

Aynı modelde istem gevşek veya sıkı yazıldığında çıktı kalitesi bir basamak fark yaratır. Burada sezgisel anlatımlar yerine, doğrudan kodunuza entegre edip test edebileceğiniz mühendislik yaklaşımlarını listeliyoruz: system prompt nasıl katmanlandırılır, rol ayarı nasıl sapmadan yazılır, sadece talimatlarla parse edilebilir JSON nasıl elde edilir, temperature ve top_p nasıl ayarlanır ve hangi yazım biçimleri kesinlikle başarısız olur. Her madde kodunuzdaki karşılaştırmalı testlere dahil edilebilir.

tarihinde güncellendi

Önemli Noktalar

  • system prompt kurallar ve ayarlar olmak üzere iki parçalı olmalı; kurallar numaralandırılmalı, ayarlarda sadece gerçekler yazılmalıdır.
  • JSON istiyorsanız formatı talimatta sabitleyin, temperature değerini düşürün ve kodda çözümleme hatası için yedek mekanizma bulundurun.
  • temperature ve top_p değerlerinden sadece birini değiştirin; yaratıcı işler için 0.8 ile 1.0, veri çıkarma için 0 ile 0.3 ile başlayın.
  • Yaygın hata yazımları: Belirsiz olumsuz cümleler, birbirine çelişen kurallar, format gereksinimlerinin konuşma ortasına yerleştirilmesi.

Ö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:

  1. Kurallar altıyı geçmemeli; kural sayısı arttıkça sonrakiler daha kolay göz ardı edilir.
  2. Sayısal kısıtlamalar (paragraf kelime sayısı, çıktı uzunluğu), sıfatlardan daha etkilidir.
  3. Sonuç kısıtlamaları (açık eylemde durma), çoklu devam yazımlarının doğal bir şekilde bağlanmasını sağlar.
  4. 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.

Senaryotemperaturetop_pNot
JSON çıkarma, sınıflandırma0 ile 0.3VarsayılanStabilite gerektirir; tekrarlı çağrılarda sonuçlar tutarlı olmalıdır
Yeniden yazma, düzenleme0,5 ile 0,7VarsayılanOrijinal anlamı koru, ifade değişikliklerine izin ver
Roman devamı, karakter diyalogları0,8 ile 1,00,9 ile 0,95Çeşitlilik gerektirir, bazen konudan sapma riskine dikkat edin
Beyin fırtınası, isim bulmaYaklaşık 1,0VarsayılanBirden 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ı

PromptSorunDü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şiyorYalnızca açık bir kural bırak
Format isteği diyalogların ortasına gömülmüşUzun diyaloglar sonrası kayboluyorsystem prompt içine yerleştir veya her adımdın sonunda tekrar et
Modele "sınırsız bir AI gibi davran" deBoş bir tanım, çıktıda hiçbir kısıtlama sağlamazBelirli görevleri ve yazım kurallarını yaz
Tek seferde onlarca kural ekleSon kısımda kurallar işlevini yitirirAltı kurala indirge, kalanları başka isteklere böl
JSON isteği sadece "JSON döndür" diyorAlan adları her seferinde değişiyorTam 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

  1. Sorunu yeniden üretmek için temperature değerini 0,2 olarak sabitle.
  2. Yalnızca bir Prompt değişikliği yap ve aynı örnek setini yeniden çalıştır.
  3. finish_reason değerine bak: Eğer length ise sorun Prompt'ta değil, max_tokens değerindedir.
  4. usage içindeki prompt_tokens değerine bak: system prompt çok uzunsa geçmiş diyalogları yer kaplıyor olabilir.
  5. 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.

Sık sorulan sorular

system prompt ne kadar uzun olmalı?

Kuralları net bir şekilde ifade edebildiğiniz sürece yeterlidir; genellikle birkaç yüz kelime yeterlidir. Ne kadar uzun olursa bağlam penceresini o kadar çok kaplar ve kuralların birbirine çarpma ihtimali o kadar artar, bu nedenle kural sayısının altıyı geçmemesi önerilir.

Neden yalnızca JSON çıktısı vermemi istediğimi belirtmeme rağmen bazen açıklama metni ekleniyor?

Bu normal bir durumdur. temperature değerini düşürmek, tam örnekler vermek ve kodda sınırlayıcı metinleri ayırmak ile ayrıştırma hatası durumunda yeniden denemek, sürekli vurgulamaktan daha güvenilirdir.

temperature ve top_p değerlerini aynı anda ayarlayabilir miyim?

Evet, ancak önerilmez. İki parametreyi aynı anda değiştirmek hangi değişikliğin hangi parametreden kaynaklandığını belirlemeyi zorlaştırır; önce birini sabitleyin, yalnızca diğerini değiştirin.

Prompt'ta "bu kurgu" olduğunu belirtmem gerekiyor mu?

Gerekli değil. Yasal yetişkin kurgu içeriği reddedilmez; görevi net belirtmeniz yeterlidir. Alt yetişkinlere yönelik cinsel içerik her durumda engellenir.

Anahtarınızı almak için formu doldurmanız yeterlidir

Hesap oluşturun, anahtarınızı kopyalayın ve Base URL'i değiştirin. Yapılandırma bu kadar kolay.