छोटा जवाब: माल्ट अरोमा व्हील पहले से ही एक वेक्टर है। 0 से 5 तक अंक दिए गए बाईस डिस्क्रिप्टर, कॉफ़ी से हनी से बिस्किट तक, यानी हर माल्ट के लिए 22 संख्याएँ, और ये मिल जाएँ तो आप सब्स्टिट्यूट खोज सकते हैं और किसी ग्रिस्ट के कैरेक्टर का अनुमान लगा सकते हैं। 51 डिजिटाइज़ किए गए व्हील की असली संख्याएँ तीन जाल दिखाती हैं। रॉ cosine सिमिलैरिटी लगभग हर माल्ट को एक जैसा बताती है (मीडियन 0.91), इसलिए पहले वेक्टर को सेंटर कीजिए। जो माल्ट वेरिएंट एक ही प्रकाशित व्हील साझा करते हैं, वे एक ही वेक्टर पर सिमट जाते हैं, इसलिए रंग और एक्सट्रैक्ट स्पेसिफ़िकेशन से आने चाहिए। और 90% Pilsner और 10% CARAFA Special का सीधा औसत कॉफ़ी को 5 में से 0.4 पर रखता है, जिसे हर ब्रूअर गलत जानता है।
Weyermann अपने ज़्यादातर माल्ट के लिए एक अरोमा व्हील प्रकाशित करता है: डिस्क्रिप्टर का एक घेरा (कॉफ़ी, कोको, ब्रेडी, हनी, टॉफ़ी, ड्राइड फ़्रूट वगैरह), हर एक की तीव्रता के अंक के साथ। ब्रूअर इन्हें एक बार में एक माल्ट पढ़ने के लिए इस्तेमाल करते हैं। इन्हें एक के ऊपर एक रखिए तो कुछ ज़्यादा दिलचस्प मिलता है: एक टेबल जिसमें हर माल्ट संख्याओं की एक पंक्ति है। GenAI की भाषा में यह एक एम्बेडिंग है, बस ऐसी जिसे इंसान पढ़ सकता है।
इसके साथ प्रयोग करने के लिए एक छोटा ओपन टूल बनाते हुए मैंने इनमें से 51 व्हील को 0 से 5 स्केल पर 22-डिस्क्रिप्टर वेक्टर में डिजिटाइज़ किया। माल्ट फ़्लेवर व्हील को एक के ऊपर एक रखने वाली पिछली पोस्ट ने ग्रिस्ट को एक वेटेड योग मानने का तर्क दिया था। यह पोस्ट इस बारे में है कि जब आप इन संख्याओं पर ठीक से वेक्टर सर्च और ब्लेंडिंग करते हैं तो क्या होता है, और भोला तरीका कहाँ चुपचाप फ़ेल होता है।
व्हील एक वेक्टर है
हर माल्ट ऐसी एक पंक्ति बन जाता है, यहाँ कुछ डिस्क्रिप्टर तक छोटी की गई:
| माल्ट | कॉफ़ी | डार्क चॉकलेट | ब्रेडी | हनी | टॉफ़ी | … |
|---|---|---|---|---|---|---|
| Pilsner Malt | 0.0 | 1.0 | 2.0 | 1.0 | 1.5 | … |
| CARAFA Special Type 2 | 4.0 | 3.0 | 4.0 | 1.5 | 2.5 | … |
ऐसी कुछ दर्जन पंक्तियाँ एक टेबल में रखिए और दो काम के सवाल एक-एक लाइन के बन जाते हैं। कौन-सा माल्ट इससे सबसे ज़्यादा मिलता है? और इस ग्रिस्ट की ख़ुशबू कैसी है?
ये वही ऑपरेशन हैं जो एक RAG सिस्टम टेक्स्ट एम्बेडिंग पर चलाता है, सिमिलैरिटी सर्च और कॉम्बिनेशन, बस यहाँ आयामों के नाम हैं। इसलिए यह सीखने की बहुत अच्छी जगह है कि वेक्टर गणित कैसे बर्ताव करता है, क्योंकि आप हर नतीजे को उससे जाँच सकते हैं जो एक ब्रूअर जानता है।
जाल 1: रॉ cosine कहता है हर माल्ट एक जैसा है
वेक्टर की तुलना का डिफ़ॉल्ट तरीका cosine सिमिलैरिटी है। यह लंबाई को नज़रअंदाज़ करके उनके बीच का कोण मापती है, और 1 (एक ही दिशा) से माइनस 1 (उलटी दिशा) तक जाती है।
रॉ व्हील वेक्टर पर, माल्ट की हर जोड़ी में मीडियन cosine सिमिलैरिटी 0.91 है। Pilsner माल्ट और CARAFA Special Type 2, यानी एक हल्का बेस माल्ट और एक डीहस्क्ड रोस्टेड माल्ट, को 0.82 मिलता है। इस पैमाने से वे क़रीबी रिश्तेदार हैं।
वजह सीधी है। हर व्हील में ज़्यादातर डिस्क्रिप्टर पर कम अंकों का एक बेसलाइन होता है: थोड़ा ब्रेडी, थोड़ा मीठा, थोड़ा हनी। सारे वेक्टर मोटे तौर पर एक ही दिशा में इशारा करते हैं क्योंकि सब वह फ़र्श साझा करते हैं। Cosine साझा फ़र्श देखता है और ऊपर का फ़र्क चूक जाता है।
इलाज है वेक्टर को सेंटर करना: तुलना से पहले हर एक में से औसत माल्ट घटा दीजिए। अब हर वेक्टर बताता है कि एक माल्ट किसी आम माल्ट से कैसे अलग है। Pilsner बनाम CARAFA Special 2 गिरकर माइनस 0.66 पर आ जाता है, सही ढंग से उलटा। Pilsner बनाम Munich Type 1 0.44 पर आता है, जुड़ा हुआ पर अलग, जो लगभग वही है जो एक ब्रूअर कहेगा।
RAG सिस्टम में टेक्स्ट एम्बेडिंग के साथ भी यही होता है, जहाँ इसे anisotropy कहते हैं: सब कुछ स्पेस के एक कोने में जमा हो जाता है और अंक जितने होने चाहिए उससे ज़्यादा दिखते हैं। माल्ट के साथ इसे देखना कहीं आसान है।
जाल 2: वेरिएंट एक ही वेक्टर पर सिमट जाते हैं
51 माल्ट में से केवल 40 अलग वेक्टर हैं। Weyermann एक फ़ैमिली के कई माल्ट के लिए एक ही व्हील प्रकाशित करता है, इसलिए CARAMUNICH Types 1, 2 और 3 एक व्हील साझा करते हैं, और तीनों CARAFA Special types भी। एक-दूसरे से उनकी cosine सिमिलैरिटी ठीक 1.0 है।
यह डेटा की गलती नहीं है। स्रोत यही कहता है। पर इसका मतलब है कि ‘CARAMUNICH Type 2 जैसा कुछ’ के लिए सिर्फ़ अरोमा वाली सर्च मज़े से Type 1 या Type 3 को परफ़ेक्ट मैच बताएगी, जबकि फ़ैमिली 80 से 160 EBC तक फैली है और Type 2 110 से 130 पर है। CARAFA Special एक साझा व्हील पर 800 से 1,500 EBC तक फैला है। वेक्टर में अरोमा है। उनमें रंग, एक्सट्रैक्ट या एंज़ाइम एक्टिविटी नहीं है।
इसलिए सब्स्टिट्यूट सर्च हाइब्रिड होनी चाहिए: पहले स्पेसिफ़िकेशन पर सख़्त फ़िल्टर (रंग का दायरा, एक्सट्रैक्ट, अधिकतम एडिशन दर), फिर बचे हुए को रैंक करने के लिए वेक्टर सिमिलैरिटी। दस्तावेज़ों पर RAG का पैटर्न ठीक यही है, जहाँ अर्थ के हिसाब से रैंक करने से पहले आप तारीख या स्रोत जैसे मेटाडेटा से फ़िल्टर करते हैं। शुद्ध वेक्टर सर्च, दोनों जगह, पूरे आत्मविश्वास से बकवास लौटाएगी जब काम की चीज़ वेक्टर में है ही नहीं।
जाल 3: औसत स्पेशलिटी माल्ट को छिपा देता है
अब ब्लेंड कीजिए। ग्रिस्ट के लिए स्पष्ट मॉडल मास-वेटेड औसत है: 90% Pilsner, 10% CARAFA Special 2, तो हर डिस्क्रिप्टर Pilsner के अंक का 0.9 गुना और CARAFA के अंक का 0.1 गुना है।
कॉफ़ी के लिए इससे 5 में से 0.4 मिलता है। Pilsner में कॉफ़ी शून्य है और CARAFA में 4, तो औसत कहता है हल्का-सा संकेत। जिस ब्रूअर ने कभी बीयर में 10% डार्क रोस्टेड माल्ट डाला है, वह जानता है कि यह हल्का संकेत नहीं है। तेज़ माल्ट की छोटी मात्रा अपने वज़न से कहीं ज़्यादा असर करती है।
बेहतर मॉडल दो काम करता है। वह हर माल्ट को उसके हिस्से के साथ-साथ अरोमा पोटेंसी से भी वेट करता है (रोस्टेड माल्ट बेस माल्ट से कई गुना ज़्यादा पोटेंट माने जाते हैं), और सबसे तेज़ अकेले योगदानकर्ता को औसत में दबाने के बजाय उभरने देता है। मैंने जो कैलिब्रेशन इस्तेमाल किया, उससे कॉफ़ी लगभग 2.6 पर आती है, साफ़ मौजूद, जबकि 100% Pilsner ग्रिस्ट अब भी Pilsner का अपना व्हील ही दोहराता है।
उस मॉडल के कॉन्स्टेंट विवेक पर आधारित फ़ैसले हैं, इस तरह ट्यून किए गए कि अकेले माल्ट अपना व्हील दोहराएँ और जाने-पहचाने ग्रिस्ट काग़ज़ पर मोटे तौर पर सही स्वाद दें। इसकी ईमानदार स्थिति यही है: कैलिब्रेट किए नॉब वाली एक समझदार संरचना, प्रकृति का कोई नियम नहीं।
GenAI कहाँ फ़िट होता है
यह ऐसा मामला है जहाँ वेक्टर गणित सादे कोड में रहना चाहिए, और बोलने का काम लैंग्वेज मॉडल करे:
- अनुमान को समझाना। ब्लेंड किया वेक्टर और हर नोट के शीर्ष योगदानकर्ता दिए जाएँ, तो LLM टेस्टिंग-शैली का सार लिखता है: ‘रोस्ट आगे, कॉफ़ी और डार्क चॉकलेट CARAFA से, नीचे ब्रेडी माल्ट’। वह उन संख्याओं का वर्णन करता है जो उसे दी गईं। वह उन्हें गढ़ता नहीं।
- खुले टेक्स्ट को डिस्क्रिप्टर से जोड़ना। ब्रूअर माल्ट को अपने शब्दों में बताते हैं। LLM ‘टोस्टी, कुछ-कुछ डाइजेस्टिव बिस्किट जैसा’ को बिस्किट और ब्रेडी अक्षों पर मैप कर सकता है ताकि टेक्स्ट क्वेरी संख्यात्मक वेक्टर में सर्च कर सके।
- टेक्स्ट एम्बेडिंग के साथ जोड़ना। टेस्टिंग नोट्स, सप्लायर विवरण और कॉम्पिटिशन फ़ीडबैक को टेक्स्ट के रूप में एम्बेड करके संख्यात्मक व्हील के साथ सर्च किया जा सकता है। यहीं से वेक्टर डेटाबेस अपना ख़र्च निकालना शुरू करता है। अकेले 51 माल्ट के लिए एक टेबल और कोड की कुछ पंक्तियाँ काफ़ी हैं।
यह कहाँ टूटता है
व्हील वर्ट का वर्णन करते हैं, बीयर का नहीं। प्रकाशित व्हील कांग्रेस-शैली के वर्ट या पूरे दाने के लिए हैं। फ़र्मेंटेशन, हॉपिंग और समय बदल देते हैं कि गिलास तक क्या बचता है। इनसे निकला कोई भी अनुमान माल्ट के योगदान के बारे में है, तैयार बीयर के बारे में नहीं।
व्हील को डिजिटाइज़ करना ख़ुद एक माप है। छपे चार्ट से तीव्रता पढ़ना, आँख से या विज़न मॉडल से, हर डिस्क्रिप्टर पर शायद आधे पॉइंट की त्रुटि जोड़ता है। वेक्टर को अनुमानित मानिए।
अनुभूति रैखिक नहीं है। अरोमा एक-दूसरे को ढकते, बढ़ाते और दबाते हैं। कोई वेटेड योग इसे पूरी तरह नहीं पकड़ता, इसीलिए पोटेंसी मॉडल एक कैलिब्रेशन है, कोई व्युत्पत्ति नहीं।
कोई आधिकारिक उत्पाद नहीं। किसी माल्टस्टर की प्रकाशित सामग्री से निकाले गए वेक्टर उसकी एक स्वतंत्र व्याख्या हैं। उन्हें माल्टस्टर का समर्थन प्राप्त नहीं है और उन्हें ऐसे पेश नहीं किया जाना चाहिए जैसे हो।
निचोड़
माल्ट अरोमा व्हील वेक्टर सर्च सीखने वाले किसी के लिए भी तोहफ़ा हैं, क्योंकि हर आयाम का एक नाम है जिसे ब्रूअर समझता है। वे मानक जाल भी साफ़ दिखाते हैं: रॉ cosine हर चीज़ की तारीफ़ करता है, वेक्टर में वही होता है जो आप डालते हैं, और औसत तेज़ अल्पसंख्यक को दबा देता है। तुलना से पहले सेंटर कीजिए, रैंक करने से पहले स्पेसिफ़िकेशन पर फ़िल्टर कीजिए, ब्लेंड करने से पहले पोटेंसी से वेट कीजिए, और लैंग्वेज मॉडल को संख्याएँ गढ़ने के बजाय उन्हें समझाने दीजिए।
सीरीज़ में आगे: 250 सार्वजनिक होमब्रू रेसिपी की स्क्रेपिंग और ट्रेंड माइनिंग। हॉप्स के लिए, जो इसकी बहन समस्या है, देखिए हॉप अरोमा प्रोफ़ाइलिंग और स्मार्ट सब्स्टिट्यूशन के लिए AI। पूरी सूची The Brewer’s Agent सीरीज़ पेज पर है।
अक्सर पूछे जाने वाले सवाल
क्या माल्ट का सब्स्टिट्यूट खोजने के लिए वेक्टर सिमिलैरिटी इस्तेमाल की जा सकती है? हाँ, सावधानी के साथ। हर माल्ट के अरोमा व्हील को डिस्क्रिप्टर तीव्रताओं के वेक्टर में बदलिए और क़रीबी मेल खोजने के लिए वेक्टर की तुलना कीजिए। पहले वेक्टर को औसत माल्ट पर सेंटर कीजिए, क्योंकि रॉ cosine सिमिलैरिटी लगभग हर जोड़ी को एक जैसा बताती है, और रंग व एक्सट्रैक्ट को सख़्त शर्त के रूप में फ़िल्टर कीजिए ताकि अरोमा मैच गलत रंग का माल्ट न सुझा सके।
अरोमा वेक्टर का औसत स्पेशलिटी माल्ट को कम क्यों आँकता है? क्योंकि एक तेज़ अल्पसंख्यक कैरेक्टर बेस माल्ट की मात्रा में घुल जाता है। 90% Pilsner और 10% रोस्टेड माल्ट वाले ग्रिस्ट में, सीधा मास-वेटेड औसत कॉफ़ी को 0 से 5 के स्केल पर 0.4 पर रखता है, जबकि ब्रूअर जानते हैं कि 10% डार्क रोस्टेड माल्ट साफ़ महसूस होता है। जो मॉडल अरोमा पोटेंसी से वेट करता है और सबसे तेज़ योगदानकर्ता को उभरने देता है, वह लगभग 2.6 देता है।
क्या माल्ट अरोमा वेक्टर को वेक्टर डेटाबेस में रखना चाहिए? कुछ दर्जन माल्ट के लिए, नहीं। एक टेबल और कोड की कुछ पंक्तियाँ काफ़ी हैं। वेक्टर डेटाबेस तब अपनी जगह कमाता है जब आप कई स्रोत जोड़ते हैं, जैसे सैकड़ों माल्ट, हॉप डिस्क्रिप्टर और टेक्स्ट एम्बेडिंग के रूप में टेस्टिंग नोट्स, और उन सब पर फ़िल्टर वाली सर्च चाहिए।