spinny:~/writing $ less rag-langchain-deep-dive.md
12Large Language Models (LLM's) zoals GPT-4 en Claude zijn buitengewoon krachtig, maar ze lijden aan een fundamentele beperking: hun kennis is bevroren op het moment van training. **Retrieval-Augmented Generation (RAG)** lost precies dit probleem op door de generatieve kracht van LLM's te combineren met het vermogen om informatie uit externe bronnen op te halen.34## Het Probleem: LLM-beperkingen561. **Statische kennis**: Een LLM weet alleen wat het zag tijdens training.72. **Hallucinaties**: Wanneer een LLM het antwoord niet weet, verzint het er een.83. **Geen toegang tot privédata**: Een generiek LLM heeft geen toegang tot je interne documentatie.910## Wat is RAG?1112RAG is een architectuur die de prompt verrijkt met informatie opgehaald uit een externe kennisbasis.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## Hoe RAG Werkt2425### Fase 1: Indexering2627```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### Fase 2: Retrieval + Generation38391. De vraag wordt omgezet in een embedding.402. De Vector Store vindt de meest vergelijkbare chunks.413. De opgehaalde chunks worden in de prompt ingevoegd als context.424. Het LLM genereert een antwoord op basis van de context.4344## Een RAG Pipeline Bouwen met LangChain4546```bash47pip install langchain langchain-openai langchain-community chromadb48```4950### Stap 1: Documenten Laden5152```python53from langchain_community.document_loaders import (54 PyPDFLoader,55 WebBaseLoader,56 DirectoryLoader,57 TextLoader,58)5960# Load a PDF61pdf_loader = PyPDFLoader("docs/manual.pdf")62pdf_docs = pdf_loader.load()6364# Load a web page65web_loader = WebBaseLoader("https://docs.example.com/guide")66web_docs = web_loader.load()6768# Load all .md files from a directory69dir_loader = DirectoryLoader("./knowledge_base", glob="**/*.md", loader_cls=TextLoader)70md_docs = dir_loader.load()7172all_docs = pdf_docs + web_docs + md_docs73```7475### Stap 2: Documenten Splitsen7677```python78from langchain.text_splitter import RecursiveCharacterTextSplitter7980text_splitter = RecursiveCharacterTextSplitter(81 chunk_size=1000,82 chunk_overlap=200,83 separators=["\n\n", "\n", ". ", " ", ""],84)8586chunks = text_splitter.split_documents(all_docs)87print(f"Original documents: {len(all_docs)}, Chunks: {len(chunks)}")88```8990### Stap 3: Embeddings en Vector Store9192```python93from langchain_openai import OpenAIEmbeddings94from langchain_community.vectorstores import Chroma9596embedding_model = OpenAIEmbeddings(model="text-embedding-3-small")9798vectorstore = Chroma.from_documents(99 documents=chunks,100 embedding=embedding_model,101 persist_directory="./chroma_db",102)103```104105### Stap 4: De Retriever106107```python108retriever = vectorstore.as_retriever(109 search_type="similarity",110 search_kwargs={"k": 4},111)112113relevant_docs = retriever.invoke("How does authentication work?")114for doc in relevant_docs:115 print(doc.page_content[:200])116 print("---")117```118119### Stap 5: De RAG Chain120121```python122from langchain_openai import ChatOpenAI123from langchain_core.prompts import ChatPromptTemplate124from langchain_core.runnables import RunnablePassthrough125from langchain_core.output_parsers import StrOutputParser126127llm = ChatOpenAI(model="gpt-4o", temperature=0)128129prompt = ChatPromptTemplate.from_template("""130Answer the question based only on the provided context.131If the context does not contain enough information, say you don't know.132133Context:134{context}135136Question: {question}137138Answer:139""")140141def format_docs(docs):142 return "\n\n".join(doc.page_content for doc in docs)143144rag_chain = (145 {"context": retriever | format_docs, "question": RunnablePassthrough()}146 | prompt147 | llm148 | StrOutputParser()149)150151response = rag_chain.invoke("How does authentication work in the system?")152print(response)153```154155## Geavanceerde RAG-technieken156157### Multi-Query Retrieval158159```python160from langchain.retrievers import MultiQueryRetriever161162multi_retriever = MultiQueryRetriever.from_llm(163 retriever=vectorstore.as_retriever(),164 llm=llm,165)166```167168### Contextual Compression169170```python171from langchain.retrievers import ContextualCompressionRetriever172from langchain.retrievers.document_compressors import LLMChainExtractor173174compressor = LLMChainExtractor.from_llm(llm)175compression_retriever = ContextualCompressionRetriever(176 base_compressor=compressor,177 base_retriever=retriever,178)179```180181### Hybrid Search182183```python184from langchain.retrievers import EnsembleRetriever185from langchain_community.retrievers import BM25Retriever186187bm25_retriever = BM25Retriever.from_documents(chunks)188bm25_retriever.k = 4189190semantic_retriever = vectorstore.as_retriever(search_kwargs={"k": 4})191192hybrid_retriever = EnsembleRetriever(193 retrievers=[bm25_retriever, semantic_retriever],194 weights=[0.4, 0.6],195)196```197198### Conversational RAG (met Geheugen)199200```python201from langchain.chains import create_history_aware_retriever202from langchain_core.prompts import MessagesPlaceholder203204contextualize_prompt = ChatPromptTemplate.from_messages([205 ("system", "Given the chat history and the user's latest question, "206 "reformulate the question so it is understandable without the history."),207 MessagesPlaceholder("chat_history"),208 ("human", "{input}"),209])210211history_aware_retriever = create_history_aware_retriever(212 llm, retriever, contextualize_prompt213)214```215216## Best Practices2172181. **Kies de juiste chunkgrootte**: Experimenteer met 500-1500 tokens.2192. **Gebruik documentmetadata**: Voeg bron, datum en categorie toe als metadata.2203. **Evalueer kwaliteit**: Gebruik frameworks zoals [RAGAS](https://docs.ragas.io/).2214. **Beheer documentupdates**: Implementeer een her-ingestiepipeline.2225. **Voeg een re-ranker toe**: Gebruik een re-ranking model na initiële retrieval.223224## Conclusie225226RAG is de standaardarchitectuur geworden voor AI-applicaties die toegang nodig hebben tot specifieke, actuele kennis. LangChain vereenvoudigt de implementatie enorm.227
:RAG en LangChain: Een Complete Gids voor Retrieval-Augmented Generationlines 1-227 (END) — press q to close