spinny:~/writing $ vim rag-langchain-deep-dive.md
1~2مدلهای زبانی بزرگ (LLMs) مانند GPT-4 و Claude فوقالعاده قدرتمند هستند، اما از یک محدودیت بنیادین رنج میبرند: دانش آنها در زمان آموزش منجمد است. **Retrieval-Augmented Generation (RAG)** دقیقاً این مشکل را حل میکند.3~4## مشکل: محدودیتهای LLM5~61. **دانش ایستا**: یک LLM فقط آنچه در طول آموزش دیده را میداند.72. **توهمات**: وقتی LLM پاسخ را نمیداند، تمایل به ساختن یکی دارد.83. **عدم دسترسی به دادههای خصوصی**.9~10## RAG چیست؟11~12```mermaid13graph LR14 User["User"] -- "Question" --> Retriever15 Retriever -- "Search relevant\ndocuments" --> VectorStore["Vector Store"]16 VectorStore -- "Relevant\ndocuments" --> Retriever17 Retriever -- "Context + Question" --> LLM18 LLM -- "Grounded\nresponse" --> User19```20~21## نحوه کار RAG22~23### فاز ۱: ایندکسگذاری24~25```mermaid26graph TD27 A["Documents\n(PDF, HTML, MD, DB)"] --> B["Document Loader"]28 B --> C["Text Splitter"]29 C --> D["Text Chunks"]30 D --> E["Embedding Model"]31 E --> F["Numerical Vectors"]32 F --> G["Vector Store\n(ChromaDB, Pinecone, FAISS)"]33```34~35### فاز ۲: بازیابی + تولید36~37## ساخت پایپلاین RAG با LangChain38~39### نصب40~41```bash42pip install langchain langchain-openai langchain-community chromadb43```44~45### مرحله ۱: بارگذاری اسناد46~47```python48from langchain_community.document_loaders import (49 PyPDFLoader,50 WebBaseLoader,51 DirectoryLoader,52 TextLoader,53)54~55pdf_loader = PyPDFLoader("docs/manual.pdf")56pdf_docs = pdf_loader.load()57~58web_loader = WebBaseLoader("https://docs.example.com/guide")59web_docs = web_loader.load()60~61dir_loader = DirectoryLoader("./knowledge_base", glob="**/*.md", loader_cls=TextLoader)62md_docs = dir_loader.load()63~64all_docs = pdf_docs + web_docs + md_docs65```66~67### مرحله ۲: تقسیم اسناد به chunks68~69```python70from langchain.text_splitter import RecursiveCharacterTextSplitter71~72text_splitter = RecursiveCharacterTextSplitter(73 chunk_size=1000,74 chunk_overlap=200,75 separators=["\n\n", "\n", ". ", " ", ""],76)77~78chunks = text_splitter.split_documents(all_docs)79print(f"Original documents: {len(all_docs)}, Chunks: {len(chunks)}")80```81~82### مرحله ۳: ایجاد embeddings و Vector Store83~84```python85from langchain_openai import OpenAIEmbeddings86from langchain_community.vectorstores import Chroma87~88embedding_model = OpenAIEmbeddings(model="text-embedding-3-small")89~90vectorstore = Chroma.from_documents(91 documents=chunks,92 embedding=embedding_model,93 persist_directory="./chroma_db",94)95```96~97### مرحله ۴: ایجاد Retriever98~99```python100retriever = vectorstore.as_retriever(101 search_type="similarity",102 search_kwargs={"k": 4},103)104~105relevant_docs = retriever.invoke("How does authentication work?")106for doc in relevant_docs:107 print(doc.page_content[:200])108 print("---")109```110~111### مرحله ۵: ساخت زنجیره RAG112~113```python114from langchain_openai import ChatOpenAI115from langchain_core.prompts import ChatPromptTemplate116from langchain_core.runnables import RunnablePassthrough117from langchain_core.output_parsers import StrOutputParser118~119llm = ChatOpenAI(model="gpt-4o", temperature=0)120~121prompt = ChatPromptTemplate.from_template("""122Answer the question based only on the provided context.123If the context does not contain enough information, say you don't know.124~125Context:126{context}127~128Question: {question}129~130Answer:131""")132~133def format_docs(docs):134 return "\n\n".join(doc.page_content for doc in docs)135~136rag_chain = (137 {"context": retriever | format_docs, "question": RunnablePassthrough()}138 | prompt139 | llm140 | StrOutputParser()141)142~143response = rag_chain.invoke("How does authentication work in the system?")144print(response)145```146~147## تکنیکهای پیشرفته RAG148~149### Multi-Query Retrieval150~151```python152from langchain.retrievers import MultiQueryRetriever153~154multi_retriever = MultiQueryRetriever.from_llm(155 retriever=vectorstore.as_retriever(),156 llm=llm,157)158~159docs = multi_retriever.invoke("What are the security best practices?")160```161~162### فشردهسازی زمینهای163~164```python165from langchain.retrievers import ContextualCompressionRetriever166from langchain.retrievers.document_compressors import LLMChainExtractor167~168compressor = LLMChainExtractor.from_llm(llm)169compression_retriever = ContextualCompressionRetriever(170 base_compressor=compressor,171 base_retriever=retriever,172)173```174~175### جستجوی ترکیبی176~177```python178from langchain.retrievers import EnsembleRetriever179from langchain_community.retrievers import BM25Retriever180~181bm25_retriever = BM25Retriever.from_documents(chunks)182bm25_retriever.k = 4183~184semantic_retriever = vectorstore.as_retriever(search_kwargs={"k": 4})185~186hybrid_retriever = EnsembleRetriever(187 retrievers=[bm25_retriever, semantic_retriever],188 weights=[0.4, 0.6],189)190```191~192### RAG مکالمهای (با حافظه)193~194```python195from langchain.chains import create_history_aware_retriever196from langchain_core.prompts import MessagesPlaceholder197~198contextualize_prompt = ChatPromptTemplate.from_messages([199 ("system", "Given the chat history and the user's latest question, "200 "reformulate the question so it is understandable without the history."),201 MessagesPlaceholder("chat_history"),202 ("human", "{input}"),203])204~205history_aware_retriever = create_history_aware_retriever(206 llm, retriever, contextualize_prompt207)208```209~210## بهترین شیوهها211~2121. **اندازه chunk مناسب انتخاب کنید**: با اندازههای مختلف (۵۰۰-۱۵۰۰ توکن) آزمایش کنید.2132. **از متادیتای اسناد استفاده کنید**.2143. **کیفیت را ارزیابی کنید**: از فریمورکهایی مانند [RAGAS](https://docs.ragas.io/) استفاده کنید.2154. **بهروزرسانی اسناد را مدیریت کنید**.2165. **یک re-ranker اضافه کنید**.217~218## نتیجهگیری219~220RAG به معماری استاندارد برای ساخت برنامههای هوش مصنوعی تبدیل شده است. LangChain پیادهسازی را بسیار ساده میکند.221~222**مراحل بعدی:**223- **به صورت محلی آزمایش کنید**: با ChromaDB و چند سند شروع کنید.224- **LangSmith را کاوش کنید**: از [LangSmith](https://smith.langchain.com/) برای نظارت استفاده کنید.225- **مدلهای embedding مختلف را امتحان کنید**.226- **مستندات را بررسی کنید**: [مستندات LangChain](https://python.langchain.com/docs/).227~
NORMAL · rag-langchain-deep-dive.md [readonly]227 lines · :q to close