प्रॉम्पटिंग

प्रॉम्प्ट वह टेक्स्ट है जो आप मॉडल से पहले डालते हैं, इसके पहले कि यह भविष्यवाणी करे। यह पूरा विचार है जिसे यह अध्याय तीव्र करता है: एक प्रॉम्प्ट किसी दिमाग को दिया गया आदेश नहीं है, यह संदर्भ है जिसे आप व्यवस्थित करते हैं ताकि आप जो उत्तर चाहते हैं वह सबसे संभावित निरंतरता बन जाए।
प्रॉम्प्ट वास्तव में क्या है
एक ही मॉडल, दो प्रॉम्प्ट। "जलवायु परिवर्तन के बारे में लिखें" आपको एक भटकाव निबंध देता है जो आपने नहीं माँगा था। "जलवायु परिवर्तन के मुख्य कारणों पर तीन वाक्य लिखें एक 12 साल के बच्चे के लिए, कोई सांख्यिकी नहीं" आपको कुछ ऐसा देता है जो आप उपयोग कर सकते हैं। इन दोनों कॉलों के बीच मॉडल नहीं बदला। संदर्भ बदल गया, और आउटपुट ने अनुसरण किया।
पिछले अध्याय ने कवर किया कि कैसे एक मॉडल सबसे संभावित अगले टोकन की भविष्यवाणी करके टेक्स्ट उत्पन्न करता है, जो इसके सामने सबकुछ द्वारा निर्देशित होता है। एक प्रॉम्प्ट वह "इसके सामने सबकुछ" है। यह परिभाषा है जिसे आपको पकड़ना चाहिए: एक प्रॉम्प्ट एक अनुरोध नहीं है जो आप एक व्यक्ति को देते हैं, यह संदर्भ है जिसे आप सेट अप करते हैं ताकि निरंतरता जो आप उम्मीद कर रहे हैं वह है जो मॉडल को सबसे संभावित लगता है।
यह पुनर्नर्धारण बदलता है कि आप कैसे लिखते हैं। आप किसी को राजी नहीं कर रहे हैं या निर्देश नहीं दे रहे हैं। आप टेक्स्ट व्यवस्थित कर रहे हैं ताकि आप जो उत्तर चाहते हैं वह संभावित अगली चीज़ है। इस अध्याय की प्रत्येक तकनीक यह करने का एक अलग तरीका है, और प्रत्येक तब अधिक समझ में आता है जब आप इसके अंदर भविष्यवाणी मशीन को देख सकते हैं।
तीन भूमिकाएं
जब आप कोड के माध्यम से एक मॉडल से बात करते हैं, तो आप टेक्स्ट का एक ब्लॉक नहीं भेजते। आप संदेशों की एक सूची भेजते हैं, और प्रत्येक संदेश एक भूमिका रखता है जो यह चिन्हित करता है कि यह कहाँ से आया। तीन हैं:
- system: आपके स्थायी निर्देश। मॉडल को किस तरह काम करना चाहिए, जो नियम यह अनुसरण करता है, जो प्रारूप आप चाहते हैं। एक बार सेट करें, पूरी बातचीत में लागू होता है।
- user: एक संदेश उस व्यक्ति से जो आपके ऐप का उपयोग कर रहा है। वास्तविक अनुरोध।
- assistant: एक संदेश जो मॉडल ने पहले उत्पादित किया था। यह है कि कैसे एक बातचीत अपना इतिहास रखती है।
messages = [
{"role": "system", "content": "आप एक खाना पकाने वाली ऐप के लिए एक संक्षिप्त सहायक हैं। एक वाक्य में जवाब दें।"},
{"role": "user", "content": "मैं कुकीज़ में मक्खन के बजाय क्या उपयोग कर सकता हूँ?"},
]हुड के नीचे, वह भूमिकाएं मॉडल में अलग चैनल नहीं हैं। वे एक टेक्स्ट स्ट्रीम में समतल होते हैं जिसमें प्रत्येक संदेश के चारों ओर विशेष मार्कर टोकन होते हैं, और वह संपूर्ण स्ट्रीम है जो मॉडल किससे भविष्यवाणी करता है। भूमिकाएं महत्वपूर्ण हैं क्योंकि मॉडल इस तरह से व्यवस्थित बातचीत पर प्रशिक्षित किया गया था, तो यह सीखा कि system सामग्री को अधिकृत स्थायी नियमों के रूप में और user सामग्री को उत्तर के रूप में देखा जाए।
सिस्टम संदेश वह है जो शुरुआत करने वाले कम उपयोग करते हैं। यह वह है जहाँ आप वह व्यवहार सेट करते हैं जो आप हर बार चाहते हैं: टोन, दर्शक, प्रारूप, जो चीज़ें मॉडल को कभी नहीं करनी चाहिएँ। टिकाऊ नियमों को वहाँ रखें, और विशिष्ट अनुरोध को user संदेश में रखें।
क्योंकि मॉडल के पास अनुरोधों के बीच कोई स्मृति नहीं है, assistant भूमिका भी है कि कैसे आप पहले जो कहा गया था उसे फिर से चलाते हैं: एक बातचीत जारी रखने के लिए, आप पहले की विनिमय को assistant और user संदेशों के रूप में वापस भेजते हैं। अधिक जब आप कोड से मॉडल कॉल करना शुरू करते हैं।
system, user, या assistant टैग किए गए संदेशों की एक सूची के साथ एक मॉडल को स्टीयर करते हैं। वह टैग एक टेक्स्ट स्ट्रीम में समतल होते हैं जो मॉडल किससे भविष्यवाणी करता है, लेकिन यह system को अधिकृत नियमों के रूप में और user को अनुरोध के रूप में देखने के लिए प्रशिक्षित किया गया है। system में टिकाऊ निर्देश रखें, विशिष्ट पूछताछ user में, और एक बातचीत के इतिहास को ले जाने के लिए पूर्व assistant और user संदेशों को फिर से चलाएं। विशिष्ट भ्रामक को मारता है
दो प्रॉम्प्ट, एक मॉडल। "जलवायु परिवर्तन के बारे में लिखें" अप्रत्याशित लंबाई और टोन का एक सामान्य निबंध देता है। "जलवायु परिवर्तन के मुख्य कारणों का एक तीन-वाक्य सारांश लिखें, एक 12 साल के बच्चे के लिए, सादी भाषा में, कोई सांख्यिकी के बिना" आपको जो आप चित्रित किया था उसके करीब देता है। एक ही मशीन, जंगली रूप से अलग आउटपुट, और एकमात्र अंतर यह है कि आपने कितना पिन किया।
कारण भविष्यवाणी लूप तक जाता है। हर कदम पर मॉडल प्रशंसनीय निरंतरता की एक श्रृंखला से चुन रहा है। एक भ्रामक प्रॉम्प्ट उस श्रृंखला को चौड़ा छोड़ता है, तो मॉडल इसे जो सबसे आम है सामान्य में छोड़ देता है, जो कभी भी वह सटीक चीज़ है जो आप सोचते हैं। एक विशिष्ट प्रॉम्प्ट उस श्रृंखला को आप जो चाहते हैं उसकी ओर संकीर्ण करता है, इससे पहले कि मॉडल ने एक टोकन लिखा हो।
# भ्रामक: मॉडल लंबाई, टोन, दर्शक, प्रारूप तय करता है
"जलवायु परिवर्तन के बारे में लिखें।"
# विशिष्ट: आप तय करते हैं
(
"जलवायु परिवर्तन के मुख्य कारणों का एक 3-वाक्य सारांश लिखें, "
"एक 12 साल के बच्चे के लिए, सादी भाषा में, कोई सांख्यिकी के बिना।"
)भ्रामक संस्करण एक हज़ार समझदारीपूर्ण तरीकों से जारी रह सकता है, और आप उनमें से एक यादृच्छिक पाते हैं। विशिष्ट संस्करण उन लगभग सभी को पहले से ही नियम करता है। जब आप एक प्रॉम्प्ट लिखते हैं, कहें कि आप वास्तव में क्या चाहते हैं:
- प्रारूप: एक वाक्य, एक सूची, JSON, एक टेबल।
- लंबाई: एक अनुच्छेद, तीन बुलेट, 50 शब्दों के नीचे।
- दर्शक: एक शुरुआत करने वाला, एक विशेषज्ञ, एक 12 साल का बच्चा।
- जब अनिश्चित हो तो क्या करें: "यदि टेक्स्ट नहीं कहता है, तो जवाब दें 'निर्दिष्ट नहीं' बजाय अनुमान के।"
वह आखिरी वाला अधिक वजन ले जाता है जितना दिखता है। अपने आप पर छोड़ दिया, मॉडल एक आत्मविश्वास से पूर्ण अनुमान के साथ एक अंतर भरता है, क्योंकि एक धाराप्रवाह अनुमान संभावित निरंतरता है। स्पष्ट रूप से यह कहने के लिए विकल्प दें कि आप "मुझे नहीं पता" कह सकते हैं इसे संभावित पथ के बजाय बनाता है, जो कुछ प्रॉम्प्ट-स्तर के कदमों में से एक है जो मतिभ्रम समस्या को पिछले अध्याय से कम करता है। विशिष्टता मॉडल के विकल्पों को संकीर्ण करती है इससे पहले कि यह एक टोकन लिखता है।
इसे उदाहरण दिखाएं
कभी-कभी सही निरंतरता स्थापित करने का सबसे स्पष्ट तरीका यह दिखाना है। प्रॉम्प्ट में कुछ काम किए हुए उदाहरण रखना few-shot prompting कहलाता है (कोई उदाहरण zero-shot है)। यह काम करता है क्योंकि मॉडल, दिल में, एक पैटर्न-जारी रखने वाला है: इसे इनपुट-फिर-सही-आउटपुट के दो या तीन उदाहरण दें और सबसे संभावित चीज़ अगली है आपके नए इनपुट पर समान पैटर्न लागू किया जाना।
messages = [
{"role": "system", "content": "प्रत्येक समीक्षा को POSITIVE, NEGATIVE, या NEUTRAL के रूप में लेबल करें। केवल लेबल के साथ जवाब दें।"},
{"role": "user", "content": "खाना ठंडा था और आने में धीमा था।"},
{"role": "assistant", "content": "NEGATIVE"},
{"role": "user", "content": "सभ्य भोजन, कुछ विशेष नहीं।"},
{"role": "assistant", "content": "NEUTRAL"},
{"role": "user", "content": "सर्वश्रेष्ठ बर्गर जो मैंने वर्षों में खाया है!"},
]
# मॉडल अब जवाब देता है: POSITIVEदो पूर्ण उदाहरण सटीक पैटर्न स्थापित करते हैं: एक शब्द, सभी कैप, एक निश्चित सेट से। तीसरी समीक्षा के लिए उस पैटर्न को जारी रखना अब एक विश्लेषण के पैराग्राफ लिखने की तुलना में अधिक संभावित है, तो वह है जो आप पाते हैं। यह है कि कुछ स्पष्ट उदाहरण कभी-कभी विवरण के एक पैराग्राफ को क्यों हराते हैं, विशेष रूप से वर्गीकरण और प्रारूप के लिए: आप आउटपुट का आकार प्रदर्शन कर रहे हैं बजाय इसके विवरण और आशा के। उदाहरण चुनें जो तकनीकी मामलों को कवर करते हैं, क्योंकि मॉडल जो आप दिखाते हैं उसके पैटर्न के अनुसार खुद को मानकीकृत करता है, जिसमें आपके उदाहरणों में कोई गलतियां भी शामिल हैं।
इसे कारण के लिए कहें
यहाँ सबसे उपयोगी prompting विचारों में से एक है, और सबसे अ-सहज, और यह सीधे कैसे मॉडल काम करता है यह से गिरता है। मॉडल एक बार में एक टोकन उत्पादन करता है, और केवल काम की जगह यह है वह टेक्स्ट है जिसे यह पहले ही लिख चुका है। इसके पास एक छिपी हुई स्क्रैचपैड नहीं है एक कठिन समस्या को शांति से काम करने के लिए। इसकी सोच, जो यह है, आउट जोर से होती है, वह टोकन में यह उत्पादन करता है।
तो अगर आप एक बहु-कदम प्रश्न पूछते हैं और केवल अंतिम उत्तर की माँग करते हैं, आप मॉडल को कहीं काम करने के साथ एक टोकन में अंत तक कूदने के लिए मजबूर कर रहे हैं, और कुछ भी सोच, गणित, या तर्क से जुड़े में यह अक्सर गलत कूदता है। सुधार यह है कि इसे जोर से काम करने दें। इसे उत्तर से पहले अपने कदमों को बाहर रखने के लिए कहें:
messages = [
{"role": "system", "content": "समस्या के माध्यम से कदम दर कदम काम करें, फिर अपनी लाइन पर अंतिम उत्तर दें।"},
{"role": "user", "content": "एक दुकान 3 के लिए $2 में कलम बेचता है। 12 कलम की लागत कितनी है?"},
]
# "कदम दर कदम" के बिना, मॉडल अक्सर एक गलत संख्या को चिल्लाते हैं
# इससे पहले, मॉडल कदमों को बाहर लिखता है, और हर कदम अगले को अधिक विश्वसनीय बनाता हैइसे chain-of-thought prompting कहलाता है, और कारण यह काम करता है यांत्रिक है, जादुई नहीं। हर कदम मॉडल लिखता है संदर्भ का हिस्सा बन जाता है यह अगले टोकन के लिए पढ़ता है, तो लिखना "12 कलम 3 की 4 समूह है" "4 समूह गुना $2 $8 है" संभावित, संभावित निरंतरता बनाता है। आप मॉडल को एक असंभव कूद की माँग के बजाय पृष्ठ पर गणना करने के लिए कमरा दे रहे हैं। "कदम दर कदम सोचें" या "अपने कार्य दिखाएं" रोजमर्रा का संस्करण है।
दो आरक्षण। लिखा हुआ कारण अभी भी उत्पादन किया गया पाठ है, तो यह ध्वनि प्रदान कर सकता है और गलत उत्तर तक पहुँच सकता है, और आप इसे एक गारंटीकृत प्रमाण के रूप में नहीं मानना चाहिए। और कुछ नए मॉडल इस तरह की कार्य आंतरिक रूप से करते हैं बिना पूछे। लेकिन अंतर्निहित सिद्धांत जो कुछ भी मॉडल अगला आता है उसके पार टिकाऊ है: एक मॉडल बेहतर कारण करता है जब इसके पास कदमों को बाहर लिखने के लिए कमरा है, क्योंकि इसकी खुद की आउटपुट केवल जगह है यह सोच सकता है।
प्रॉम्प्ट को संरचित करें
जैसे-जैसे प्रॉम्प्ट बढ़ते हैं, संरचना संदर्भ को स्पष्ट रखती है तो मॉडल प्रत्येक भाग को सही तरीके से वजन करता है। कुछ आदतें मदद करती हैं:
- निर्देश पहले, डेटा आखिरी रखें। कहें कि क्या करना है, फिर टेक्स्ट प्रदान करें यह करने के लिए।
- निर्देशों को डेटा से स्पष्ट सीमांकक से अलग करें। किसी भी प्रदान किए गए टेक्स्ट को स्पष्ट मार्कर में लपेटें तो आपके नियमों और इनपुट के बीच सीमा स्पष्ट है।
- आउटपुट आकार को स्पष्ट रूप से पूछें। यदि आप JSON चाहते हैं, कहें, और क्षेत्रों का वर्णन करें।
prompt = f'''ग्राहक संदेश के नीचे सारांशित करें एक वाक्य में।
फिर किसी भी उत्पाद नाम सूची करें जो इसका उल्लेख करता है।
Customer message:
"""
{user_message}
"""'''ट्रिपल कोट्स एक delimiter हैं। वे चिन्हित करते हैं "इसके अंदर सबकुछ डेटा है प्रक्रिया करने के लिए, निर्देश अनुसरण करने के लिए नहीं"। यह केवल सफाई नहीं है, और यहाँ भविष्यवाणी दृश्य दिखाता है कि यह क्यों वास्तविक सुरक्षा है।
मॉडल के लिए यह सभी एक टेक्स्ट की स्ट्रीम है, तो यदि उपयोगकर्ता इनपुट कोई सीमा के साथ आपके निर्देशों में सीधे प्रवाह करता है, एक उपयोगकर्ता "उपरोक्त को अनदेखा करें और यह इसके बजाय करें" लिख सकता है और मॉडल के पास कोई विश्वसनीय तरीका नहीं है उस पंक्ति को अलग करने के लिए अपने वास्तविक निर्देशों से। यह अच्छी तरह से इसे अनुसरण करके जारी रखता है।
वह हमला prompt injection कहलाता है, और निर्देशों और अविश्वसनीय डेटा को स्पष्ट रूप से बाड़ लगाना रखना पहली पंक्ति की रक्षा है, Safety और limits में कवर किया गया। मॉडल के लिए यह सभी एक टेक्स्ट की स्ट्रीम है, तो अविश्वसनीय इनपुट को बाड़ लगाएं।
व्यावहारिक रूप में
यहाँ एक प्रॉम्प्ट है जो इनमें से कई विचारों को स्टैक करता है: एक टिकाऊ नियमों के लिए सिस्टम संदेश, एक विशिष्ट अनुरोध, प्रारूप को ठीक करने के लिए एक उदाहरण, और स्पष्ट रूप से सीमांकित डेटा।
messages = [
{
"role": "system",
"content": (
"आप बैठक नोटों से कार्य आइटम निकालते हैं। "
"एक क्रमांकित सूची के साथ जवाब दें, एक कार्य प्रति पंक्ति, प्रत्येक एक क्रिया से शुरू होता है। "
"यदि कोई कार्य आइटम नहीं हैं, तो जवाब दें 'None'।"
),
},
{"role": "user", "content": 'Notes: """हम सहमत हुए कि Sam बजट को शुक्रवार तक भेजेगा और Lee स्थान बुक करेगा।"""'},
{"role": "assistant", "content": "1. शुक्रवार तक बजट भेजें (Sam)\n2. स्थान बुक करें (Lee)"},
{"role": "user", "content": f'Notes: """{meeting_notes}"""'},
]सिस्टम संदेश नियमों को एक बार सेट करता है, उदाहरण सटीक प्रारूप को ठीक करता है, और प्रत्येक अनुरोध सीमांकित डेटा प्रदान करता है। हर भाग संदर्भ को व्यवस्थित कर रहा है तो आउटपुट जो आप चाहते हैं वह संभावित निरंतरता है। वह पूरा शिल्प है: यह एक विश्वसनीय प्रॉम्प्ट है, एक भाग्यशाली नहीं। अगला आप इस तरह के संदेशों को कोड से मॉडल कॉल करना में वास्तविक कोड से एक मॉडल के लिए भेजेंगे।
system संदेश टिकाऊ नियमों के लिए, एक विशिष्ट अनुरोध, प्रारूप को ठीक करने के लिए एक उदाहरण, और स्पष्ट रूप से सीमांकित डेटा। हर भाग संदर्भ को व्यवस्थित कर रहा है तो आपका चाहा गया आउटपुट संभावित अगला टेक्स्ट है। वह शिल्प है, एक डिज़ाइन से एक प्रॉम्प्ट जो आंशिक रूप से काम करता है। 
