एम्बेडबेस निर्माण, भंडारण और एम्बेडिंग को पुनः प्राप्त करने के लिए एक ओपन-सोर्स एपीआई है।
आज हम पॉल ग्राहम के निबंधों के लिए एक खोज इंजन का निर्माण करेंगे जिसका उपयोग हम Apple सिरी शॉर्टकट के साथ करेंगे, उदाहरण के लिए इन निबंधों के बारे में सिरी से प्रश्न पूछना।
"एम्बेडिंग" मशीन लर्निंग में एक अवधारणा है जो आपको डेटा की तुलना करने की अनुमति देती है।
आज हम एम्बेडिंग के तकनीकी विषय में गोता नहीं लगाएंगे।
"एम्बेडिंग" के बारे में सोचने का एक तरीका एक बैग में समान चीजों को एक साथ रखने जैसा है। इसलिए यदि आपके पास खिलौनों का एक बैग है, और आप एक निश्चित खिलौना खोजना चाहते हैं, तो आप बैग में देखते हैं और देखते हैं कि इसके पास कौन से अन्य खिलौने हैं, यह पता लगाने के लिए कि आपको कौन सा खिलौना चाहिए। एक कंप्यूटर शब्दों के साथ एक ही काम कर सकता है, समान शब्दों को एक साथ एक बैग में रख सकता है, और फिर अपने पास के दूसरे शब्दों के आधार पर वह शब्द खोज सकता है जो वह चाहता है।
जब आप अपने उत्पादन सॉफ़्टवेयर में एम्बेडिंग का उपयोग करना चाहते हैं, तो आपको उन्हें आसानी से स्टोर और एक्सेस करने में सक्षम होना चाहिए।
एम्बेडिंग के भंडारण और गणना के लिए कई वेक्टर डेटाबेस और एनएलपी मॉडल हैं। एम्बेडिंग से निपटने के लिए कुछ अतिरिक्त तरकीबें भी हैं।
उदाहरण के लिए, यह आवश्यक नहीं होने पर पुनर्गणना करने के लिए महंगा और अक्षम हो सकता है, उदाहरण के लिए, यदि नोट में "कुत्ते" और फिर "कुत्ते" शामिल हैं, तो आप आवश्यक रूप से पुनर्गणना नहीं करना चाहते क्योंकि परिवर्तित जानकारी उपयोगी नहीं हो सकती है।
इसके अलावा, इन वेक्टर डेटाबेसों के लिए एक तीव्र सीखने की अवस्था और मशीन सीखने को समझने की आवश्यकता होती है।
एंबेडबेस आपको मशीन लर्निंग, वेक्टर डेटाबेस, और कोड की कुछ पंक्तियों में गणनाओं को अनुकूलित करने के बारे में कुछ भी जाने बिना डेटा को सिंक्रोनाइज़ करने और शब्दार्थ खोज करने की अनुमति देता है।
क्रम में, हम करेंगे:
git clone https://github.com/another-ai/embedbase cd embedbase
Pinecone वेबसाइट पर जाएं, लॉगिन करें और एक इंडेक्स बनाएं:
हम इसे "पॉल" नाम देंगे और आयाम "1536" का उपयोग करेंगे ( इस संख्या को ठीक करने के लिए महत्वपूर्ण है , हुड के तहत, यह OpenAI डेटा संरचना "एम्बेडिंग" का "आकार" है), अन्य सेटिंग्स कम महत्वपूर्ण हैं।
आपको अपनी Pinecone API कुंजी प्राप्त करने की आवश्यकता है जो Embedbase को Pinecone के साथ संचार करने देगी:
अब आपको https://platform.openai.com/account/api-keys पर अपना OpenAI कॉन्फ़िगरेशन प्राप्त करने की आवश्यकता है (यदि आवश्यक हो तो खाता बनाएं)।
प्रेस "एक नई कुंजी बनाएँ":
साथ ही, अपनी संस्था आईडी यहां प्राप्त करें:
अब फ़ाइल "config.yaml" ( एम्बेडबेस निर्देशिका में ) में मान लिखें और भरें:
# embedbase/config.yaml # https://app.pinecone.io/ pinecone_index: "my index name" # replace this with your environment pinecone_environment: "us-east1-gcp" pinecone_api_key: "" # https://platform.openai.com/account/api-keys openai_api_key: "sk-xxxxxxx" # https://platform.openai.com/account/org-settings openai_organization: "org-xxxxx"
🎉 अब आप एम्बेडबेस चला सकते हैं!
डॉकर प्रारंभ करें, यदि आपके पास यह नहीं है, तो कृपया आधिकारिक वेबसाइट पर दिए गए निर्देशों का पालन करके इसे स्थापित करें।
अब एंबेडबेस चलाएं:
docker-compose up
यह वैकल्पिक है, बेझिझक अगले भाग पर जाएं!
यदि आप प्रेरित हैं, तो आप एंबेडबेस को Google क्लाउड रन में परिनियोजित कर सकते हैं। सुनिश्चित करें कि आपके पास एक Google क्लाउड प्रोजेक्ट है और आधिकारिक दस्तावेज के माध्यम से कमांड लाइन "gcloud" स्थापित किया है।
# login to gcloud gcloud auth login # Get your Google Cloud project ID PROJECT_ID=$(gcloud config get-value project) # Enable container registry gcloud services enable containerregistry.googleapis.com # Enable Cloud Run gcloud services enable run.googleapis.com # Enable Secret Manager gcloud services enable secretmanager.googleapis.com # create a secret for the config gcloud secrets create EMBEDBASE_PAUL_GRAHAM --replication-policy=automatic # add a secret version based on your yaml config gcloud secrets versions add EMBEDBASE_PAUL_GRAHAM --data-file=config.yaml # Set your Docker image URL IMAGE_URL="gcr.io/${PROJECT_ID}/embedbase-paul-graham:0.0.1" # Build the Docker image for cloud deployment docker buildx build . --platform linux/amd64 -t ${IMAGE_URL} -f ./search/Dockerfile # Push the docker image to Google Cloud Docker registries # Make sure to be authenticated https://cloud.google.com/container-registry/docs/advanced-authentication docker push ${IMAGE_URL} # Deploy Embedbase to Google Cloud Run gcloud run deploy embedbase-paul-graham \ --image ${IMAGE_URL} \ --region us-central1 \ --allow-unauthenticated \ --set-secrets /secrets/config.yaml=EMBEDBASE_PAUL_GRAHAM:1
वेब क्रॉलर आपको एक वेबसाइट के सभी पेजों को डाउनलोड करने की अनुमति देते हैं, यह Google द्वारा उपयोग किया जाने वाला अंतर्निहित एल्गोरिथम है।
रिपॉजिटरी को क्लोन करें और निर्भरताएं स्थापित करें:
git clone https://github.com/another-ai/embedbase-paul-graham cd embedbase-paul-graham npm i
आइए कोड को देखें, यदि आप टाइपस्क्रिप्ट प्रोजेक्ट के लिए आवश्यक सभी फाइलों से अभिभूत हैं, तो चिंता न करें और उन्हें अनदेखा न करें।
// src/main.ts // Here we want to start from the page that list all Paul's essays const startUrls = ['http://www.paulgraham.com/articles.html']; const crawler = new PlaywrightCrawler({ requestHandler: router, }); await crawler.run(startUrls);
आप देख सकते हैं कि क्रॉलर को "रूट्स" से इनिशियलाइज़ किया गया है, ये रहस्यमय रूट क्या हैं?
// src/routes.ts router.addDefaultHandler(async ({ enqueueLinks, log }) => { log.info(`enqueueing new URLs`); await enqueueLinks({ // Here we tell the crawler to only accept pages that are under // "http://www.paulgraham.com/" domain name, // for example if we find a link on Paul's website to an url // like "https://ycombinator.com/startups" if it will ignored globs: ['http://www.paulgraham.com/**'], label: 'detail', }); }); router.addHandler('detail', async ({ request, page, log }) => { // Here we will do some logic on all pages under // "http://www.paulgraham.com/" domain name // for example, collecting the page title const title = await page.title(); // getting the essays' content const blogPost = await page.locator('body > table > tbody > tr > td:nth-child(3)').textContent(); if (!blogPost) { log.info(`no blog post found for ${title}, skipping`); return; } log.info(`${title}`, { url: request.loadedUrl }); // Remember that usually AI models and databases have some limits in input size // and thus we will split essays in chunks of paragraphs // split blog post in chunks on the \n\n const chunks = blogPost.split(/\n\n/); if (!chunks) { log.info(`no blog post found for ${title}, skipping`); return; } // If you are not familiar with Promises, don't worry for now // it's just a mean to do things faster await Promise.all(chunks.flatMap((chunk) => { const d = { url: request.loadedUrl, title: title, blogPost: chunk, }; // Here we just want to send the page interesting // content into Embedbase (don't mind Dataset, it's optional local storage) return Promise.all([Dataset.pushData(d), add(title, chunk)]); })); });
ऐड () क्या है?
const add = (title: string, blogPost: string) => { // note "paul" in the URL, it can be anything you want // that will help you segment your data in // isolated parts const url = `${baseUrl}/v1/paul`; const data = { documents: [{ data: blogPost, }], }; // send the data to Embedbase using "node-fetch" library fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(data), }).then((response) => { return response.json(); }).then((data) => { console.log('Success:', data); }).catch((error) => { console.error('Error:', error); }); };
अब आप क्रॉलर चला सकते हैं, एंबेडबेस में सब कुछ डाउनलोड करने और निगलने में एक मिनट से भी कम समय लगना चाहिए।
OpenAI क्रेडिट का उपयोग <$1 से कम के लिए किया जाएगा
npm start
यदि आपने एंबेडबेस को क्लाउड पर तैनात किया है, तो कृपया उपयोग करें
# you can get your cloud run URL like this: CLOUD_RUN_URL=$(gcloud run services list --platform managed --region us-central1 --format="value(status.url)" --filter="metadata.name=embedbase-paul-graham") npm run playground ${CLOUD_RUN_URL}
आपको अपने टर्मिनल में कुछ गतिविधि (एंबेडबेस डॉकटर कंटेनर और नोड प्रक्रिया दोनों) बिना त्रुटियों के दिखाई देनी चाहिए ( अन्यथा मदद के लिए बेझिझक संपर्क करें )।
उदाहरण रिपॉजिटरी में आप " src/playground.ts " देख सकते हैं जो एक सरल स्क्रिप्ट है जो आपको अपने टर्मिनल में एंबेडबेस के साथ इंटरैक्ट करने देती है, कोड सीधा है:
// src/playground.ts const search = async (query: string) => { const url = `${baseUrl}/v1/paul/search`; const data = { query, }; return fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(data), }).then((response) => { return response.json(); }).then((data) => { console.log('Success:', data); }).catch((error) => { console.error('Error:', error); }); }; const p = prompt(); // this is an interactive terminal that let you search in paul graham // blog posts using semantic search // It is an infinite loop that will ask you for a query // and show you the results const start = async () => { console.log('Welcome to the Embedbase playground!'); console.log('This playground is a simple example of how to use Embedbase'); console.log('Currently using Embedbase server at', baseUrl); console.log('This is an interactive terminal that let you search in paul graham blog posts using semantic search'); console.log('Try to run some queries such as "how to get rich"'); console.log('or "how to pitch investor"'); while (true) { const query = p('Enter a semantic query:'); if (!query) { console.log('Bye!'); return; } await search(query); } }; start();
यदि आप स्थानीय रूप से एंबेडबेस चला रहे हैं तो आप इसे इस तरह चला सकते हैं:
npm run playground
या, इस तरह, अगर आपने एंबेडबेस को क्लाउड पर तैनात किया है:
npm run playground ${CLOUD_RUN_URL}
परिणाम:
मजे का समय! पॉल ग्राहम निबंध 😜 के बारे में सिरी प्रश्न पूछने में सक्षम होने के लिए आइए एक Apple सिरी शॉर्टकट बनाएं
सबसे पहले, Apple शॉर्टकट शुरू करें:
एक नया शॉर्टकट बनाएँ:
हम इस शॉर्टकट को "सर्च पॉल" नाम देंगे (ध्यान रखें कि यह उसी तरह होगा जैसे आप सिरी को शॉर्टकट शुरू करने के लिए कहते हैं, इसलिए कुछ आसान चुनें)
सादे अंग्रेजी में, यह शॉर्टकट उपयोगकर्ता से एक प्रश्न पूछता है और इसके साथ एंबेडबेस को कॉल करता है, और सिरी को उन निबंधों का उच्चारण करने के लिए कहता है जो उसे मिले।
"गेट फॉर इन" एंबेडबेस प्रतिक्रिया से संपत्ति "समानताएं" निकालेगा
प्रत्येक समानता के लिए "प्रत्येक आइटम के साथ दोहराएं" होगा:
"गठबंधन" एक नई पंक्ति के साथ परिणामों में "शामिल" होगा
(वैकल्पिक, नीचे कैसे दिखाया जाएगा) यह एक मजेदार ट्रिक है जिसे आप तीखेपन के लिए शॉर्टकट में जोड़ सकते हैं, OpenAI GPT3 का उपयोग करके परिणाम टेक्स्ट को थोड़ा सा रूपांतरित करने के लिए जब सिरी इसे उच्चारित करता है
हम ध्वनि के अनुकूल होने के लिए परिणाम को "टेक्स्ट" में इकट्ठा करते हैं
सिरी को इसे बोलने के लिए कहें
आप इस कार्यात्मक GPT3 शॉर्टकट का उपयोग करके परिणामों को अच्छे टेक्स्ट में बदल सकते हैं
("वाहक [आपका OPENAI कुंजी]" के साथ "प्राधिकरण" मान भरें)
एंबेडबेस के साथ, आप लागत कम रखते हुए एम्बेडिंग के निर्माण, भंडारण और पुनर्प्राप्ति के सिरदर्द के बिना कुछ ही समय में सिमेंटिक-संचालित उत्पाद बना सकते हैं।