# 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)