एम्बेडिंग और वेक्टर स्टोर से पुनर्प्राप्ति
एम्बेडिंग बनाइए और अपने डेटा पर अर्थ-आधारित खोज सक्षम करने के लिए वेक्टर स्टोर से पूछताछ कीजिए।
एम्बेडिंग और वेक्टर स्टोर से पुनर्प्राप्ति, CoddyKit पर Spring Boot 4 की संपूर्ण मार्गदर्शिका का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Spring Boot 4 की संपूर्ण मार्गदर्शिका सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Spring Boot 4 की संपूर्ण मार्गदर्शिका पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
एम्बेडिंग सिमैंटिक खोज को शक्ति क्यों देती हैं
कीवर्ड खोज शाब्दिक टोकन का मिलान करती है। सिमैंटिक खोज अर्थ का मिलान करती है। इन दोनों के बीच की कड़ी एम्बेडिंग है: फ़्लोट संख्याओं का एक निश्चित-लंबाई वाला वेक्टर, जो किसी टेक्स्ट के सिमैंटिक विषय-वस्तु को दर्शाता है।
- समान अर्थ वाले टेक्स्ट वेक्टर स्पेस में एक-दूसरे के निकट वेक्टर बनाते हैं।
- निकटता को कोसाइन समानता या यूक्लिडियन दूरी से मापा जाता है।
"how do I reset my password"जैसी क्वेरी"account recovery steps"शीर्षक वाले दस्तावेज़ से मेल खा सकती है, भले ही कोई साझा कीवर्ड न हो।
Spring AI में आप EmbeddingModel से एम्बेडिंग बनाते हैं और उन्हें VectorStore में संग्रहीत/क्वेरी करते हैं। यह पाठ दोनों को एक Retrieval-Augmented पाइपलाइन में जोड़ता है।
EmbeddingModel का अमूर्तीकरण
Spring AI EmbeddingModel को प्रदाता-निरपेक्ष इंटरफ़ेस के रूप में उपलब्ध कराता है। स्टार्टर जोड़ें (उदाहरण के लिए spring-ai-starter-model-openai) और Spring Boot अपने-आप एक बीन कॉन्फ़िगर कर देगा, जिसे आप इंजेक्ट कर सकते हैं।
embed(String)एकलfloat[]लौटाता है।embed(List<String>)कई टेक्स्ट को कुशलतापूर्वक बैच में संसाधित करता है।dimensions()वेक्टर का आकार बताता है (उदाहरण के लिएtext-embedding-3-smallके लिए 1536)।
मॉडल को application.yml में कॉन्फ़िगर करें, ताकि बीन इंजेक्शन के लिए तैयार हो।
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}
embedding:
options:
model: text-embedding-3-smallअपनी पहली एम्बेडिंग बनाना
EmbeddingModel इंजेक्ट करें और embed को कॉल करें। परिणाम एक सघन वेक्टर होता है, जिसे आप देख या स्थायी रूप से संग्रहीत कर सकते हैं। अधिक जानकारी देने वाला embedForResponse कॉल टोकन उपयोग का मेटाडेटा भी लौटाता है।
- स्टार्टअप पर एक बार
dimensions()का logging अवश्य करें, ताकि वेक्टर आकार बदलने वाला मॉडल परिवर्तन समय रहते पकड़ा जा सके। - वेक्टर स्टोर का कॉलम इसी आयाम से बिल्कुल मेल खाना चाहिए, अन्यथा प्रविष्टियाँ विफल हो जाएँगी।
@RestController
class EmbeddingController {
private final EmbeddingModel embeddingModel;
EmbeddingController(EmbeddingModel embeddingModel) {
this.embeddingModel = embeddingModel;
}
@GetMapping("/embed")
Map<String, Object> embed(@RequestParam String text) {
float[] vector = embeddingModel.embed(text);
return Map.of(
"dimensions", vector.length,
"preview", List.of(vector[0], vector[1], vector[2])
);
}
}कोसाइन समानता हाथ से निकालना
समझ विकसित करने के लिए, यहाँ वह गणित दिया गया है जो वेक्टर स्टोर आपके लिए करता है। कोसाइन समानता दो वेक्टरों के डॉट गुणनफल को उनके परिमाणों के गुणनफल से भाग देने पर प्राप्त होती है। इसका मान -1 (विपरीत) से 1 (समान दिशा) तक होता है।
- 1.0 के निकट मान का अर्थ है कि टेक्स्ट सिमैंटिक रूप से बहुत निकट हैं।
- वेक्टर स्टोर आमतौर पर इस माप से प्राप्त समानता स्कोर उपलब्ध कराते हैं।
यह स्वतंत्र प्रोग्राम दो उदाहरणात्मक वेक्टरों की कोसाइन समानता निकालता है।
public class CosineSimilarity {
static double cosine(double[] a, double[] b) {
double dot = 0, normA = 0, normB = 0;
for (int i = 0; i < a.length; i++) {
dot += a[i] * b[i];
normA += a[i] * a[i];
normB += b[i] * b[i];
}
return dot / (Math.sqrt(normA) * Math.sqrt(normB));
}
public static void main(String[] args) {
double[] query = {0.9, 0.1, 0.2};
double[] docA = {0.8, 0.2, 0.1};
double[] docB = {-0.5, 0.9, -0.4};
System.out.printf("query vs A: %.4f%n", cosine(query, docA));
System.out.printf("query vs B: %.4f%n", cosine(query, docB));
}
}VectorStore का अमूर्तीकरण
एक VectorStore Document ऑब्जेक्ट को उनकी एम्बेडिंग के साथ स्थायी रूप से संग्रहीत करता है और समानता क्वेरी का समर्थन करता है। Spring AI में PGVector, Redis, Chroma, Milvus, Qdrant के कार्यान्वयन और SimpleVectorStore परीक्षणों के लिए उपलब्ध हैं।
add(List<Document>)दस्तावेज़ों की एम्बेडिंग बनाकर उन्हें संग्रहीत करता है।similaritySearch(SearchRequest)क्वेरी की एम्बेडिंग बनाता है और निकटतम दस्तावेज़ लौटाता है।delete(...)आईडी या फ़िल्टर के आधार पर दस्तावेज़ हटाता है।
महत्वपूर्ण बात यह है कि add आपके लिए EmbeddingModel को कॉल करता है, इसलिए स्टोर का उपयोग करते समय आपको शायद ही कभी मैन्युअल रूप से एम्बेडिंग बनानी पड़े।
PGVector कॉन्फ़िगर करना
प्रोडक्शन के लिए, PGVector (Postgres एक्सटेंशन) एक सामान्य विकल्प है, क्योंकि यह वेक्टरों को आपके रिलेशनल डेटा के साथ एक ही स्थान पर रखता है। spring-ai-starter-vector-store-pgvector जोड़ें और स्कीमा आरंभीकरण कॉन्फ़िगर करें।
index-type: HNSWतेज़ अनुमानित निकटतम-पड़ोसी खोज देता है।dimensionsआपके एम्बेडिंग मॉडल के आउटपुट आकार के बराबर होना चाहिए।initialize-schema: trueSpring को स्टार्टअप परvector_storeतालिका बनाने देता है।
spring:
ai:
vectorstore:
pgvector:
initialize-schema: true
index-type: HNSW
distance-type: COSINE_DISTANCE
dimensions: 1536
datasource:
url: jdbc:postgresql://localhost:5432/appdb
username: app
password: ${DB_PASSWORD}दस्तावेज़ों का अंतर्ग्रहण
स्रोत टेक्स्ट के प्रत्येक खंड को एक Document में रखें। आप मनमाना मेटाडेटा (स्रोत, लेखक, टेनेंट आईडी) जोड़ सकते हैं, जिसे क्वेरी के समय फ़िल्टर किया जा सकता है। vectorStore.add(...) को कॉल करने से एक ही चरण में एम्बेडिंग बनती है और डेटा स्थायी रूप से संग्रहीत होता है।
- डुप्लिकेट बनाने के बजाय अपसर्ट करना हो, तो स्थिर आईडी का उपयोग करें।
- खंडों को छोटा रखें (कुछ सौ टोकन), ताकि प्राप्त संदर्भ केंद्रित रहे।
@Service
class IngestionService {
private final VectorStore vectorStore;
IngestionService(VectorStore vectorStore) {
this.vectorStore = vectorStore;
}
void ingest() {
List<Document> docs = List.of(
new Document("Spring Boot 4 requires Java 17 or later.",
Map.of("source", "release-notes", "version", "4.0")),
new Document("Reset your password from the account recovery page.",
Map.of("source", "help-center", "topic", "auth"))
);
vectorStore.add(docs);
}
}ETL रीडर से खंड बनाना
वास्तविक कॉर्पस PDF, Markdown या JSON के रूप में आते हैं। Spring AI की ETL pipeline DocumentReader स्रोत और DocumentTransformer स्प्लिटर उपलब्ध कराती है। TokenTextSplitter बड़े दस्तावेज़ों को एम्बेडिंग के अनुकूल खंडों में बाँटता है और मेटाडेटा को सुरक्षित रखता है।
TikaDocumentReaderPDF, Word और HTML पढ़ता है।TokenTextSplitterकॉन्फ़िगर किए जा सकने वाले ओवरलैप के साथ टोकन संख्या के आधार पर बाँटता है।- आउटपुट सीधे
vectorStore.add(...)में चला जाता है।
@Service
class PdfIngestion {
private final VectorStore vectorStore;
PdfIngestion(VectorStore vectorStore) {
this.vectorStore = vectorStore;
}
void load(Resource pdf) {
var reader = new TikaDocumentReader(pdf);
var splitter = new TokenTextSplitter();
List<Document> chunks = splitter.apply(reader.get());
vectorStore.add(chunks);
}
}SearchRequest से समानता खोज
SearchRequest एक builder है, जो पुनर्प्राप्ति को नियंत्रित करता है। मुख्य सेटिंग्स topK (कितने परिणाम) और similarityThreshold (कटऑफ़ से नीचे के कमजोर मिलानों को हटाना) हैं।
- उच्चतर
similarityThreshold(उदाहरण के लिए 0.75) शोर कम करता है, लेकिन कम परिणाम लौटा सकता है। topKयह सीमित करता है कि आप LLM को कितना संदर्भ देंगे, जिससे टोकन लागत नियंत्रित होती है।
@Service
class SearchService {
private final VectorStore vectorStore;
SearchService(VectorStore vectorStore) {
this.vectorStore = vectorStore;
}
List<Document> search(String query) {
return vectorStore.similaritySearch(
SearchRequest.builder()
.query(query)
.topK(4)
.similarityThreshold(0.7)
.build()
);
}
}मेटाडेटा फ़िल्टरिंग
बहु-टेनेंट या सीमित डेटा के लिए केवल सिमैंटिक प्रासंगिकता पर्याप्त नहीं है। SearchRequest एक फ़िल्टर एक्सप्रेशन स्वीकार करता है, जिसका मूल्यांकन दस्तावेज़ के मेटाडेटा पर किया जाता है और जो वेक्टर समानता को संरचित बाधाओं के साथ जोड़ता है।
FilterExpressionBuilderया पोर्टेबल स्ट्रिंग एक्सप्रेशन का उपयोग करें।- स्टोर फ़िल्टर और समानता रैंकिंग, दोनों को साथ लागू करता है।
- इसी तरह टेनेंट पृथक्करण लागू किया जाता है:
tenantId == 'acme'।
List<Document> scoped = vectorStore.similaritySearch(
SearchRequest.builder()
.query("how do I reset my password")
.topK(3)
.similarityThreshold(0.7)
.filterExpression("source == 'help-center' && topic == 'auth'")
.build()
);पुनर्प्राप्ति से RAG तक
पुनर्प्राप्ति RAG (Retrieval-Augmented Generation) का पहला आधा भाग है। दूसरे आधे में प्राप्त खंडों को प्रॉम्प्ट में शामिल किया जाता है, ताकि LLM आपके डेटा पर आधारित उत्तर दे। Spring AI का QuestionAnswerAdvisor वेक्टर स्टोर को सीधे ChatClient कॉल से जोड़ता है।
- एडवाइज़र प्रत्येक अनुरोध पर समानता खोज चलाता है और परिणामों को संदर्भ के रूप में जोड़ता है।
- आप वही
SearchRequestसेटिंग्स (topK, threshold) एडवाइज़र में पास करते हैं। - इससे उत्तर आपके अनुक्रमित दस्तावेज़ों के प्रति विश्वसनीय रहता है और मनगढ़ंत उत्तर कम होते हैं।
@Service
class RagService {
private final ChatClient chatClient;
RagService(ChatClient.Builder builder, VectorStore vectorStore) {
this.chatClient = builder
.defaultAdvisors(QuestionAnswerAdvisor.builder(vectorStore)
.searchRequest(SearchRequest.builder().topK(4).similarityThreshold(0.7).build())
.build())
.build();
}
String ask(String question) {
return chatClient.prompt().user(question).call().content();
}
}त्वरित जाँच: पुनर्प्राप्ति को समायोजित करना
एक सहकर्मी बताते हैं कि उनका RAG एंडपॉइंट अक्सर अप्रासंगिक दस्तावेज़ों को प्रॉम्प्ट में जोड़ देता है, जिससे टोकन लागत बढ़ती है और मॉडल भ्रमित होता है। वे एम्बेडिंग मॉडल बदले बिना केवल अत्यधिक प्रासंगिक मिलान रखना चाहते हैं। कौन-सा एकल SearchRequest समायोजन इस समस्या का सबसे सीधा समाधान है?
पुनरावलोकन और मुख्य बातें
आपने Spring AI में एक पूरी सिमैंटिक पुनर्प्राप्ति pipeline बनाई:
- EmbeddingModel टेक्स्ट को सघन वेक्टरों में बदलता है;
dimensions()आपके स्टोर के कॉलम आकार से मेल खाना चाहिए। - VectorStore (PGVector, Redis, Qdrant आदि)
Documents को संग्रहीत करता है औरadd()पर उनकी एम्बेडिंग अपने-आप बनाता है। - अंतर्ग्रहण से पहले वास्तविक files को खंडों में बाँटने के लिए ETL pipeline (
TikaDocumentReader+TokenTextSplitter) का उपयोग करें। - SearchRequest
topK,similarityThresholdऔर स्कोपिंग व टेनेंट पृथक्करण के लिए मेटाडेटाfilterExpressionके माध्यम से पुनर्प्राप्ति नियंत्रित करता है। - QuestionAnswerAdvisor मेल खाता संदर्भ
ChatClientप्रॉम्प्ट में जोड़कर पुनर्प्राप्ति को पूर्ण RAG में बदलता है।
आधारयुक्त उत्तर और टोकन बजट के बीच संतुलन बनाने के लिए लागत हेतु topK और सटीकता हेतु similarityThreshold को समायोजित करें।
एआई शिक्षक के साथ Java सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 21
- पाठ
- 84
अक्सर पूछे जाने वाले प्रश्न
क्या “एम्बेडिंग और वेक्टर स्टोर से पुनर्प्राप्ति” पाठ निःशुल्क है?
हाँ — Spring Boot 4 की संपूर्ण मार्गदर्शिका अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “एम्बेडिंग और वेक्टर स्टोर से पुनर्प्राप्ति” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Spring Boot 4 की संपूर्ण मार्गदर्शिका पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“एम्बेडिंग और वेक्टर स्टोर से पुनर्प्राप्ति” में मैं क्या सीखूँगा?
एम्बेडिंग बनाइए और अपने डेटा पर अर्थ-आधारित खोज सक्षम करने के लिए वेक्टर स्टोर से पूछताछ कीजिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Spring Boot 4 की संपूर्ण मार्गदर्शिका का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Spring Boot 4 की संपूर्ण मार्गदर्शिका शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Spring Boot 4 की संपूर्ण मार्गदर्शिका शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“एम्बेडिंग और वेक्टर स्टोर से पुनर्प्राप्ति” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Spring Boot 4 की संपूर्ण मार्गदर्शिका पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Spring Boot 4 की संपूर्ण मार्गदर्शिका पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- ChatClient, प्रॉम्प्ट और संरचित आउटपुट
- एम्बेडिंग और वेक्टर स्टोर से पुनर्प्राप्ति
- पुनर्प्राप्ति-संवर्धित जनरेशन पाइपलाइन
- टूल कॉलिंग और एजेंट सलाहकार