क्वेरी करना और उत्तर बनाना
उपयोगकर्ता की क्वेरी संसाधित करने, प्रासंगिक संदर्भ प्राप्त करने और LLM का उपयोग करके उत्तर तैयार करने का तर्क विकसित कीजिए।
क्वेरी करना और उत्तर बनाना, CoddyKit पर LangChain / RAG / वेक्टर डेटाबेस का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह LangChain / RAG / वेक्टर डेटाबेस सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। LangChain / RAG / वेक्टर डेटाबेस पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
RAG से क्वेरी करना: उत्तर का प्रवाह
RAG घटकों को एकीकृत करने के बाद अगला चरण उनका उपयोग करके उपयोगकर्ता के प्रश्नों का उत्तर देना है। इस पाठ में उपयोगकर्ता की क्वेरी से लेकर उत्पन्न उत्तर तक की पूरी प्रक्रिया शामिल है।
हम 'क्वेरी-समय' के तर्क पर ध्यान देंगे: आपकी प्रणाली प्रश्न कैसे लेती है, प्रासंगिक संदर्भ कैसे ढूँढती है और LLM का उपयोग करके सुसंगत प्रतिक्रिया कैसे तैयार करती है।
उपयोगकर्ता की क्वेरी को समझना
RAG प्रणाली खोज इंजन की तरह उपयोगकर्ता के प्रश्न से शुरू होती है। यह कच्चा इनपुट पूरी प्रक्रिया का प्रारंभिक संकेत होता है।
- यह निर्धारित करता है कि कौन-सी जानकारी पुनर्प्राप्त करनी है।
- यह LLM को मार्गदर्शन देता है कि किस प्रकार का उत्तर उत्पन्न करना है।
इस प्रारंभिक चरण में आमतौर पर किसी विशेष प्रारूपण की आवश्यकता नहीं होती; यह केवल सादा पाठ होता है।
अपने पुनर्प्राप्तिकर्ता को सेट अप करना
प्रासंगिक दस्तावेज़ ढूँढने के लिए आपको एक पुनर्प्राप्तिकर्ता की आवश्यकता होती है। यह घटक आपके वेक्टर स्टोर में क्वेरी करना जानता है। आमतौर पर इसे आपके VectorStore इंस्टेंस से प्राप्त किया जाता है।
as_retriever() method इस घटक को बनाती है, और आप k जैसे पैरामीटर कॉन्फ़िगर कर सकते हैं, जो प्राप्त किए जाने वाले शीर्ष दस्तावेज़ों की संख्या है।
from langchain_community.vectorstores import InMemoryVectorStore
from langchain_core.documents import Document
from langchain_core.embeddings import Embeddings
from typing import List
# A simple mock for embeddings
class MockEmbeddings(Embeddings):
def embed_documents(self, texts: List[str]) -> List[List[float]]:
return [[i * 0.1] * 10 for i in range(len(texts))]
def embed_query(self, text: str) -> List[float]:
return [0.5] * 10
def main():
# Create a dummy vector store with some content
embeddings = MockEmbeddings()
docs = [
Document(page_content="The capital of France is Paris.", metadata={"source": "wiki"}),
Document(page_content="Eiffel Tower is in Paris, France.", metadata={"source": "travel"})
]
vectorstore = InMemoryVectorStore.from_documents(docs, embeddings)
# Create a retriever from the vector store
retriever = vectorstore.as_retriever(search_kwargs={"k": 1})
print("Retriever created successfully!")
if __name__ == "__main__":
main()संदर्भयुक्त दस्तावेज़ प्राप्त करना
पुनर्प्राप्तिकर्ता मिलने के बाद आप उपयोगकर्ता की क्वेरी के साथ उसे invoke कर सकते हैं। यह आपके वेक्टर स्टोर में समानता-खोज करेगा और सबसे प्रासंगिक Document ऑब्जेक्ट लौटाएगा।
ये दस्तावेज़ वह संदर्भ बनाते हैं जिसे LLM को भेजा जाएगा।
from langchain_community.vectorstores import InMemoryVectorStore
from langchain_core.documents import Document
from langchain_core.embeddings import Embeddings
from typing import List
class MockEmbeddings(Embeddings):
def embed_documents(self, texts: List[str]) -> List[List[float]]:
return [[i * 0.1] * 10 for i in range(len(texts))]
def embed_query(self, text: str) -> List[float]:
return [0.5] * 10
def main():
embeddings = MockEmbeddings()
docs = [
Document(page_content="The capital of France is Paris.", metadata={"source": "wiki"}),
Document(page_content="Eiffel Tower is in Paris, France.", metadata={"source": "travel"}),
Document(page_content="London is the capital of the UK.", metadata={"source": "wiki"})
]
vectorstore = InMemoryVectorStore.from_documents(docs, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 2})
user_query = "What is the capital of France?"
retrieved_docs = retriever.invoke(user_query)
print(f"Retrieved {len(retrieved_docs)} documents:")
for doc in retrieved_docs:
print(f"- {doc.page_content[:50]}...")
if __name__ == "__main__":
main()LLM के लिए संदर्भ तैयार करना
LLM आमतौर पर संदर्भ के रूप में पाठ की एकल string को प्राथमिकता देते हैं। पुनर्प्राप्त किए गए Document ऑब्जेक्ट को एक सुसंगत प्रारूप में संयोजित करना आवश्यक है।
एक सामान्य तरीका है उनके page_content fields को, संभवतः विभाजकों के साथ, जोड़ना और आवश्यकता होने पर स्रोत का मेटाडेटा शामिल करना।
- यह सुनिश्चित करता है कि पूरा संदर्भ LLM की token विंडो में आ जाए।
- यह LLM के लिए विचार करने योग्य साफ़ इनपुट प्रस्तुत करता है।
RAG प्रॉम्प्ट तैयार करना
प्रॉम्प्ट टेम्पलेट अत्यंत महत्वपूर्ण है। यह LLM को बताता है कि उपयोगकर्ता के प्रश्न का उत्तर देने के लिए दिए गए संदर्भ का उपयोग कैसे करना है। इसमें आमतौर पर context और question दोनों के लिए स्थानधारक शामिल होते हैं।
अच्छी तरह से तैयार किया गया प्रॉम्प्ट LLM को तथ्यात्मक बने रहने और मनगढ़ंत उत्तरों से बचने का मार्गदर्शन करता है।
from langchain_core.prompts import ChatPromptTemplate
def main():
# Define a RAG-specific prompt template
rag_prompt = ChatPromptTemplate.from_messages([
("system", "You are an AI assistant for Q&A. Use the context to answer. If you don't know, say that you don't know."),
("human", "Context: {context}\nQuestion: {question}")
])
print("RAG Prompt Template created!")
# Example of how it formats:
# print(rag_prompt.format(context="some info", question="a query"))
if __name__ == "__main__":
main()उत्तर-उत्पादन इंजन से जुड़ना
उत्तर उत्पन्न करने का अंतिम चरण तैयार किए गए संदर्भ और उपयोगकर्ता के प्रश्न को Large Language Model में भेजना है। LangChain आपको विभिन्न LLM प्रदाताओं को आसानी से जोड़ने की सुविधा देता है।
इस उदाहरण में हम API कुंजी की आवश्यकता के बिना एकीकरण प्रदर्शित करने के लिए एक नकली LLM का उपयोग करेंगे।
from langchain_core.language_models import BaseChatModel
from langchain_core.messages import BaseMessage, AIMessage
from typing import List, Any
# A simple mock LLM
class MockChatLLM(BaseChatModel):
def invoke(self, input: Any, config: Any = None) -> BaseMessage:
# Simulate LLM response based on input
if "Paris" in str(input):
return AIMessage(content="Paris is the capital of France.")
elif "London" in str(input):
return AIMessage(content="London is the capital of the UK.")
else:
return AIMessage(content="I don't have enough info to answer.")
async def ainvoke(self, input: Any, config: Any = None) -> BaseMessage:
return self.invoke(input, config) # Simple async pass-through
@property
def _llm_type(self) -> str:
return "mock-chat-llm"
def main():
llm = MockChatLLM()
print("Mock LLM initialized!")
# Example invocation (not part of the RAG chain yet)
response = llm.invoke("Tell me about Paris.")
print(f"LLM Response: {response.content}")
if __name__ == "__main__":
main()आरंभ से अंत तक RAG श्रृंखला जोड़ना
अब हम LangChain Expression Language (LCEL) का उपयोग करके पुनर्प्राप्तिकर्ता, प्रॉम्प्ट टेम्पलेट और LLM को मिलाकर एक शक्तिशाली, लचीली RAG श्रृंखला बनाएँगे। यह श्रृंखला पूरे प्रवाह को संभालती है।
हम इनपुट प्रबंधित करने के लिए RunnablePassthrough और अंतिम पाठ-उत्तर निकालने के लिए StrOutputParser का उपयोग करेंगे।
from langchain_core.runnables import RunnablePassthrough, RunnableLambda
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.documents import Document
from langchain_community.vectorstores import InMemoryVectorStore
from langchain_core.embeddings import Embeddings
from langchain_core.language_models import BaseChatModel
from langchain_core.messages import BaseMessage, AIMessage
from typing import List, Any
# Mock Embeddings
class MockEmbeddings(Embeddings):
def embed_documents(self, texts: List[str]) -> List[List[float]]:
return [[i * 0.1] * 10 for i in range(len(texts))]
def embed_query(self, text: str) -> List[float]:
return [0.5] * 10
# Mock LLM
class MockChatLLM(BaseChatModel):
def invoke(self, input: Any, config: Any = None) -> BaseMessage:
input_str = str(input)
if "Paris" in input_str and "capital of France" in input_str:
return AIMessage(content="Based on context, Paris is the capital of France.")
elif "Eiffel Tower" in input_str and "Paris" in input_str:
return AIMessage(content="The Eiffel Tower is in Paris, France.")
else:
return AIMessage(content="I don't have enough info in the context.")
async def ainvoke(self, input: Any, config: Any = None) -> BaseMessage:
return self.invoke(input, config)
@property
def _llm_type(self) -> str:
return "mock-chat-llm"
def main():
# 1. Setup Retriever
embeddings = MockEmbeddings()
docs = [
Document(page_content="The capital of France is Paris.", metadata={"source": "wiki"}),
Document(page_content="Eiffel Tower is in Paris, France.", metadata={"source": "travel"})
]
vectorstore = InMemoryVectorStore.from_documents(docs, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 1})
# 2. Setup Prompt
rag_prompt = ChatPromptTemplate.from_messages([
("system", "You are an AI assistant. Use the following context to answer: {context}. If you don't know, say 'I don't know.'"),
("human", "Question: {question}")
])
# 3. Setup LLM
llm = MockChatLLM()
# 4. Define how to format retrieved documents
def format_docs(docs: List[Document]) -> str:
return "\n\n".join(doc.page_content for doc in docs)
# 5. Build the RAG chain
rag_chain = (
{"context": retriever | RunnableLambda(format_docs),
"question": RunnablePassthrough()}
| rag_prompt
| llm
| StrOutputParser()
)
print("RAG chain assembled!")
if __name__ == "__main__":
main()अपने RAG अनुप्रयोग से क्वेरी करना
RAG श्रृंखला पूरी तरह तैयार होने के बाद आप उपयोगकर्ता के प्रश्न के साथ उसे invoke कर सकते हैं। श्रृंखला आंतरिक रूप से पुनर्प्राप्ति, संदर्भ प्रारूपण, प्रॉम्प्टिंग और LLM द्वारा उत्पन्न करने की प्रक्रिया संभालेगी तथा सीधा उत्तर लौटाएगी।
आपकी RAG प्रणाली से प्रतिक्रिया प्राप्त करने का यह अंतिम चरण है।
from langchain_core.runnables import RunnablePassthrough, RunnableLambda
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.documents import Document
from langchain_community.vectorstores import InMemoryVectorStore
from langchain_core.embeddings import Embeddings
from langchain_core.language_models import BaseChatModel
from langchain_core.messages import BaseMessage, AIMessage
from typing import List, Any
# Mock Embeddings
class MockEmbeddings(Embeddings):
def embed_documents(self, texts: List[str]) -> List[List[float]]:
return [[i * 0.1] * 10 for i in range(len(texts))]
def embed_query(self, text: str) -> List[float]:
return [0.5] * 10
# Mock LLM
class MockChatLLM(BaseChatModel):
def invoke(self, input: Any, config: Any = None) -> BaseMessage:
input_str = str(input)
if "Paris" in input_str and "capital of France" in input_str:
return AIMessage(content="Based on context, Paris is the capital of France.")
elif "Eiffel Tower" in input_str and "Paris" in input_str:
return AIMessage(content="The Eiffel Tower is in Paris, France.")
else:
return AIMessage(content="I don't have enough info in the context.")
async def ainvoke(self, input: Any, config: Any = None) -> BaseMessage:
return self.invoke(input, config)
@property
def _llm_type(self) -> str:
return "mock-chat-llm"
def main():
# Setup Retriever
embeddings = MockEmbeddings()
docs = [
Document(page_content="The capital of France is Paris.", metadata={"source": "wiki"}),
Document(page_content="Eiffel Tower is in Paris, France.", metadata={"source": "travel"})
]
vectorstore = InMemoryVectorStore.from_documents(docs, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 1})
# Setup Prompt
rag_prompt = ChatPromptTemplate.from_messages([
("system", "You are an AI assistant. Use the following context to answer: {context}. If you don't know, say 'I don't know.'"),
("human", "Question: {question}")
])
# Setup LLM
llm = MockChatLLM()
def format_docs(docs: List[Document]) -> str:
return "\n\n".join(doc.page_content for doc in docs)
# Build the RAG chain
rag_chain = (
{"context": retriever | RunnableLambda(format_docs),
"question": RunnablePassthrough()}
| rag_prompt
| llm
| StrOutputParser()
)
# Invoke the RAG chain with a query
query = "Where is the Eiffel Tower?"
result = rag_chain.invoke(query)
print(f"Query: {query}")
print(f"Answer: {result}")
query_no_context = "What is the capital of Japan?"
result_no_context = rag_chain.invoke(query_no_context)
print(f"\nQuery: {query_no_context}")
print(f"Answer: {result_no_context}")
if __name__ == "__main__":
main()RAG प्रवाह के अपने ज्ञान की जाँच करें
एक ऐसे LangChain RAG अनुप्रयोग पर विचार कीजिए, जिसे ज्ञान-आधार से प्रश्नों के उत्तर देने के लिए बनाया गया है।
पुनरावलोकन: RAG से क्वेरी करना
इस पाठ में आपने सीखा कि उपयोगकर्ता की क्वेरी संसाधित करने और उत्तर उत्पन्न करने के लिए सभी RAG घटकों को एक साथ कैसे लाया जाता है:
- हमने उपयोगकर्ता के प्रश्न को पुनर्प्राप्तिकर्ता के लिए क्वेरी में बदला।
- हमने प्रासंगिक दस्तावेज़ प्राप्त करने के लिए वेक्टर स्टोर से एक पुनर्प्राप्तिकर्ता बनाया।
- हमने LLM का मार्गदर्शन करने के लिए एक प्रॉम्प्ट टेम्पलेट तैयार किया।
- हमने अंतिम उत्तर तैयार करने के लिए एक LLM को एकीकृत किया।
- अंत में, हमने LangChain Expression Language (LCEL) का उपयोग करके आरंभ से अंत तक की RAG श्रृंखला बनाई और उसे invoke किया।
अब आप एक कार्यात्मक RAG प्रणाली बना सकते हैं, जो प्रमाण-आधारित और तथ्यात्मक उत्तर देती है!
एआई शिक्षक के साथ LangChain / RAG / वेक्टर डेटाबेस सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 12
- पाठ
- 48
अक्सर पूछे जाने वाले प्रश्न
क्या “क्वेरी करना और उत्तर बनाना” पाठ निःशुल्क है?
हाँ—“क्वेरी करना और उत्तर बनाना” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और LangChain / RAG / वेक्टर डेटाबेस पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। LangChain / RAG / वेक्टर डेटाबेस पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“क्वेरी करना और उत्तर बनाना” में मैं क्या सीखूँगा?
उपयोगकर्ता की क्वेरी संसाधित करने, प्रासंगिक संदर्भ प्राप्त करने और LLM का उपयोग करके उत्तर तैयार करने का तर्क विकसित कीजिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ LangChain / RAG / वेक्टर डेटाबेस का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या LangChain / RAG / वेक्टर डेटाबेस शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर LangChain / RAG / वेक्टर डेटाबेस शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“क्वेरी करना और उत्तर बनाना” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस LangChain / RAG / वेक्टर डेटाबेस पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर LangChain / RAG / वेक्टर डेटाबेस पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- सभी RAG घटकों का एकीकरण
- क्वेरी करना और उत्तर बनाना
- RAG प्रणाली के प्रदर्शन का मूल्यांकन
- RAG के लिए गोल्डन टेस्ट सेट बनाना