initial commit: slides + practica_resueltos + README

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-29 11:50:55 +02:00
commit 0aff31e2d3
203 changed files with 23207 additions and 0 deletions
+172
View File
@@ -0,0 +1,172 @@
# Ejercicios del Curso de LangChain
Este repositorio contiene los ejercicios prácticos del curso de **LangChain con TypeScript**.
## Recursos
- **Cliente del Agente (demo)**: [https://jabiinfante.github.io/langchain.js-agent-client-dummy/](https://jabiinfante.github.io/langchain.js-agent-client-dummy/)
- Código fuente: [https://github.com/jabiinfante/langchain.js-agent-client-dummy](https://github.com/jabiinfante/langchain.js-agent-client-dummy)
## Requisitos Previos
### 1. Cuentas y API Keys necesarias
#### Mistral AI (Requerido)
1. Crear cuenta en [https://console.mistral.ai/](https://console.mistral.ai/)
2. Ir a "API Keys" y generar una nueva key
3. Guardar la key como `MISTRAL_API_KEY`
#### LangSmith (Requerido para trazabilidad)
1. Crear cuenta en [https://smith.langchain.com/](https://smith.langchain.com/)
2. Ir a "Settings" → "API Keys" y crear una nueva key
3. Guardar la key como `LANGCHAIN_API_KEY`
#### Google AI / Gemini (Opcional)
1. Ir a [https://aistudio.google.com/apikey](https://aistudio.google.com/apikey)
2. Crear una API Key
3. Guardar la key como `GOOGLE_API_KEY`
#### Cohere (Requerido para reranking en el agente)
1. Crear cuenta en [https://dashboard.cohere.com/](https://dashboard.cohere.com/)
2. Ir a "API Keys" y copiar la key
3. Guardar la key como `COHERE_API_KEY`
#### Qdrant (Opcional - solo para ejercicios 05 y 06)
1. Crear cuenta en [https://cloud.qdrant.io/](https://cloud.qdrant.io/)
2. Crear un cluster gratuito
3. Obtener la URL del cluster y la API Key
4. Guardar como `QDRANT_URL` y `QDRANT_API_KEY`
### 2. Configurar variables de entorno
Crear un archivo `.env` en la raíz del proyecto:
```env
# === Mistral AI (Requerido) ===
MISTRAL_API_KEY=tu_api_key_de_mistral
# === LangSmith (Requerido para trazabilidad) ===
LANGCHAIN_API_KEY=tu_api_key_de_langsmith
LANGCHAIN_TRACING_V2=true
LANGCHAIN_PROJECT=curso-langchain
# === Google AI / Gemini (Opcional) ===
GOOGLE_API_KEY=tu_api_key_de_google
# === Cohere (Requerido para reranking) ===
COHERE_API_KEY=tu_api_key_de_cohere
# === Qdrant (Opcional - solo para ejercicios 05 y 06) ===
QDRANT_URL=https://tu-cluster.qdrant.io
QDRANT_API_KEY=tu_api_key_de_qdrant
```
### 3. Instalar dependencias
```bash
npm install
```
## Catálogo de Ejercicios
| # | Script | Archivo | Descripción |
| --- | --------------------- | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 01 | `npm run 01:comments` | `01_comments_classifier.ts` | **Clasificador de Comentarios** - Analiza comentarios usando Structured Output con Zod. Demuestra `withStructuredOutput()` y `batch()` para procesar múltiples inputs. |
| 02 | `npm run 02:poet` | `02_cyber_poet.ts` | **Poeta Cibernético** - Combina Tools y Structured Output. El LLM genera un poema y usa una herramienta para contar palabras con precisión. |
| 03 | `npm run 03:homework` | `03_homework_maker.ts` | **Generador de Tareas** - Agente multi-tool con bucle agentic manual. Usa Wikipedia, Calculator y WordCount para generar tareas escolares adaptadas al nivel del alumno. |
| 04 | `npm run 04:agent` | `04_webserver_for_agent.ts` | **Servidor Web con Agente** - Integra un agente ReAct con Fastify y SSE para streaming en tiempo real. Incluye memoria persistente, RAG sobre guiones de Nolan, tasas de cambio y generación de fichas de películas en `.docx`. |
| 05 | `npm run 05:indexer` | `05_mdn-vector-indexer.ts` | **Indexador de Documentación** - Pipeline de indexación RAG que carga documentación de MDN, la divide en chunks y la almacena en Qdrant. |
| 06 | `npm run 06:indexer` | `06_nollan-indexer.ts` | **Indexador de Guiones de Nolan** - Pipeline de indexación RAG que carga guiones de películas de Christopher Nolan desde IMSDB y los almacena en Qdrant. |
## Estructura del Proyecto
```
src/
├── 01_comments_classifier.ts # Structured Output + batch
├── 02_cyber_poet.ts # Tools + Structured Output
├── 03_homework_maker.ts # Agentic Loop + PromptTemplate + múltiples tools
├── 04_webserver_for_agent.ts # Fastify + SSE + Agent con memoria
├── 05_mdn-vector-indexer.ts # Web scraping + chunking + Qdrant
├── 06_nollan-indexer.ts # Indexación de guiones de Nolan + Qdrant
├── agents_wrapper/
│ └── agent.ts # Wrapper del agente con streaming y contextSchema
└── helpers/
├── comments-mock.ts # Datos de prueba para ejercicio 01
├── constants.ts # Constantes compartidas (OUTPUT_DIR)
├── helper.ts # Utilidad promptUser() para input interactivo
├── middlewares.ts # Middleware trimMessages para limitar contexto
└── tools.ts # Herramientas: wordCount, wikipedia, exchangeRates, storageKnowledge, buildFilmDocument
template/
└── plantilla_ficha.docx # Plantilla Word para generar fichas de películas
output_docx/ # Directorio donde se generan los documentos .docx
```
## Conceptos por Ejercicio
### 01 - Clasificador de Comentarios
- **Zod**: Definición de esquemas para validación
- **withStructuredOutput()**: Forzar respuestas JSON estructuradas
- **batch()**: Procesar múltiples inputs en paralelo
### 02 - Poeta Cibernético
- **tool()**: Crear herramientas personalizadas
- **bindTools()**: Conectar herramientas al modelo
- **tool_calls**: El LLM solicita usar herramientas
- **ToolMessage**: Devolver resultados de herramientas
### 03 - Generador de Tareas
- **Agentic Loop**: Bucle while que procesa tool_calls hasta completar
- **PromptTemplate**: Plantillas con variables dinámicas
- **Múltiples Tools**: Wikipedia, Calculator, WordCount
- **promptUser()**: Input interactivo en consola
### 04 - Servidor Web con Agente
- **createAgent()**: Crear agente ReAct con herramientas
- **Checkpointer (SQLite)**: Memoria persistente de conversaciones
- **SSE (Server-Sent Events)**: Streaming de respuestas al cliente
- **contextSchema**: Inyección de dependencias a las tools
- **dynamicSystemPromptMiddleware**: System prompt que se regenera en cada invocación (incluye fecha actual)
- **QdrantVectorStore / MemoryVectorStore**: Fallback automático si Qdrant no está disponible
- **Herramientas disponibles en el agente**:
- `storage_knowledge` — RAG sobre guiones de películas de Christopher Nolan (Interstellar, Inception) con reranking via Cohere
- `get_exchange_rates` — Tasas de cambio actuales via Frankfurter API
- `get_historical_rates` — Tasas de cambio históricas de una fecha concreta
- `build_film_document` — Genera una ficha de película en `.docx` usando una plantilla Word
- `calculator` — Calculadora matemática
### 05 - Indexador de Documentación
- **CheerioWebBaseLoader**: Web scraping de HTML
- **RecursiveCharacterTextSplitter**: División de documentos en chunks
- **Embeddings**: Representación vectorial de texto
- **QdrantVectorStore**: Base de datos vectorial para búsqueda semántica
- **Deduplicación**: Eliminar vectores existentes antes de re-indexar
### 06 - Indexador de Guiones de Nolan
- **CheerioWebBaseLoader**: Web scraping de guiones desde IMSDB
- **RecursiveCharacterTextSplitter**: División en chunks con overlap
- **Batch indexing**: Inserción por lotes para respetar límites de la API de embeddings
- **CohereRerank**: Reranking de resultados (usado en el agente del ejercicio 04)
## Orden Recomendado
1. **01_comments_classifier** - Conceptos básicos de Structured Output
2. **02_cyber_poet** - Introducción a Tools
3. **03_homework_maker** - Agentic Loop manual con múltiples tools
4. **06_nollan-indexer** - Indexar guiones de Nolan en Qdrant (necesario para el agente)
5. **04_webserver_for_agent** - Agente completo con servidor web, streaming y generación de documentos
6. **05_mdn-vector-indexer** - Indexación de documentación MDN para RAG (opcional)