spinny:~/writing $ less rag-langchain-deep-dive.md
12بڑے زبان کے ماڈلز (LLMs) جیسے GPT-4 اور Claude غیر معمولی طور پر طاقتور ہیں، لیکن وہ ایک بنیادی حد سے دوچار ہیں: ان کا علم تربیت کے وقت منجمد ہو جاتا ہے۔ وہ آپ کے اندرونی دستاویزات، آپ کے ڈیٹابیس، یا حقیقی وقت کی معلومات تک رسائی حاصل نہیں کر سکتے۔ **ریٹریول-آگمینٹڈ جنریشن (RAG)** بالکل اسی مسئلے کو حل کرتا ہے، LLMs کی تخلیقی طاقت کو بیرونی ذرائع سے معلومات حاصل کرنے کی صلاحیت کے ساتھ جوڑ کر۔34## مسئلہ: LLM کی حدود56RAG کے بارے میں بات کرنے سے پہلے، یہ سمجھنا ضروری ہے کہ ہمیں اس کی ضرورت کیوں ہے۔781. **جامد علم**: ایک LLM صرف وہی جانتا ہے جو اس نے تربیت کے دوران دیکھا۔ اگر آپ اس کی کٹ آف کے بعد ہونے والے واقعے کے بارے میں پوچھیں، تو یہ جواب نہیں دے سکتا۔92. **ہیلوسینیشنز**: جب ایک LLM جواب نہیں جانتا، تو یہ ایک بنانے کا رجحان رکھتا ہے، قابل فہم لیکن مکمل طور پر غلط معلومات پیدا کرتا ہے۔103. **نجی ڈیٹا تک رسائی نہیں**: ایک عام LLM کے پاس آپ کی کمپنی کی اندرونی دستاویزات، ٹکٹوں، یا کوڈ بیس تک رسائی نہیں ہے۔1112RAG ان تینوں مسائل کو حل کرتا ہے، کیوری کے وقت بیرونی ذرائع سے حاصل کردہ **متعلقہ سیاق و سباق** ماڈل کو فراہم کر کے۔1314## RAG کیا ہے؟1516ریٹریول-آگمینٹڈ جنریشن ایک فن تعمیر ہے جو LLM کو بھیجے گئے پرامپٹ کو بیرونی نالج بیس سے حاصل کردہ معلومات سے افزودہ کرتا ہے۔ ماڈل کے پیرامیٹرک علم پر مکمل انحصار کرنے کی بجائے، RAG پہلے متعلقہ معلومات **تلاش** کرتا ہے اور پھر اسے پرامپٹ میں **داخل** کرتا ہے، ماڈل کو درست، بنیاد پر مبنی جوابات پیدا کرنے کے قابل بناتا ہے۔1718```mermaid19graph LR20 User["User"] -- "Question" --> Retriever21 Retriever -- "Search relevant\ndocuments" --> VectorStore["Vector Store"]22 VectorStore -- "Relevant\ndocuments" --> Retriever23 Retriever -- "Context + Question" --> LLM24 LLM -- "Grounded\nresponse" --> User25```2627## RAG تفصیل سے کیسے کام کرتا ہے2829RAG فن تعمیر دو اہم مراحل پر مشتمل ہے: **انڈیکسنگ** (آف لائن) اور **ریٹریول + جنریشن** (آن لائن)۔3031### مرحلہ 1: انڈیکسنگ (دستاویز انجیشن)3233انڈیکسنگ کا مرحلہ آپ کے دستاویزات کو سیمینٹک تلاش کے لیے تیار کرتا ہے۔ یہ چار اقدامات پر مشتمل ہے۔3435```mermaid36graph TD37 A["Documents\n(PDF, HTML, MD, DB)"] --> B["Document Loader"]38 B --> C["Text Splitter"]39 C --> D["Text Chunks"]40 D --> E["Embedding Model"]41 E --> F["Numerical Vectors"]42 F --> G["Vector Store\n(ChromaDB, Pinecone, FAISS)"]43```4445#### 1. دستاویز لوڈنگ4647دستاویزات کسی بھی ذریعے سے آ سکتی ہیں: PDF فائلز، ویب صفحات، ڈیٹابیسز، Markdown فائلز، APIs۔ **Document Loader** ان دستاویزات کو پڑھتا ہے اور انہیں منظم متن میں تبدیل کرتا ہے۔4849#### 2. متن تقسیم (Chunking)5051LLMs کی سیاق و سباق کی ونڈو محدود ہوتی ہے، اور دستاویزات بہت لمبی ہو سکتی ہیں۔ **Text Splitter** دستاویزات کو *chunks* نامی چھوٹے ٹکڑوں میں تقسیم کرتا ہے۔ چنکنگ کا معیار اہم ہے: بہت چھوٹے chunks سیاق و سباق کھو دیتے ہیں، جبکہ بہت بڑے chunks مطابقت کو کم کر دیتے ہیں۔5253سب سے عام حکمت عملیاں ہیں:54- **ریکرسو کریکٹر اسپلٹنگ**: `\n\n`، `\n`، `. ` جیسے جداکاروں کا استعمال کرتے ہوئے متن کو بار بار تقسیم کرتا ہے، دستاویز کی ساخت کا احترام کرتے ہوئے۔55- **سیمینٹک اسپلٹنگ**: متن میں قدرتی وقفے تلاش کرنے کے لیے embeddings استعمال کرتا ہے۔56- **Chunk اوورلیپ**: حدود پر سیاق و سباق محفوظ رکھنے کے لیے لگاتار chunks کے درمیان اوورلیپ شامل کرتا ہے۔5758#### 3. Embedding5960ہر chunk کو ایک embedding ماڈل (جیسے OpenAI کا `text-embedding-3-small`) کے ذریعے ایک **عددی ویکٹر** (embedding) میں تبدیل کیا جاتا ہے۔ یہ ویکٹرز متن کے سیمینٹک معنی کو حاصل کرتے ہیں: ملتے جلتے معانی والے جملوں کے ویکٹرز کثیر جہتی فضا میں قریب ہوں گے۔6162#### 4. Vector Store6364ویکٹرز ایک **Vector Store** (یا ویکٹر ڈیٹابیس) میں محفوظ کیے جاتے ہیں، جیسے ChromaDB، Pinecone، Weaviate، یا FAISS۔ یہ ڈیٹابیس **مشابہت کی تلاش** کے لیے بہینہ بنایا گیا ہے: ایک کیوری دیے جانے پر، یہ سب سے ملتے جلتے ویکٹرز (اور اس لیے سب سے متعلقہ ٹیکسٹ chunks) تلاش کرتا ہے۔6566### مرحلہ 2: ریٹریول + جنریشن6768جب صارف سوال پوچھتا ہے:69701. سوال کو اسی embedding ماڈل کا استعمال کرتے ہوئے ایک embedding میں تبدیل کیا جاتا ہے۔712. Vector Store **مشابہت کی تلاش** کے ذریعے سب سے ملتے جلتے chunks تلاش کرتا ہے (عام طور پر cosine similarity یا Euclidean فاصلہ)۔723. حاصل کردہ chunks کو سیاق و سباق کے طور پر پرامپٹ میں داخل کیا جاتا ہے۔734. LLM فراہم کردہ سیاق و سباق کی بنیاد پر جواب تیار کرتا ہے۔7475## LangChain کے ساتھ RAG پائپ لائن بنانا7677**LangChain** LLM پر مبنی ایپلی کیشنز بنانے کے لیے سب سے مقبول Python (اور JavaScript) فریم ورک ہے۔ یہ RAG پائپ لائن کے ہر جزو کے لیے اعلیٰ سطحی تجریدات فراہم کرتا ہے۔7879### انسٹالیشن8081```bash82pip install langchain langchain-openai langchain-community chromadb83```8485### مرحلہ 1: دستاویزات لوڈ کریں8687LangChain مختلف ڈیٹا سورسز کے لیے درجنوں Document Loaders فراہم کرتا ہے۔8889```python90from langchain_community.document_loaders import (91 PyPDFLoader,92 WebBaseLoader,93 DirectoryLoader,94 TextLoader,95)9697# Load a PDF98pdf_loader = PyPDFLoader("docs/manual.pdf")99pdf_docs = pdf_loader.load()100101# Load a web page102web_loader = WebBaseLoader("https://docs.example.com/guide")103web_docs = web_loader.load()104105# Load all .md files from a directory106dir_loader = DirectoryLoader("./knowledge_base", glob="**/*.md", loader_cls=TextLoader)107md_docs = dir_loader.load()108109all_docs = pdf_docs + web_docs + md_docs110```111112### مرحلہ 2: دستاویزات کو Chunks میں تقسیم کریں113114```python115from langchain.text_splitter import RecursiveCharacterTextSplitter116117text_splitter = RecursiveCharacterTextSplitter(118 chunk_size=1000,119 chunk_overlap=200,120 separators=["\n\n", "\n", ". ", " ", ""],121)122123chunks = text_splitter.split_documents(all_docs)124print(f"Original documents: {len(all_docs)}, Chunks: {len(chunks)}")125```126127`chunk_overlap` پیرامیٹر بہت اہم ہے: یہ لگاتار chunks کے درمیان اوورلیپ بناتا ہے تاکہ حدود پر سیاق و سباق ضائع نہ ہو۔128129### مرحلہ 3: Embeddings اور Vector Store بنائیں130131```python132from langchain_openai import OpenAIEmbeddings133from langchain_community.vectorstores import Chroma134135embedding_model = OpenAIEmbeddings(model="text-embedding-3-small")136137vectorstore = Chroma.from_documents(138 documents=chunks,139 embedding=embedding_model,140 persist_directory="./chroma_db",141)142```143144### مرحلہ 4: Retriever بنائیں145146Retriever وہ جزو ہے جو، ایک کیوری دیے جانے پر، vector store سے سب سے متعلقہ chunks حاصل کرتا ہے۔147148```python149retriever = vectorstore.as_retriever(150 search_type="similarity",151 search_kwargs={"k": 4},152)153154relevant_docs = retriever.invoke("How does authentication work?")155for doc in relevant_docs:156 print(doc.page_content[:200])157 print("---")158```159160### مرحلہ 5: RAG چین بنائیں161162اب آئیے سب کچھ ایک LLM اور پرامپٹ ٹیمپلیٹ کے ساتھ جوڑیں۔163164```python165from langchain_openai import ChatOpenAI166from langchain_core.prompts import ChatPromptTemplate167from langchain_core.runnables import RunnablePassthrough168from langchain_core.output_parsers import StrOutputParser169170llm = ChatOpenAI(model="gpt-4o", temperature=0)171172prompt = ChatPromptTemplate.from_template("""173Answer the question based only on the provided context.174If the context does not contain enough information, say you don't know.175176Context:177{context}178179Question: {question}180181Answer:182""")183184def format_docs(docs):185 return "\n\n".join(doc.page_content for doc in docs)186187rag_chain = (188 {"context": retriever | format_docs, "question": RunnablePassthrough()}189 | prompt190 | llm191 | StrOutputParser()192)193194response = rag_chain.invoke("How does authentication work in the system?")195print(response)196```197198## RAG کی جدید تکنیکیں199200بنیادی پائپ لائن اچھی طرح کام کرتی ہے، لیکن جواب کے معیار کو نمایاں طور پر بہتر بنانے کے لیے کئی تکنیکیں ہیں۔201202### ملٹی-کیوری ریٹریول203204بعض اوقات صارف کی کیوری مبہم ہوتی ہے یا دستاویزات میں استعمال ہونے والی زبان سے ہم آہنگ نہیں ہوتی۔ **Multi-Query Retriever** خود بخود اصل سوال کے مختلف ورژن تیار کرتا ہے تاکہ متعدد نقطہ نظر حاصل ہوں۔205206```python207from langchain.retrievers import MultiQueryRetriever208209multi_retriever = MultiQueryRetriever.from_llm(210 retriever=vectorstore.as_retriever(),211 llm=llm,212)213214docs = multi_retriever.invoke("What are the security best practices?")215```216217### سیاقی کمپریشن218219ایک chunk کا سارا مواد کیوری سے متعلق نہیں ہوتا۔ **Contextual Compression Retriever** ہر حاصل کردہ chunk سے صرف متعلقہ حصے نکالنے کے لیے ایک LLM استعمال کرتا ہے۔220221```python222from langchain.retrievers import ContextualCompressionRetriever223from langchain.retrievers.document_compressors import LLMChainExtractor224225compressor = LLMChainExtractor.from_llm(llm)226compression_retriever = ContextualCompressionRetriever(227 base_compressor=compressor,228 base_retriever=retriever,229)230```231232### ہائبرڈ تلاش233234خالص سیمینٹک تلاش ہمیشہ بہترین نہیں ہوتی۔ **ہائبرڈ تلاش** بہتر نتائج حاصل کرنے کے لیے سیمینٹک تلاش (embeddings) کو لغوی تلاش (BM25، کی ورڈ میچنگ) کے ساتھ ملاتی ہے۔235236```python237from langchain.retrievers import EnsembleRetriever238from langchain_community.retrievers import BM25Retriever239240bm25_retriever = BM25Retriever.from_documents(chunks)241bm25_retriever.k = 4242243semantic_retriever = vectorstore.as_retriever(search_kwargs={"k": 4})244245hybrid_retriever = EnsembleRetriever(246 retrievers=[bm25_retriever, semantic_retriever],247 weights=[0.4, 0.6],248)249```250251### مکالماتی RAG (میموری کے ساتھ)252253ایک RAG چیٹ بوٹ بنانے کے لیے جو بات چیت کا سیاق و سباق یاد رکھے، آپ کو ایسی میموری شامل کرنی ہوگی جو بات چیت کی تاریخ کو مدنظر رکھتے ہوئے صارف کے سوالات دوبارہ تشکیل دے۔254255```python256from langchain.chains import create_history_aware_retriever257from langchain_core.prompts import MessagesPlaceholder258259contextualize_prompt = ChatPromptTemplate.from_messages([260 ("system", "Given the chat history and the user's latest question, "261 "reformulate the question so it is understandable without the history."),262 MessagesPlaceholder("chat_history"),263 ("human", "{input}"),264])265266history_aware_retriever = create_history_aware_retriever(267 llm, retriever, contextualize_prompt268)269```270271## بہترین طریقے2722731. **صحیح chunk سائز کا انتخاب کریں**: مختلف سائز (500-1500 ٹوکنز) کے ساتھ تجربہ کریں۔ درست جوابات کے لیے چھوٹے chunks، وسیع تر سیاق و سباق کے لیے بڑے chunks۔2742. **دستاویز میٹا ڈیٹا استعمال کریں**: chunks میں میٹا ڈیٹا کے طور پر ماخذ، تاریخ اور زمرہ شامل کریں۔ یہ ریٹریول کے دوران نتائج فلٹر کرنے کی اجازت دیتا ہے۔2753. **معیار کا جائزہ لیں**: *faithfulness*، *relevancy* اور *context precision* جیسے میٹرکس ماپنے کے لیے [RAGAS](https://docs.ragas.io/) جیسے فریم ورک استعمال کریں۔2764. **دستاویز اپ ڈیٹس کا انتظام کریں**: اپنے ڈیٹا سورسز کے ساتھ vector store کو ہم آہنگ رکھنے کے لیے دوبارہ انجیشن پائپ لائن نافذ کریں۔2775. **re-ranker شامل کریں**: ابتدائی ریٹریول کے بعد، اصل مطابقت کی بنیاد پر نتائج کو دوبارہ ترتیب دینے کے لیے re-ranking ماڈل (جیسے Cohere Rerank) استعمال کریں۔278279## نتیجہ280281RAG ان AI ایپلی کیشنز کی تعمیر کے لیے معیاری فن تعمیر بن گیا ہے جن کو مخصوص، تازہ ترین علم تک رسائی کی ضرورت ہے۔ LangChain پائپ لائن کے ہر جزو کے لیے تجریدات فراہم کرتے ہوئے عمل درآمد کو بہت آسان بناتا ہے۔282283**اگلے اقدامات:**284- **مقامی طور پر تجربہ کریں**: پائپ لائن سے واقفیت حاصل کرنے کے لیے ChromaDB اور چند دستاویزات سے شروع کریں۔285- **LangSmith دریافت کریں**: پروڈکشن میں اپنی چینز کی نگرانی اور ڈیبگ کرنے کے لیے [LangSmith](https://smith.langchain.com/) استعمال کریں۔286- **مختلف embedding ماڈلز آزمائیں**: `text-embedding-3-small`، `text-embedding-3-large` اور Sentence Transformers کے اوپن سورس ماڈلز کا موازنہ کریں۔287- **دستاویزات چیک کریں**: [LangChain دستاویزات](https://python.langchain.com/docs/) ایک بہترین اور مسلسل اپ ڈیٹ ہونے والا ذریعہ ہے۔288
:RAG اور LangChain: ریٹریول-آگمینٹڈ جنریشن کے لیے ایک مکمل گائیڈlines 1-288 (END) — press q to close