spinny:~/writing $ vim rag-langchain-deep-dive.md
1~2Великі мовні моделі (LLM) такі як GPT-4 та Claude надзвичайно потужні, але мають фундаментальне обмеження: їхні знання заморожені на момент навчання. **Retrieval-Augmented Generation (RAG)** вирішує саме цю проблему, поєднуючи генеративну потужність LLM з можливістю отримувати інформацію з зовнішніх джерел.3~4## Проблема: Обмеження LLM5~61. **Статичні знання**: LLM знає лише те, що бачив під час навчання.72. **Галюцинації**: Коли LLM не знає відповіді, він має тенденцію вигадувати.83. **Немає доступу до приватних даних**: Загальний LLM не має доступу до вашої внутрішньої документації.9~10## Що таке RAG?11~12RAG - це архітектура, яка збагачує промпт інформацією, отриманою з зовнішньої бази знань.13~14```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```22~23## Як Працює RAG24~25### Фаза 1: Індексація26~27```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```36~37### Фаза 2: Retrieval + Generation38~391. Запитання перетворюється на embedding.402. Vector Store знаходить найбільш схожі чанки.413. Отримані чанки вставляються у промпт як контекст.424. LLM генерує відповідь на основі контексту.43~44## Побудова RAG Pipeline з LangChain45~46```bash47pip install langchain langchain-openai langchain-community chromadb48```49~50```python51from langchain_community.document_loaders import PyPDFLoader, WebBaseLoader, DirectoryLoader, TextLoader52~53pdf_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```61~62```python63from langchain.text_splitter import RecursiveCharacterTextSplitter64~65text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200, separators=["\n\n", "\n", ". ", " ", ""])66chunks = text_splitter.split_documents(all_docs)67```68~69```python70from langchain_openai import OpenAIEmbeddings71from langchain_community.vectorstores import Chroma72~73embedding_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```77~78```python79from langchain_openai import ChatOpenAI80from langchain_core.prompts import ChatPromptTemplate81from langchain_core.runnables import RunnablePassthrough82from langchain_core.output_parsers import StrOutputParser83~84llm = 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.88~89Context:90{context}91~92Question: {question}93~94Answer:95""")96~97def format_docs(docs):98 return "\n\n".join(doc.page_content for doc in docs)99~100rag_chain = (101 {"context": retriever | format_docs, "question": RunnablePassthrough()}102 | prompt | llm | StrOutputParser()103)104~105response = rag_chain.invoke("How does authentication work in the system?")106```107~108## Просунуті Техніки RAG109~110Multi-Query Retrieval, Contextual Compression, Hybrid Search та Conversational RAG.111~112```python113from langchain.retrievers import MultiQueryRetriever114multi_retriever = MultiQueryRetriever.from_llm(retriever=vectorstore.as_retriever(), llm=llm)115```116~117```python118from langchain.retrievers import EnsembleRetriever119from langchain_community.retrievers import BM25Retriever120~121bm25_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```126~127## Найкращі Практики128~1291. **Обирайте правильний розмір чанка**: Експериментуйте з 500-1500 токенами.1302. **Використовуйте метадані документів**: Додавайте джерело, дату та категорію.1313. **Оцінюйте якість**: Використовуйте фреймворки як [RAGAS](https://docs.ragas.io/).1324. **Керуйте оновленнями документів**: Реалізуйте пайплайн повторної інгестії.1335. **Додайте re-ranker**: Використовуйте модель re-ranking після початкового пошуку.134~135## Висновок136~137RAG став стандартною архітектурою для AI-додатків, що потребують доступу до специфічних, актуальних знань. LangChain значно спрощує реалізацію.138~
NORMAL · rag-langchain-deep-dive.md [readonly]138 lines · :q to close