पाठ 17 / 31

RAG Chain बनाना

Retriever, prompt, model और parser को जोड़ें।

संदर्भ और सवाल prompt में

RAG chain prompt में दो चीज़ें डालती है: retrieved संदर्भ और मूल सवाल। LCEL में यह chain की शुरुआत में dict है: {"context": retriever | format_docs, "question": RunnablePassthrough()} फिर | prompt | model | parser। Formatting चरण अंशों को क्रमांक देता है ताकि मॉडल [1] cite कर सके। मॉडल को निर्देश दें कि सिर्फ़ संदर्भ से उत्तर दे और वरना कहे कि नहीं पता। उत्तर के साथ स्रोत लौटाने के लिए retrieved Documents को आउटपुट में (parallel शाखा से) रखें ताकि आपका UI उनसे जोड़ सके।

पूरी RAG chain, चलाकर

मैंने यह Python virtual environment में langchain-core 1.6.6, langchain-text-splitters 1.1.2 और llama-index-core 0.14.25 के साथ ऑफ़लाइन चलाया। किसी API key या network call की ज़रूरत नहीं क्योंकि असली मॉडल की जगह fake मॉडल या खिलौना embedding है। छपा prompt संदर्भ में क्रमांक [1] वाला retrieved अंश और उसके बाद सवाल दिखाता है। Fake मॉडल "24 days [1]" लौटाता है। यहाँ retrieval अर्थहीन fake embedding और समान पाठ के एक-दस्तावेज़ मिलान से है, इसलिए सिर्फ़ wiring दिखाई जा रही है; असली उत्तरों के लिए असली embedding मॉडल और chat मॉडल लगाएँ।

from langchain_core.documents import Document
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_core.embeddings import DeterministicFakeEmbedding
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough, RunnableLambda
from langchain_core.language_models.fake_chat_models import FakeListChatModel

store = InMemoryVectorStore(DeterministicFakeEmbedding(size=32))
store.add_documents([Document(page_content="Employees get 24 days of paid leave per year."),
                     Document(page_content="Hotels are capped at 6000 rupees per night.")])
retriever = store.as_retriever(search_kwargs={"k": 1})

def fmt(docs): return "\n".join(f"[{i}] {d.page_content}" for i, d in enumerate(docs, 1))

prompt = ChatPromptTemplate.from_template("Answer from the context only.\nContext:\n{context}\nQuestion: {question}")
model = FakeListChatModel(responses=["24 days [1]"])
chain = ({"context": retriever | RunnableLambda(fmt), "question": RunnablePassthrough()}
         | prompt | model | StrOutputParser())

question = "Employees get 24 days of paid leave per year."
print(prompt.invoke({"context": fmt(retriever.invoke(question)), "question": question}).to_string())
print("answer:", chain.invoke(question))

Output:

Human: Answer from the context only.
Context:
[1] Employees get 24 days of paid leave per year.
Question: Employees get 24 days of paid leave per year.
answer: 24 days [1]

त्वरित जाँच: RAG prompt को कौन-सी दो चीज़ें मिलती हैं?

  • दो मॉडल
  • GPU और CPU
  • Retrieved संदर्भ और मूल सवाल
  • सिर्फ़ उत्तर
Answer

Retrieved संदर्भ और मूल सवाल — निष्ठा से उत्तर देने को मॉडल को प्रमाण और सवाल दोनों चाहिए।