Langchain Rag
Build Retrieval-Augmented Generation pipelines with document loaders, embeddings, vector stores, and retrieval chains. Use when implementing search, document Q&A, or knowledge-base features. Critical for Lawlyfy AI and any product with document retrieval.
LangChain RAG
When to use
When building any feature that retrieves documents and uses them as context for LLM responses. This includes: legal case search (Lawlyfy), knowledge bases, document Q&A, semantic search, and chat-with-your-data features.
Pipeline architecture
Documents → Loader → Splitter → Embeddings → Vector Store → Retriever → Chain → Response
Document loading
from langchain_community.document_loaders import PyPDFLoader, TextLoader, CSVLoader
loader = PyPDFLoader("document.pdf")
docs = loader.load()
Text splitting
from langchain_text_splitters import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
separators=["\n\n", "\n", ". ", " "]
)
chunks = splitter.split_documents(docs)
Embeddings and vector store
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(chunks, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
Retrieval chain
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
combine_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(retriever, combine_chain)
result = rag_chain.invoke({"input": "What is the ruling on...?"})
Hybrid retrieval (vector + keyword)
For production RAG (recommended for Lawlyfy):
from langchain.retrievers import EnsembleRetriever
from langchain_community.retrievers import BM25Retriever
bm25 = BM25Retriever.from_documents(docs, k=5)
ensemble = EnsembleRetriever(
retrievers=[vectorstore.as_retriever(), bm25],
weights=[0.6, 0.4]
)
Anti-patterns
- Do NOT embed entire documents without splitting. Chunk size matters.
- Do NOT skip overlap. Zero overlap loses context at chunk boundaries.
- Do NOT use cosine similarity alone for legal/factual retrieval. Hybrid (vector + BM25) performs better.
- Do NOT skip reranking for production. Use Cohere reranker or cross-encoder.