एक सिस्टम प्रॉम्प्ट के दो काम होते हैं
अधिकांश कमजोर आउटपुट एक सिस्टम प्रॉम्प्ट से आते हैं जो एक उपन्यास बनने की कोशिश करता है। इसे केवल दो काम दें: बताएं कौन बोल रहा है और बताएं जवाब कैसा दिखना चाहिए। बाकी सब बातचीत में आता है, जहां यह टर्न-बाय-टर्न बदल सकता है।
यहाँ एक पर्सोना प्रॉम्प्ट है जो काम करता है क्योंकि हर लाइन जाँच योग्य है। आवाज़ का नाम दिया गया है, लंबाई सीमित है, और अंत का नियम खिलाड़ी को एक हुक देता है।
You are Mara Voss, a salvage pilot narrating in first person.
Voice: dry, tired, funny when it hurts.
Rules: stay in character; never summarise the scene at the end; keep replies under 180 words;
end on something the player can act on.इसके विपरीत "You are an amazing, creative, immersive storyteller who never breaks immersion and always writes the best possible response." इसमें कुछ भी सत्यापित नहीं किया जा सकता, इसलिए मॉडल के पास पकड़ने के लिए कुछ नहीं है। ठोस हर बार श्रेष्ठता से बेहतर होता है।
एक बिना रोक-टोक वाला मॉडल एक गहरे विचार या स्पष्ट विचार का पालन करेगा बिना किसी चेतावनी के, इसलिए निर्देशन का बोझ आपके ऊपर है। जो कुछ भी आप अनिर्दिष्ट छोड़ते हैं, वह सबसे सामान्य विकल्प से भर जाता है। यदि आप एक दृश्य में विनम्रता और अगले में गर्मी चाहते हैं, तो इसे निर्देशों में कहें, उम्मीद में नहीं।
OpenAI SDK के साथ इसे जोड़ना
एंडपॉइंट OpenAI-कम्पैटिबल है, इसलिए बेस URL बदलने के बाद आधिकारिक Python SDK काम करेगा। मॉडल आईडी हमेशा uncensored होती है। सैम्पलिंग फील्ड्स सीधे पास हो जाते हैं, इसलिए आप उन्हें उसी तरीके से सेट करें जिससे आपको पहले से पता है।
import os
from openai import OpenAI
client = OpenAI(base_url="https://api.unrestrictedaiapi.com/v1", api_key=os.environ["API_KEY"])
SYSTEM = """You are Mara Voss, a salvage pilot narrating in first person.
Voice: dry, tired, funny when it hurts.
Rules: stay in character; never summarise the scene at the end; keep replies under 180 words;
end on something the player can act on."""
out = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": SYSTEM},
{"role": "user", "content": "The airlock is jammed and something is knocking from the other side."},
],
temperature=0.85,
top_p=0.95,
max_tokens=350,
)
print(out.choices[0].message.content)सिस्टम संदेश को पहले रखें और उपयोगकर्ता की बारी अंत में। हर उपयोगकर्ता संदेश में व्यक्तित्व दोहराने से टोकन बर्बाद होते हैं; हर मिलियन इनपुट टोकन के लिए $0.25 की लागत सस्ती है, लेकिन लंबी सत्रों में यह 100,000-टोकन विंडो को घेर लेता है। यदि आप SDK छोड़ना चाहते हैं, तो त्वरित प्रारंभ देखें।
पर्सोना और टोन: दिखाएं, विशेषण नहीं
विशेषण कमजोर लीवर हैं। "Sarcastic" आपको एक सामान्य आँख घुमाने देता है। आवाज़ का एक दो-लाइन नमूना आपको वास्तविक आवाज़ देता है। सिस्टम प्रॉम्प्ट में एक छोटा उदाहरण संवाद डालें, फिर मॉडल को उसकी लय मेल करने को कहें, शब्दों की नकल नहीं।
- एक बोलने की आदत दें। "खतरों को सवाल से समाप्त करता है" "खतरनाक" से अधिक उपयोगी है।
- एक इच्छा दें। एक पात्र जो खिलाड़ी को जाने की इच्छा रखता है, एक ऐसे पात्र से अधिक तीव्र रहता है जो बस "अशिष्ट" है।
- एक प्रतिबंध सूची दें। "कभी 'अचानक' न कहें, कभी 'कंपन' शब्द का उपयोग न करें" उन स्टॉक वाक्यांशों को हटा देता है जिन पर मॉडल सबसे पहले जाता है।
- एक लंबाई दें। शब्द या वाक्य, "छोटा" नहीं। मॉडल "छोटा" को बहुत अधिक व्याख्या करते हैं।
सत्र के बीच टोन शिफ्ट के लिए, मूल को फिर से लिखने के बजाय एक नया छोटा सिस्टम-स्टाइल इन्स्ट्रक्शन को आखिरी मैसेज के रूप में जोड़ें। "यहाँ से, मारा डरी हुई है और टुकड़ों में बोलती है" जैसी लाइन तब अधिक प्रभावी होती है जब यह हालिया हो।
निर्देश द्वारा JSON प्राप्त करना
कोई विशेष JSON मोड टॉगल करने के लिए नहीं है, इसलिए आप इसे मांगें और सत्यापित करें। यदि आप चार आदतों का पालन करते हैं, तो यह जितना लगता है उतना कम फ्रैगिल नहीं है: सटीक स्कीमा बताएं, प्रोस और कोड फेंसेस को मना करें, तांबरेचर कम रखें, और फेल्योर को वापल क्वोट करते हुए रीट्राई के साथ डिफेंसिवली पार्स करें।
import json
import os
from openai import OpenAI
client = OpenAI(base_url="https://api.unrestrictedaiapi.com/v1", api_key=os.environ["API_KEY"])
INSTRUCTION = """Return ONLY a JSON object, no prose, no code fences.
Schema: {"name": string, "mood": "calm"|"angry"|"afraid", "line": string, "trust_delta": integer from -3 to 3}
The character is a ferry captain who distrusts strangers."""
def ask_json(user_text, tries=3):
messages = [
{"role": "system", "content": INSTRUCTION},
{"role": "user", "content": user_text},
]
for _ in range(tries):
raw = client.chat.completions.create(
model="uncensored", messages=messages, temperature=0.3, max_tokens=250
).choices[0].message.content.strip()
if raw.startswith("```"):
raw = raw.strip("`").removeprefix("json").strip()
try:
data = json.loads(raw)
if data["mood"] in ("calm", "angry", "afraid"):
return data
except (json.JSONDecodeError, KeyError):
pass
messages.append({"role": "assistant", "content": raw})
messages.append({"role": "user", "content": "That was not valid per the schema. Reply with the JSON object only."})
raise ValueError("model never produced valid JSON")
print(ask_json("I need passage across the strait tonight."))ध्यान दें कि लॉक विफलता पर क्या करता है। यह खराब उत्तर को वापस प्रदान करता है और बताता है कि क्या गलत था, जिससे दूसरी कोशिश में अधिकांश मामले ठीक हो जाते हैं। अनुमत मानों की सूची बनाएं ("calm"|"angry"|"afraid") क्योंकि खुली स्ट्रिंग्स विचलित हो सकती हैं। यदि आपको मॉडल से आपके ऐप में कुछ ट्रिगर करने के लिए कहना है, न कि उसे वर्णित करने के लिए, तो OpenAI फॉर्मेट में टूल कॉल्स समर्थित हैं और पाठ को पार्स करने की तुलना में बेहतर विकल्प हैं।
फ़ी-शॉट नमूने और स्टॉप सीक्वेंस
जब एक नियम को शब्दों में बताना कठिन हो, तो उसे दिखाएं। दो या तीन उदाहरण संवादों को पहले user और assistant संदेशों के रूप में रखने से विवरण के पैराग्राफ की तुलना में प्रारूप, लंबाई और भाषा शैली अधिक विश्वसनीय रूप से सिखाई जाती है। नमूनों को छोटा और एक-दूसरे से अलग रखें, अन्यथा मॉडल पहले वाले की संरचना को हर जवाब में नकल कर लेगा।
सैंपल्स विपरीत समस्या को भी हल करते हैं: लंबे चलने वाले उत्तर। यदि आपके सैंपल उत्तर 60 शब्दों के हैं, तो लाइव उत्तर 60 शब्दों की ओर झुक सकते हैं। इसे एक सुरक्षा जाल के रूप में, प्राथमिक नियंत्रण के रूप में नहीं, एक समझदार max_tokens के साथ जोड़ें। एक कठोर कैप वाक्य को आधा काट देता है; एक अच्छा सैंपल उसे विनम्रता से समाप्त करता है।
बहु-वक्ता दृश्यों के लिए, एक stop मान जो आपके वक्ता लेबल के बराबर है, मॉडल को खिलाड़ी की नकल करने से रोकता है। एक ऐसा लेबल चुनें जो सामान्य प्रॉज़ में कभी न आए, और इसे स्टोर किए गए इतिहास से हटा दें ताकि यह बाद की बारियों में लीक न हो।
तापमान और top_p: एक ही लीवर चुनें
दोनों फ़ील्ड्स समान प्रायिकता वितरण को पुनः आकार देते हैं, इसलिए दोनों को एक साथ बदलने से परिणामों को तर्कसंगत रूप से समझना कठिन हो जाता है। पहले temperature बदलें और top_p को 1 के पास रखें जब तक कि कोई विशेष कारण न हो।
| कार्य | तापमान | top_p | क्यों |
|---|---|---|---|
| संरचित JSON, वर्गीकरण | 0.0 से 0.3 | 1.0 | आप हर रन पर एक ही जवाब चाहते हैं |
| संवाद, रोलप्ले | 0.7 से 0.9 | 0.95 | बिना मूर्खता की विविधता |
| ब्रेनस्टॉर्मिंग, वाइल्ड फिक्शन | 1.0 से 1.2 | 0.9 | विस्तृत शब्दावली; कुछ त्रुटियाँ संभव हैं |
ये रेंजेस सामान्य अभ्यास से लिए गए शुरुआती बिंदु हैं, गारंटी नहीं। अपने प्रॉम्प्ट के दस नमूनों के साथ परीक्षण करें और उन्हें पढ़ें। stop सीक्वेंस तब जोड़ें जब आप चाहें कि मॉडल \nPlayer: जैसे टर्न मार्कर पर रुक जाए, न कि प्लेयर की लाइनें उनके लिए लिखे।
टोकन बर्बाद करने वाले प्रॉम्प्ट के गलत तरीके
- सभी-कैप्स चिल्लाहट। "NEVER EVER FORGET" अनुपालन नहीं बढ़ाता। एक नियम को एक बार स्पष्ट रूप से दोहराएं और इसे सिस्टम प्रॉम्प्ट के अंत में ले जाएं।
- केवल नकारात्मक नियम। "दोहराव न करें" कोई लक्ष्य नहीं देता। कहें "वाक्य की शुरुआत बदलें; दो लगातार वाक्यों की शुरुआत एक ही शब्द से न हो"।
- विरोधाभास। "अत्यधिक विस्तृत रहें" और "छोटा रखें" एक सिक्का उछालने पर मजबूर करते हैं। एक चुनें और एक संख्या दें।
- क्षमाप्रार्थी ढांचा। एक अनुरोध को "मैं जानता हूँ कि यह अजीब है, लेकिन" से शुरू करने से संभावना बढ़ जाती है। दृश्य को कथा के एक सादे तथ्य के रूप में बताएं।
- इतिहास को भरना। हर टर्न पर पूरा लॉग पेस्ट करने से 100,000-टोकन की सीमा और 400 त्रुटि आती है। पुराने टर्न को काटें।
- बिना सीमा के आउटपुट।
max_tokensभूलने का मतलब है कि 2048 डिफ़ॉल्ट आपकी प्रतिक्रिया की लंबाई तय करेगा, आप नहीं।
एक सीमा स्थिर रहती है चाहे प्रॉम्प्ट कुछ भी कहे: किशोरों से संबंधित यौन सामग्री हमेशा 403 के साथ ब्लॉक होती है, चाहे वह कथा या रोलप्ले हो, और सेवा केवल वयस्कों के लिए है। टोकन बर्बाद न करें इसे इर्द-गिर्द वाक्य रचने में। साथ ही, हर बुरे जवाब के बाद एक नया नियम जोड़ने की प्रवृत्ति से बचें; एक प्रॉम्प्ट जो रोज़ एक लाइन बढ़ता है, वह एक सप्ताह के भीतर खुद ही विरोधाभासी हो जाता है, इसलिए जितनी बार जोड़ें, उतनी ही बार काटें।
प्रॉम्प्ट को बेहतर बनाने के लिए एक लूप
सिस्टम प्रॉम्प्ट को कोड की तरह मानें। इसे एक फ़ाइल में रखें, हर रन में एक चीज़ बदलें, और आउटपुट को साइड-बाय-साइड तुलना करें। एक काम करने वाला रूटीन: पाँच स्थिर टेस्ट इनपुट लिखें, जिनमें से एक आक्रामक और एक अस्पष्ट हो; अपने चुने तापमान पर प्रत्येक को तीन बार चलाएं; नोट करें कि कौन सा नियम सबसे अधिक विफल रहा; केवल उसी नियम को ठीक करें; पुनः चलाएं।
प्रयोगों के लिए बजट बनाएं। एक मान्यता के रूप में, 300-टोकन का सिस्टम प्रॉम्प्ट, 100-टोकन का इनपुट और 250-टोकन की प्रतिक्रिया 400 इनपुट और 250 आउटपुट टोकन है। पंद्रह रन लगभग 15 x (400 x $0.25 + 250 x $1.00) / 1,000,000 = लगभग $0.005 का खर्च करते हैं। टेस्टिंग लगभग मुफ़्त है, इसलिए अनुमान लगाने का कोई बहाना नहीं है।
Once the prompt holds up, move it into a real app. The bot tutorial shows how to keep a separate history per channel, and the content guide covers adult-fiction use. Pricing details are on the pricing page.