Desarrollo de Agentes con OpenAI
Con esta formación aprenderás a desarrollar agentes dentro de OpenAI abordando temas muy relevantes como la generación de...

Si quieres dar a tus proyectos de IA un salto de calidad, los sistemas RAG son la clave. Con LangChain y OpenAI podrás combinar la recuperación de información con modelos generativos para obtener resultados coherentes y útiles. En este artículo aprenderás a crear un sistema RAG paso a paso, con ejemplos de código y buenas prácticas para adaptarlo a entornos reales.
Tabla de contenidos
Los sistemas RAG (Retrieval-Augmented Generation) se han convertido en una de las arquitecturas más efectivas para aumentar la fiabilidad de la inteligencia artificial.
Al combinar la recuperación de información con la generación de texto, permiten que los modelos respondan basándose en datos relevantes y actualizados, evitando respuestas inventadas y mejorando la confianza en los resultados. Para empresas, esto significa reducir riesgos y obtener un valor real en cada interacción.
En este artículo aprenderás a crear tu propio sistema RAG paso a paso con LangChain y OpenAI.
Veremos cómo preparar la base de conocimiento, conectar el pipeline con un modelo de última generación, mejorar la recuperación de información y añadir memoria al sistema para mantener coherencia. Todo explicado con un enfoque práctico, ejemplos aplicables y consejos para llevar el prototipo a producción con seguridad.
El objetivo es que cualquier manager, técnico o decisor entienda no solo cómo construir un RAG, sino también cómo alinearlo con necesidades de negocio concretas.
Así podrás evaluar el potencial de esta tecnología y decidir en qué procesos puede aportar un retorno inmediato, ya sea en soporte al cliente, gestión documental o automatización de flujos internos.
Antes de entrar en la parte técnica, conviene entender qué es un sistema RAG y por qué se ha convertido en un estándar en proyectos de inteligencia artificial aplicada a negocio. Conocer su definición, cómo se diferencia de un modelo tradicional y qué beneficios aporta a una empresa permitirá comprender mejor los pasos que veremos más adelante.
Un sistema RAG combina dos componentes principales: la recuperación de información y la generación de texto. En lugar de depender solo de lo que sabe un modelo de lenguaje, el sistema busca en una base de conocimiento externa los fragmentos más relevantes y los entrega al modelo como contexto. El modelo, a partir de esa información, genera una respuesta más precisa y fundamentada.
En la práctica, esto significa que el modelo no “inventa” respuestas, sino que se apoya en datos actualizados y controlados por la organización. Esa es la gran diferencia respecto a una simple llamada a un LLM: el sistema se nutre de información curada y específica para cada caso de uso.
Un LLM tradicional responde en base a lo que aprendió en su entrenamiento, sin acceso a fuentes externas en tiempo real. Esto implica que puede devolver información desactualizada o incompleta. En cambio, un sistema RAG amplía sus capacidades al consultar documentos propios de la empresa, bases de datos o repositorios internos.
La diferencia práctica es clara: mientras un modelo solo responde “desde su memoria”, un RAG actúa como un consultor informado que primero busca y luego responde con mayor precisión. Esto lo hace mucho más fiable en entornos corporativos donde la exactitud es crítica.
Implementar un sistema RAG aporta ventajas tangibles:
En empresas, los casos de uso más habituales son el soporte al cliente, la consulta de documentación técnica, la gestión de RRHH (como políticas internas o procesos de contratación) y la automatización de informes. Todos ellos comparten un objetivo común: transformar un LLM genérico en un sistema alineado con las necesidades de negocio.
Antes de empezar a escribir código es fundamental preparar el entorno de trabajo y asegurar que dispones de los requisitos técnicos necesarios. Una buena configuración inicial evita errores comunes y facilita que el desarrollo sea fluido y seguro.
Para construir un sistema RAG se necesitan unas bases mínimas:
openai
para interactuar con la API de OpenAI.langchain
para gestionar el flujo de recuperación y generación.De forma opcional, se pueden añadir librerías de soporte como dotenv
para gestionar claves de forma segura o tiktoken
para controlar el uso de tokens.
Lo más recomendable es trabajar en un entorno virtual, por ejemplo con venv
o conda
. Esto permite instalar dependencias específicas sin interferir con otros proyectos. Un editor ligero como VS Code es suficiente, aunque también puedes optar por Jupyter Notebook o Colab si prefieres un enfoque más interactivo.
En mi experiencia, iniciar el proyecto con un archivo requirements.txt
facilita replicar la instalación en otros equipos y mantener consistencia en el desarrollo.
La clave de la API de OpenAI es un dato sensible y nunca debe quedar expuesta en el código. Para evitar riesgos:
.env
y cárgala con librerías como python-dotenv
.De esta forma, tu sistema RAG será más seguro desde el primer momento y reducirá las posibilidades de fuga de información confidencial.
Todo sistema RAG necesita una base de conocimiento sólida que funcione como la fuente de verdad a la que recurrirá el modelo. Cuanto más limpia, organizada y relevante sea la información que cargues, más fiables serán las respuestas generadas.
El primer paso es elegir los documentos que formarán parte de tu RAG. Pueden ser manuales internos, artículos técnicos, políticas de recursos humanos, informes financieros o cualquier otro material útil. Lo importante es que sean fuentes oficiales, actualizadas y relevantes para el caso de uso.
Una vez definidos, los documentos deben cargarse en tu proyecto en formatos estándar como TXT, PDF o CSV. LangChain ofrece utilidades para leer y procesar muchos de estos formatos sin necesidad de trabajo manual adicional.
Los modelos no trabajan bien con textos demasiado largos. Por eso, los documentos deben dividirse en fragmentos (chunks) de tamaño manejable, normalmente entre 500 y 1.000 tokens. Antes de fragmentar, conviene limpiar el texto eliminando elementos innecesarios como cabeceras repetidas, pies de página o caracteres especiales.
En mi experiencia, dedicar tiempo a esta limpieza inicial marca la diferencia: un corpus más consistente se traduce en resultados más precisos.
Una vez fragmentados, cada bloque de texto se transforma en un embedding, es decir, una representación numérica que captura su significado semántico. OpenAI ofrece modelos de embeddings optimizados que funcionan muy bien con LangChain.
Estos embeddings se almacenan en un vector store, como FAISS, Chroma o Milvus. Este componente permite realizar búsquedas semánticas rápidas y devolver los fragmentos más relevantes cuando el usuario hace una consulta. En esencia, el vector store es el “cerebro auxiliar” del sistema RAG.
Con la base de conocimiento preparada, el siguiente paso es enlazarla con un modelo de lenguaje que pueda generar respuestas a partir de los fragmentos recuperados. Aquí es donde entran en juego LangChain y la API de OpenAI.
Para usar la API de OpenAI necesitas tu clave privada, que se puede gestionar de forma segura con un archivo .env
. Una vez configurada, podrás acceder a los modelos más recientes como GPT-5, que destaca por su capacidad de razonamiento y su eficiencia en tareas complejas. Para entornos de prueba también puedes usar modelos más ligeros como gpt-4.1
o gpt-4.1-mini
, que resultan más económicos.
La elección depende del caso de negocio: un prototipo puede funcionar con un modelo pequeño, mientras que una aplicación en producción debería optar por GPT-5 para maximizar fiabilidad.
LangChain actúa como orquestador entre el modelo y la base de conocimiento. El pipeline básico de un sistema RAG con LangChain sigue este flujo:
Este proceso se configura con pocos bloques de código y constituye la base sobre la que añadiremos mejoras más adelante.
La mejor manera de validar la conexión es hacer una prueba simple: lanzar una consulta al sistema y comprobar que el modelo responde utilizando datos de la base cargada. Aunque sea un ejemplo básico, te permitirá confirmar que la integración entre LangChain, OpenAI y el vector store funciona correctamente y ya puedes avanzar hacia casos de uso más avanzados.
# RAG "hola mundo" con LangChain + OpenAI + FAISS
# pip install langchain langchain-openai langchain-community faiss-cpu python-dotenv
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_text_splitter import RecursiveCharacterTextSplitter
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains import create_retrieval_chain
load_dotenv()
llm = ChatOpenAI(model="gpt-5", temperature=0) # modelo recomendado
emb = OpenAIEmbeddings(model="text-embedding-3-large")
# 1) Corpus mínimo (en producción: carga de ficheros)
docs_raw = [
{"page_content": "La política de vacaciones permite 23 días laborables al año.", "metadata": {"tema": "RRHH"}},
{"page_content": "Para restablecer contraseña, usa el portal interno IT y 2FA.", "metadata": {"tema": "IT"}}
]
# 2) Split + indexación
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents([
type("Doc", (), d)() for d in [{"page_content": d["page_content"], "metadata": d["metadata"]} for d in docs_raw]
]) # crea objetos con atributos page_content/metadata
vs = FAISS.from_documents(chunks, emb)
retriever = vs.as_retriever(search_kwargs={"k": 3})
# 3) Cadena RAG básica (stuff)
prompt = ChatPromptTemplate.from_messages([
("system", "Eres un asistente conciso. Usa EXCLUSIVAMENTE el contexto proporcionado para responder."),
("human", "Pregunta: {input}\n\nContexto:\n{context}")
])
stuff_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(retriever, stuff_chain)
# 4) Consulta de prueba
q = "¿Cuántos días de vacaciones tenemos?"
resp = rag_chain.invoke({"input": q})
print(resp["answer"])
Un sistema RAG solo es tan bueno como la calidad de la información que recupera. Si la búsqueda devuelve fragmentos poco relevantes, las respuestas del modelo serán menos útiles. Por eso es clave optimizar la forma en que almacenamos y consultamos los embeddings.
El vector store es el corazón de la recuperación. Existen varias opciones, entre las que destacan:
La elección dependerá de tus necesidades: para prototipos pequeños basta con Chroma, mientras que proyectos empresariales suelen optar por FAISS o Milvus.
No basta con guardar y buscar: también se pueden aplicar técnicas adicionales para afinar resultados:
Estas técnicas permiten que el sistema devuelva información más ajustada al contexto de la consulta.
Imagina que cargas en tu RAG un conjunto de manuales técnicos. Si un usuario pregunta “¿cómo restablecer la contraseña en el sistema interno?”, el vector store devolverá varios fragmentos relacionados. Al aplicar filtros por metadatos (por ejemplo, “documentación de IT”), el sistema prioriza las instrucciones correctas y evita ruido de otros documentos. Esto se traduce en una respuesta más rápida y precisa.
# Recuperación optimizada: MMR, filtros por metadatos y top-k
# pip install langchain langchain-openai langchain-community faiss-cpu
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
# Suponiendo que ya tienes 'vs' creado (FAISS con embeddings)
# 1) Re-ranking por MMR para diversidad de resultados
retriever_mmr = vs.as_retriever(search_type="mmr", search_kwargs={"k": 5, "fetch_k": 20, "lambda_mult": 0.5})
# 2) Búsqueda con puntuación para inspección rápida
query = "Política de vacaciones"
docs_scores = vs.similarity_search_with_score(query, k=4)
for d, score in docs_scores:
print(f"Score={score:.4f} | Texto={d.page_content[:60]}...")
# 3) Filtro por metadatos (ejemplo: solo documentos de RRHH)
# Nota: FAISS puro no indexa metadatos para filtrar. En repositorios grandes usa vectorstores con filtros (p. ej., Chroma/Milvus).
# Aquí simulamos un filtro previo en memoria:
docs_rrhh = [d for d, _ in docs_scores if d.metadata.get("tema") == "RRHH"]
for d in docs_rrhh:
print("RRHH ->", d.page_content[:80], "...")
Un sistema RAG básico es capaz de recuperar información y generar respuestas, pero puede quedarse corto en interacciones largas. Para que las respuestas mantengan coherencia a lo largo de la conversación, necesitamos añadir mecanismos de memoria y gestionar el contexto de forma inteligente.
La memoria permite que el sistema recuerde información compartida previamente por el usuario y la use en respuestas posteriores. Por ejemplo, si en un primer turno el usuario indica que trabaja en el departamento de marketing, el agente debería recordarlo en las siguientes consultas sin necesidad de repetirlo. Esto mejora la experiencia y la naturalidad de la conversación.
No obstante, mantener coherencia no significa guardar absolutamente todo. Es recomendable aplicar reglas de filtrado para evitar que se acumulen datos irrelevantes o redundantes. En entornos empresariales, la clave está en decidir qué merece conservarse y durante cuánto tiempo. Con esta estrategia el sistema mantiene el foco y reduce el riesgo de mezclar información innecesaria.
Los modelos de lenguaje tienen un límite en el número de tokens que pueden procesar. Si cargamos demasiado contenido en cada interacción, corremos el riesgo de superar ese límite y perder coherencia. Para evitarlo, se aplican técnicas como:
El enfoque más eficaz suele ser híbrido: usar memoria para retener datos inmediatos de la conversación y combinarla con recuperación desde el vector store para mantener la información actualizada. Así, el sistema puede responder con precisión en interacciones largas sin perder de vista las fuentes oficiales. Este equilibrio convierte al RAG en una herramienta más robusta y lista para entornos empresariales.
En la práctica, esto se traduce en un agente que recuerda los datos relevantes del usuario (como su rol o preferencias) y que al mismo tiempo consulta documentos corporativos cuando se requiere información especializada. Esta combinación potencia la utilidad del sistema y lo convierte en una solución mucho más versátil para procesos críticos dentro de la organización.
# Memoria + RAG con LCEL: historial por sesión con RunnableWithMessageHistory
# pip install langchain langchain-openai langchain-community faiss-cpu
from langchain_openai import ChatOpenAI
from langchain_core.runnables import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains import create_retrieval_chain
llm = ChatOpenAI(model="gpt-5", temperature=0)
prompt = ChatPromptTemplate.from_messages([
("system", "Eres un asistente conciso. Usa el contexto. Si no está, di que no lo sabes."),
("human", "Pregunta: {input}\n\nContexto:\n{context}")
])
stuff = create_stuff_documents_chain(llm, prompt)
base_rag = create_retrieval_chain(retriever, stuff) # usa el retriever de tu FAISS/Chroma
# Historial por sesión (en prod: persiste por user_id)
store = {}
def get_history(session_id: str):
if session_id not in store:
store[session_id] = ChatMessageHistory()
return store[session_id]
rag_with_history = RunnableWithMessageHistory(
base_rag,
lambda session_id: get_history(session_id),
input_messages_key="input",
history_messages_key="history",
)
# Conversación con memoria
sid = "demo-user-123"
print(rag_with_history.invoke({"input": "¿Cuántos días de vacaciones hay?"}, config={"configurable": {"session_id": sid}})["answer"])
print(rag_with_history.invoke({"input": "¿Y quién aprueba las vacaciones?"}, config={"configurable": {"session_id": sid}})["answer"])
Antes de desplegar un sistema RAG en un entorno real es fundamental comprobar que funciona como se espera. Las pruebas ayudan a identificar errores, ajustar parámetros y asegurar que el sistema cumple con los estándares de calidad que necesita la organización.
El primer paso es crear una batería de prompts de prueba que cubran los casos de uso más comunes. Estos prompts deben reflejar tanto preguntas sencillas como consultas más complejas. La idea es medir si el sistema responde con precisión y coherencia en todas las situaciones.
En mi experiencia, resulta muy útil mantener un conjunto fijo de pruebas de regresión. Cada vez que hagas un cambio en el sistema, repite estas pruebas para verificar que no has introducido nuevos errores.
Para evaluar de forma objetiva, conviene definir métricas claras:
Estas métricas permiten tener una visión global y balancear calidad, velocidad y presupuesto.
Antes de pasar a producción, asegúrate de cumplir con este checklist:
Con estas validaciones tendrás la confianza de que el RAG puede desplegarse en un entorno real sin sorpresas desagradables.
# Validación básica: latencia, acierto aproximado por patrón y logging mínimo
# pip install langchain langchain-openai
import re, time, logging
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
logging.basicConfig(level=logging.INFO, format="%(levelname)s | %(message)s")
llm = ChatOpenAI(model="gpt-5", temperature=0)
prompt = ChatPromptTemplate.from_messages([
("system", "Responde en una frase, con datos del contexto si se proporciona."),
("human", "{q}")
])
TESTS = [
{"name": "Definición corta RAG", "q": "Define RAG en una frase.", "expect": r"\brecupera.+genera|\bgeneraci[oó]n\b"},
{"name": "Consulta factual simple", "q": "Di 'hola mundo' y nada más.", "expect": r"\bhola mundo\b"},
]
def run_test(t):
t0 = time.time()
out = prompt | llm
ans = out.invoke({"q": t["q"]}).content
ms = int((time.time() - t0) * 1000)
ok = re.search(t["expect"], ans, flags=re.I) is not None
logging.info(f"{t['name']} | ok={ok} | {ms}ms | {ans}")
return ok, ms
oks, times = 0, []
for t in TESTS:
ok, ms = run_test(t)
oks += int(ok)
times.append(ms)
print(f"OK: {oks}/{len(TESTS)} | p95 ~ {sorted(times)[-1]} ms")
Construir un sistema RAG funcional es solo el inicio. Para que sea útil en un entorno corporativo a largo plazo conviene pensar en cómo escalarlo, integrarlo con otros sistemas y mantenerlo seguro y eficiente. Estas buenas prácticas te ayudarán a convertir un prototipo en una herramienta estratégica que realmente aporte valor al negocio.
Un prototipo puede ejecutarse con un vector store local, pero en producción lo habitual es migrar a soluciones más robustas. Opciones como Milvus o servicios gestionados en la nube permiten manejar grandes volúmenes de datos y consultas concurrentes. También es clave diseñar la arquitectura con redundancia y balanceo de carga para garantizar la disponibilidad.
Además de la infraestructura, la escalabilidad requiere una estrategia de datos. Esto incluye definir qué documentos se indexan, con qué frecuencia se actualizan y cómo se gestionan versiones obsoletas. Una política clara evita inconsistencias y asegura que el RAG siga siendo útil a medida que crece la base de conocimiento.
El verdadero valor de un RAG llega cuando se conecta con los sistemas que ya usa la empresa. Integrarlo con el CRM, ERP o la base documental interna permite que los usuarios accedan a información actualizada sin salir de sus flujos de trabajo habituales. LangChain facilita estas integraciones al permitir definir conectores y pipelines personalizados.
Otro punto importante es la gobernanza de accesos. No todos los usuarios deben ver toda la información; establecer permisos por roles y auditar consultas garantiza que el sistema cumpla con las normativas internas y externas. Así, el RAG no solo mejora la eficiencia, sino que también refuerza la seguridad y la trazabilidad de los datos corporativos.
Antes de decidir un despliegue más amplio, conviene revisar este checklist:
Este checklist ayuda a que la decisión no se base solo en la novedad tecnológica, sino en la creación de un sistema con impacto real y sostenible. Cuando se cumplen estas condiciones, un sistema RAG puede pasar de ser un prototipo prometedor a convertirse en un pilar estratégico dentro de la empresa.
Los sistemas RAG representan un paso adelante en la forma en que las empresas pueden aprovechar la inteligencia artificial. Al combinar recuperación de información con generación de texto, ofrecen respuestas más precisas y alineadas con las necesidades de cada organización. Esta arquitectura se adapta tanto a prototipos rápidos como a despliegues corporativos a gran escala.
A lo largo de este artículo hemos visto cómo preparar una base de conocimiento, configurar el pipeline con LangChain y OpenAI, optimizar la recuperación de información y añadir memoria para mantener coherencia. También repasamos cómo validar y probar el sistema antes de llevarlo a producción, asegurando calidad y control de costes.
El mensaje clave es que un RAG no debe verse como un proyecto aislado, sino como una pieza estratégica dentro del ecosistema digital de la empresa. Si se construye con buenas prácticas y se integra en los sistemas adecuados, puede convertirse en un aliado esencial para la toma de decisiones y la eficiencia operativa.
También te puede interesar
Con esta formación aprenderás a desarrollar agentes dentro de OpenAI abordando temas muy relevantes como la generación de...
Vamos a aprender a construir un chatbot con sistema RAG desde 0, sus componentes, las tecnologías más usadas...
Esta formación proporcionará a los estudiantes una comprensión profunda de LangChain en Python, permitiendo el desarrollo de aplicaciones...
Esta formación proporciona una comprensión profunda de Azure OpenAI, una colaboración entre Microsoft y OpenAI. Aprenderás a aplicar...