Back to all posts

मैं हमारे ब्लॉग प्रोडक्शन को आद्योपांत कैसे स्वचालित करता हूँ

मैं Ming हूँ। vm0 पर प्रोडक्ट डिज़ाइन के साथ-साथ हमारा कंटेंट चलाना भी मेरे काम का हिस्सा है, और इसमें मेरी उम्मीद से कहीं ज़्यादा कुछ निकला: वर्कफ़्लो डिज़ाइन, इलस्ट्रेशन, इमेज प्रोडक्शन, CMS का काम, अनुवाद। यह है कि मैं इसे धीरे-धीरे कैसे पूरा करता रहा हूँ।


कंटेंट यहाँ मेरे कामों में से एक है

vm0 पर मेरा ज़्यादातर दिन प्रोडक्ट डिज़ाइन और हमारे Next.js कोडबेस के बीच बँटता है। लेकिन हमारा कंटेंट चलाना भी मेरे ज़िम्मे है, और जैसे ही मैंने शुरू किया, मुझे एहसास हुआ कि एक ऐसे ब्लॉग में सचमुच कितना कुछ लगता है जो प्रदर्शन करता हो। आपको एक-समान आउटपुट चाहिए, असली कीवर्ड रिसर्च, ब्रांड के साथ सुसंगत विज़ुअल, ठीक-ठाक मेटा डिस्क्रिप्शन, और हमारे समर्थित चार भाषाओं में अनुवाद।

जब मैंने इसे गंभीरता से करना शुरू किया, तो हर पोस्ट में ज़्यादातर एक दिन लग जाता था। लिखाई इसका एक छोटा-सा हिस्सा निकली। ज़्यादातर समय लिखाई के इर्द-गिर्द के प्रोडक्शन काम में जाता था: सही कीवर्ड ढूँढ़ना, कवर आर्ट बनाना, CMS में फ़ील्ड्स को सही करना, हर locale के लिए इसे दोबारा करना।

इसलिए मैंने उस पाइपलाइन का जितना हो सका उतना धीरे-धीरे Lucas में डाल दिया, जो एक AI मार्केटिंग एजेंट है जिसे मैंने अपने रोज़मर्रा के काम के इर्द-गिर्द Zero पर बनाया। उसे "Marketing manager" के रूप में कॉन्फ़िगर किया गया है, और उसका दायरा कोई भी मार्केटिंग से जुड़ी चीज़ है: ब्लॉग प्रोडक्शन आज सबसे ज़्यादा विकसित हिस्सा है, और जैसे-जैसे मैं समय के साथ स्किल्स और कनेक्टर जोड़ता हूँ, वह बढ़ता रहता है।

अभी Lucas के पास हमारे Strapi हेडलेस CMS, हमारे Ahrefs खाते, हमारी टीम Slack, हमारी वेब चैट, ब्रांड-सुसंगत इलस्ट्रेशन के लिए एक आंतरिक draw स्किल, और लिखाई की कलाकारी के लिए मानक copywriting स्किल तक पहुँच है।

नीचे मैं बताऊँगा कि यह AI ब्लॉग ऑटोमेशन व्यवहार में कैसे काम करता है: कैसे Lucas एक अस्पष्ट प्रॉम्प्ट लेता है, उसे विषय और कीवर्ड में तोड़ता है, एक पोस्ट का ड्राफ़्ट बनाता है, एक कवर बनाता है, टेक्स्ट को स्वाभाविक अनुवाद से गुज़ारता है, और हमारे हेडलेस CMS में चार locale ड्राफ़्ट उतारता है। फिर मैं बताऊँगा कि मैं यहाँ तक कैसे पहुँचा, और मैं जानबूझकर क्या इंसानों के लिए छोड़ देता हूँ (अब भी ज़्यादातर मैं ही)।


मैं Lucas का इस्तेमाल कैसे करता हूँ: वेब ऐप और Slack

कई चैट बबल एक ही AI एजेंट पर एकत्रित होते हुए

मैं ज़्यादातर Lucas के साथ vm0 की वेब चैट के ज़रिए काम करता हूँ। यह डीप-वर्क इंटरफ़ेस है जहाँ मैं उसके साथ बैठकर आउटलाइन बनाता हूँ, ड्राफ़्ट लिखता हूँ, कवर के पुनरावृत्तियाँ करता हूँ और संपादन करता हूँ। लंबे थ्रेड, लंबा संदर्भ, ऐसी आगे-पीछे की बातचीत जो किसी चैट चैनल में अजीब लगती।

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


एक आम प्रॉम्प्ट कैसा दिखता है

Lucas को मेरे प्रॉम्प्ट आम तौर पर छोटे होते हैं। ज़्यादा से ज़्यादा तीन वाक्य। एक प्रतिनिधि उदाहरण:

Lucas, प्रभावी साप्ताहिक मीटिंग चलाने पर एक ट्यूटोरियल लिखो: मीटिंग संरचना, आम ग़लतियाँ, और दूरस्थ टीमों को व्यस्त कैसे रखें, यह कवर करो। ट्यूटोरियल शैली, SEO-अनुकूल, Zero इस्तेमाल करने के CTA के साथ ख़त्म करो। सिर्फ़ ड्राफ़्ट लिंक, प्रकाशित मत करो।

बस यही पूरा ब्रीफ़ है। एक संदेश। न कोई आउटलाइन, न कीवर्ड सूची, न डिज़ाइन ब्रीफ़, न लंबाई का लक्ष्य। Lucas वहाँ से इसे संभाल लेता है।

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


Lucas विषय और कीवर्ड का विश्लेषण कैसे करता है

कई कीवर्ड टैग से सिमटकर एक चुने हुए कीवर्ड तक पहुँचता एक फ़नल

Lucas का पहला क़दम एक अस्पष्ट प्रॉम्प्ट से संरचना निकालना है। ऊपर दिए गए जैसे अनुरोध के लिए, उसके कामकाजी नोट्स ऐसे दिखते हैं:

फिर वह कीवर्ड चुनता है। कंटेंट मार्केटिंग का यह वह हिस्सा है जिसके बारे में शुरू करते समय मेरी सबसे कम समझ थी, इसलिए मैंने Lucas को एक रूटीन दी जिससे वह हर बार गुज़रता है जब मैं उसे कीवर्ड काम के लिए प्रॉम्प्ट करता हूँ। यह कोई स्किल नहीं है जिसे वह स्वायत्त रूप से चलाता है, बस एक क्रम है जिसके लिए मैं उस पर भरोसा करता हूँ:

  1. Ahrefs से उम्मीदवार खींचो। वह विषय वाक्यांश पर Ahrefs API कॉल करता है, जो मासिक खोज मात्रा, कीवर्ड कठिनाई (KD), मूल विषय, और SERP इरादे के साथ लॉन्ग-टेल विविधताएँ लौटाता है।
  2. कठिनाई से फ़िल्टर करो। मैंने उसे एक कठोर नियम दिया: KD < 30। vm0 एक अपेक्षाकृत नया डोमेन है जिसका अधिकार सीमित है, इसलिए ऊँची-KD वाले कीवर्ड के पीछे भागना अभी हमारे लिए समझदारी नहीं है। शुरुआत में लॉन्ग-टेल जीतता है।
  3. हमारे Strapi इंडेक्स से क्रॉस-रेफ़रेंस करो। वह Strapi REST API के ज़रिए हमारे CMS से हर प्रकाशित slug खींचता है और कोई भी कीवर्ड हटा देता है जिसे हम पहले से कवर करते हैं। कोई आपसी प्रतिस्पर्धा नहीं।
  4. इरादे को प्रोडक्ट फ़िट से मिलाओ। किसी कीवर्ड का इरादा हमारी use case लाइब्रेरी के अनुकूल होना चाहिए। "प्रभावी साप्ताहिक मीटिंग कैसे चलाएँ" → ऑपरेशन्स / टीम प्रबंधन → फ़िट बैठता है। "टोक्यो में सबसे अच्छा रामेन" → नहीं बैठता, चाहे मात्रा कितनी भी हो।
  5. एक चुनो। फ़िल्टर की गई सूची से, वह सबसे ज़्यादा मात्रा वाला विकल्प चुनता है और उसे पोस्ट की रीढ़ के रूप में इस्तेमाल करता है। उदाहरण के लिए, remote weekly meeting best practices

ऑन-पेज SEO के लिए वह एक सरल नियम लागू करता है: लक्ष्य कीवर्ड टाइटल में, कम से कम एक H2 में, और पहले 100 शब्दों में। पर्यायवाची और संबंधित वाक्यांश पूरे पाठ में स्वाभाविक रूप से बुने हुए। जहाँ फ़िट बैठें वहाँ दो या तीन संबंधित पोस्ट के आंतरिक लिंक। उसके बाद: स्वाभाविक रूप से लिखो, कोई कीवर्ड ठूँसना नहीं।

पोस्ट की संरचना (छह या सात H2, हर चरण के नीचे एक "Tip:" कॉलआउट, अंत में एक CTA) एक ट्यूटोरियल टेम्पलेट से आती है जिसे मैंने कई पोस्ट के दौरान उदाहरणों से बनाया।


कवर कैसे बनाया जाता है

कवर ब्लॉग प्रोडक्शन का वह हिस्सा है जिसकी मुझे सबसे ज़्यादा परवाह है, कुछ इसलिए कि मैं एक डिज़ाइनर हूँ और कुछ इसलिए कि यही वह चीज़ है जो पाठक एक शब्द पढ़ने से पहले देखते हैं। यह वह Open Graph छवि भी है जब पोस्ट X या LinkedIn पर साझा होती हैं, और यही हमारे ब्लॉग इंडेक्स को स्टॉक फ़ोटोग्राफ़ी की दीवार के बजाय एक प्रकाशन जैसा बनाती है।

जो लुक मुझे चाहिए था उसके लिए स्टॉक फ़ोटो एक विकल्प नहीं थे, और एक-एक करके इलस्ट्रेशन ब्रीफ़ करने से प्रति पोस्ट प्रोडक्शन लागत बेक़ाबू हो जाती। इसलिए मैंने draw नाम की एक Zero स्किल बनाई। यह 200 लाइन की एक Python स्क्रिप्ट है जो पाँच काम करती है:

  1. दो इनपुट लेती है: एक रूपक (metaphor) (क्या रेखाचित्रित करना है) और एक रंग (color) (एक मित्रवत नाम और एक hex एंकर)।
  2. उन्हें एक तय प्रॉम्प्ट टेम्पलेट में डालती है जो बाक़ी रचना को बाँध देता है: गर्म धूसर पृष्ठभूमि #eeeeee, चुने गए रंग में कैनवास के केंद्र में watercolor blob, ऊपर हाथ से बनाया गया इंक स्केच, ऊपर-बाईं ओर (25, 25) पर vm0 लोगो।
  3. रचित प्रॉम्प्ट को fal.ai के nano-banana-pro मॉडल को 16:9 पर भेजती है।
  4. PNG डाउनलोड करती है। किसी भी लगभग-सफ़ेद पिक्सेल को वापस ठीक #eeeeee पर सामान्य कर देती है ताकि पृष्ठभूमि कभी भटके नहीं। 1600×900 तक अपस्केल करती है। पारदर्शी vm0 लोगो को ऊपर अल्फ़ा-कंपोज़िट करती है।
  5. नतीजे को vm0 के CDN पर अपलोड करती है और URL प्रिंट करती है।

एक आम इनवोकेशन ऐसा दिखता है:

python draw.py \
  --metaphor "a tilted hourglass with sand draining into a small open notebook, a sparkle near the rim" \
  --color-name "dusty rose" \
  --color-hex "#e08b96" \
  --upload

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

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

इन-आर्टिकल स्पॉट आर्ट (इस पोस्ट के सेक्शन के बीच आप जो छोटे चित्र देखते हैं) के लिए एक भाई स्किल है जिसे illustration कहते हैं। वही विचार: तय शैली, सिर्फ़ रूपक और रंग बदलते हैं। बस 16:9 कवर के बजाय वर्गाकार 1024×1024 आर्ट के लिए ट्यून किया गया।

इमेज SEO पर एक छोटी टिप्पणी: वही कवर छवि पोस्ट की Open Graph और Twitter Card एसेट के रूप में जुड़ी होती है, इसलिए सोशल शेयर इसे साफ़-सुथरे ढंग से उठा लेते हैं। Strapi अपलोड पर अपने आप चार पहले से आकार बदले गए वैरिएंट (thumbnail, small, medium, large) जनरेट करता है, हालाँकि मैंने अभी तक आर्टिकल बॉडी को उन्हें srcset के ज़रिए लोड करने के लिए नहीं जोड़ा है। यह एक छोटा फ़्रंट-एंड TODO है। इनलाइन इलस्ट्रेशन को वर्णनात्मक alt टेक्स्ट मिलता है जो Lucas के उन्हें एम्बेड करते समय markdown में लिखा जाता है; Strapi में कवर का अपना alternativeText ऐसा कुछ है जिसे मैं अब भी भरना चाहता हूँ।


पोस्ट कैसे लिखी जाती है

बाईं ओर एक खड़ी आउटलाइन जो दाईं ओर भरे हुए पैराग्राफ़ ब्लॉक में फैलती है, साथ में एक टिप-बल्ब

एक बार विषय, कीवर्ड और कवर तय हो जाने पर, ड्राफ़्टिंग ज़्यादातर यांत्रिक है। Lucas:

  1. पहले आउटलाइन बनाता है। छह या सात H2, हर एक का एक साफ़ काम: समस्या को ढाँचा देना, चरण-दर-चरण निर्देश, "Tip:" कॉलआउट, सारांश, CTA।
  2. हर H2 को गद्य में विस्तारित करता है copywriting स्किल का इस्तेमाल करके। आवाज़ (छोटे वाक्य, ठोस उदाहरण, जहाँ काम करे वहाँ द्वितीय पुरुष, कभी-कभार शुष्क हास्य) उन नियमों से आती है जो मैं Lucas के स्थायी निर्देशों में रखता हूँ, स्किल से नहीं।
  3. हर चरण के नीचे व्यावहारिक "Tip:" कॉलआउट जोड़ता है। ट्यूटोरियल के लिए उपयोगी क्योंकि ज़्यादातर पाठक सरसरी तौर पर पढ़ते हैं, और कॉलआउट उन्हें लंबे कंटेंट से गुज़रने का एक रास्ता देते हैं।
  4. पोस्ट की description फ़ील्ड लिखता है। Strapi इसे 80 अक्षरों पर सीमित करता है, इसलिए यह छोटी रहती है और ऐसी पढ़ी जाती है जैसे किसी इंसान ने लिखी हो। इसे आर्टिकल उपशीर्षक और OG/Twitter कार्ड विवरण के रूप में इस्तेमाल किया जाता है।
  5. एक CTA के साथ बंद करता है जो प्रोडक्ट का नाम लेता है और एक मुफ़्त वर्कस्पेस से लिंक करता है।

पहला ड्राफ़्ट आम तौर पर प्रॉम्प्ट के दो या तीन मिनट बाद वापस आता है। मैं इसे पढ़ता हूँ, जहाँ आवाज़ बेमेल हो वहाँ टोन समायोजन माँगता हूँ, और Lucas तब तक पुनरावृत्ति करता है जब तक यह सही न बैठे। पहला ड्राफ़्ट शायद ही कभी भेजने लायक होता है। यह आम तौर पर ज़्यादातर तैयार होता है पर थोड़ा बेमेल, और यहीं मैं अपनी समीक्षा का ज़्यादातर समय ख़र्च करता हूँ।


ड्राफ़्ट Strapi में कैसे उतरता है

एक लिपटा हुआ ड्राफ़्ट पैकेज एक CMS मेलबॉक्स में रखा जा रहा है, ऊपर एक पॉज़ आइकन मँडराता हुआ

हम अपने हेडलेस CMS के रूप में Strapi इस्तेमाल करते हैं। articles कंटेंट टाइप में एक cover (media), author और category (relations), locale (string), और एक blocks डायनेमिक ज़ोन है जहाँ बॉडी रहती है।

Lucas का CMS सिंक फ़्लो:

  1. कवर PNG को /api/upload पर POST करो। लौटाई गई documentId सहेजो।
  2. /api/articles?status=draft पर POST करो, टाइटल, विवरण (≤80 अक्षर; Strapi इसे लागू करता है), slug, locale, cover/author/category रिलेशन्स को संख्यात्मक ID के रूप में, और markdown बॉडी वाला एक अकेला shared.rich-text ब्लॉक के साथ।
  3. सबसे अहम: publishedAt को छोड़ दो। Strapi null को ड्राफ़्ट स्थिति मानता है।
  4. vm0 के ड्राफ़्ट पैटर्न का इस्तेमाल करके एक प्रीव्यू URL लौटाओ: https://www.vm0.ai/{locale}/blog/posts/{slug}?status=draft

Strapi v5 पर एक चेतावनी: सार्वजनिक REST API कुछ कंटेंट टाइप पर publishedAt को ओवरराइड कर सकता है, जिसका मतलब है कि API के ज़रिए आपका बनाया कोई "ड्राफ़्ट" चुपचाप लाइव हो सकता है। इसका समाधान एक छोटा DB माइग्रेशन है जो ड्राफ़्ट राइट पर इस फ़ील्ड को हटा देता है।

slug रणनीति भी SEO के लिए मायने रखती है। हम इसका अनुवाद करने के बजाय सभी चार locales में एक ही कैनॉनिकल slug इस्तेमाल करते हैं। /de/blog/posts/remote-weekly-meeting-best-practices पर एक पाठक वही URL संरचना देखता है जो /en पर एक पाठक देखता है, और हमारी बैकलिंक प्रोफ़ाइल अनूदित URL में बिखरती नहीं। उन locale रिलेशन्स से hreflang लिंक टैग निकालना एक छोटा फ़्रंट-एंड TODO है। हम उन्हें अभी तक नहीं भेजते।


i18n अनुवाद कैसे काम करता है

एक केंद्रीय दस्तावेज़ जो EN, DE, JA, ES लेबल वाली चार छोटी प्रतियों में फैलता है

vm0 चार locales में भेजता है: अंग्रेज़ी, जर्मन, जापानी, स्पेनिश। हम पोस्ट को Google Translate से नहीं गुज़ारते। सस्ता रास्ता आवाज़ को तबाह कर देता है; सही रास्ता मुहावरों को ढालता है।

Lucas पहले EN ड्राफ़्ट बनाता है, लौटाई गई documentId पकड़ता है, फिर स्वाभाविक रूप से अनूदित पेलोड के साथ तीन फ़ॉलो-अप PUT /api/articles/{documentId}?locale=de (और ?locale=ja, ?locale=es) कॉल करता है। Strapi उन्हें उसी कैनॉनिकल दस्तावेज़ के locale वैरिएंट के रूप में मानता है, जो चारों संस्करणों को एडमिन में और फ़्रंट-एंड locale स्विचर पर जुड़ा हुआ रखता है।

अनुवाद के नियम जो मैंने उसे दिए, ज़्यादातर ग़लत आउटपुट से टकराकर और उन्हें सुधारकर:

बहुभाषी कंटेंट प्रकाशन वर्कफ़्लो का वह हिस्सा था जो पहले सबसे ज़्यादा समय खाता था। अब यह उसी एजेंट रन में बस आख़िरी चरण है।


क्या स्वचालित नहीं होता

एक छोटा, अहम सेक्शन। इस वर्कफ़्लो की हर चीज़ जानबूझकर स्वचालित नहीं है:

बात मुझे लूप से हटाने की नहीं है। बात मुझे लूप के उन हिस्सों से हटाने की है जिन्हें वास्तव में मेरी ज़रूरत नहीं है।


मैं इस वर्कफ़्लो तक कैसे पहुँचा

मैंने एक वीकेंड बैठकर इसे डिज़ाइन नहीं किया। यह पोस्ट-दर-पोस्ट जमा हुआ, यह ध्यान देने से कि कौन-से चरण मेरा समय खा रहे थे।

मैंने जो ध्यान दिया: जो हिस्से स्वचालित करने लायक थे वे रचनात्मक हिस्से नहीं थे। वे जोड़ने वाले हिस्से थे: कीवर्ड खींचना, कवर रेंडर, अपलोड कॉल, locale फ़ैन-आउट, प्रीव्यू URL फ़ॉर्मेटिंग। जब मैंने ईमानदारी से इसका हिसाब रखा, तो मैं असली लिखाई से ज़्यादा समय लॉजिस्टिक्स पर ख़र्च कर रहा था।

इसलिए मैंने धीरे-धीरे लॉजिस्टिक्स को एजेंट में डाल दिया। मॉडल लिखता है; एजेंट चीज़ें इधर-उधर करना संभालता है। मैं अब भी यह तय करने वाला हूँ कि क्या लिखना है और यह कैसा सुनाई देना चाहिए, बस अब टुकड़ों को जोड़ने वाला नहीं।

मेरे लिए, व्यवहार में कंटेंट ऑटोमेशन "AI ब्लॉग लिखता है" नहीं निकला। यह "AI लिखाई के इर्द-गिर्द सब कुछ करता है, इसलिए मेरे पास सचमुच लिखाई को देखने का समय होता है" निकला।


अगर आप कुछ ऐसा ही आज़माना चाहते हैं

अगर आप किसी ऐसी ही जगह हैं, अपनी इच्छा से ज़्यादा टोपियाँ पहने हुए जिनमें कंटेंट एक है, तो इसका ज़्यादातर हिस्सा दोहराने योग्य है:

एक मुफ़्त Zero वर्कस्पेस शुरू करें →

या अगर आप साइन अप करने से पहले और एजेंट वर्कफ़्लो देखना चाहते हैं, तो हमारी use case लाइब्रेरी में इंजीनियरिंग, प्रोडक्ट, मार्केटिंग और ऑपरेशन्स में 19 कॉपी-करने-को-तैयार ऑटोमेशन हैं।

अगर आप ख़ास तौर पर Lucas को क्लोन करना चाहें: एक एजेंट बनाएँ, उसे Marketing manager भूमिका दें, Strapi (या आपका CMS) + Ahrefs + एक इमेज जेन टूल कनेक्ट करें, अपने हिसाब से ढली एक draw स्किल जोड़ें, और एक copywriting स्किल जो आपकी ब्रांड आवाज़ को पकड़ती हो। बाक़ी वह आपके पहले प्रॉम्प्ट से ख़ुद समझ जाएगा।

Related Articles

Stay in the loop

// Get the latest insights on AI teammates and collaboration.

SubscribeJoin Discord