How to Build a RAG Agent: Step-by-Step Guide for 2026
RAG (Retrieval-Augmented Generation) is the most proven technique for grounding AI agents in real, up-to-date knowledge. This step-by-step guide takes you from raw documents to a production-grade RAG agent — with working code, tool recommendations, and the mistakes to avoid.
What Is RAG and Why Does It Matter?
Large language models have a fundamental limitation: their knowledge is frozen at training time. Ask GPT-5 about your company's internal documentation, yesterday's meeting notes, or a product released last week, and you'll get hallucinations or "I don't know."
RAG solves this by giving the agent a retrieval step before generation. Instead of relying solely on parametric memory (what the model learned during training), the agent actively fetches relevant documents from an external knowledge base and uses them as context for its response.
The result: answers that are factually grounded in your actual data, not the model's best guess.
The RAG Pipeline: 5 Stages
Every RAG system follows the same five stages, whether you're building with LangChain, LlamaIndex, or from scratch:
- Ingestion — Load your documents (PDFs, web pages, databases, Notion pages, etc.)
- Chunking — Split documents into manageable pieces
- Embedding — Convert chunks into vector representations
- Indexing — Store vectors in a vector database
- Retrieval + Generation — At query time, retrieve relevant chunks and pass them to the LLM
Step 1: Choose Your Stack
Before writing a single line of code, pick your components. Here are the recommended defaults for 2026:
- Orchestration: LangChain or LlamaIndex (both excellent, LangChain has more ecosystem coverage, LlamaIndex has better built-in RAG abstractions)
- Embedding model: OpenAI
text-embedding-3-small(best price/performance) or a local model via Ollama - Vector store: Chroma (local, zero config) → Pinecone or Weaviate (production cloud)
- LLM: GPT-4o, Claude Sonnet, or Llama via Groq for cost savings
Step 2: Ingest Your Documents
LangChain has document loaders for almost every format. Here's a minimal example loading a directory of PDFs:
from langchain_community.document_loaders import PyPDFDirectoryLoader
loader = PyPDFDirectoryLoader("./docs/")
documents = loader.load()
print(f"Loaded {len(documents)} pages")
For web content, use WebBaseLoader. For Notion, there's a dedicated NotionDBLoader. LangChain covers 100+ source types.
Step 3: Chunk Strategically
This is where most tutorials cut corners — and where most RAG systems fail. The goal: chunks that are semantically coherent and fit within the LLM's useful attention range (roughly 200–800 tokens).
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50, # overlap preserves context across chunk boundaries
separators=["\n\n", "\n", ".", " "]
)
chunks = splitter.split_documents(documents)
print(f"Created {len(chunks)} chunks")
Chunking mistakes to avoid:
- Chunks too large (>1000 tokens) — dilutes relevance during retrieval
- Zero overlap — loses context at boundaries
- Splitting in the middle of code blocks or tables — breaks semantic coherence
Step 4: Embed and Index
Now convert chunks to vectors and store them. Using Chroma for local development:
from langchain_openai import OpenAIEmbeddings
from langchain_chroma import Chroma
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
print("Index built and persisted.")
For production, swap Chroma with Pinecone or Weaviate — the API is nearly identical thanks to LangChain's abstraction layer.
Step 5: Build the RAG Agent
Now wire up the retriever to an agent. Using LangChain's modern LCEL (LangChain Expression Language):
from langchain_openai import ChatOpenAI
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
llm = ChatOpenAI(model="gpt-4o", temperature=0)
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
system_prompt = (
"You are a helpful assistant. Use the following retrieved context "
"to answer the question. If the context doesn't contain the answer, "
"say 'I don't have information about that in my knowledge base.'\n\n"
"Context:\n{context}"
)
prompt = ChatPromptTemplate.from_messages([
("system", system_prompt),
("human", "{input}"),
])
question_answer_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(retriever, question_answer_chain)
response = rag_chain.invoke({"input": "What is our Q1 revenue target?"})
print(response["answer"])
Step 6: Upgrade to an Agentic RAG
Basic RAG retrieves once and generates. An agentic RAG can decide when to retrieve, what to retrieve, and can re-retrieve if the first pass wasn't sufficient. Here's how to turn your retriever into an agent tool:
from langchain.tools.retriever import create_retriever_tool
from langchain.agents import create_tool_calling_agent, AgentExecutor
retriever_tool = create_retriever_tool(
retriever,
name="search_knowledge_base",
description="Search the company knowledge base for relevant information. Use this for any question about internal policies, products, or documentation."
)
tools = [retriever_tool]
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
result = agent_executor.invoke({"input": "Compare our Q1 and Q2 targets"})
print(result["output"])
The agent now decides whether to call the retriever (and how many times) based on the query complexity. For multi-hop questions requiring several lookups, this pattern dramatically outperforms naive RAG.
Advanced Techniques Worth Knowing
Hybrid Search
Combine dense (embedding) search with sparse (keyword/BM25) search. Dense search captures semantic meaning; sparse search catches exact term matches. Most production RAG systems use both. Pinecone and Weaviate support hybrid search natively.
Re-ranking
After retrieval, use a cross-encoder re-ranker (e.g., Cohere's Rerank API or a local BGE re-ranker) to reorder chunks by actual relevance to the query. This significantly improves answer quality for the same retrieval cost.
Metadata Filtering
Add metadata to your chunks (document type, date, author, department) and filter before retrieval. This is 10x more precise than semantic search alone for structured corpora.
Query Transformation
Have the LLM rewrite or expand the user's query before retrieval. Vague queries like "what was that thing about the budget?" become "Q3 2026 budget allocation and approval process." LangChain's MultiQueryRetriever does this automatically.
Evaluation: How to Know If It's Working
Don't skip evaluation. A RAG system that feels good in demos can fail badly on real queries. Use these metrics:
- Context Precision — Are the retrieved chunks actually relevant?
- Context Recall — Did we retrieve all the relevant chunks?
- Answer Faithfulness — Does the generated answer stay grounded in the retrieved context (no hallucination)?
- Answer Relevance — Does the answer actually address the question?
Tools like Ragas, LangSmith, and Langfuse automate these evaluations against a labeled test set. All three are indexed in AgDex.
Production Checklist
- ✅ Chunking strategy validated against your specific document types
- ✅ Embedding model chosen and costs estimated at scale
- ✅ Vector store with backup and index versioning
- ✅ Retrieval evaluation (precision + recall baselines)
- ✅ Re-ranking for queries where precision matters
- ✅ Observability with LangSmith or Langfuse (trace every retrieval and generation)
- ✅ Refresh pipeline for re-indexing updated documents
Tools Referenced in This Guide
All tools mentioned are indexed in the AgDex directory: LangChain, LlamaIndex, Chroma, Pinecone, Weaviate, Ragas, LangSmith, Langfuse, Groq.
🔍 Explore AI Agent Tools on AgDex
Browse 400+ curated AI agent tools, frameworks, and platforms — filtered by category, language, and use case.
Browse the Directory →Related Articles
Find all RAG tools, vector databases, and evaluation frameworks in AgDex
Browse AgDex Directory →Cómo construir un agente RAG: Guía paso a paso para 2026
RAG (generación aumentada por recuperación) es la técnica más probada para fundamentar agentes de IA en conocimiento real y actualizado. Esta guía paso a paso te llevará desde documentos en bruto hasta un agente RAG de nivel de producción, con código funcional, recomendaciones de herramientas y los errores que debes evitar.
¿Qué es RAG y por qué es importante?
Los modelos de lenguaje grandes tienen una limitación fundamental: su conocimiento queda congelado en el momento de su entrenamiento. Pregúntale a GPT-5 sobre la documentación interna de tu empresa, las notas de la reunión de ayer o un producto lanzado la semana pasada, y obtendrás alucinaciones o un "no lo sé".
RAG resuelve esto al dotar al agente de un paso de recuperación antes de la generación. En lugar de confiar únicamente en la memoria paramétrica (lo que el modelo aprendió durante el entrenamiento), el agente busca activamente documentos relevantes en una base de conocimientos externa y los utiliza como contexto para su respuesta.
El resultado: respuestas fundamentadas tácticamente en tus datos reales, no en la mejor suposición del modelo.
El pipeline de RAG: 5 etapas
Cada sistema RAG sigue las mismas cinco etapas, ya sea que lo construyas con LangChain, LlamaIndex o desde cero:
- Ingesta — Carga tus documentos (PDFs, páginas web, bases de datos, páginas de Notion, etc.)
- Fragmentación (Chunking) — Divide los documentos en fragmentos manejables
- Generación de embeddings — Convierte los fragmentos en representaciones vectoriales
- Indexación — Almacena los vectores en una base de datos vectorial
- Recuperación + Generación — Al momento de la consulta, recupera los fragmentos relevantes y pásalos al LLM
Paso 1: Elige tu stack
Antes de escribir una sola línea de código, elige tus componentes. Aquí tienes las opciones predeterminadas recomendadas para 2026:
- Orquestación: LangChain o LlamaIndex (ambos excelentes; LangChain tiene una mayor cobertura del ecosistema, mientras que LlamaIndex cuenta con mejores abstracciones de RAG integradas)
- Modelo de embeddings: OpenAI
text-embedding-3-small(la mejor relación calidad-precio) o un modelo local a través de Ollama - Base de datos vectorial (Vector store): Chroma (local, configuración cero) → Pinecone o Weaviate (nube para producción)
- LLM: GPT-4o, Claude Sonnet o Llama a través de Groq para ahorrar costos
Paso 2: Ingiere tus documentos
LangChain cuenta con cargadores de documentos para casi cualquier formato. Aquí tienes un ejemplo mínimo para cargar un directorio de archivos PDF:
from langchain_community.document_loaders import PyPDFDirectoryLoader
loader = PyPDFDirectoryLoader("./docs/")
documents = loader.load()
print(f"Páginas cargadas: {len(documents)}")
Para contenido web, utiliza WebBaseLoader. Para Notion, existe un NotionDBLoader dedicado. LangChain cubre más de 100 tipos de fuentes.
Paso 3: Fragmenta de manera estratégica
Aquí es donde la mayoría de los tutoriales toman atajos, y donde fallan la mayoría de los sistemas RAG. El objetivo es obtener fragmentos que sean semánticamente coherentes y que se ajusten al rango de atención útil del LLM (aproximadamente entre 200 y 800 tokens).
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50, # la superposición preserva el contexto en los límites de los fragmentos
separators=["\n\n", "\n", ".", " "]
)
chunks = splitter.split_documents(documents)
print(f"Creados {len(chunks)} fragmentos")
Errores de fragmentación a evitar:
- Fragmentos demasiado grandes (>1000 tokens): diluye la relevancia durante la recuperación
- Superposición cero: se pierde el contexto en los límites de los fragmentos
- Dividir en medio de bloques de código o tablas: rompe la coherencia semántica
Paso 4: Genera embeddings e indexa
Ahora convierte los fragmentos en vectores y almacénalos. Uso de Chroma para el desarrollo local:
from langchain_openai import OpenAIEmbeddings
from langchain_chroma import Chroma
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
print("Índice creado y persistido.")
Para producción, cambia Chroma por Pinecone o Weaviate; la API es casi idéntica gracias a la capa de abstracción de LangChain.
Paso 5: Construye el agente RAG
Ahora conecta el recuperador a un agente. Utilizando el moderno LCEL (LangChain Expression Language) de LangChain:
from langchain_openai import ChatOpenAI
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
llm = ChatOpenAI(model="gpt-4o", temperature=0)
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
system_prompt = (
"Eres un asistente útil. Utiliza el siguiente contexto recuperado "
"para responder a la pregunta. Si el contexto no contiene la respuesta, "
"di 'No tengo información sobre eso en mi base de conocimientos.'\n\n"
"Contexto:\n{context}"
)
prompt = ChatPromptTemplate.from_messages([
("system", system_prompt),
("human", "{input}"),
])
question_answer_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(retriever, question_answer_chain)
response = rag_chain.invoke({"input": "¿Cuál es nuestro objetivo de ingresos para el Q1?"})
print(response["answer"])
Paso 6: Actualiza a un RAG agéntico (Agentic RAG)
El RAG básico realiza la recuperación una sola vez y genera la respuesta. Un RAG agéntico puede decidir cuándo recuperar, qué recuperar y puede volver a realizar la recuperación si la primera pasada no fue suficiente. Así es como puedes convertir tu recuperador en una herramienta para el agente:
from langchain.tools.retriever import create_retriever_tool
from langchain.agents import create_tool_calling_agent, AgentExecutor
retriever_tool = create_retriever_tool(
retriever,
name="search_knowledge_base",
description="Busca en la base de conocimientos de la empresa información relevante. Utiliza esto para cualquier pregunta sobre políticas internas, productos o documentación."
)
tools = [retriever_tool]
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
result = agent_executor.invoke({"input": "Compara nuestros objetivos del Q1 y Q2"})
print(result["output"])
El agente ahora decide si llama al recuperador (y cuántas veces) en función de la complejidad de la consulta. Para preguntas de múltiples saltos (multi-hop) que requieren varias búsquedas, este patrón supera drásticamente al RAG tradicional (naive RAG).
Técnicas avanzadas que vale la pena conocer
Búsqueda híbrida (Hybrid Search)
Combina la búsqueda densa (embeddings) con la búsqueda dispersa (palabras clave/BM25). La búsqueda densa captura el significado semántico; la búsqueda dispersa encuentra coincidencias exactas de términos. La mayoría de los sistemas RAG en producción utilizan ambas. Pinecone y Weaviate admiten la búsqueda híbrida de forma nativa.
Reordenamiento (Re-ranking)
Después de la recuperación, utiliza un reordenador de codificador cruzado (cross-encoder re-ranker, por ejemplo, la API Rerank de Cohere o un reordenador BGE local) para reorganizar los fragmentos según su relevancia real para la consulta. Esto mejora significativamente la calidad de la respuesta para el mismo costo de recuperación.
Filtrado por metadatos (Metadata Filtering)
Agrega metadatos a tus fragmentos (tipo de documento, fecha, autor, departamento) y filtra antes de la recuperación. Esto es 10 veces más preciso que la búsqueda semántica por sí sola para corpus estructurados.
Transformación de consultas (Query Transformation)
Haz que el LLM reescriba o amplíe la consulta del usuario antes de la recuperación. Las consultas vagas como "¿qué era aquello sobre el presupuesto?" se convierten en "Proceso de aprobación y asignación del presupuesto para el Q3 de 2026". El MultiQueryRetriever de LangChain hace esto de forma automática.
Evaluación: Cómo saber si está funcionando
No omitas la evaluación. Un sistema RAG que *parece* funcionar bien en las demostraciones puede fallar estrepitosamente con consultas reales. Utiliza estas métricas:
- Precisión del contexto (Context Precision) — ¿Son realmente relevantes los fragmentos recuperados?
- Exhaustividad del contexto (Context Recall) — ¿Recuperamos todos los fragmentos relevantes?
- Fidelidad de la respuesta (Answer Faithfulness) — ¿La respuesta generada se mantiene fundamentada en el contexto recuperado (sin alucinaciones)?
- Relevancia de la respuesta (Answer Relevance) — ¿La respuesta realmente aborda la pregunta formulada?
Herramientas como Ragas, LangSmith y Langfuse automatizan estas evaluaciones en comparación con un conjunto de pruebas etiquetado. Las tres están indexadas en AgDex.
Lista de verificación para producción
- ✅ Estrategia de fragmentación validada para tus tipos específicos de documentos
- ✅ Modelo de embeddings seleccionado y costos estimados a escala
- ✅ Base de datos vectorial con respaldo y versionado de índices
- ✅ Evaluación de recuperación (líneas base de precisión y exhaustividad)
- ✅ Reordenamiento (Re-ranking) para consultas donde la precisión es crítica
- ✅ Observabilidad con LangSmith o Langfuse (rastreo de cada recuperación y generación)
- ✅ Pipeline de actualización para volver a indexar los documentos modificados
Herramientas mencionadas en esta guía
Todas las herramientas mencionadas están indexadas en el directorio de AgDex: LangChain, LlamaIndex, Chroma, Pinecone, Weaviate, Ragas, LangSmith, Langfuse, Groq.
🔍 Explora herramientas para agentes de IA en AgDex
Explora más de 400 herramientas, frameworks y plataformas seleccionadas para agentes de IA, filtradas por categoría, lenguaje y caso de uso.
Explorar el directorio →Artículos relacionados
Encuentra todas las herramientas de RAG, bases de datos vectoriales y frameworks de evaluación en AgDex
Explorar el directorio de AgDex →Wie man einen RAG-Agenten baut: Schritt-für-Schritt-Anleitung für 2026
RAG (Retrieval-Augmented Generation) ist die bewährteste Methode, um KI-Agenten mit realem, aktuellem Wissen zu fundieren. Diese Schritt-für-Schritt-Anleitung führt Sie von Rohdokumenten zu einem produktionsreifen RAG-Agenten – inklusive funktionsfähigem Code, Tool-Empfehlungen und den typischen Fehlern, die Sie vermeiden sollten.
Was ist RAG und warum ist es wichtig?
Große Sprachmodelle haben eine grundlegende Einschränkung: Ihr Wissen ist zum Zeitpunkt des Trainings eingefroren. Fragen Sie GPT-5 nach der internen Dokumentation Ihres Unternehmens, den Besprechungsnotizen von gestern oder einem Produkt, das letzte Woche veröffentlicht wurde, und Sie erhalten Halluzinationen oder ein „Ich weiß es nicht“.
RAG löst dieses Problem, indem es dem Agenten vor der Generierung einen Suchschritt (Retrieval) vorschaltet. Anstatt sich ausschließlich auf das parametrische Gedächtnis zu verlassen (das, was das Modell während des Trainings gelernt hat), ruft der Agent aktiv relevante Dokumente aus einer externen Wissensdatenbank ab und nutzt sie als Kontext für seine Antwort.
Das Ergebnis: Antworten, die sachlich auf Ihren tatsächlichen Daten basieren und nicht auf der besten Vermutung des Modells.
Die RAG-Pipeline: 5 Phasen
Jedes RAG-System folgt denselben fünf Phasen, unabhängig davon, ob Sie es mit LangChain, LlamaIndex oder von Grund auf neu erstellen:
- Ingestion (Datenimport) — Laden Sie Ihre Dokumente (PDFs, Webseiten, Datenbanken, Notion-Seiten usw.)
- Chunking (Textaufteilung) — Teilen Sie Dokumente in handhabbare Abschnitte auf
- Embedding (Vektorisierung) — Konvertieren Sie die Textabschnitte (Chunks) in Vektordarstellungen
- Indexierung — Speichern Sie Vektoren in einer Vektordatenbank
- Retrieval + Generation — Rufen Sie bei einer Abfrage relevante Chunks ab und übergeben Sie diese an das LLM
Schritt 1: Wählen Sie Ihren Stack
Bevor Sie eine einzige Zeile Code schreiben, wählen Sie Ihre Komponenten aus. Hier sind die empfohlenen Standards für 2026:
- Orchestrierung (Orchestration): LangChain oder LlamaIndex (beide hervorragend, LangChain bietet eine breitere Abdeckung des Ökosystems, LlamaIndex hat bessere integrierte RAG-Abstraktionen)
- Embedding-Modell: OpenAI
text-embedding-3-small(bestes Preis-Leistungs-Verhältnis) oder ein lokales Modell über Ollama - Vektordatenbank (Vector Store): Chroma (lokal, keine Konfiguration erforderlich) → Pinecone oder Weaviate (Produktions-Cloud)
- LLM: GPT-4o, Claude Sonnet oder Llama über Groq zur Kosteneinsparung
Schritt 2: Importieren Sie Ihre Dokumente
LangChain bietet Dokumenten-Loader für fast jedes Format. Hier ist ein minimales Beispiel für das Laden eines Verzeichnisses mit PDFs:
from langchain_community.document_loaders import PyPDFDirectoryLoader
loader = PyPDFDirectoryLoader("./docs/")
documents = loader.load()
print(f"Geladen: {len(documents)} Seiten")
Verwenden Sie für Webinhalte WebBaseLoader. Für Notion gibt es einen speziellen NotionDBLoader. LangChain unterstützt über 100 Quelltypen.
Schritt 3: Strategisches Chunking
Hier sparen die meisten Tutorials an der falschen Stelle – und hier scheitern auch die meisten RAG-Systeme. Das Ziel: Chunks, die semantisch zusammenhängend sind und in den nützlichen Aufmerksamkeitsbereich des LLM passen (etwa 200–800 Tokens).
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50, # Überlappung bewahrt den Kontext über Chunk-Grenzen hinweg
separators=["\n\n", "\n", ".", " "]
)
chunks = splitter.split_documents(documents)
print(f"{len(chunks)} Chunks erstellt")
Zu vermeidende Chunking-Fehler:
- Zu große Chunks (>1000 Tokens) — verwässert die Relevanz beim Abruf
- Keine Überlappung — führt zu Kontextverlust an den Grenzen
- Aufteilung mitten in Codeblöcken oder Tabellen — zerstört den semantischen Zusammenhang
Schritt 4: Vektorisieren und Indexieren
Konvertieren Sie nun die Chunks in Vektoren und speichern Sie diese. Verwendung von Chroma für die lokale Entwicklung:
from langchain_openai import OpenAIEmbeddings
from langchain_chroma import Chroma
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
print("Index erstellt und persistiert.")
Ersetzen Sie Chroma in der Produktion durch Pinecone oder Weaviate – die API ist dank der Abstraktionsschicht von LangChain fast identisch.
Schritt 5: Erstellen Sie den RAG-Agenten
Verbinden Sie nun den Retriever mit einem Agenten. Verwendung der modernen LCEL (LangChain Expression Language) von LangChain:
from langchain_openai import ChatOpenAI
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
llm = ChatOpenAI(model="gpt-4o", temperature=0)
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
system_prompt = (
"Du bist ein hilfreicher Assistent. Verwende den folgenden abgerufenen Kontext, "
"um die Frage zu beantworten. Wenn der Kontext die Antwort nicht enthält, "
"sage 'Ich habe dazu keine Informationen in meiner Wissensdatenbank.'\n\n"
"Kontext:\n{context}"
)
prompt = ChatPromptTemplate.from_messages([
("system", system_prompt),
("human", "{input}"),
])
question_answer_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(retriever, question_answer_chain)
response = rag_chain.invoke({"input": "Was ist unser Umsatzziel für das erste Quartal?"})
print(response["answer"])
Schritt 6: Upgrade auf ein Agentic RAG
Ein einfaches RAG ruft einmal ab und generiert. Ein agentisches RAG (Agentic RAG) kann entscheiden, wann und was abgerufen werden soll, und kann erneut abrufen, wenn der erste Durchgang nicht ausreichte. So machen Sie Ihren Retriever zu einem Agenten-Tool:
from langchain.tools.retriever import create_retriever_tool
from langchain.agents import create_tool_calling_agent, AgentExecutor
retriever_tool = create_retriever_tool(
retriever,
name="search_knowledge_base",
description="Durchsuche die Wissensdatenbank des Unternehmens nach relevanten Informationen. Verwende dies für alle Fragen zu internen Richtlinien, Produkten oder Dokumentationen."
)
tools = [retriever_tool]
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
result = agent_executor.invoke({"input": "Vergleiche unsere Q1- und Q2-Ziele"})
print(result["output"])
Der Agent entscheidet nun basierend auf der Komplexität der Abfrage, ob (und wie oft) er den Retriever aufruft. Bei komplexen Multi-Hop-Fragen, die mehrere Suchvorgänge erfordern, übertrifft dieses Muster das einfache (naive) RAG bei weitem.
Fortgeschrittene Techniken, die man kennen sollte
Hybridsuche (Hybrid Search)
Kombinieren Sie dichte (Embedding-basierte) Suche mit spärlicher (Schlüsselwort-/BM25-) Suche. Die dichte Suche erfasst die semantische Bedeutung, während die spärliche Suche exakte Begriffstreffer findet. Die meisten RAG-Systeme in der Produktion nutzen beides. Pinecone und Weaviate unterstützen Hybridsuche nativ.
Re-ranking (Neuordnung)
Verwenden Sie nach dem Abruf einen Cross-Encoder-Re-Ranker (z. B. Coheres Rerank-API oder einen lokalen BGE-Re-Ranker), um die Chunks nach ihrer tatsächlichen Relevanz für die Abfrage neu zu ordnen. Dies verbessert die Antwortqualität bei gleichen Abrufdaten erheblich.
Metadaten-Filterung (Metadata Filtering)
Fügen Sie Ihren Chunks Metadaten (Dokumenttyp, Datum, Autor, Abteilung) hinzu und filtern Sie diese vor dem Abruf. Dies ist bei strukturierten Korpora 10-mal präziser als eine rein semantische Suche.
Abfragetransformation (Query Transformation)
Lassen Sie das LLM die Abfrage des Benutzers vor dem Abruf umschreiben oder erweitern. Unklare Abfragen wie „Was war das mit dem Budget?“ werden zu „Q3 2026 Budgetzuteilung und Genehmigungsprozess“. Der MultiQueryRetriever von LangChain erledigt dies automatisch.
Evaluierung: Wie man weiß, ob es funktioniert
Sparen Sie nicht an der Evaluierung. Ein RAG-System, das sich in Demos gut anfühlt, kann bei echten Abfragen kläglich versagen. Nutzen Sie diese Metriken:
- Context Precision (Kontextpräzision) — Sind die abgerufenen Chunks tatsächlich relevant?
- Context Recall (Kontextabdeckung) — Haben wir alle relevanten Chunks abgerufen?
- Answer Faithfulness (Antworttreue) — Basiert die generierte Antwort auf dem abgerufenen Kontext (keine Halluzinationen)?
- Answer Relevance (Antwortrelevanz) — Geht die Antwort tatsächlich auf die Frage ein?
Tools wie Ragas, LangSmith und Langfuse automatisieren diese Evaluierungen anhand eines beschrifteten Testsets. Alle drei sind in AgDex indexiert.
Checkliste für die Produktion
- ✅ Chunking-Strategie validiert für Ihre spezifischen Dokumenttypen
- ✅ Embedding-Modell ausgewählt und Kosten bei Skalierung geschätzt
- ✅ Vektordatenbank mit Backup und Indexversionierung
- ✅ Retrieval-Evaluierung (Präzisions- und Abdeckungs-Baselines)
- ✅ Re-ranking für Abfragen, bei denen es auf Präzision ankommt
- ✅ Observierbarkeit mit LangSmith oder Langfuse (Verfolgen Sie jeden Abruf und jede Generierung)
- ✅ Aktualisierungs-Pipeline zur Neuindexierung aktualisierter Dokumente
In dieser Anleitung referenzierte Tools
Alle genannten Tools sind im AgDex-Verzeichnis indexiert: LangChain, LlamaIndex, Chroma, Pinecone, Weaviate, Ragas, LangSmith, Langfuse, Groq.
🔍 Entdecken Sie KI-Agenten-Tools auf AgDex
Durchsuchen Sie über 400 kuratierte KI-Agenten-Tools, Frameworks und Plattformen – gefiltert nach Kategorie, Sprache und Anwendungsfall.
Verzeichnis durchsuchen →Ähnliche Artikel
Finden Sie alle RAG-Tools, Vektordatenbanken und Evaluierungs-Frameworks in AgDex
AgDex-Verzeichnis durchsuchen →RAGエージェントの構築方法:2026年版ステップバイステップガイド
RAG(検索拡張生成)は、AIエージェントにリアルタイムで最新の知識をグラウンディングさせるための、最も確実な手法です。このステップバイステップガイドでは、生データであるドキュメントの読み込みから、本番環境レベルのRAGエージェントの構築までを解説します。実際のコード、推奨ツール、避けるべき失敗についても紹介します。
RAGとは何か?なぜ重要なのか?
大規模言語モデル(LLM)には、学習時点の知識で凍結されているという根本的な限界があります。GPT-5に社内のドキュメントや昨日のミーティングメモ、先週リリースされたばかりの製品について尋ねると、ハルシネーション(嘘の回答)が発生するか、「わかりません」と返ってきます。
RAGは、生成の前に「検索」のステップをエージェントに組み込むことで、この問題を解決します。モデルが学習段階で得たパラメータ記憶だけに頼るのではなく、エージェントが外部のナレッジベースから関連ドキュメントを能動的に取得し、それを回答のコンテキスト(文脈)として利用します。
その結果、モデルの推測ではなく、実際のデータに事実として基づいた回答が得られます。
RAGパイプライン:5つのステージ
LangChainやLlamaIndexを使って構築する場合でも、あるいはスクラッチで構築する場合でも、すべてのRAGシステムは以下の5つのステージに従います。
- インジェクション(取り込み) — ドキュメント(PDF、ウェブページ、データベース、Notionのページなど)を読み込む
- チャンキング — ドキュメントを扱いやすいサイズに分割する
- 埋め込み(Embedding) — チャンクをベクトル表現に変換する
- インデックス登録 — ベクトルデータベースにベクトルを格納する
- 検索+生成 — クエリの実行時に、関連するチャンクを取得してLLMに渡す
ステップ1:スタックの選定
コードを1行も書く前に、コンポーネントを選定しましょう。2026年時点での推奨されるデフォルト構成は以下の通りです。
- オーケストレーション: LangChain または LlamaIndex (どちらも優れています。LangChainはエコシステムのカバー率が広く、LlamaIndexは優れたRAGの抽象化機能を標準で備えています)
- 埋め込み(Embedding)モデル: OpenAI
text-embedding-3-small(最高のコストパフォーマンス)またはOllama経由のローカルモデル - ベクトルストア: Chroma (ローカル、設定不要) → Pinecone または Weaviate (本番環境用クラウド)
- LLM: GPT-4o、Claude Sonnet、またはコスト削減のためのGroq経由のLlama
ステップ2:ドキュメントの取り込み
LangChainには、ほぼすべてのフォーマットに対応するドキュメントローダーが用意されています。以下は、PDFのディレクトリを読み込むための最小限のコード例です。
from langchain_community.document_loaders import PyPDFDirectoryLoader
loader = PyPDFDirectoryLoader("./docs/")
documents = loader.load()
print(f"Loaded {len(documents)} pages")
ウェブコンテンツの場合はWebBaseLoaderを使用します。Notionの場合は専用のNotionDBLoaderが用意されています。LangChainは100種類以上のソースに対応しています。
ステップ3:戦略的なチャンキング
これは、多くのチュートリアルが省略しがちな部分であり、ほとんどのRAGシステムが失敗する原因でもあります。目標は、意味的に首尾一貫しており、LLMの有効なアテンション範囲(およそ200〜800トークン)に収まるチャンクを作成することです。
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50, # オーバーラップさせることでチャンク境界をまたぐ文脈を維持
separators=["\n\n", "\n", ".", " "]
)
chunks = splitter.split_documents(documents)
print(f"{len(chunks)} 個のチャンクを作成しました")
避けるべきチャンキングの失敗:
- チャンクが大きすぎる(1,000トークン超) — 検索時の関連性が薄れる
- オーバーラップがゼロ — 境界部分の文脈(コンテキスト)が失われる
- コードブロックやテーブルの途中で分割する — 意味的な一貫性が損なわれる
ステップ4:埋め込みとインデックス登録
次に、チャンクをベクトルに変換して保存します。ローカル開発ではChromaを使用します。
from langchain_openai import OpenAIEmbeddings
from langchain_chroma import Chroma
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
print("インデックスが構築され、保存されました。")
本番環境では、ChromaをPineconeまたはWeaviateに置き換えます。LangChainの抽象化レイヤーのおかげで、APIはほぼ同じです。
ステップ5:RAGエージェントの構築
いよいよ、リトリーバー(検索エンジン)をエージェントに接続します。LangChainのモダンなLCEL(LangChain Expression Language)を使用します。
from langchain_openai import ChatOpenAI
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
llm = ChatOpenAI(model="gpt-4o", temperature=0)
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
system_prompt = (
"あなたは親切なアシスタントです。以下の取得されたコンテキストを使用して、 "
"質問に答えてください。コンテキストに回答が含まれていない場合は、 "
"「ナレッジベースにその情報はありません。」と答えてください。\n\n"
"コンテキスト:\n{context}"
)
prompt = ChatPromptTemplate.from_messages([
("system", system_prompt),
("human", "{input}"),
])
question_answer_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(retriever, question_answer_chain)
response = rag_chain.invoke({"input": "第1四半期の売上目標は何ですか?"})
print(response["answer"])
ステップ6:エージェント型RAG(Agentic RAG)へのアップグレード
基本的なRAGは、検索を1回だけ行って回答を生成します。一方でエージェント型RAG(Agentic RAG)は、いつ、何を検索するかを判断でき、最初の検索で十分な情報が得られなかった場合は再検索を行うこともできます。リトリーバーをエージェントのツールにする方法は以下の通りです。
from langchain.tools.retriever import create_retriever_tool
from langchain.agents import create_tool_calling_agent, AgentExecutor
retriever_tool = create_retriever_tool(
retriever,
name="search_knowledge_base",
description="会社のナレッジベースから関連情報を検索します。社内規定、製品、またはドキュメントに関する質問にはこれを使用してください。"
)
tools = [retriever_tool]
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
result = agent_executor.invoke({"input": "第1四半期と第2四半期の目標を比較してください"})
print(result["output"])
エージェントは、クエリの複雑さに応じてリトリーバーを呼び出すかどうか(およびその回数)を判断します。複数の検索ステップを必要とする複雑なマルチホップ型の質問において、このパターンは従来のシンプルなRAGを大幅に凌駕します。
知っておくべき高度なテクニック
ハイブリッド検索(Hybrid Search)
密ベクトル(埋め込み)検索と、疎ベクトル(キーワード/BM25)検索を組み合わせます。密ベクトル検索はセマンティックな意味を捉え、疎ベクトル検索は正確なキーワードの一致を捉えます。本番環境のほとんどのRAGシステムは両方を併用しています。PineconeとWeaviateは、標準でハイブリッド検索をサポートしています。
リランキング(Re-ranking/再順位付け)
検索後、クロスエンコーダー・リランカー(CohereのRerank APIやローカルのBGEリランカーなど)を使用して、クエリに対する実際の関連性に基づいてチャンクを再順位付けします。これにより、同じ検索コストで回答の精度が大幅に向上します。
メタデータフィルタリング(Metadata Filtering)
チャンクにメタデータ(ドキュメントの種類、日付、作成者、部門など)を追加し、検索前にフィルタリングします。構造化された文書群に対しては、セマンティック検索単体よりも10倍高精度です。
クエリ変換(Query Transformation)
検索を実行する前に、LLMにユーザーのクエリを書き換えさせたり拡張させたりします。例えば、「予算のアレはどうなってたっけ?」といった曖昧なクエリを「2026年第3四半期の予算配分および承認プロセス」のように変換します。LangChainのMultiQueryRetrieverを使用すれば、これを自動で行うことができます。
評価:正常に動作しているか確認する方法
評価を省略してはいけません。デモの段階では良く見えても、実際のクエリでは悲惨な結果になるRAGシステムは多く存在します。以下の指標を活用しましょう。
- Context Precision(コンテキストの精度) — 取得されたチャンクは本当に関連性があるか?
- Context Recall(コンテキストの再現率) — 関連するすべてのチャンクを取得できたか?
- Answer Faithfulness(回答の忠実性) — 生成された回答は取得されたコンテキストにしっかりと基づいているか(ハルシネーションの防止)?
- Answer Relevance(回答の関連性) — 回答は実際に質問に対して的確に答えているか?
ツールのように RagasやLangSmith、Langfuseなどのツールは、ラベル付けされたテストセットに対するこれらの評価を自動化します。これら3つのツールはいずれもAgDexに掲載されています。
本番環境導入チェックリスト
- ✅ 対象のドキュメントタイプに合わせてチャンキング戦略が検証されていること
- ✅ 埋め込みモデルを選定し、大規模運用時のコストを見積もっていること
- ✅ バックアップ機能とインデックスのバージョン管理を備えたベクトルストアを用意していること
- ✅ 検索機能の評価(精度と再現率のベースライン)が完了していること
- ✅ 精度が極めて重要となるクエリ向けにリランキングを導入していること
- ✅ LangSmithまたはLangfuseを使用したオブザーバビリティ(すべての検索と生成のトレース)が確保されていること
- ✅ 更新されたドキュメントを再インデックスするための更新パイプラインが構築されていること
本ガイドで参照したツール
本ガイドで紹介したすべてのツールは、AgDex ディレクトリに掲載されています:LangChain、LlamaIndex、Chroma、Pinecone、Weaviate、Ragas、LangSmith、Langfuse、Groq。
🔍 AgDex で AI エージェント用ツールを探索する
厳選された400以上のAIエージェント向けツール、フレームワーク、プラットフォームを、カテゴリ、言語、ユースケース別にフィルタリングして閲覧できます。
ディレクトリを閲覧する →関連記事
AgDexで、すべてのRAGツール、ベクトルデータベース、評価フレームワークを見つけることができます。
AgDex ディレクトリを閲覧する →