<पी> क्या आपने Google या Perplexity.ai का उपयोग किया है? क्या आपको आश्चर्य है कि वे ऐसे खोज परिणाम कैसे दिखाने में सक्षम हैं जो नवीनतम हैं और जिनमें ऑनलाइन लेखों के लिंक शामिल हैं? खैर, इस गाइड में आप सीखेंगे कि अपने दम पर ऐसी प्रणाली कैसे बनाई जाए। आप सीखेंगे कि एक ऐसी प्रणाली कैसे बनाई जाए जो आपके बढ़ते ज्ञान बैंक में आपके द्वारा जोड़े गए लेखों के लिंक के आधार पर सिफारिशें उत्पन्न करने में सक्षम हो। आवश्यकताएँ
<पी> आपको निम्नलिखित की आवश्यकता होगी: - Node.js 18 या बाद का संस्करण
- एक अपस्टैश खाता
- एक OpenAI खाता
- एक Fly.io खाता
टेक स्टैक
प्रौद्योगिकी | विवरण | अपस्टैशसर्वरलेस डेटाबेस प्लेटफ़ॉर्म। आप वेक्टर एम्बेडिंग और मेटाडेटा को संग्रहीत करने के लिए अपस्टैश वेक्टर का उपयोग करने जा रहे हैं। वेब मानकों पर ध्यान केंद्रित करने के साथ फुल-स्टैक वेब अनुप्रयोगों के निर्माण के लिए रीमिक्सफ्रेमवर्क। आपके उपयोगकर्ताओं के निकट डेटाबेस। सुसंगत कोड शैली के लिए PrettierOpinionated कोड फ़ॉर्मेटर। कदम
<पी> इस गाइड को पूरा करने और अपना स्वयं का लेख अनुशंसा सिस्टम तैनात करने के लिए, आपको इन चरणों का पालन करना होगा: - एक OpenAI टोकन जेनरेट करें
- एक अपस्टैश वेक्टर इंडेक्स बनाएं
- प्रोजेक्ट सेट करें
- OpenAI API क्लाइंट को त्वरित करें
- OpenAI API एंबेडिंग क्लाइंट बनाएं
- अपस्टैश वेक्टर क्लाइंट बनाएं
- एक कॉन्टेक्स्ट एपीआई एंडपॉइंट बनाएं
- चैट एपीआई एंडपॉइंट बनाएं
- Fly.io पर तैनात करें
- संदर्भ
- निष्कर्ष
OpenAI टोकन जेनरेट करें
<पी> OpenAI API का उपयोग करके, आप लेखों की वेक्टर एम्बेडिंग प्राप्त करने में सक्षम हैं, और AI का उपयोग करके चैटबॉट प्रतिक्रियाएँ बना सकते हैं। OpenAI API के किसी भी अनुरोध के लिए प्राधिकरण टोकन की आवश्यकता होती है। टोकन प्राप्त करने के लिए, अपने OpenAI खाते में एपीआई कुंजी पर जाएँ, और नई गुप्त कुंजी बनाएं पर क्लिक करें। बटन. इस टोकन को बाद में OPENAI_API_KEY के रूप में उपयोग के लिए कॉपी और सुरक्षित रूप से संग्रहीत करें पर्यावरण चर. एक अपस्टैश वेक्टर इंडेक्स बनाएं
<पी> एक बार जब आप एक अपस्टैश खाता बना लें और लॉग इन हो जाएं, तो वेक्टर टैब पर जाएं और Create Index पर क्लिक करें। एक वेक्टर इंडेक्स बनाना शुरू करने के लिए। <पी>
<पी> अपनी पसंद का इंडेक्स नाम दर्ज करें (जैसे, article)। ) और वेक्टर आयाम को 1536 पर सेट करें। <पी>
<पी> अब, कनेक्ट तक नीचे स्क्रॉल करें अनुभाग, और .env पर क्लिक करें बटन. सामग्री की प्रतिलिपि बनाएँ, और इसे अपने एप्लिकेशन में आगे उपयोग करने के लिए किसी सुरक्षित स्थान पर सहेजें। <पी>
प्रोजेक्ट सेट करें
<पी> सेट अप करने के लिए, बस ऐप रेपो को क्लोन करें और इसमें जो कुछ भी है उसे जानने के लिए इस गाइड का पालन करें। प्रोजेक्ट को क्लोन करने के लिए, टर्मिनल में निम्नलिखित चलाएँ: # Clone the project
git clone https://github.com/rishi-raj-jain/article-recommendation-system
cd article-recommendation-system
# Install the dependencies
pnpm install
<पी> एक बार जब आप रेपो क्लोन कर लें, तो एक .env बनाएं फ़ाइल. आप उपरोक्त अनुभागों में प्राप्त गुप्त कुंजियाँ जोड़ने जा रहे हैं। <पी> .env फ़ाइल में निम्नलिखित कुंजियाँ होनी चाहिए: # .env
# OpenAI API Key
OPENAI_API_KEY="sk-..."
# Upstash Vector Keys
UPSTASH_VECTOR_REST_URL="https://...-us1-vector.upstash.io"
UPSTASH_VECTOR_REST_TOKEN="...="
<पी> ऐसा हो जाने पर, आपकी ओर से कॉन्फ़िगरेशन सेट अप पूरा हो गया है। अब आप अपने टर्मिनल में निम्नलिखित कमांड निष्पादित करके और लोकलहोस्ट:3000 पर जाकर एप्लिकेशन को क्रियाशील देख सकते हैं। pnpm run build && pnpm run start
<पी> कोड के प्रासंगिक भागों को समझने के लिए अनुसरण करें जो आपको अपना स्वयं का लेख अनुशंसा सिस्टम सफलतापूर्वक बनाने की अनुमति देता है। OpenAI API क्लाइंट को त्वरित करें
<पी> openai के साथ पैकेज, आप समय बचाने और कोड की कुछ पंक्तियों के भीतर OpenAI REST API के साथ इंटरैक्ट करने में सक्षम हैं। निम्नलिखित कोड के साथ, हमने चैट पूर्णता प्रतिक्रियाएँ बनाने के लिए आगे उपयोग के लिए OpenAI API क्लाइंट लाइब्रेरी को इंस्टेंटिअट किया है। // File: app/lib/openai/completion.server.ts
import OpenAI from 'openai'
// Instantiate class to generate text completion using the OpenAI API
export default new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
})
<पी> नोट:.server.ts जोड़कर रीमिक्स में किसी फ़ाइल के लिए, आप यह सुनिश्चित कर सकते हैं कि इसका कोड जबरन बाहर दिया गया है क्लाइंट साइड बंडल का. OpenAI API एंबेडिंग क्लाइंट बनाएं
<पी> @langchain/openai के साथ पैकेज, आप OpenAIEmbeddings का उपयोग करने में सक्षम हैं किसी दिए गए पाठ के वेक्टर एम्बेडिंग उत्पन्न करने के लिए वर्ग। किसी भी लैंगचेन वेक्टर स्टोर के साथ संयुक्त होने पर, OpenAIEmbeddings क्लास आपको प्रत्येक वेक्टर एम्बेडिंग को स्वयं बनाने और सम्मिलित करने की प्रक्रिया से बचाता है। निम्नलिखित कोड के साथ, हमने हुड के नीचे वेक्टर एम्बेडिंग बनाने के लिए आगे उपयोग के लिए OpenAIEmbeddings क्लास को इंस्टेंटियेट किया है। // File: app/lib/openai/embedding.server.ts
import { OpenAIEmbeddings } from '@langchain/openai'
// Instantiate class to generate embeddings using the OpenAI API
export default new OpenAIEmbeddings({
modelName: 'text-embedding-3-small',
openAIApiKey: process.env.OPENAI_API_KEY,
})
अपस्टैश वेक्टर क्लाइंट बनाएं
<पी> @upstash/vector का उपयोग करना और @langchain/community/vectorstores/upstash पैकेज, आप अपने रीमिक्स एप्लिकेशन में एक कनेक्शन रहित क्लाइंट बनाने में सक्षम हैं जो आपको अपस्टैश वेक्टर इंडेक्स से वेक्टर एम्बेडिंग को स्टोर करने, हटाने और क्वेरी करने की अनुमति देता है। // File: app/lib/upstash/vectorStore.server.ts
import embeddings from '~/lib/openai/embedding.server'
import { Index as UpstashIndex } from '@upstash/vector'
import { UpstashVectorStore } from '@langchain/community/vectorstores/upstash'
// Instantiate the Upstash Vector Index
const index = new UpstashIndex({
url: process.env.UPSTASH_VECTOR_REST_URL as string,
token: process.env.UPSTASH_VECTOR_REST_TOKEN as string,
})
// Instantiate the Upstash Vector Store that'll create and save embeddings
export default new UpstashVectorStore(embeddings, { index })
एक कॉन्टेक्स्ट एपीआई एंडपॉइंट बनाएं
<पी> जैसे ही आप रीमिक्स एप्लिकेशन चलाते हैं, आपको इनपुट के रूप में एकाधिक आलेख यूआरएल स्वीकार करने वाला एक टेक्स्ट बॉक्स दिखाई देगा। भविष्य की उपयोगकर्ता खोजों में वैयक्तिकृत प्रतिक्रियाएँ बनाने के लिए उन लेखों को चैटबॉट के ज्ञान में जोड़ा जाना है। इस अनुभाग में, आप सीखेंगे कि संदर्भ समापन बिंदु (app/routes/api_.context.tsx) कैसा है ) उन एकाधिक लेख यूआरएल को स्वीकार करने, उनकी सामग्री लाने, उनके वेक्टर एम्बेडिंग उत्पन्न करने और उन्हें गतिशील रूप से अपस्टैश वेक्टर इंडेक्स में संग्रहीत करने के लिए स्थापित किया गया है। // File: app/routes/api_.context.tsx
import { Document } from 'langchain/document'
import { ActionFunctionArgs } from '@remix-run/node'
import vectorServer from '~/lib/vector/vectorStore.server'
import { CheerioWebBaseLoader } from 'langchain/document_loaders/web/cheerio'
export const action = async ({ request }: ActionFunctionArgs) => {
const formData = await request.formData()
// Check if any article link are present in the form submission
const articlesToEmbed = formData.get('articles') as string
if (articlesToEmbed) {
// Create the documents to be added to the Upstash Vector Store
const documents: any[] = []
await Promise.all(
articlesToEmbed.split(',').map(async (link) => {
// Use the link to render in the search results
// Parse the link using Cheerio
const loader = new CheerioWebBaseLoader(link.trim())
const scraper = await loader.scrape()
// Get the content of title tag to render in the search results
const name = scraper('title').html()
// Get the page content as string
const pageContent = scraper.text()
// Create metadata object to be inserted in the vector store
const metadata = { link, name }
documents.push(new Document({ pageContent, metadata }))
}),
)
// Creating embeddings from the provided documents along with metadata
// and add them to Upstash database
await vectorServer.addDocuments(documents.filter(Boolean))
}
}
<पी> उपरोक्त रीमिक्स एक्शन में, POST अनुरोध में मौजूद फॉर्म डेटा संदर्भ समापन बिंदु (/api/context) पर मौजूद है ) को पार्स किया गया है। इसके अलावा, अल्पविराम (,) द्वारा अलग किए गए आलेख लिंक के सेट पर एक लूप है जो निम्न कार्य करता है: - एक
pageContent बनाता है लेख के वेबपेज से प्राप्त पाठ्य सामग्री के रूप में परिवर्तनीय - एक
name बनाता है लेख के वेबपेज के शीर्षक के रूप में परिवर्तनीय
- पाठ सामग्री, संदर्भ और लेख के नाम के साथ एक लैंगचेन दस्तावेज़ बनाता है (
new Document({ pageContent, metadata }) )
- प्रत्येक दस्तावेज़ को वैश्विक
documents में जोड़ता है सारणी
<पी> अंत में, सभी दस्तावेज़ वैश्विक documents में संग्रहीत हो गए सरणी को अपस्टैश वेक्टर इंडेक्स में डाला जाता है। हुड के तहत, प्रत्येक दस्तावेज़ के लिए वेक्टर एम्बेडिंग इसके pageContent का उपयोग करके उत्पन्न की जाती है। संपत्ति. चैट एपीआई एंडपॉइंट बनाएं
<पी> इस अनुभाग में, आप सीखेंगे कि चैट एपीआई एंडपॉइंट (app/routes/api_.chat.tsx) कैसे होता है ) उपयोगकर्ता खोज के लिए प्रासंगिक लेखों की अनुशंसाओं वाली खोज इंजन जैसी प्रतिक्रियाएं बनाने के लिए स्थापित किया गया है। खोज से संबंधित लेख किसी दिए गए वेक्टर इंडेक्स से निकटतम टॉप-के वैक्टर ढूंढकर पाए जाते हैं। इसके अलावा, वैक्टर के मेटाडेटा से शीर्षक और लिंक संदर्भ के रूप में ओपनएआई एपीआई पर भेजे जाते हैं। यह चैटबॉट को उपयोगकर्ता की खोज पर प्रतिक्रिया देने के साथ-साथ लेखों को बाहरी लिंक के रूप में शामिल करने की अनुमति देता है। चीजों को सरल बनाने के लिए, हम इसे आगे के भागों में तोड़ेंगे: समानता खोज का उपयोग करके प्रासंगिक वेक्टर एंबेडिंग ढूंढें
<पी> प्रत्येक उपयोगकर्ता खोज के लिए लेखों के संपूर्ण ज्ञान बैंक को दोबारा देखना एक महंगा ऑपरेशन है। इसे शीर्ष 3 लेखों तक सीमित करने के लिए जो (यदि) उपयोगकर्ता खोज के लिए अत्यधिक प्रासंगिक हैं, अपने अपस्टैश वेक्टर इंडेक्स में वैक्टर के मौजूदा सेट को क्वेरी करें। इसके अलावा, उन वेक्टरों को रखने के लिए फ़िल्टर करें जिनकी एम्बेडिंग उपयोगकर्ता खोज के वेक्टर एम्बेडिंग के साथ कम से कम 70% समानता स्कोर रखती है। // File: app/routes/api_.chat.tsx
import vectorServer from '~/lib/upstash/vectorStore.server'
import type { ActionFunctionArgs } from '@remix-run/node'
export const action = async ({ request }: ActionFunctionArgs) => {
// Set of messages between user and chatbot
const { messages = [] } = await request.json()
// Get the latest question stored in the last message of the chat array
const searchQuery = messages[messages.length - 1].content
// Perform Similarity Search using the Upstash Vector Store
const queryResult = await vectorServer.similaritySearchWithScore(searchQuery, 3)
// Filter the records with confidence score > 70% and
// set the metadata as response to render search results
const results = queryResult.filter((i) => i[1] >= 0.7).map((i) => i[0].metadata)
// Proceed to create a response
}
चैटबॉट के लिए सिस्टम संदर्भ और निर्देश बनाएं
<पी> अब जब आपने वैक्टर का अत्यधिक प्रासंगिक सेट प्राप्त कर लिया है, तो आप चाहते हैं कि चैटबॉट उपयोगकर्ता की खोज पर प्रतिक्रिया देने से पहले संबंधित लेखों को जाने और उनका संदर्भ ले। OpenAI के gpt-3.5-turbo के साथ ऐसा करने के लिए मॉडल, सिस्टम के रूप में रोल प्रॉपर्टी के साथ एक संदेश ऑब्जेक्ट बनाएं और सामग्री संपत्ति में निम्नलिखित निर्देश शामिल होंगे: - चैटबॉट को Google की तरह प्रतिक्रिया देनी चाहिए
- चैटबॉट को यह सुनिश्चित करना चाहिए कि प्रतिक्रिया मार्कडाउन प्रारूप में है
- चैटबॉट की प्रतिक्रिया में लेखों के हाइपरलिंक होने चाहिए
- चैटबॉट केवल लेखों के संदर्भों को शामिल करने से कहीं आगे जाता है
// File: app/routes/api_.train.tsx
import { OpenAIStream, StreamingTextResponse } from 'ai'
import completionServer from '~/lib/openai/completion.server'
export const action = async ({ request }: ActionFunctionArgs) => {
// ...
// Now use OpenAI Text Completion with relevant articles as context
const completionResponse = await completionServer.chat.completions.create({
stream: true,
model: 'gpt-3.5-turbo',
messages: [
{
// create a system content message to be added as
// the open ai text completion will supply it as the context with the API
role: 'system',
content: `Behave like a Google. You have the knowledge of the following articles: ${JSON.stringify(results)}. Each response should be in 100% markdown compatible format and should have hyperlinks in it. Be precise. Do add some general text in the response related to the query.`,
},
// also, pass the whole conversation!
...messages,
],
})
// Convert the response into a friendly text-stream
const stream = OpenAIStream(completionResponse)
// Respond with the stream
return new StreamingTextResponse(stream)
}
<पी> उपरोक्त कोड के साथ, आप OpenAI से उन परिणामों को स्ट्रीम करने में सक्षम हैं जो संदर्भ से अवगत हैं, उपयोगकर्ता खोज के लिए प्रासंगिक पाए जाने वाले लेखों की अनुशंसा करते हैं। <पी> वह बहुत कुछ सीखने वाला था! अब आपका काम पूरा हो गया है ✨ Fly.io पर तैनात करें
<पी> रिपॉजिटरी Fly.io के लिए बेक-इन सेटअप के साथ आती है, विशेष रूप से इससे संबंधित: - डॉकरफ़ाइल
- fly.toml
- .dockerignore
<पी> एक बार जब आपके पास Fly.io खाता हो, तो आप रूट डायरेक्टरी में अपने टर्मिनल में निम्नलिखित कमांड निष्पादित करके Fly.io में एक ऐप बना सकते हैं: # Create an app based on the baked-in configuration in your account
# This will result only in the change of app name in existing fly.toml
fly launch
<पी> और अपने टर्मिनल में निम्नलिखित कमांड निष्पादित करते हुए Fly.io पर तैनात करें: # Deploy the app based on the configuration created above
fly deploy
संदर्भ
<पी> अधिक विस्तृत जानकारी के लिए, इस गाइड में उपयोग किए गए संदर्भ देखें। - गिटहब रिपॉजिटरी
- लैंगचेन के साथ अपस्टैश वेक्टर स्टोर एकीकरण
- OpenAI के चैट समापन एपीआई में सिस्टम निर्देश
- LangChain में Cheerio का उपयोग करके वेबपेजों से डेटा लोड करें
- रिएक्ट ऐप्स में AI चैट UI बनाना
निष्कर्ष
<पी> इस गाइड में, आपने सीखा कि गतिशील रूप से उत्पन्न सिस्टम संदर्भ के साथ वेक्टर एंबेडिंग और ओपनएआई कंप्लीशन एपीआई का उपयोग करके एक लेख अनुशंसा प्रणाली कैसे बनाई जाए। अपस्टैश वेक्टर और लैंगचेन के साथ, आपको वैक्टर को एक इंडेक्स में संग्रहीत करने, टॉप-के वेक्टर खोज क्वेरी करने और प्रत्येक उपयोगकर्ता खोज के लिए प्रासंगिक संदर्भ बनाने की क्षमता मिलती है, यह सब कुछ कोड की कुछ पंक्तियों के भीतर होता है। <पी> यदि आपका कोई प्रश्न या टिप्पणी है, तो बेझिझक GitHub पर मुझसे संपर्क करें।