प्रॉम्प्ट डिज़ाइन
प्रॉम्प्टिंग वेब डिज़ाइन जैसी है। आइए इसे प्रॉम्प्ट डिज़ाइन कहें और इसके लिए बेहतर टूल बनाएँ।
मैं आमतौर पर नई चीज़ों को समझाने के लिए पुरानी दुनिया की मिसालें ढूँढ़ने की इस आम आदत से बचता हूँ। इसलिए कृपया मेरा साथ दें, जबकि मैं वही काम करने जा रहा हूँ: मैं यह बताना चाहता हूँ कि प्रॉम्प्टिंग को क्यों प्रॉम्प्ट डिज़ाइन कहा जाना चाहिए और उसकी तुलना वेब डिज़ाइन से क्यों की जानी चाहिए।
मैं प्रॉम्प्टिंग को समय-सीमा में बँधे किसी मानव से संवाद करने जैसा मानता हूँ। हालाँकि LLM-विशिष्ट तकनीकें निश्चित रूप से मददगार हैं (खासकर chain-of-thought), लेकिन मैंने पाया है कि प्रदर्शन बेहतर करने के सबसे अच्छे तरीकों में से एक है निर्देशों को बेहद स्पष्ट और उच्च-गुणवत्ता वाला रखना — ठीक वैसे ही जैसे स्पष्टता और संक्षिप्तता असली इंसानों को भी बेहतर समझने में मदद करती है।
स्पष्ट-संचार-के-रूप-में-प्रॉम्प्टिंग से प्रॉम्प्टिंग कुछ हद तक लेखन जैसी लगती है। लेकिन मैं जो ज़्यादातर प्रॉम्प्टिंग करता हूँ, वह पैरामीट्रिक होती है: मेरे पास कई इनपुट वेरिएबल्स होते हैं, और मुझे अपने प्रॉम्प्ट को उनके मुताबिक़ गतिशील रूप से अनुकूलित करना पड़ता है।
इसलिए, गतिशील-इनपुट-के-साथ-स्पष्ट-संचार-के-रूप-में-प्रॉम्प्टिंग मुझे इसका सबसे सटीक वर्णन लगता है।
तो फिर ऐसा कौन-सा क्षेत्र है, जिसमें गतिशील इनपुट के साथ स्पष्ट संवाद करना होता है? वेब डिज़ाइन।
आइए सारी समानताएँ गिना लें। प्रॉम्प्टिंग और वेब डिज़ाइन, दोनों:
-
स्पष्टता की माँग करते हैं, और जिनका मुख्य उद्देश्य संचार होता है;
-
लेखन या पत्रिका लेआउट के विपरीत, गतिशील सामग्री के अनुसार प्रतिक्रिया देनी पड़ती है; और
-
अपनी सामग्री को अलग-अलग आकारों के हिसाब से ढालना पड़ता है — वेब डिज़ाइन में स्क्रीन साइज़ के अनुसार, और प्रॉम्प्टिंग में कॉन्टेक्स्ट विंडो के अनुसार।
प्रॉम्प्टिंग और वेब डिज़ाइन, दोनों करने के अपने अनुभव में, मैंने यह भी पाया है कि इन दोनों क्षेत्रों में मेरी डेवलपर-प्राथमिकताएँ काफ़ी मिलती-जुलती हैं:
-
असल प्रॉम्प्ट को देखना बेहद ज़रूरी है, ठीक वैसे ही जैसे रेंडर हुई वेबसाइट को देखना बेहद ज़रूरी है। अगर मुझे अपने दिमाग़ में HTML और CSS रेंडरिंग प्रक्रिया का अंदाज़ा लगाना पड़े, तो मैं वेबसाइट डिज़ाइन नहीं कर सकता। इसी तरह, सभी इनपुट वेरिएबल्स भरने के बाद प्रॉम्प्ट का रेंडर हुआ आउटपुट देखे बिना अच्छे और स्पष्ट प्रॉम्प्ट लिखना वास्तव में बहुत मुश्किल है।
-
उदाहरण के लिए, प्रॉम्प्ट
"Hi ${username} ${message}"ठीक लग सकता है, लेकिन जब आप उसे रेंडर करते हैं, तो पता चलता है कि उपयोगकर्ता का नाम संदेश में घुल-मिल जाता है। -
संयोज्य कंपोनेंट्स प्रॉम्प्टिंग और वेब डिज़ाइन, दोनों में उपयोगी हैं।
-
दोनों में घोषणात्मक शैली, आदेशात्मक शैली से बेहतर है। ऐसी वेबसाइट में बदलाव करना वास्तव में कठिन होता है, जहाँ सभी HTML एलिमेंट्स
document.createElementकॉल्स से बनाए गए हों। इसी तरह,str += "..."की लंबी श्रृंखला से बने प्रॉम्प्ट को पढ़ना और बदलना आसानी से संभालना मुश्किल हो जाता है। -
दोनों में, कभी-कभी मैं “पिक्सेल परफेक्शन” हासिल करना चाहता हूँ। कम सक्षम मॉडल्स (GPT-3.5 और उससे कमज़ोर) को प्रॉम्प्ट करते समय, मैं यह सुनिश्चित करना चाहता हूँ कि उसमें कोई अनावश्यक नई पंक्तियाँ या दूसरी तरह की ख़राब फ़ॉर्मैटिंग न हो; और वेबसाइट डिज़ाइन करते समय, कभी-कभी हर पिक्सेल मायने रखता है।
LLM एजेंट्स के लिए, इस समानता को और भी आगे ले जाया जा सकता है: एजेंट प्रॉम्प्टिंग को एजेंट्स के लिए एक इंटरैक्टिव वेबसाइट बनाने जैसा समझा जा सकता है, जहाँ वे फ़ंक्शन्स कॉल करके “बटन क्लिक” कर सकते हैं, और जहाँ फ़ंक्शन कॉल के जवाब में प्रॉम्प्ट फिर से रेंडर होता है, ठीक वैसे ही जैसे बटन क्लिक के जवाब में वेबसाइट फिर से रेंडर होती है।
बेशक, प्रॉम्प्ट डिज़ाइन और वेब डिज़ाइन के बीच कुछ अंतर भी हैं:
-
प्रॉम्प्टिंग सिर्फ़ टेक्स्ट से संबंधित है (फ़िलहाल!)।
-
कैशिंग अलग है: खासकर एजेंट्स के लिए, आप यह सुनिश्चित करना चाहते हैं कि सिर्फ़ प्रॉम्प्ट के बाद वाले हिस्सों को बदलकर आपके री-रेंडर्स सस्ते रहें। इसकी वेब से एक थोड़ी बनावटी समानता ज़रूर है (आप अपनी वेबसाइट को कैश के लिए अनुकूलित करना चाहते हैं), लेकिन मुझे लगता है कि बुनियादी तौर पर यह काफ़ी अलग चुनौती है।
फिर भी, इन समानताओं ने मुझे यह यक़ीन दिलाया है कि प्रॉम्प्टिंग को प्रॉम्प्ट डिज़ाइन कहा जाना चाहिए, प्रॉम्प्ट इंजीनियरिंग नहीं। प्रॉम्प्ट लिखना ठीक वैसा ही लगता है जैसे वेबसाइट डिज़ाइन करना, इसलिए इसका नाम भी वैसा ही होना चाहिए।
प्रॉम्प्ट डिज़ाइन के इस नज़रिए ने मुझे Priompt बनाने के लिए प्रेरित किया, जो React-जैसी, JSX-आधारित प्रॉम्प्ट डिज़ाइन लाइब्रेरी है।
Priompt v0.1: प्रॉम्प्ट डिज़ाइन लाइब्रेरी की पहली कोशिश
Priompt आधुनिक वेब डिज़ाइन सिद्धांतों से प्रेरित एक प्रॉम्प्ट डिज़ाइन लाइब्रेरी बनाने की पहली कोशिश है। हम Cursor में इसका आंतरिक तौर पर इस्तेमाल कर रहे हैं, और यह हमें बहुत पसंद है।
मुझे लगता है कि इसकी सभी abstractions शायद पूरी तरह सही नहीं हैं, लेकिन कम-से-कम मुझे इस बात का यक़ीन है कि string templates की तुलना में JSX, प्रॉम्प्ट लिखने का कहीं ज़्यादा सुविधाजनक तरीका है। यहाँ तक कि सिर्फ़ यह आसान-सी बात कि आप अपने प्रॉम्प्ट के कुछ हिस्सों को आसानी से comment out कर सकते हैं, iteration loop को काफ़ी तेज़ बना देती है।

Priompt के साथ एक (काफ़ी जल्दबाज़ी में बनाई गई) preview website भी आती है, जहाँ आप अपने प्रॉम्प्ट का preview असली डेटा पर देख सकते हैं। अपना ऐप विकसित करते समय, आप हर request पर किसी कंपोनेंट में आने वाले serialized props को लॉग कर सकते हैं। फिर, जब आपको कोई अप्रत्याशित व्यवहार दिखे, तो आप Priompt preview पर जाकर ठीक वही प्रॉम्प्ट देख सकते हैं, source code में बदलाव कर सकते हैं, और उसी props के साथ प्रॉम्प्ट को अपडेट होते देख सकते हैं जो असली request में थे। हमने पाया है कि इससे प्रॉम्प्ट्स पर iteration करना आसान हो जाता है।

अगर आप इसे आज़माएँ, तो कृपया मुझे अपने विचार बताएँ! मैं इसी दिशा में और विचार देखना पसंद करूँगा, या बस यह सुनना कि मैं पूरी तरह ग़लत हूँ और प्रॉम्प्ट डिज़ाइन बेवकूफ़ी है :).
सीमाएँ
मॉडल्स तेज़ी से बदलते हैं, और उसी के साथ प्रॉम्प्टिंग की तकनीकों को भी बदलना पड़ता है। इसे देखते हुए, मुझे लगता है कि प्रॉम्प्ट डिज़ाइन की इस व्याख्या के साथ कुछ सीमाएँ जुड़ी हैं:
-
GPT-4 के लिए पिक्सेल-परफेक्ट डिज़ाइन ज़्यादा महत्वपूर्ण नहीं हैं, और GPT-4.5 या उससे बेहतर मॉडल्स के लिए वे शायद अप्रासंगिक हो जाएँगी।
-
अगर हाल के लंबे-संदर्भ मॉडल्स की प्रवृत्ति को आगे बढ़ाकर देखें, तो कॉन्टेक्स्ट विंडो की सीमा शायद गायब हो जाए। हालाँकि, मैं इस बात को लेकर आश्वस्त नहीं हूँ।
-
ऐसा लगता है कि OpenAI डेवलपर्स को प्रॉम्प्ट पर लगातार कम नियंत्रण देने की दिशा में बढ़ रहा है; यह संभव है कि एक साल में प्रॉम्प्ट जैसी कोई चीज़ ही न रहे, और API call हमसे सिर्फ़ रॉ इनपुट्स और एक instruction ही माँगे। कम नियंत्रण की यह प्रवृत्ति चैट प्रारूप से शुरू हुई थी और हाल ही में घोषित function calling के साथ आगे भी जारी रही है
-
यह भी संभव है कि कैशिंग प्रॉम्प्टिंग के सबसे महत्वपूर्ण पहलुओं में से एक हो; ऐसे में यह डिज़ाइन से ज़्यादा इंजीनियरिंग जैसा लगने लगता है।
-
शायद प्रॉम्प्ट डिज़ाइन बहुत निचले स्तर की चीज़ है, और इसे किसी उच्च-स्तरीय framework या compiler (जैसे langchain) पर छोड़ देना चाहिए। मुझे लगता है कि यह बात सही हो सकती है, लेकिन LLMs की तेज़ी से बदलती प्रकृति को देखते हुए, मैं व्यक्तिगत रूप से जितना संभव हो उतना रॉ मॉडल के करीब रहना पसंद करता हूँ।
आखिर में एक ज़रूरी बात
...क्योंकि मैं आपके साथ काम करना चाहूँगा: Cursor में, हम Cursor बना रहे हैं — एक AI-फर्स्ट कोड एडिटर। अगर आप प्रॉम्प्ट डिज़ाइन, कोडिंग के लिए LLMs, या बेहतरीन उत्पाद बनाने को लेकर उत्साहित हैं, तो कृपया मुझे arvid@cursor.com पर ईमेल करें। हम San Francisco में 5 लोगों की टीम हैं, मेरे सभी सहकर्मी असाधारण हैं, और हम कुछ और असाधारण लोगों — कोडर और डिज़ाइनर — को अपने साथ कोडिंग के भविष्य के निर्माण में शामिल करना चाहते हैं।