spinny:~/writing $ man rag-langchain-deep-dive
RAG_LANGCHAIN_DEEP_DIVE(7)spinny.devRAG_LANGCHAIN_DEEP_DIVE(7)
NAME
rag-langchain-deep-dive — RAG och LangChain: En Komplett Guide till Retrieval-Augmented Generation
SYNOPSIS
cat rag-langchain-deep-dive.md
DESCRIPTION
Large Language Models (LLM) som GPT-4 och Claude är extraordinärt kraftfulla, men de lider av en fundamental begränsning: deras kunskap är frusen vid träningstillfället. Retrieval-Augmented Generation (RAG) löser exakt detta problem genom att kombinera LLM:ers generativa kraft med förmågan att hämta information från externa källor.
Problemet: LLM-begränsningar
- Statisk kunskap: En LLM vet bara vad den såg under träning.
- Hallucinationer: När en LLM inte vet svaret tenderar den att fabricera ett.
- Ingen åtkomst till privat data: Ett generiskt LLM har ingen åtkomst till din interna dokumentation.
Vad är RAG?
RAG är en arkitektur som berikar prompten med information hämtad från en extern kunskapsbas.
Hur RAG Fungerar
Fas 1: Indexering
Fas 2: Retrieval + Generation
- Frågan omvandlas till en embedding.
- Vector Store hittar de mest liknande chunkarna.
- De hämtade chunkarna infogas i prompten som kontext.
- LLM:en genererar ett svar baserat på kontexten.
Bygga en RAG Pipeline med LangChain
pip install langchain langchain-openai langchain-community chromadb
Steg 1-5: Ladda, Splitta, Skapa Embeddings, Hämta, Generera
from langchain_community.document_loaders import PyPDFLoader, WebBaseLoader, DirectoryLoader, TextLoader pdf_loader = PyPDFLoader("docs/manual.pdf") pdf_docs = pdf_loader.load() web_loader = WebBaseLoader("https://docs.example.com/guide") web_docs = web_loader.load() dir_loader = DirectoryLoader("./knowledge_base", glob="**/*.md", loader_cls=TextLoader) md_docs = dir_loader.load() all_docs = pdf_docs + web_docs + md_docs
from langchain.text_splitter import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200, separators=["\n\n", "\n", ". ", " ", ""]) chunks = text_splitter.split_documents(all_docs)
from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma embedding_model = OpenAIEmbeddings(model="text-embedding-3-small") vectorstore = Chroma.from_documents(documents=chunks, embedding=embedding_model, persist_directory="./chroma_db") retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 4})
from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import RunnablePassthrough from langchain_core.output_parsers import StrOutputParser llm = ChatOpenAI(model="gpt-4o", temperature=0) prompt = ChatPromptTemplate.from_template(""" Answer the question based only on the provided context. If the context does not contain enough information, say you don't know. Context: {context} Question: {question} Answer: """) def format_docs(docs): return "\n\n".join(doc.page_content for doc in docs) rag_chain = ( {"context": retriever | format_docs, "question": RunnablePassthrough()} | prompt | llm | StrOutputParser() ) response = rag_chain.invoke("How does authentication work in the system?")
Avancerade RAG-tekniker
Multi-Query, Contextual Compression, Hybrid Search, Conversational RAG
from langchain.retrievers import MultiQueryRetriever multi_retriever = MultiQueryRetriever.from_llm(retriever=vectorstore.as_retriever(), llm=llm)
from langchain.retrievers import EnsembleRetriever from langchain_community.retrievers import BM25Retriever bm25_retriever = BM25Retriever.from_documents(chunks) bm25_retriever.k = 4 semantic_retriever = vectorstore.as_retriever(search_kwargs={"k": 4}) hybrid_retriever = EnsembleRetriever(retrievers=[bm25_retriever, semantic_retriever], weights=[0.4, 0.6])
Bästa Praxis
- Välj rätt chunkstorlek: Experimentera med 500-1500 tokens.
- Använd dokumentmetadata: Lägg till källa, datum och kategori.
- Utvärdera kvalitet: Använd ramverk som RAGAS.
- Hantera dokumentuppdateringar: Implementera en re-ingest pipeline.
- Lägg till en re-ranker: Använd en re-ranking-modell.
Slutsats
RAG har blivit standardarkitekturen för AI-applikationer som behöver åtkomst till specifik, aktuell kunskap. LangChain förenklar implementeringen avsevärt.
METADATA
- date: 2026-03-02
- reading: 3 min
- author: Filippo Spinella
- tags: AI, LangChain, LLM, Python
SEE ALSO
RAG_LANGCHAIN_DEEP_DIVE(7)2026-03-02RAG_LANGCHAIN_DEEP_DIVE(7)