Güncellenme:
Çince web kurgusu ve rol yapma uygulamaları: bağlam, karakterler ve maliyet
Seri çince web kurgusu ve karakter içi sohbet, en yoğun metin iş yüklerinden ikisidir: bölüm başına binlerce karakter, aylarca tutarlı kalması gereken bir karakter kadrosu ve her hatayı fark eden okurlar. Bu rehber, istemleri nasıl yapılandıracağınızı, 100.000 token'lık bağlam penceresini nasıl yöneteceğinizi ve varsayımlardan maliyeti nasıl tahmin edeceğinizi gösterir.
Bu iş yüklerinin görünümü
Web kurgu serileri, genellikle günlük olarak yayınlanan 2.000 ila 4.000 karakterlik bölümler halinde yazılır ve kurgu yüzlerce bölüm boyunca uzanır. Rol yapma uygulamaları ise konuşma kuzenidir: bir kişilik, bir senaryo ve uzun bir geçmiş. Her ikisi de model API'sinden aynı üç şeyi gerektirir: hatırlamak için yeterli bağlam, uzun yazmak için yeterli çıktı bütçesi ve sapmayan bir stil.
Servis, https://api.chinesellmapi.com/v1 uç noktasında OpenAI uyumlu bir sohbet uç noktası sunar; id'si uncensored olan bir metin modeli mevcuttur. Bağlam penceresi, istem ve tamamlama arasında paylaşılan 100.000 token'dır; max_tokens varsayılan olarak 2.048'dir ve 32.000'e kadar çıkabilir. temperature, top_p ve stop gibi standart örnekleme alanları doğrudan iletilir. Sohbet için uygun olan akış desteği sağlanır. Temel kurulum ve kodlama notları app quickstart bölümünde yer alır.
İçerik kuralları, baştan belirtilmiştir
Bu, yalnızca yetişkinlere yönelik bir hizmettir. Yasal yetişkin edebiyatı, olgun temalar ve tartışmalı konular doğaları gereği reddedilmez ve hizmet 18 yaş ve üzeri kullanıcılar içindir. Minörler (ergenler) içeren cinsel içerik her zaman engellenir ve kurgu veya rol yapma olarak çerçevelendiğinde bile 403 content_blocked hatasını döndürür. Bunu değiştiren bir ayar yoktur.
Bunu baştan tasarlayın. Karakter kartlarınızda her karakterin yetişkin olduğunu belirtin ve açık yaşlar verin. Kendi ürününüze bir yaş kapısı ekleyin. 403 hatasını o istek için kesin bir cevap olarak kabul edin; nötr bir mesaj gösterin ve istemleri yeniden ifade ederek yeniden deneme yapmayın. Bu adımlar platform kuralları ne olursa olsun iyi bir ürün hijyenidir.
Karakter kartları ve stil blokları
Tutarlılık, sabit gerçekleri tek bir yere koyup her çağrıda tekrarlayarak sağlanır. Bir karakter kartı; isim, yaş, rol, konuşma alışkanlıkları, ilişkiler ve karakterin henüz ifşa etmemesi gereken gizli bilgiler gibi sıkı kısıtlamaları içeren kompakt bir kayıttır. Ayrı bir stil bloğu ise bakış açısını, tempoyu, diyalog oranını, bölüm uzunluğunu ve bitiş alışkanlığını sabitler. Her ikisi de sistem mesajına yerleştirilir böylece her istek başında önde dururlar.
CHARACTER_SHEET = """\
【人物卡】
姓名:沈清禾(女,28岁)
身份:江城古籍修复师,性格沉静,嘴硬心软
口头禅:“先别急,东西不会跑。”
说话方式:短句,少用感叹号,偶尔引用旧书里的句子
关系:与顾远舟(男,31岁,旧书商)是多年好友,彼此有未说出口的好感
禁忌:不提及她离开出版社的真正原因(第40章才揭晓)
"""
STYLE = """\
【文风】第三人称限知视角,贴近沈清禾;节奏舒缓,多写物件与天气的细节;
对话占比约四成;每章 2500 到 3000 字;结尾留一个小悬念。"""
Bunları Çince olarak yazın. Yakalanmış bir söz veya cümle uzunluğu gibi Çince örneklerde ifade edilen konuşma alışkanlıkları, onları anlatan bir İngilizce açıklamadan çok daha güvenilir bir şekilde aktarılır. Her formu birkaç yüz token altında tutun ve her tekrar eden karakter için bir tane verin; onluk bir kadro bile sadece birkaç bin token eder. Bir karakterin durumu değiştiğinde, değişikliği geçmişe yüklemek yerine formu kendisi güncelleyin.
Seri bölümler için uzun bağlam
Her önceki bölümü isteme yapıştırma eğilimi vardır. Önce aritmetiği yapın. 100.000 token'lık bir pencere ve yaklaşık 4.500 token'lık bölümlerle, tüm pencere çıktı için yer bırakmadan yaklaşık on dört bölüm alır ve bir seri yüzlerce sürer. Çalışılabilir desen katmanlı bellektir:
- Her zaman mevcut olan karakter kartı ve stil bloğu.
- Her bölüm için birkaç yüz karakterlik biriken bir hikaye özeti; birkaç bölümde bir yenilenen bir devam özeti olarak birleştirilir.
- Önceki bölümün tam metni, böylece anlatım birleşim yerinde bağlanır.
- Yazılan bölüm için taslak.
Her bölümün sonunda modelden, ilişki değişikliklerini ve açık plot ipliklerini koruyan kısa bir özet isteyin ve bunu devam özetine ekleyin. Aşağıdaki kod bir bölüm yazar ve bir sonraki özeti üretir. Ayrıca gerçek token sayılarını loglamanızı sağlayan usage alanını da döndürür:
import os
from openai import OpenAI
client = OpenAI(base_url="https://api.chinesellmapi.com/v1", api_key=os.environ["API_KEY"])
def write_chapter(sheet, style, story_so_far, last_chapter, outline):
messages = [
{"role": "system", "content": "你是一位连载网络小说的作者,所有人物均为成年人。严格遵守人物卡和文风设定。\n" + sheet + "\n" + style},
{"role": "user", "content": (
"【前情提要】\n" + story_so_far +
"\n\n【上一章全文】\n" + last_chapter +
"\n\n【本章大纲】\n" + outline +
"\n\n请直接写出本章正文,不要写标题以外的说明。")},
]
r = client.chat.completions.create(
model="uncensored",
messages=messages,
max_tokens=5000, # ~3,000 characters needs roughly 4,500 tokens under our assumption
temperature=0.9,
top_p=0.95,
)
return r.choices[0].message.content, r.usage
def summarize(chapter_text):
r = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "用 200 字以内概括下面这一章的剧情,保留人物关系的变化和未解的伏笔:\n" + chapter_text}],
max_tokens=400,
temperature=0.3,
)
return r.choices[0].message.content
Rol yapma: kişilik, dönüş şekli ve durma dizileri
Rol yapma, aynı kart ve stil disiplinine ve birkaç sohbet-spesifik kontrole ihtiyaç duyar. Kişiliği sistem mesajına yerleştirin, kimin kimi oynadığını belirtin, yanıt uzunluğu aralığını sabitleyin ve modelin kullanıcının karakterinin eylemlerini yazmamasını sağlayın. Model kullanıcının bir sonraki satırını yazmaya başladığında çıktıyı kesmek için stop kullanın ve metin oluşturulduğu gibi görünsün diye yanıtı akış (stream) olarak alın.
import os
from openai import OpenAI
client = OpenAI(base_url="https://api.chinesellmapi.com/v1", api_key=os.environ["API_KEY"])
PERSONA = (
"你扮演顾远舟,31岁的旧书商,说话随和,爱开玩笑,但在重要的事上很认真。"
"用户扮演沈清禾。所有角色均为成年人。保持第一人称,每次回复 80 到 200 字,"
"用(括号)写简短的动作描写,不要替用户的角色做决定。"
)
history = [{"role": "system", "content": PERSONA}]
def turn(user_text):
history.append({"role": "user", "content": user_text})
stream = client.chat.completions.create(
model="uncensored",
messages=history,
max_tokens=400,
temperature=1.0,
stop=["\n用户:"], # keep the model from writing the user's next line
stream=True,
)
reply = ""
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
piece = chunk.choices[0].delta.content
reply += piece
print(piece, end="", flush=True)
print()
history.append({"role": "assistant", "content": reply})
turn("(推开书店的门)这场雨下得真不是时候。")
Geçmiş, her turda bir kullanıcı mesajı ve bir asistan mesajı ile büyür. Yaklaşık bütçenize yaklaştığında, en eski kısmı tek bir mesaja özetleyin ve en son turları olduğu gibi koruyun. Karakterler için canlı diyaloglar için sıcaklık 0,9 ile 1,0 arasında olmalıdır; karakterin senaryoya sıkı sıkıya bağlı kalması gerektiğinde 0,5'e düşürün.
Uzun bir seride dirençli stil kontrolü
Stil kayması, okuyucuların en çok şikayet ettiği sorundur: anlatıcı yavaşça daha fazla konuşmaya başlar, diyaloglar resmi hale gelir, tempo hızlanır. Spesifik detaylarla buna karşı koyun. "Zarif bir üslupla yazın" yerine ölçülebilir alışkanlıkları tanımlayın: cümle uzunluğu, deyimlerin ne sıklıkla kullanılacağı, hava ve nesne detaylarının ne kadar dahil edileceği, bölümlerin bir gerilimle mi yoksa sessiz bir sonla mı biteceği. Hedef üslupta yazılmış iki veya üç kısa örnek paragraf, bir sayıdan fazla sıfat değerinden daha fazlasına değer.
Farklı türler farklı ayarlar gerektirir. Bir cultivation veya fantasy serisi, aynı ismin iki türlü yazılmaması için realm, sect ve technique gibi icat edilmiş terimlerin bir sözlüğünden yararlanır. Modern bir romantizm diyalog ritmine ve küçük fiziksel detaylara dayanır. Bir gizem, modelin onlara çelişmemesi için okuyucunun gördüğü gerçeklerin bir listesi olan bir ipucu defteri gerektirir. Bu listelerin her birini sistem isteminde tutun ve hikaye ilerledikçe güncelleyin.
Son olarak, sıcaklık (temperature) ve top_p değerlerini bir seri boyunca sabit tutun. Bölümler arasında örnekleme parametrelerini değiştirirseniz ses değişir. Sadece taslak beyin fırtınası için sıcaklığı artırın, metin için değil.
Belirtilen varsayımlarla maliyet hesaplaması
Tüm rakamlar, milyon giriş token'ı başına $0.25 ve milyon çıktı token'ı başına $1.00 olan yayımlanan oranları ve her Çince karakter için 1.5 token varsayımını kullanır. Varsayımları kendi usage günlüklerinizdeki sayılarla değiştirin.
| Senaryo | Varsayılan giriş tokenları | Varsayılan çıktı tokenları | Çağrı başına maliyet |
|---|---|---|---|
| Seri bölüm (3.000 karakter çıktı) | 8.000 | 4.500 | $0.0020 + $0.0045 = $0.0065 |
| Rol yapma dönüşü, 20.000 tokenlık geçmiş | 20.000 | 300 | $0.0050 + $0.0003 = $0.0053 |
| Rol yapma dönüşü, tam 60.000 tokenlık geçmiş | 60.000 | 500 | $0.0150 + $0.0005 = $0.0155 |
Bölüm satırında 8.000 giriş token'ı, 1.200 token'lık bir karakter formu ve stil bloğu, 2.000 token'lık bir özet, 4.500 token'lık önceki bölüm ve 300 token'lık bir taslak olarak ayrılır. Yüz böyle bölüm yaklaşık $0,65'e mal olur. 20.000 token'lık geçmiş boyutunda yüz rol yapma dönüşü yaklaşık $0,53'e mal olur. Çıkarım şudur: geçmiş uzunluğu sohbet maliyetini belirler, bu nedenle kısaltma ve özetleme kendini hızlı bir şekilde öder.
Yedi gün boyunca geçerli olan $0,50 deneme kredisi, ilk satırın varsayımlarına göre yaklaşık 76 bölümü karşılar. Güncel oranlar için fiyatlandırma sayfasını kontrol edin ve hesap detayları için deneme SSS sayfasına bakın.
Üretim için operasyonel notlar
Bölüm oluşturma uzun bir istektir; bu nedenle cömert zaman aşımı değerleri kullanın veya metni akış yapın ve kendiniz birleştirin. Her anahtarın dakikada 300 isteğe izin verdiğinden dolayı 429 hatasını kısa bir bekleme süresiyle yönetin ve 503 hatasını upstream_busy olarak birkaç saniye sonra yeniden deneme olayı olarak ele alın. 402 hatası, ön ödemeli bakiyenin bitmiş veya denemenin süresinin dolmuş olduğunu gösterir; bu durumda yeniden denemek yerine sizi uyarmalıdır.
Sonraki bölümü oluşturmadan önce oluşturulan her bölümü ve özetini kendi veritabanınıza kaydedin. Bir çağrı bir gece boyunca toplu işlem sırasında yolda başarısız olursa, son kaydedilen bölümden devam edebilir ve aynı metin için iki kez ödeme yapmazsınız. Maliyetin bölüm başına bir tahmin yerine bir sorgu olması için istem sürümünü ve kullanım rakamlarını her bölümün yanına kaydedin.
Rol yapma ürünleri için oturum başına bir bütçe tutun. Tek bir oturumun tüketebileceği dönüş sayısını veya toplam tokenı sınırlayın ve sınır aşıldığında kullanıcılara net bir mesaj gösterin. İstemler geçmişi içerdiğinden, çok uzun bir oturum, taze bir oturuma göre dönüş başına çok daha pahalıdır; bu yüzden eski dönüşleri özetlemek sadece pencereye sığmak için değil, maliyet açısından da önemlidir. İstemler eğitim için kullanılmaz; bunu ürününüzün gizlilik notlarında kendi depolama politikanızın yanında belirtebilirsiniz.
Sorular ve cevaplar
Bir istekte bir bölüm ne kadar uzun olabilir?
Çıktı, istek başına 32.000 token ile sınırlıdır ve prompt ile 100.000 tokenlik bağlam penceresini paylaşır. 3.000 karakterlik bir bölüm rahatlıkla sığar, bu yüzden max_tokens değerini tahmininizin biraz üzerine ayarlayın.
Yüzlerce bölüm boyunca karakterleri nasıl tutarlı tutarım?
Her çağrıda sistem prompt'unda bir karakter sayfası ve stil bloğu tutun ve hikayeyi biriken bir özet ile önceki bölümü taşıyarak ilerletin.
Yetişkin kurgusuna izin veriliyor mu?
Yetişkin karakterler arasındaki yasal yetişkin edebiyatı reddedilmez ve hizmet 18 yaş ve üzeri kullanıcılar içindir. Minörler (ergenler) içeren cinsel içerik, kurgu ve rol yapma dahil olmak üzere her zaman 403 hatası ile engellenir.
Rol yapma yanıtlarını akış olarak alabilir miyim?
Evet. Sunucu tarafından gönderilen olayları almak için stream parametresini true olarak ayarlayın ve modelin kullanıcı satırlarını yazmasını önlemek için stop dizilerini kullanın.
Anahtarınız tek bir formun uzağında
Bir hesap oluşturun, anahtarı kopyalayın ve base URL'yi değiştirin. Kurulumun tamamı bu kadar.