HI ▾

Chinese LLM APIकथा

API कुंजी पाएँ

अपडेट किया गया

चीनी वेब फिक्शन (网文) और रोलप्ले ऐप्स: कॉन्टेक्स्ट, कैरेक्टर्स और लागत

सिरियलाइज्ड चीनी वेब फिक्शन और इन-चैरैक्टर चैट दो सबसे अधिक मांग वाले टेक्स्ट वर्कलोड हैं: प्रत्येक अध्याय में हजारों वर्ण, एक कलाकार जो महीनों तक स्थिर रहता है, और पाठक जो हर गलती को नोटिस करते हैं। यह गाइड दिखाती है कि प्रॉम्प्ट को कैसे संरचित करें, 100,000-टोकन विंडो को कैसे प्रबंधित करें, और दी गई धारणाओं से लागत का अनुमान कैसे लगाएं।

ये वर्कलोड कैसे दिखते हैं

वेब फिक्शन सिरियल्स 2,000 से 4,000 वर्णों के अध्यायों में लिखे जाते हैं, अक्सर दैनिक प्रकाशित होते हैं, और एक प्लॉट सैकड़ों अध्यायों तक फैला होता है। रोलप्ले ऐप्स संवादात्मक रिश्तेदार हैं: एक पर्सोना, एक परिदृश्य और एक लंबा इतिहास। दोनों को मॉडल API से तीन चीजों की आवश्यकता होती है: याद रखने के लिए पर्याप्त कॉन्टेक्स्ट, लंबे समय तक लिखने के लिए पर्याप्त आउटपुट बजट, और एक शैली जो ड्रिफ्ट नहीं करती।

सर्विस एक OpenAI-कम्पैटिबल चैट एंडपॉइंट प्रदान करती है https://api.chinesellmapi.com/v1 जिसमें एक टेक्स्ट मॉडल है, id uncensored। कॉन्टेक्स्ट विंडो 100,000 टोकन की है जो प्रॉम्प्ट और कंप्लीशन के बीच साझा है, max_tokens का डिफ़ॉल्ट मान 2,048 है और यह 32,000 तक जा सकता है, और मानक सैंपलिंग फील्ड जैसे temperature, top_p और stop पास किए जाते हैं। स्ट्रीमिंग समर्थित है, जो चैट के लिए उपयुक्त है। बेसिक सेटअप और एन्कोडिंग नोट्स app quickstart में मौजूद हैं।

सामग्री नियम, शुरुआत में बताए गए

यह केवल वयस्कों के लिए सेवा है। कानूनी वयस्क कथाएँ, परिपक्व विषय और विवादास्पद विषयों को विशेष रूप से अस्वीकार नहीं किया जाता है, और यह सेवा 18 वर्ष या उससे अधिक आयु के उपयोगकर्ताओं के लिए है। किशोरों से संबंधित यौन सामग्री हमेशा ब्लॉक की जाती है और 403 content_blocked त्रुटि लौटाती है, भले ही उसे कथा या भूमिका निभाने के रूप में प्रस्तुत किया गया हो। इसमें कोई सेटिंग नहीं है जो इसे बदल सके।

इसके लिए शुरुआत से ही तैयारी करें। अपनी किरदार शीट में स्पष्ट रूप से उल्लेख करें कि प्रत्येक पात्र वयस्क है और उनकी स्पष्ट आयु बताएं। अपने उत्पाद में आयु सीमा (age gate) जोड़ें। उस अनुरोध के लिए 403 को अंतिम उत्तर मानें: एक तटस्थ संदेश दिखाएं और प्रॉम्प्ट को पुनः लिखकर पुनः प्रयास न करें। ये कदम अच्छे उत्पाद प्रबंधन हैं, चाहे प्लेटफ़ॉर्म की नियमावली कुछ भी कहे।

कैरेक्टर शीट और स्टाइल ब्लॉक

स्थिरता स्थिर तथ्यों को एक जगह रखने और हर कॉल पर उन्हें दोहराने से आती है। एक कैरेक्टर शीट नाम, उम्र, भूमिका, बोलने की आदतें, रिश्ते और कठिन बाधाओं का एक संक्षिप्त रिकॉर्ड है, जिसमें वे रहस्य भी शामिल हैं जिन्हें कैरेक्टर को अभी नहीं बताना चाहिए। एक अलग स्टाइल ब्लॉक दृष्टिकोण, गति, संवाद अनुपात, अध्याय की लंबाई और अंत की आदत को फिक्स करता है। दोनों सिस्टम मैसेज में जाते हैं ताकि वे हर अनुरोध के सामने बैठें।

CHARACTER_SHEET = """\
【人物卡】
姓名:沈清禾(女,28岁)
身份:江城古籍修复师,性格沉静,嘴硬心软
口头禅:“先别急,东西不会跑。”
说话方式:短句,少用感叹号,偶尔引用旧书里的句子
关系:与顾远舟(男,31岁,旧书商)是多年好友,彼此有未说出口的好感
禁忌:不提及她离开出版社的真正原因(第40章才揭晓)
"""

STYLE = """\
【文风】第三人称限知视角,贴近沈清禾;节奏舒缓,多写物件与天气的细节;
对话占比约四成;每章 2500 到 3000 字;结尾留一个小悬念。"""

इनको चीनी भाषा में लिखें। चीनी उदाहरणों में व्यक्त बोलने की आदतें, जैसे कोई पकड़-वाक्य या वाक्य की लंबाई, उनके अंग्रेजी विवरण की तुलना में बहुत अधिक विश्वसनीय रूप से स्थानांतरित होती हैं। प्रत्येक शीट को कुछ सौ टोकन से कम रखें, और प्रत्येक पुनरावर्ती पात्र को एक शीट दें; दस पात्रों का कलाकृति भी केवल कुछ हज़ार टोकन ही होता है। जब किसी पात्र की स्थिति बदलती है, तो इतिहास पर बदलाव लादने के बजाय शीट को स्वयं अपडेट करें।

सीरियलाइज्ड अध्यायों के लिए लंबा कॉन्टेक्स्ट

प्रत्येक पिछले अध्याय को प्रॉम्प्ट में पेस्ट करने की प्रवृत्ति होती है। पहले गणना करें। 100,000-टोकन विंडो और लगभग 4,500 टोकन के अध्यायों के साथ, पूरी विंडो में लगभग चौदह अध्याय आते हैं, लेकिन आउटपुट के लिए कोई जगह नहीं बचती, और एक सिरियल सैकड़ों चलता है। काम करने वाला पैटर्न लेयर्ड मेमोरी है:

  1. कैरेक्टर शीट और स्टाइल ब्लॉक, हमेशा मौजूद।
  2. एक रनिंग स्टोरी सारांश, प्रत्येक अध्याय के लिए कुछ सौ वर्ण, एक रनिंग रिकैप में मर्ज किया गया जिसे आप हर कुछ अध्यायों में रिफ्रेश करते हैं।
  3. पिछले अध्याय का पूर्ण पाठ, ताकि कहानी की धारा जुड़ी रहे।
  4. लिखे जा रहे अध्याय के लिए आउटलाइन।

प्रत्येक अध्याय के बाद, मॉडल से एक छोटा सारांश मांगें जो रिश्ते में बदलाव और खुले प्लॉट थ्रेड्स को बनाए रखे, और इसे रिकैप में एपेंड करें। नीचे दिया गया कोड एक अध्याय लिखता है और अगला सारांश तैयार करता है। यह usage भी लौटाता है ताकि आप वास्तविक टोकन गणना लॉग कर सकें:

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

रोलप्ले: पर्सोना, टर्न शेप और स्टॉप सीक्वेंस

रोलप्ले को उसी शीट-और-शैली अनुशासन और कुछ चैट-विशिष्ट नियंत्रणों की आवश्यकता होती है। पर्सोना को सिस्टम संदेश में डालें, बताएं कि कौन किसकी भूमिका निभा रहा है, प्रतिक्रिया की लंबाई की सीमा निर्धारित करें, और मॉडल को उपयोगकर्ता के पात्र की क्रियाएँ लिखने से रोकें। यदि मॉडल उपयोगकर्ता की अगली पंक्ति लिखना शुरू कर दे, तो stop का उपयोग आउटपुट काटने के लिए करें, और प्रतिक्रिया को स्ट्रीम करें ताकि टेक्स्ट जनरेट होते ही प्रकट हो।

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("(推开书店的门)这场雨下得真不是时候。")

इतिहास प्रत्येक टर्न पर एक उपयोगकर्ता संदेश और एक असिस्टेंट संदेश से बढ़ता है। जब यह आपके बजट के करीब पहुंचे, तो सबसे पुराने हिस्से का सारांश एक संदेश में बनाएं और सबसे हालिया टर्न को शब्दशः रखें। 0.9 से 1.0 के आसपास टेम्परेचर पात्रों के लिए जीवंत संवाद देता है; जब आपको पर्सोना को सख्ती से स्क्रिप्ट पर रखना हो तो इसे 0.5 की ओर घटाएं।

लंबे सीरियल में टिकने वाला स्टाइल कंट्रोल

स्टाइल ड्रिफ्ट वह विफलता है जिसके बारे में पाठक सबसे अधिक शिकायत करते हैं: कथाकार धीरे-धीरे चैटियर बन जाता है, संवाद औपचारिक हो जाता है, गति तेज हो जाती है। इसे विशिष्टताओं से लड़ें। "एक सुंदर शैली में लिखें" के बजाय, मापने योग्य आदतों का वर्णन करें: वाक्य की लंबाई, मुहावरों का उपयोग कितनी बार करें, मौसम और वस्तु विवरण कितना शामिल करें, क्या अध्याय एक हुक या एक शांत बीट पर समाप्त होते हैं। लक्षित आवाज में दो या तीन छोटे नमूना पैराग्राफ, स्टाइल ब्लॉक में रखे गए, एक पृष्ठ से अधिक मूल्यवान हैं।

विभिन्न शैलियों के लिए अलग-अलग सेटिंग्स की आवश्यकता होती है। एक कल्टिवेशन या फंतासी श्रृंखला को गढ़े गए शब्दों के शब्दकोश (जैसे लोक, संप्रदाय और तकनीक) से लाभ होता है, ताकि एक ही नाम दो तरह से न लिखा जाए। एक आधुनिक रोमांस संवाद की लय और छोटी शारीरिक विवरणों पर निर्भर करता है। एक रहस्य को एक संकेत लेजर की आवश्यकता होती है: पाठक द्वारा देखे गए तथ्यों की एक सूची, ताकि मॉडल उनका विरोधाभास न करे। इन सूचियों को सिस्टम प्रॉम्प्ट में रखें और कहानी आगे बढ़ने के साथ अपडेट करें।

अंत में, तापमान और top_p को एक सीरियल के अंदर स्थिर रखें। यदि आप अध्यायों के बीच सैम्पलिंग बदलते हैं, तो आवाज बदल जाती है। ब्रेनस्टॉर्मिंग आउटलाइन के लिए तापमान बढ़ाएं, न कि प्रोस के लिए।

दी गई धारणाओं के साथ लागत गणना

सभी आंकड़े प्रकाशित दरों का उपयोग करते हैं: $0.25 प्रति मिलियन इनपुट टोकन और $1.00 प्रति मिलियन आउटपुट टोकन, और एक माना गया 1.5 टोकन प्रति चीनी अक्षर। अपनी खुद की usage लॉग से आंकड़ों के साथ मान्यताओं को बदलें।

परिदृश्यमाना गया इनपुट टोकनमाना गया आउटपुट टोकनप्रत्येक कॉल की लागत
सीरियल अध्याय (3,000 अक्षर आउटपुट)8,0004,500$0.0020 + $0.0045 = $0.0065
रोलप्ले टर्न, 20,000-टोकन इतिहास20,000300$0.0050 + $0.0003 = $0.0053
रोलप्ले टर्न, पूर्ण 60,000-टोकन इतिहास60,000500$0.0150 + $0.0005 = $0.0155

अध्याय पंक्ति में 8,000 इनपुट टोकन 1,200-टोकन कैरेक्टर शीट और स्टाइल ब्लॉक, 2,000-टोकन रिकैप, 4,500-टोकन पिछला अध्याय और 300-टोकन आउटलाइन में विभाजित होते हैं। ऐसे सौ अध्यायों की लागत लगभग $0.65 होगी। 20,000-टोकन इतिहास साइज पर सौ रोलप्ले टर्न की लागत लगभग $0.53 होगी। निष्कर्ष यह है कि इतिहास की लंबाई चैट लागत को निर्धारित करती है, इसलिए कटौती और सारांश बनाना जल्दी अपने आप को भुगतान कर देता है।

$0.50 का ट्रायल क्रेडिट, जो सात दिनों के लिए मान्य है, पहले पंक्ति की मान्यताओं के तहत लगभग 76 अध्यायों को कवर करता है। वर्तमान दरों के लिए pricing देखें, और खाता विवरण के लिए trial FAQ देखें।

प्रोडक्शन के लिए संचालन नोट्स

अध्याय जनरेशन एक लंबा अनुरोध है, इसलिए उदार टाइमआउट का उपयोग करें या स्ट्रीम करें और टेक्स्ट को स्वयं एसेंबल करें। 429 को छोटे बैकऑफ़ के साथ हैंडल करें, क्योंकि प्रत्येक कुंजी प्रति मिनट 300 अनुरोध की अनुमति देती है, और 503 को upstream_busy के साथ एक retry-in-a-few-seconds इवेंट के रूप में मानें। 402 का अर्थ है कि प्रीपेड बैलेंस खत्म हो गया है या ट्रायल समाप्त हो गया है, जिससे आपको अलर्ट होना चाहिए, रीट्राई नहीं।

अगला अध्याय जनरेट करने से पहले प्रत्येक जनरेटेड अध्याय और उसके सारांश को अपने डेटाबेस में सेव करें। यदि एक कॉल रात के बैच के बीच में असफल हो जाती है, तो आप अंतिम स्टोर्ड अध्याय से रीज्यूम कर सकते हैं, और आप उसी टेक्स्ट के लिए दो बार नहीं भुगतते। प्रॉम्प्ट वर्जन और उपयोग आंकड़ों को प्रत्येक अध्याय के बगल में स्टोर करें ताकि प्रति अध्याय लागत एक क्वेरी हो न कि एक अनुमान।

रोलप्ले उत्पादों के लिए, प्रति-सत्र बजट रखें। एक सत्र द्वारा खर्च किए जाने वाले टर्न की संख्या या कुल टोकन को कैप करें, और जब कैप पहुंच जाता है तो उपयोगकर्ताओं को एक स्पष्ट संदेश दिखाएं। चूंकि प्रॉम्प्ट इतिहास शामिल करते हैं, एक बहुत लंबा सत्र एक ताजे सत्र की तुलना में प्रति टर्न बहुत अधिक लागत करता है, इसलिए पुराने टर्न को सारांशित करना विंडो को फिट करने से परे महत्वपूर्ण है। प्रॉम्प्ट को ट्रेनिंग के लिए उपयोग नहीं किया जाता है, जिसे आप अपने उत्पाद की गोपनीयता नोट्स में अपने स्टोरेज नीति के साथ बता सकते हैं।

प्रश्न और उत्तर

एक अनुरोध में एक अध्याय कितना लंबा हो सकता है?

प्रत्येक अनुरोध के लिए आउटपुट 16,000 टोकन तक सीमित है और प्रॉम्प्ट के साथ 100,000-टोकन की विंडो साझा करता है। 3,000-अक्षरों का अध्याय आराम से फिट बैठता है, इसलिए अपनी अनुमानित मात्रा से थोड़ा ऊपर max_tokens सेट करें।

सैकड़ों अध्यायों में पात्रों को स्थिर कैसे रखें?

प्रत्येक कॉल पर सिस्टम प्रॉम्प्ट में एक पात्र शीट और शैली ब्लॉक रखें, और प्लॉट को एक रोलिंग सारांश और पिछले अध्याय के साथ आगे बढ़ाएं।

क्या वयस्क कथा अनुमत है?

वयस्क पात्रों के बीच कानूनी वयस्क कथा अस्वीकृत नहीं की जाती है, और सेवा 18 वर्ष और उससे अधिक उम्र के उपयोगकर्ताओं के लिए है। किशोरों से जुड़ा यौन सामग्री हमेशा ब्लॉक हो जाती है, जिसमें 403 त्रुटि कोड आता है, चाहे वह कथा हो या रोलप्ले।

क्या मैं रोलप्ले प्रतिक्रियाओं को स्ट्रीम कर सकता हूं?

हाँ। स्ट्रीमिंग प्राप्त करने के लिए stream को true सेट करें, और मॉडल द्वारा उपयोगकर्ता की पंक्तियों को लिखने से रोकने के लिए stop सीक्वेंस का उपयोग करें।

आपकी कुंजी बस एक फ़ॉर्म दूर है

एक खाता बनाएं, कुंजी कॉपी करें, बेस URL बदलें। यही पूरी सेटअप है।

API कुंजी पाएँ