Zaktualizowano
Fikcja i roleplay: kontekst, postacie i koszt
Serializowana chińska fikcja sieciowa i czat w roli to dwa z najbardziej wymagających obciążeń tekstowych: tysiące znaków na rozdział, obsada, która musi pozostać spójna przez miesiące, i czytelnicy, którzy zauważają każdy błąd. Ten przewodnik pokazuje, jak strukturować prompty, zarządzać oknem kontekstu 100,000 tokenów i oszacować koszt na podstawie podanych założeń.
Jak wyglądają te obciążenia
Seriale fikcji sieciowej pisane są w rozdziałach po 2,000 do 4,000 znaków, często publikowane codziennie, z fabułą rozciągającą się na setki rozdziałów. Aplikacje do odgrywania ról to konwersacyjny odpowiednik: persona, scenariusz i długa historia. Oba wymagają od API modelu trzech rzeczy: wystarczającego kontekstu do zapamiętania, wystarczającego budżetu wyjściowego do pisania na długo i stylu, który nie dryfuje.
Usługa oferuje endpoint kompatybilny z OpenAI w https://api.chinesellmapi.com/v1 z jednym modelem tekstowym o identyfikatorze uncensored. Okno kontekstu wynosi 100 000 tokenów dzielonych między prompt a uzupełnienie, max_tokens domyślnie ustawione jest na 2048 i może osiągnąć 32 000, a standardowe pola próbkowania takie jak temperature, top_p i stop są przekazywane dalej. Strumieniowanie jest wspierane, co sprawdza się w czatach. Podstawowa konfiguracja i uwagi dotyczące kodowania znajdują się w app quickstart.
Zasady dotyczące treści, podane na wstępie
To usługa przeznaczona wyłącznie dla dorosłych. Prawna fikcja dla dorosłych, dojrzałe tematy i kontrowersyjne tematy nie są odrzucane jako takie, a usługa przeznaczona jest dla użytkowników w wieku 18 lat lub starszych. Treści seksualne z udziałem małoletnich są zawsze blokowane i zwracają błąd 403 content_blocked, również gdy są ujęte jako fikcja lub odgrywanie ról. Nie ma ustawienia, które to zmienia.
Buduj pod to od początku. W kartach postaci zaznacz, że każda postać jest osobą dorosłą i podaj dokładny wiek. Dodaj w swojej aplikacji bramę wiekową. Traktuj błąd 403 jako ostateczną odpowiedź dla tego zapytania: pokaż neutralną wiadomość i nie powtarzaj zapytania z przekształconym promptem. To dobre praktyki produktowe niezależnie od zasad platformy.
Karty postaci i bloki stylu
Spójność wynika z umieszczania stabilnych faktów w jednym miejscu i powtarzania ich przy każdym wywołaniu. Karta postaci to kompaktowy rekord imienia, wieku, roli, nawyków mówienia, relacji i twardych ograniczeń, w tym sekretów, których postać nie powinna jeszcze ujawnić. Oddzielny blok stylu ustala punkt widzenia, tempo, proporcję dialogów, długość rozdziału i nawyk zakończenia. Oba idą w wiadomości systemowej, aby znajdowały się na początku każdego zapytania.
CHARACTER_SHEET = """\
【人物卡】
姓名:沈清禾(女,28岁)
身份:江城古籍修复师,性格沉静,嘴硬心软
口头禅:“先别急,东西不会跑。”
说话方式:短句,少用感叹号,偶尔引用旧书里的句子
关系:与顾远舟(男,31岁,旧书商)是多年好友,彼此有未说出口的好感
禁忌:不提及她离开出版社的真正原因(第40章才揭晓)
"""
STYLE = """\
【文风】第三人称限知视角,贴近沈清禾;节奏舒缓,多写物件与天气的细节;
对话占比约四成;每章 2500 到 3000 字;结尾留一个小悬念。"""
Pisz po chińsku. Nawyki językowe wyrażone w chińskich przykładach, takich jak przechwytyka czy długość zdania, przenoszą się znacznie lepiej niż angielski opis. Trzymaj się kilku setek tokenów na kartę i dodaj kartę dla każdej powracającej postaci; obsada dziesięciu postaci to wciąż tylko kilka tysięcy tokenów. Gdy sytuacja postaci się zmienia, zaktualizuj kartę, a nie polegaj na historii, by przenieść zmianę.
Długi kontekst dla serializowanych rozdziałów
Pokusą jest wklejenie każdego poprzedniego rozdziału do promptu. Zrób rachunki najpierw. Przy oknie 100 000 tokenów i rozdziałach po ok. 4 500 tokenów, całe okno mieści ok. czternaście rozdziałów bez miejsca na output, a serial trwa setki. Pracowny wzorzec to warstwowa pamięć:
- Karta postaci i blok stylu, zawsze obecne.
- Stalowe streszczenie historii, kilka setek znaków na rozdział, scalone w jedno biegnące streszczenie, które odświeżasz co kilka rozdziałów.
- Pełny tekst poprzedniego rozdziału, aby proza łączyła się na szwie.
- Zarys rozdziału, który jest pisany.
Po każdym rozdziale poproś model o krótkie streszczenie, które zachowuje zmiany relacji i otwarte wątki fabularne, i dołącz je do streszczenia. Poniższy kod pisze rozdział i generuje kolejne streszczenie. Zwraca również usage, abyś mógł logować rzeczywiste liczby tokenów:
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
Odgrywanie ról: persona, kształt tury i sekwencje stop
Odgrywanie ról wymaga tej samej dyscypliny kart i stylu oraz kilku kontroli specyficznych dla czatu. Umieść personę w wiadomości systemowej, określ, kto gra kogo, ustal zakres długości odpowiedzi i kaź modelowi nie pisać akcji postaci użytkownika. Użyj stop, aby odciąć output, jeśli model zacznie pisać kolejną linię użytkownika, i strumieniuj odpowiedź, aby tekst pojawiał się w miarę generowania.
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("(推开书店的门)这场雨下得真不是时候。")
Historia rośnie o jedną wiadomość użytkownika i jedną asystenta na turę. Gdy zbliżysz się do limitu budżetu, podsumuj najstarszą część w jedną wiadomość i zachowaj najnowsze tury dosłownie. Temperatura około 0,9–1,0 daje żywą konwersację dla postaci; obniż ją do 0,5, gdy persona musi ściśle trzymać się scenariusza.
Kontrola stylu, która przetrwa długi serial
Dryf stylu to porażka, o którą czytelnicy skarżą się najczęściej: narrator powoli staje się bardziej gadatliwy, dialogi stają się formalne, tempo przyspiesza. Walcz z tym konkretnymi danymi. Zamiast "pisz eleganckim stylem", opisz mierzalne nawyki: długość zdania, jak często używać idiomów, ile szczegółów o pogodzie i obiektach uwzględniać, czy rozdziały kończą się haczykiem, czy cichym akcentem. Dwa lub trzy krótkie akapity próbne w docelowym głosie, umieszczone w bloku stylu, są warte więcej niż strona przymiotników.
Różne gatunki wymagają różnych parametrów. Serial kultywacyjny lub fantasy zyskuje na kontrolce słownictwa wymyślonych terminów, takich jak krainy, sekty i techniki, aby to samo imię nie było pisane na dwa sposoby. Współczesna romansowa historia opiera się na rytmie dialogów i drobnych detalach fizycznych. Zagadka potrzebuje księgi wskazówek: listy faktów, które czytelnik widział, aby model się im nie sprzeciwiał. Trzymaj każdą z tych list w promptcie systemowym i aktualizuj ją, jak historia się rozwija.
Na koniec, utrzymuj temperaturę i top_p stałe w ramach serialu. Jeśli zmieniasz próbkowanie między rozdziałami, głos się zmienia. Podnoś temperaturę tylko do burzy mózgów nad zarysami, nie dla samej prozy.
Matematyka kosztów z podanymi założeniami
Wszystkie stawki opierają się na opublikowanych stawkach $0,25 za milion tokenów wejściowych i $1,00 za milion tokenów wyjściowych oraz założeniu 1,5 tokena na znak chiński. Zastąp założenia liczbami z własnych dzienników usage.
| Scenariusz | Założone tokeny wejściowe | Założone tokeny wyjściowe | Koszt na wywołanie |
|---|---|---|---|
| Serialny rozdział (3,000 znaków wyjście) | 8 000 | 4 500 | $0.0020 + $0.0045 = $0.0065 |
| Tura odgrywania ról, historia 20,000 tokenów | 20 000 | 300 | $0.0050 + $0.0003 = $0.0053 |
| Tura odgrywania ról, pełna historia 60,000 tokenów | 60 000 | 500 | $0.0150 + $0.0005 = $0.0155 |
W wierszu rozdziału 8000 tokenów wejściowych dzieli się na kartę postaci i blok stylu 1200 tokenów, streszczenie 2000 tokenów, poprzedni rozdział 4500 tokenów i zarys 300 tokenów. Sto takich rozdziałów kosztowałoby około $0,65. Sto tur odgrywania ról przy historii 20 000 tokenów kosztuje około $0,53. Wniosek: długość historii napędza koszt czatu, więc przycinanie i podsumowywanie szybko się zwracają.
Kredyt próbny $0,50 ważny przez siedem dni pokrywa około 76 rozdziałów przy założeniach z pierwszego wiersza. Sprawdź pricing, aby zobaczyć aktualne stawki, i zobacz trial FAQ, aby uzyskać szczegóły konta.
Uwagi operacyjne dla produkcji
Generowanie rozdziału to długie zapytanie, więc użyj hojnych limitów czasu lub strumieniuj i zmontuj tekst samodzielnie. Obsłuż 429 krótkim opóźnieniem, ponieważ każdy klucz pozwala na 300 zapytań na minutę, a traktuj 503 z upstream_busy jako zdarzenie do ponownej próby za kilka sekund. 402 oznacza, że przedpłacony balans został wyczerpany lub próba wygasła, co powinno Cię ostrzec, a nie powtarzać.
Zapisuj każdy wygenerowany rozdział i jego streszczenie we własnej bazie danych przed wygenerowaniem kolejnego. Jeśli połączenie zawiednie w połowie nocy batcha, możesz wznowić od ostatniego zapisanego rozdziału i nigdy nie płacisz dwukrotnie za ten sam tekst. Przechowuj wersję promptu i statystyki użycia obok każdego rozdziału, aby koszt rozdziału był zapytaniem, a nie zgadywanką.
Dla produktów odgrywających role, utrzymuj budżet na sesję. Ogranicz liczbę tur lub całkowitą liczbę tokenów, które jedna sesja może zużyć, i pokaż użytkownikom jasną wiadomość, gdy limit zostanie osiągnięty. Ponieważ prompty zawierają historię, bardzo długa sesja kosztuje znacznie więcej na turę niż świeża, dlatego streszczanie starych tur ma znaczenie poza samym dopasowaniem do okna. Prompty nie są używane do trenowania, co możesz wskazać w notach prywatności swojego produktu wraz z własną polityką przechowywania.
Pytania i odpowiedzi
Jak długi może być rozdział w jednym zapytaniu?
Wynik jest ograniczony do 32 000 tokenów na zapytanie i dzieli okno 100 000 tokenów z promptem. Rozdział o długości 3 000 znaków mieści się bez problemu, więc ustaw max_tokens nieco powyżej swojej estymacji.
Jak utrzymać spójność postaci na przestrzeni setek rozdziałów?
Przechowuj kartę postaci i blok stylu w promptzie systemowym przy każdym wywołaniu oraz kontynuuj fabułę poprzez sumaryczne streszczenie oraz poprzedni rozdział.
Czy dozwolona jest literatura dla dorosłych?
Prawna literatura dorosła między postaciami dorosłymi nie jest odrzucana, a usługa jest dla użytkowników 18+. Treści seksualne z udziałem małoletnich są zawsze blokowane błędem 403, również w fikcji i odgrywaniu ról.
Czy mogę strumieniować odpowiedzi w roleplay?
Tak. Ustaw stream na true, aby otrzymywać zdarzenia wysyłane przez serwer, i użyj sekwencji stop, aby zapobiec pisaniu przez model linii użytkownika.
Twój klucz jest o jeden formularz stąd
Utwórz konto, skopiuj klucz, zmień base URL. To cała konfiguracja.