संक्षिप्त उत्तर: जब कोई grower फ़ोन करके कहता है कि ब्लॉक 7 में residue की समस्या हो सकती है, तो सवाल यह होता है कि किन बोतलों में ब्लॉक 7 का फल है, और कितने हिस्से में। अगर सेलर लॉट और वॉल्यूम-भारित movements के ग्राफ़ के रूप में दर्ज है, तो यह एक recursive क्वेरी है जो सेकंडों में चलती है। उसके आगे कुछ MCP टूल्स (trace back, trace forward, bottling status) के ज़रिए एक GenAI एजेंट रखिए, और वाइनमेकर सादी भाषा में सवाल पूछकर ऐसा जवाब पा सकता है जिसका हर प्रतिशत परखे हुए कोड ने निकाला हो। एजेंट recall मेमो लिखता है। recall का फ़ैसला वह कभी नहीं करता।
सितंबर का एक मंगलवार है और एक grower फ़ोन करता है। ब्लॉक 7 पर एक स्प्रे शायद withholding period के भीतर ही हो गया था। अभी किसी को नहीं पता कि इससे फ़र्क पड़ता है या नहीं, पर वाइनरी को आज ही जानना है कि वह फल कहाँ गया। कौन से टैंक? कौन से blend? कौन सी bottlings, और उनमें से कौन सी पहले ही भेजी जा चुकी हैं?
ज़्यादातर वाइनरियों में यह वर्क ऑर्डर के ढेर और एक स्प्रेडशीट के साथ दो दिन का काम बन जाता है। इसकी ज़रूरत नहीं है। इस सीरीज़ में पहले बना movement ledger हर जवाब पहले से रखता है। बस उसे ग्राफ़ की तरह पढ़ना है।
सेलर पहले से ही एक ग्राफ़ है
वाइन का हर लॉट एक node है। हर movement एक edge है जिस पर वॉल्यूम लिखा है। एक ब्लॉक का फल एक टैंक में जाता है। उस टैंक का एक हिस्सा दूसरे टैंक में जाता है जिसमें पहले से कुछ और है। दो टैंक blend होकर तीसरा बनाते हैं, जो बोतल में भरा जाता है।
जब वाइन किसी बर्तन में जाती है, तो नई संरचना एक वॉल्यूम-भारित औसत होती है:
नया हिस्सा = (पहले से मौजूद वॉल्यूम x उसका हिस्सा + आने वाला वॉल्यूम x उसका हिस्सा) / कुल वॉल्यूम
चित्र में टैंक B में ब्लॉक 9 के 7,000 लीटर थे और ब्लॉक 7 के 3,000 लीटर आए, तो वह 30% ब्लॉक 7 है। bottling लॉट D, B से 5,000 लीटर और C से 5,000 लेता है, तो वह 15% ब्लॉक 7 है। पूरी प्रक्रिया बस इतनी है। बस इसे हर movement पर सही क्रम में लगाना है, जो ठीक वही काम है जिसके लिए कंप्यूटर बने हैं और ठीक वही जिसमें जल्दबाज़ी में लोग गलती करते हैं।
recursive क्वेरी
इसके लिए graph database की ज़रूरत नहीं है। एक वाइनरी में साल भर में हज़ारों movements होते हैं, और आपके पहले से चल रहे warehouse में एक recursive common table expression उन पर आराम से चल लेता है।
WITH RECURSIVE forward AS (
SELECT to_lot AS lot_id, share AS source_share, 1 AS depth
FROM lot_edges
WHERE from_lot = 'BLOCK-07-2025'
UNION ALL
SELECT e.to_lot, f.source_share * e.share, f.depth + 1
FROM forward f
JOIN lot_edges e ON e.from_lot = f.lot_id
WHERE f.depth < 30
)
SELECT lot_id, SUM(source_share) AS block7_share
FROM forward
GROUP BY lot_id;
यहाँ हर edge पर share गंतव्य लॉट का वह अंश है जो स्रोत लॉट से आया, और इसे silver layer में ledger के वॉल्यूम से एक बार निकाला जाता है। किसी ब्लॉक से edges पर आगे चलिए और रास्ते भर हिस्सों को गुणा कीजिए: इससे हर आगे वाला लॉट और उसमें ब्लॉक की मात्रा मिल जाती है। किसी bottling लॉट से पीछे चलिए और आपको उसकी पूरी रेसिपी मिलती है, वाइनयार्ड ब्लॉक तक।
depth की सीमा सजावट नहीं है। बरसों की topping वाले बैरल कार्यक्रम लंबी श्रृंखलाएँ बनाते हैं, और डेटा एंट्री की गलती से बना एक भटका हुआ loop वरना तब तक चलेगा जब तक warehouse हार न मान ले।
वही क्वेरी लेबल को साबित करती है
genealogy सिर्फ़ बुरे दिनों के लिए नहीं है। वही संरचना उस सवाल का जवाब देती है जो मार्केटिंग टीम हर विंटेज पूछती है: क्या यह blend वह लेबल ले सकता है जो हम चाहते हैं?
सीमाएँ बाज़ार के हिसाब से बदलती हैं। EU में लेबल पर किस्म या विंटेज के लिए आमतौर पर कम से कम 85% वाइन का योग्य होना ज़रूरी है। US में ज़्यादातर मामलों में किस्म के नाम के लिए 75% चाहिए, AVA के लिए 85%, और विंटेज तारीख के लिए AVA का नाम हो तो 95% और वरना 85%। backwards trace ठीक यही प्रतिशत देता है: किस्म, विंटेज और मूल के हिसाब से लॉट का हिस्सा। अपने बाज़ारों के नियम एक छोटी टेबल में रखिए, और एक जाँच आर्टवर्क छपने से पहले बता सकती है कि blend उन्हें पार करता है या नहीं, और कितने अंतर से।
इसके आगे GenAI एजेंट रखना
जब grower अभी फ़ोन पर ही हो, तब वाइनमेकर को recursive CTE नहीं लिखना चाहिए। यह एजेंट के लिए अच्छा काम है, अगर एजेंट ऐसे बना हो कि वह संख्याएँ गलत कर ही न सके।
2026 में Model Context Protocol (MCP) language model को टूल्स का सेट देने का मानक तरीका है। traceability के लिए तीन टूल काफ़ी हैं:
trace_forward(source, min_share)हर वह लॉट और bottling लौटाता है जिसमें कोई ब्लॉक या लॉट हो, एक सीमा से ऊपर के हिस्सों के साथ।trace_back(lot)किसी लॉट की पूरी संरचना ब्लॉक, किस्म और विंटेज के हिसाब से लौटाता है।bottling_status(lot)बने, स्टॉक में मौजूद और भेजे गए cases लौटाता है, और यह भी कि किसे भेजे गए।
हर टूल एक परखी हुई क्वेरी है। एजेंट का काम है सवाल समझना, सही क्रम में सही टूल बुलाना और जो वे लौटाएँ उसे लिखना। “ब्लॉक 7 कहाँ गया, और क्या उसमें से कुछ भेजा जा चुका है?” पूछे जाने पर वह trace_forward बुलाता है, फिर हर मिली bottling के लिए bottling_status, और एक छोटा मेमो बनाता है: दो टैंक अभी सेलर में हैं, एक bottling 15% ब्लॉक 7 पर है जिसके 400 cases तीन distributors को भेजे जा चुके हैं, और उन distributors की सूची।
कुछ नियम इसे भरोसेमंद रखते हैं:
- सिर्फ़ पढ़ने वाले टूल। एजेंट देख सकता है पर वाइन हिला नहीं सकता या रिकॉर्ड बदल नहीं सकता। hold और recall ऐसे काम हैं जो कोई व्यक्ति करता है।
- संख्याएँ सिर्फ़ टूल के आउटपुट से। मेमो वही हिस्से और case गिनती बताता है जो टूल्स ने लौटाए। अगर मॉडल कोई आँकड़ा खुद निकालता है, तो वह प्रॉम्प्ट की गलती है।
- mock recalls से इसे परखिए। खाने-पीने के कई नियम-तंत्र एक कदम पीछे और एक कदम आगे ट्रेस करने की अपेक्षा रखते हैं, और अच्छी वाइनरियाँ mock recall ड्रिल चलाती हैं। पिछली कुछ ड्रिल को ज्ञात जवाबों वाले test set में बदलिए और जब भी कुछ बदले, एजेंट को उन पर चलाइए।
फ़र्क समय का है। जो recall सवाल पहले दो दिन की कागज़ी कार्रवाई लेता था, वह कुछ मिनट लेता है, और वाइनमेकर वे मिनट जवाब जोड़ने की बजाय उसे जाँचने में लगाता है।
यह कहाँ टूटता है
संरचना पूरी तरह मिश्रण मानकर चलती है। गणित टैंक को एक-समान मानता है। जो टैंक बिना हिलाए top किया गया, या blend के मिलने से पहले जिससे निकाला गया, वह एक-समान नहीं है। recall के लिए सबसे बुरा मामला मानिए और उदार सीमाओं के साथ ट्रेस कीजिए।
topping धूल बनाती है। मिले-जुले स्रोतों से बरसों तक बैरल top करने से हज़ारों छोटे-छोटे अंश बनते हैं: इसका 0.2%, उसका 0.05%। एक सीमा तय कीजिए जिसके नीचे स्रोत बताया तो जाए पर उसका पीछा न किया जाए, और उसे मेमो में लिखिए।
ग्राफ़ उतना ही अच्छा है जितना ledger। एक दर्ज न हुआ ट्रांसफ़र श्रृंखला तोड़ देता है, और trace कहेगा कि ब्लॉक 7 टैंक B पर रुक गया, जबकि ऐसा नहीं हुआ। loss map के adjustment events पहले से चेतावनी देते हैं कि श्रृंखला कहाँ कमज़ोर है।
एजेंट को फ़ैसला नहीं करना चाहिए। स्टॉक रोकना है, distributors को बताना है या recall करना है, यह कानूनी और व्यावसायिक वज़न वाला फ़ैसला है। एजेंट तथ्य तेज़ी से जुटाता है। फ़ैसले पर हस्ताक्षर कोई व्यक्ति करता है।
निचोड़
हर blend एक ग्राफ़ है, चाहे वाइनरी उसे ग्राफ़ की तरह दर्ज करे या नहीं। movements को उनके वॉल्यूम के साथ रखिए, संरचना पाइपलाइन में एक बार निकालिए, और एक recursive क्वेरी उस सबसे कठिन सवाल का जवाब देती है जो grower पूछ सकता है। उन क्वेरी को MCP टूल्स में लपेटिए और एक GenAI एजेंट सादी भाषा में जवाब दे सकता है, जिसका हर प्रतिशत आपके परखे हुए कोड से आता है। मॉडल जवाब तक जल्दी पहुँचाता है। जवाब को सही ledger बनाता है।
सीरीज़ में आगे: data contracts के रूप में excise returns, जहाँ उसी ledger को टैक्स विभाग से मिलान करना होता है। दूसरी दिशा से blending, यानी लक्ष्य तक पहुँचने के लिए घटक चुनना, वाइन blending optimisation के लिए AI में है। पूरी सूची Cellar Ledger सीरीज़ पेज पर है।
अक्सर पूछे जाने वाले सवाल
वाइन के blend को वाइनयार्ड ब्लॉक तक वापस कैसे ट्रेस करें? हर लॉट को एक node और हर movement को वॉल्यूम ले जाने वाली एक edge मानिए। जब वाइन किसी बर्तन में जाती है, तो नई संरचना वहाँ पहले से मौजूद और नई आई वाइन का वॉल्यूम-भारित मिश्रण होती है। एक recursive क्वेरी edges पर पीछे की ओर चलती है, bottling लॉट से उसके स्रोतों तक, या आगे की ओर, वाइनयार्ड ब्लॉक से हर उस लॉट और bottling तक जिसमें वह है, और रास्ते भर हिस्सों को गुणा करती जाती है।
क्या वाइनरी traceability के लिए graph database चाहिए? आमतौर पर नहीं। एक वाइनरी में साल भर में हज़ारों movements होते हैं, अरबों नहीं, और आप जो lakehouse या warehouse पहले से चलाते हैं, उसमें एक recursive common table expression इसे आराम से संभाल लेता है। graph database तब फ़ायदेमंद होता है जब कई साइटें हों, बैरल का इतिहास बहुत लंबा हो, या आपको ट्रेसिंग से आगे graph algorithms चाहिए हों।
वाइनरी recall एजेंट में MCP क्या जोड़ता है? MCP, यानी Model Context Protocol, language model को टूल्स का एक सेट देने का मानक तरीका है। recall एजेंट के लिए टूल हैं trace_back, trace_forward और bottling_status, और हर एक एक परखी हुई क्वेरी चलाता है। मॉडल तय करता है कि कौन सा टूल बुलाना है और नतीजा लिखता है, पर हर हिस्सा और वॉल्यूम टूल से आता है, मॉडल के अपने गणित से नहीं।