LangChain
LangChain proporciona primitivas componibles para aplicaciones de LLM: modelos, recuperadores, herramientas y cadenas. La sintaxis de pipe de LCEL conecta los pasos en pipelines.
Receta
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_chroma import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
llm = ChatOpenAI(model="gpt-4o-mini")
retriever = Chroma(embedding_function=OpenAIEmbeddings()).as_retriever()Ejemplo de funcionamiento
"""langchain.py - Cadena RAG con LCEL."""
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_chroma import Chroma
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_text_splitters import RecursiveCharacterTextSplitter
docs = ["pytest ejecuta pruebas con fixtures.", "FastAPI usa Pydantic para la validación."]
splits = RecursiveCharacterTextSplitter(chunk_size=200).split_text("\n".join(docs))
vectorstore = Chroma.from_texts(splits, OpenAIEmbeddings())
retriever = vectorstore.as_retriever(search_kwargs={"k": 2})
prompt = ChatPromptTemplate.from_template(
"Responde solo con el contexto:\n{context}\n\nPregunta: {question}"
)
def format_docs(docs):
return "\n---\n".join(d.page_content for d in docs)
chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| ChatOpenAI(model="gpt-4o-mini", temperature=0)
| StrOutputParser()
)
print(chain.invoke("¿Cómo funciona pytest?"))Errores comunes
- Cambios constantes en la versión de LangChain - las importaciones cambian entre versiones. Solución: fija las versiones; usa primitivas de
langchain-core. - Sobreabstracción - un RAG simple no necesita 10 clases envoltorio. Solución: usa el SDK de OpenAI directamente para prototipos; LangChain cuando la composición crezca.
- Uso oculto de tokens - los envoltorios ocultan el coste. Solución: habilita el modo verboso/callbacks para registrar el uso.
Alternativas
| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
| LangChain | Pipelines de LLM de múltiples pasos | Llamada a API única |
| LlamaIndex | RAG centrado en datos | Cadenas simples |
| LangGraph | Agentes con estado | Pipelines lineales |
| SDK Directo | Control total, aprendizaje | Aplicaciones complejas de múltiples pasos |
Preguntas frecuentes
¿LangChain vs LangGraph?
LangChain para cadenas lineales; LangGraph para ciclos, estado y bucles de agentes.¿Qué es LCEL?
LangChain Expression Language - sintaxis de pipe `|` para encadenar Runnables.¿Cómo añado memoria?
RunnableWithMessageHistory o checkpointer en LangGraph.¿Cómo depuro cadenas?
Trazado con langsmith.com y LANGCHAIN_TRACING_V2=true.¿Recuperador personalizado?
Hereda de BaseRetriever; implementa `_get_relevant_documents`.¿Cómo hago streaming?
`chain.stream(input)` produce tokens progresivamente.¿Llamada a herramientas en LangChain?
Vincula herramientas a ChatModel; usa ToolNode en LangGraph.¿Es necesario LangChain para RAG?
No - el SDK directo + base de datos vectorial funciona bien para casos simples.¿Cómo pruebo cadenas?
Simula LLM con FakeListChatModel; verifica la recuperación por separado.¿Paquete dividido?
langchain-core, langchain-openai, langchain-chroma son paquetes separados.¿Cómo manejo errores?
Runnable con fallback: `chain.with_fallbacks([backup_chain]).¿Despliegue en producción?
LangServe expone las cadenas como endpoints de FastAPI.Relacionado
- LangGraph y bucles de agentes
- LlamaIndex
- Conceptos básicos de RAG
- Uso de herramientas y llamadas a funciones
- Bases de datos vectoriales
Versiones de la pila: Esta página se escribió para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ y uv 0.6+.