spinny:~/writing $ less rag-langchain-deep-dive.md
12Великі мовні моделі (LLM) такі як GPT-4 та Claude надзвичайно потужні, але мають фундаментальне обмеження: їхні знання заморожені на момент навчання. **Retrieval-Augmented Generation (RAG)** вирішує саме цю проблему, поєднуючи генеративну потужність LLM з можливістю отримувати інформацію з зовнішніх джерел.34## Проблема: Обмеження LLM561. **Статичні знання**: LLM знає лише те, що бачив під час навчання.72. **Галюцинації**: Коли LLM не знає відповіді, він має тенденцію вигадувати.83. **Немає доступу до приватних даних**: Загальний LLM не має доступу до вашої внутрішньої документації.910## Що таке RAG?1112RAG - це архітектура, яка збагачує промпт інформацією, отриманою з зовнішньої бази знань.1314```mermaid15graph LR16 User["User"] -- "Question" --> Retriever17 Retriever -- "Search relevant\ndocuments" --> VectorStore["Vector Store"]18 VectorStore -- "Relevant\ndocuments" --> Retriever19 Retriever -- "Context + Question" --> LLM20 LLM -- "Grounded\nresponse" --> User21```2223## Як Працює RAG2425### Фаза 1: Індексація2627```mermaid28graph TD29 A["Documents\n(PDF, HTML, MD, DB)"] --> B["Document Loader"]30 B --> C["Text Splitter"]31 C --> D["Text Chunks"]32 D --> E["Embedding Model"]33 E --> F["Numerical Vectors"]34 F --> G["Vector Store\n(ChromaDB, Pinecone, FAISS)"]35```3637### Фаза 2: Retrieval + Generation38391. Запитання перетворюється на embedding.402. Vector Store знаходить найбільш схожі чанки.413. Отримані чанки вставляються у промпт як контекст.424. LLM генерує відповідь на основі контексту.4344## Побудова RAG Pipeline з LangChain4546```bash47pip install langchain langchain-openai langchain-community chromadb48```4950```python51from langchain_community.document_loaders import PyPDFLoader, WebBaseLoader, DirectoryLoader, TextLoader5253pdf_loader = PyPDFLoader("docs/manual.pdf")54pdf_docs = pdf_loader.load()55web_loader = WebBaseLoader("https://docs.example.com/guide")56web_docs = web_loader.load()57dir_loader = DirectoryLoader("./knowledge_base", glob="**/*.md", loader_cls=TextLoader)58md_docs = dir_loader.load()59all_docs = pdf_docs + web_docs + md_docs60```6162```python63from langchain.text_splitter import RecursiveCharacterTextSplitter6465text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200, separators=["\n\n", "\n", ". ", " ", ""])66chunks = text_splitter.split_documents(all_docs)67```6869```python70from langchain_openai import OpenAIEmbeddings71from langchain_community.vectorstores import Chroma7273embedding_model = OpenAIEmbeddings(model="text-embedding-3-small")74vectorstore = Chroma.from_documents(documents=chunks, embedding=embedding_model, persist_directory="./chroma_db")75retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 4})76```7778```python79from langchain_openai import ChatOpenAI80from langchain_core.prompts import ChatPromptTemplate81from langchain_core.runnables import RunnablePassthrough82from langchain_core.output_parsers import StrOutputParser8384llm = ChatOpenAI(model="gpt-4o", temperature=0)85prompt = ChatPromptTemplate.from_template("""86Answer the question based only on the provided context.87If the context does not contain enough information, say you don't know.8889Context:90{context}9192Question: {question}9394Answer:95""")9697def format_docs(docs):98 return "\n\n".join(doc.page_content for doc in docs)99100rag_chain = (101 {"context": retriever | format_docs, "question": RunnablePassthrough()}102 | prompt | llm | StrOutputParser()103)104105response = rag_chain.invoke("How does authentication work in the system?")106```107108## Просунуті Техніки RAG109110Multi-Query Retrieval, Contextual Compression, Hybrid Search та Conversational RAG.111112```python113from langchain.retrievers import MultiQueryRetriever114multi_retriever = MultiQueryRetriever.from_llm(retriever=vectorstore.as_retriever(), llm=llm)115```116117```python118from langchain.retrievers import EnsembleRetriever119from langchain_community.retrievers import BM25Retriever120121bm25_retriever = BM25Retriever.from_documents(chunks)122bm25_retriever.k = 4123semantic_retriever = vectorstore.as_retriever(search_kwargs={"k": 4})124hybrid_retriever = EnsembleRetriever(retrievers=[bm25_retriever, semantic_retriever], weights=[0.4, 0.6])125```126127## Найкращі Практики1281291. **Обирайте правильний розмір чанка**: Експериментуйте з 500-1500 токенами.1302. **Використовуйте метадані документів**: Додавайте джерело, дату та категорію.1313. **Оцінюйте якість**: Використовуйте фреймворки як [RAGAS](https://docs.ragas.io/).1324. **Керуйте оновленнями документів**: Реалізуйте пайплайн повторної інгестії.1335. **Додайте re-ranker**: Використовуйте модель re-ranking після початкового пошуку.134135## Висновок136137RAG став стандартною архітектурою для AI-додатків, що потребують доступу до специфічних, актуальних знань. LangChain значно спрощує реалізацію.138
:RAG та LangChain: Повний Посібник з Retrieval-Augmented Generationlines 1-138 (END) — press q to close