Crear una cadena RAG de principio a fin
Únalo todo: loader -> splitter -> embeddings -> vector store -> retriever -> prompt -> model.
Crear una cadena RAG de principio a fin es una lección gratuita de AI Agents en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Agents, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Agents incluye 4 lecciones en total.
Partes de esta lección aún no han sido traducidas y se muestran en inglés.
Objetivo del proyecto
Combine cargadores, divisores, almacenes vectoriales y LCEL en una cadena RAG completa, con una estructura similar a la de producción.
Step 1: Load and Chunk
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
loader = PyPDFLoader('handbook.pdf')
docs = loader.load()
splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100)
chunks = splitter.split_documents(docs)
print(f'{len(chunks)} chunks loaded')Step 2: Embed and Store
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
embeddings = OpenAIEmbeddings(model='text-embedding-3-small')
store = Chroma.from_documents(
chunks,
embeddings,
persist_directory='./handbook_db'
)Step 3: Set Up Retriever
retriever = store.as_retriever(
search_type='similarity',
search_kwargs={'k': 4}
)Step 4: Define the Prompt
from langchain.prompts import ChatPromptTemplate
rag_prompt = ChatPromptTemplate.from_template('''
You are a helpful assistant. Use the context below to answer.
If the answer is not in the context, say you do not know.
Cite sources like [1], [2].
Context:
{context}
Question: {question}
Answer:
''')Step 5: Format Documents Helper
def format_docs(docs):
return '\n\n'.join(
f'[{i+1}] (source: {d.metadata.get("source", "?")}, page {d.metadata.get("page", "?")})\n{d.page_content}'
for i, d in enumerate(docs)
)
from types import SimpleNamespace
docs = [
SimpleNamespace(metadata={'source': 'handbook.pdf', 'page': 3}, page_content='Vacation policy details.'),
SimpleNamespace(metadata={'source': 'handbook.pdf', 'page': 5}, page_content='Sick leave details.'),
]
print(format_docs(docs))
Step 6: Assemble the LCEL Chain
from langchain_core.runnables import RunnablePassthrough
from langchain.schema.output_parser import StrOutputParser
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model='gpt-4o-mini', temperature=0)
rag_chain = (
{'context': retriever | format_docs, 'question': RunnablePassthrough()}
| rag_prompt
| model
| StrOutputParser()
)Step 7: Invoke
answer = rag_chain.invoke('What is our refund policy?')
print(answer)Step 8: Stream the Answer
for chunk in rag_chain.stream('What is our refund policy?'):
print(chunk, end='', flush=True)Paso 9: devolver las fuentes por separado
A veces querrá incluir tanto la respuesta COMO los documentos recuperados en la salida:
from langchain_core.runnables import RunnableParallel
rag_with_sources = RunnableParallel(
context=retriever,
answer=rag_chain
)
result = rag_with_sources.invoke('What is our refund policy?')
print(result['answer'])
for doc in result['context']:
print(doc.metadata)Paso 10: RAG conversacional
Añada recuperación consciente del historial: reescriba las preguntas de seguimiento en forma independiente antes de recuperar información:
from langchain.chains import create_history_aware_retriever
# 'And what about XL sizes?' -> 'What is the refund policy for XL sizes?'Paso 11: evaluar la cadena
La integración con LangSmith captura cada invocación de la cadena. Puede crear conjuntos de datos a partir del uso real y ejecutar evaluaciones.
Consideraciones para producción
- Fije las versiones del modelo
- Establezca max_tokens
- Añada seguimiento del uso de tokens
- Implemente reintentos con un modelo alternativo
- Almacene en caché los embeddings (ya son deterministas en OpenAI)
- Añada Langfuse/LangSmith para las trazas
Propósito de format_docs
¿Por qué usar un helper format_docs entre el retriever y el prompt?
Repaso
Ha creado una cadena RAG completa con LCEL. Con las adiciones anteriores, esta estructura puede escalar hasta producción.
Preguntas frecuentes
¿La lección «Crear una cadena RAG de principio a fin» es gratis?
Sí — el texto completo de «Crear una cadena RAG de principio a fin» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Agents, actualiza a CoddyKit PRO. El curso de AI Agents incluye 4 lecciones en total.
¿Qué aprenderé en «Crear una cadena RAG de principio a fin»?
Únalo todo: loader -> splitter -> embeddings -> vector store -> retriever -> prompt -> model. Practicas AI Agents con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar AI Agents?
No se requiere experiencia previa. AI Agents en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Crear una cadena RAG de principio a fin»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de AI Agents?
Sí. Cada lección de AI Agents incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Arquitectura de LangChain: modelos, prompts y cadenas
- Cargadores, divisores y almacenes vectoriales
- LCEL (LangChain Expression Language)
- Crear una cadena RAG de principio a fin