AI
Taller técnico · Parte 2

LLM para Desarrollo
de Software: avanzado

Extender Claude Code con skills, hooks y plugins; diseñar y orquestar agentes; y correr modelos locales con RAG y fine-tuning.

Octubre 2026 · Continuación de la Parte 1 (julio 2026)
Introducción

Objetivos de esta segunda parte

En la Parte 1 vimos cómo usar Claude y Claude Code bien. Ahora pasamos a construir sobre ellos: personalizarlos, ponerlos a trabajar en paralelo y llevar parte del trabajo a modelos que corren en tu máquina.

1

Extender

Empaquetar flujos de trabajo como skills, garantizar reglas con hooks y compartir todo como plugin.

2

Orquestar

Elegir entre workflow y agente, y entre subagentes, agent teams, worktrees o el Agent SDK.

3

Correr local

Entender cuantización y memoria para elegir un modelo abierto que entre en tu hardware.

4

Recuperar y adaptar

Armar un RAG, mejorar su precisión y decidir cuándo conviene contexto largo o fine-tuning.

Recorrido

Agenda del taller

Bloque 1 · Extender Claude Code

  • Mapa: CLAUDE.md, skills, hooks, subagentes, MCP y plugins
  • Anatomía de una skill y carga progresiva
  • Skills avanzadas: fork, contexto dinámico, argumentos
  • Hooks: ciclo de vida, exit codes y tipos
  • Plugins y marketplaces

Bloque 2 · Agentes y orquestación

  • Workflows vs agentes: los patrones
  • El loop agéntico
  • Subagentes, agent teams, worktrees y headless
  • Claude Agent SDK
  • Buenas prácticas multi-agente

Bloque 3 · LLM locales y RAG

  • Por qué (y cuándo) correr local
  • Cuantización, memoria y MoE
  • Ollama en la práctica (y con Claude Code)
  • RAG: pipeline, código y mejoras
  • Contexto largo vs RAG vs fine-tuning (LoRA)
Antes de arrancar: una puesta al día de lo que cambió desde julio, porque algunos datos de la Parte 1 ya quedaron viejos.
Puesta al día

Qué cambió desde la Parte 1

En tres meses salió una generación nueva de modelos Claude, con precios iguales o más bajos. La tabla de la diapositiva 5 de la Parte 1 queda así:

En julioPrecio in / outHoyPrecio in / out
Claude Fable 5$10 / $50Claude Fable 5.1$10 / $50
Claude Opus 4.8$5 / $25Claude Opus 5.5$4 / $20
Claude Sonnet 5$3 / $15*Claude Sonnet 5.5$2 / $10
Claude Haiku 4.5$1 / $5Claude Haiku 5.5$0.10 / $0.50**

USD por millón de tokens. *Con precio de lanzamiento de $2 / $10. **Prompts de hasta 100K tokens; por encima, $0.50 / $2.50. La lectura en caché ahora cuesta entre 2,5% y 10% del input base (antes, 10%).

Corrección

Modelos abiertos dentro de Claude Code

En la Parte 1 dijimos que no se podía. Hoy Ollama expone una API compatible con la de Anthropic, así que Claude Code puede usar un modelo local. No es soporte oficial de Anthropic y el resultado depende mucho del modelo: lo vemos en el Bloque 3.

Lo que no cambió: la lógica para elegir modelo y effort de la Parte 1 sigue vigente. Lo que cambian son los nombres y los números.
Bloque 1

Extender Claude Code:
skills, hooks y plugins

Cómo pasar de escribir el mismo prompt todas las semanas a tener flujos empaquetados, reglas que se cumplen siempre y un kit que el equipo instala con un comando.

Extender

El mapa: qué mecanismo usar para qué

Todos agregan algo a Claude Code, pero difieren en cuándo se cargan y en si dependen de que el modelo decida usarlos.

MecanismoQué esCuándo entra en juegoIdeal para
CLAUDE.mdInstrucciones persistentes del proyectoSiempre, al iniciar cada sesiónComandos y convenciones que aplican en todas las tareas
SkillInstrucciones, referencias y scripts en una carpeta con SKILL.mdLa descripción, siempre; el resto, solo al usarlaFlujos repetibles y material de referencia largo
HookComando que corre en un evento del ciclo de vidaLo ejecuta Claude Code, no el modelo: es deterministaReglas que tienen que cumplirse siempre, sin excepción
SubagenteAgente con su propio contexto, prompt y herramientasCuando se le delega una tareaInvestigar o revisar sin ensuciar la conversación principal
MCPServidor que expone herramientas y datos externosLas herramientas se buscan y cargan bajo demandaConectar sistemas: bases de datos, Jira, Slack, Figma
PluginPaquete versionado con cualquiera de los anterioresMientras esté habilitadoCompartir un setup completo con el equipo o la clase
Regla práctica: si lo tiene que saber siempre → CLAUDE.md. Si lo tiene que saber hacer a veces → skill. Si tiene que pasar sí o sí → hook.
Skills

Anatomía de una skill

Una skill es una carpeta con un SKILL.md: frontmatter YAML arriba e instrucciones en Markdown abajo. Claude la usa cuando la tarea coincide con su descripción, o la invocás vos con /nombre.

.claude/skills/crear-endpoint/├── SKILL.md # obligatorio ├── reference.md # se lee si hace falta ├── examples.md # se lee si hace falta └── scripts/ └── validar.py # se ejecuta, no se carga
AlcanceRuta
Personal~/.claude/skills/<nombre>/
Proyecto.claude/skills/<nombre>/
Plugin<plugin>/skills/<nombre>/

La de proyecto se commitea y la recibe todo el equipo. Las de plugin quedan con espacio de nombres: /mi-plugin:skill.

SKILL.md--- name: crear-endpoint description: Crea un endpoint REST en Laravel con las convenciones del proyecto. Usala cuando pidan una ruta, un controlador o un recurso de API nuevo. argument-hint: [recurso] --- Crear el endpoint para $ARGUMENTS: 1. Leé las convenciones en reference.md 2. Generá migración, modelo, controlador y FormRequest 3. Escribí un test de feature y corré `php artisan test` 4. Si algo falla, corregilo antes de terminar
La description es lo único que Claude ve para decidir si la usa: escribila como un disparador (“usala cuando…”). Mantené el SKILL.md por debajo de 500 líneas y mandá el detalle a archivos de soporte.
Skills

Carga progresiva: por qué las skills escalan

Una skill no ocupa contexto hasta que se usa. Eso permite tener decenas instaladas sin pagar sus instrucciones completas en cada turno, algo que un CLAUDE.md largo no puede hacer.

Nivel 1 · siempre

Nombre y descripción

Están en el contexto de cada turno para que Claude sepa que la skill existe. La descripción (con when_to_use) se trunca a 1.536 caracteres.

Nivel 2 · al invocarla

El cuerpo de SKILL.md

Se carga cuando Claude o vos la invocan y queda en el contexto el resto de la sesión. Tras una compactación conserva sus primeros 5.000 tokens.

Nivel 3 · si hace falta

Archivos de soporte

Referencias y ejemplos se leen solo cuando la tarea los necesita. Los scripts se ejecutan sin cargar su código en el contexto.

Quién puede invocarla

FrontmatterVosClaudeUsalo para
(por defecto)SíSíLa mayoría de las skills
disable-model-invocation: trueSíNoAcciones con efectos, como /deploy: que solo corran cuando vos lo pedís
user-invocable: falseNoSíConocimiento de fondo que no tiene sentido como comando
Skills

Skills avanzadas: subagente, contexto dinámico y argumentos

Con unos pocos campos más, una skill puede correr aislada en un subagente y arrancar con datos frescos del repo.

.claude/skills/revisar-pr/SKILL.md--- name: revisar-pr description: Revisa los cambios de la rama antes de abrir un PR disable-model-invocation: true context: fork agent: Explore model: opus --- ## Cambios a revisar !`git diff main...HEAD` ## Tarea Revisá el diff anterior buscando bugs, casos borde sin tests y desvíos de las convenciones del proyecto. Devolvé una lista priorizada con archivo y línea. Foco adicional: $ARGUMENTS

context: fork + agent

La skill corre en un subagente (acá, el Explore de solo lectura). No ve tu conversación, así que las instrucciones tienen que ser autocontenidas.

!`comando`

Corre el comando antes de que Claude lea la skill y reemplaza el marcador por la salida. Si el comando falla, la skill no se ejecuta.

$ARGUMENTS, $0, ${CLAUDE_SKILL_DIR}

Lo que escribís después de /revisar-pr, un argumento por posición, o la carpeta de la propia skill para llamar a sus scripts.

allowed-tools, model, effort

Preaprueban herramientas o cambian modelo y effort solo mientras la skill está activa.

Portabilidad: en claude.ai y la API de Skills solo se aceptan name, description, license, compatibility, metadata y allowed-tools. Los demás campos son exclusivos de Claude Code.

Hooks

Hooks: puntos fijos en el ciclo de vida

Un hook es un comando que Claude Code ejecuta cuando ocurre un evento. No depende de que el modelo “se acuerde”: si el evento ocurre, el hook corre.

SessionStartinicia o retoma UserPromptSubmitllega tu prompt PreToolUsepuede bloquear HerramientaEdit, Bash, MCP… PostToolUsedespués del éxito Stoptermina de responder SessionEndcierra la sesión se repite por cada llamada a herramienta siguiente prompt

Más de 30 eventos en total, por ejemplo

PermissionRequest · Notification · SubagentStart · SubagentStop · PreCompact · PostCompact · TaskCreated · TaskCompleted · TeammateIdle · FileChanged · CwdChanged · WorktreeCreate · ConfigChange · InstructionsLoaded

El matcher filtra cuándo dispara: por ejemplo "Edit|Write" en PreToolUse/PostToolUse, o "compact" en SessionStart para reinyectar contexto después de compactar.
Hooks

Hooks en práctica: formatear y proteger archivos

El hook recibe un JSON por stdin con los datos del evento y responde con su exit code (o con JSON por stdout para un control más fino).

.claude/settings.json{ "hooks": { "PostToolUse": [{ "matcher": "Edit|Write", "hooks": [{ "type": "command", "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write" }] }], "PreToolUse": [{ "matcher": "Edit|Write", "hooks": [{ "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/proteger.sh" }] }] } }
.claude/hooks/proteger.sh#!/bin/bash INPUT=$(cat) FILE=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty') PROTEGIDOS=(".env" "package-lock.json" ".git/") for p in "${PROTEGIDOS[@]}"; do if [[ "$FILE" == *"$p"* ]]; then echo "Bloqueado: $FILE es un archivo protegido" >&2 exit 2 # bloquea y le explica a Claude por qué fi done exit 0

exit 0

Sin objeción. Si además imprime JSON por stdout, ese JSON decide (permitir, preguntar, agregar contexto).

exit 2

Bloquea la acción. Lo que escribiste en stderr le llega a Claude como feedback para que cambie de enfoque.

Otro código

No bloquea. Si hay varios hooks, gana la decisión más restrictiva: deny, después ask, después allow.

Fuente: code.claude.com/docs — Hooks guide (ejemplos adaptados). Requiere jq; el script debe ser ejecutable (chmod +x).
Hooks

Tipos de hooks y cuándo usar cada uno

La mayoría son comandos de shell, pero un hook también puede llamar a una URL, a una herramienta MCP o a un modelo que evalúe la situación.

command

Corre un comando de shell. Determinista y rápido: el caso típico.

http

Envía los datos del evento por POST a una URL: auditoría, dashboards, Slack.

mcp_tool

Llama a una herramienta de un servidor MCP ya configurado.

prompt

Un modelo evalúa en un turno algo que requiere criterio, no una regla fija.

agent

Verificación de varios turnos con herramientas. Experimental.

CLAUDE.md pide, el hook garantiza

  • En CLAUDE.md: “corré el linter después de editar”. Casi siempre lo hace, pero con el contexto lleno se le puede pasar.
  • Con un hook PostToolUse: el linter corre después de cada edición, sin excepción y sin gastar tokens del modelo.

Hooks útiles para empezar

  • Formatear después de cada Edit/Write
  • Bloquear rm -rf o pushes a main (PreToolUse sobre Bash)
  • Notificación de escritorio cuando Claude espera tu respuesta
  • Reinyectar reglas clave después de compactar (SessionStart + compact)
  • Loguear cada comando de Bash a un archivo
Plugins

Plugins: empaquetar y compartir todo junto

Un plugin es una carpeta con un manifiesto que agrupa skills, subagentes, hooks y servidores MCP. Se instala como una unidad desde un marketplace: un repo con un catálogo de plugins.

utu-dev-kit/├── .claude-plugin/ │ └── plugin.json ├── skills/ │ └── revisar-pr/SKILL.md │ → /utu-dev-kit:revisar-pr ├── agents/ │ └── revisor.md │ → subagente ├── hooks/ │ └── hooks.json │ → hooks del plugin └── .mcp.json → servidores MCP
.claude-plugin/plugin.json{ "name": "utu-dev-kit", "version": "1.0.0", "description": "Skills y hooks del curso de Programación Avanzada" }
El marketplace es un repo con .claude-plugin/marketplace.json que lista los plugins y de dónde bajarlos. Es un catálogo, no una tienda.
# explorar e instalar (pestaña Discover) /plugin # agregar un marketplace /plugin marketplace add usuario/repo # instalar por nombre@marketplace /plugin install utu-dev-kit@mi-marketplace # probar sin marketplace claude --plugin-dir ./utu-dev-kit # apagarlo sin desinstalar claude plugin disable utu-dev-kit
Plugins

Antes de instalar un plugin

Un plugin habilitado forma parte de todas tus sesiones, no solo de las que lo usan. Conviene saber qué te cuesta y qué puede hacer.

$

Contexto

El nombre y la descripción de cada skill y agente que Claude puede invocar entran en el contexto en cada turno, aunque no los uses. Muchos plugins = menos espacio y más tokens.

⚙

Procesos

Sus servidores MCP corren junto a cada sesión y sus hooks disparan en sus eventos.

!

Permisos

Lo que el plugin ejecuta, lo ejecuta como vos. Revisá el código antes de instalar, sobre todo si viene de un marketplace de terceros.

Alcance de instalación

AlcancePara quién queda habilitadoCuándo usarlo
UserPara vos, en todos los proyectos de esta computadoraHerramientas personales que usás en todos lados
ProjectPara todo el que trabaje en el repo, vía .claude/settings.json commiteadoEl kit del equipo o de la clase
LocalSolo para vos, solo en este repoProbar algo sin afectar al resto
Bloque 2

Agentes y orquestación

Cuándo conviene un agente y cuándo un flujo fijo, cómo trabaja el loop por dentro, y las opciones para poner varios Claude a trabajar a la vez.

Orquestación

Workflows vs agentes: los patrones

En un workflow el código define el camino y el modelo ejecuta cada paso. En un agente el modelo decide sus propios pasos y herramientas. Los workflows son más predecibles; los agentes, más flexibles y más caros.

Workflow

Encadenamiento de prompts

Pasos secuenciales con chequeos entre medio. Cuándo: la tarea se divide limpio en subtareas fijas.

Workflow

Ruteo

Clasifica la entrada y la manda al prompt, herramienta o modelo adecuado. Cuándo: hay categorías distintas y se clasifican bien.

Workflow

Paralelización

Secciones independientes a la vez, o la misma tarea varias veces y se vota. Cuándo: querés velocidad o más confianza.

Workflow

Orquestador–trabajadores

Un modelo divide la tarea, delega y une los resultados. Cuándo: no sabés de antemano cuántas subtareas hay.

Workflow

Evaluador–optimizador

Uno genera, otro critica, en loop. Cuándo: hay criterios claros y la crítica mejora el resultado.

Agente

Agente autónomo

Elige pasos y herramientas hasta terminar. Cuándo: problemas abiertos, con sandbox, tests y límites.

Empezá por lo más simple: muchas veces una sola llamada con buen contexto y ejemplos alcanza. Agregá complejidad solo cuando mejora el resultado de forma medible.
Orquestación

El loop agéntico por dentro

Claude Code, el Agent SDK y cualquier agente comparten la misma estructura: el modelo decide, una herramienta actúa y el resultado vuelve al contexto, hasta que no hace falta otro paso.

1 · Contextoprompt + archivos + historial 2 · El modelo deciderazona y elige el próximo paso 3 · HerramientaRead, Edit, Bash, MCP… 4 · Resultadosalida, error o test fallido se repite sin más pasos Respuesta

Cuándo se detiene

  • El modelo responde sin pedir otra herramienta
  • Se alcanza un límite de turnos o de presupuesto
  • Necesita un permiso que no tiene
  • Un hook Stop lo deja terminar (o lo hace seguir)

Qué hace bueno a un agente

  • Herramientas con nombres y descripciones claras
  • Una forma objetiva de verificar: tests, build, lint
  • Límites explícitos: permisos, turnos y alcance
Orquestación

Cuatro formas de poner varios Claude a trabajar

Se diferencian en cuánto contexto comparten, cómo se comunican y cuánto cuestan. La regla: usá la opción más liviana que resuelva la tarea.

OpciónContextoComunicaciónCostoIdeal para
SubagentesPropio; devuelve un resumen al que lo llamóReporta solo a la sesión principalBajoTareas acotadas donde importa el resultado, no el proceso
Agent teamsCada teammate es una sesión completa e independienteMensajes directos entre ellos y lista de tareas compartidaAlto: escala con cada teammateInvestigar, revisar o construir features que cruzan capas
WorktreesSesiones separadas, cada una con su copia del repoLa coordinás vosUna sesión por worktreeTrabajo en paralelo sin pisar archivos (feature + bugfix)
Headless / SDKProceso lanzado desde código o CIPor código: JSON, streamsSegún usoCI, pipelines y productos propios
# una sesión aislada en su worktree (rama worktree-feature-auth) claude --worktree feature-auth # otra, en paralelo, desde un PR claude --worktree "#1234" # modo no interactivo para CI claude -p "corré los tests y resumí los fallos" --output-format json
.claude/agents/refactorizador.md--- name: refactorizador description: Aplica refactors mecánicos en muchos archivos isolation: worktree # siempre en su propia copia --- Aplicá el refactor pedido, corré los tests y reportá.
Fuentes: code.claude.com/docs — Agent teams · Worktrees. Sumá .claude/worktrees/ a tu .gitignore.
Orquestación

Agent teams: un equipo de sesiones coordinadas

Una sesión hace de líder: crea tareas, lanza teammates y une resultados. Los teammates trabajan cada uno en su contexto y se hablan entre sí. Es una función experimental y viene apagada.

Líder (tu sesión)planifica, asigna, sintetiza Lista de tareaspendiente · en curso · lista Buzonesmensajes entre agentes Seguridadteammate Performanceteammate Teststeammate
settings.json{ "env": { "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1" } }
# prompt al líder Creá un equipo de 3 teammates para revisar el PR #142: uno enfocado en seguridad, otro en performance y otro en cobertura de tests. Que cada uno reporte sus hallazgos.
  • Empezá con 3–5 teammates y 5–6 tareas por cada uno
  • No heredan tu conversación: el contexto va en el prompt de creación
  • Cada teammate, dueño de archivos distintos, para no pisarse
  • Hooks TaskCompleted y TeammateIdle como controles de calidad (exit 2)
Orquestación

Claude Agent SDK: el motor de Claude Code como librería

El mismo loop, herramientas, hooks, subagentes, MCP y skills de Claude Code, programables desde Python o TypeScript para meterlos en tu propia aplicación.

agent.pyimport asyncio from claude_agent_sdk import query, ClaudeAgentOptions, AssistantMessage, ResultMessage async def main(): # loop agéntico: va emitiendo mensajes mientras Claude trabaja async for message in query( prompt="Revisá utils.py buscando bugs que causen errores. Arreglalos.", options=ClaudeAgentOptions( allowed_tools=["Read", "Edit", "Glob"], # preaprobadas permission_mode="acceptEdits", # acepta ediciones ), ): if isinstance(message, AssistantMessage): for block in message.content: if hasattr(block, "text"): print(block.text) elif hasattr(block, "name"): print(f"Herramienta: {block.name}") elif isinstance(message, ResultMessage): print(f"Listo: {message.subtype}") asyncio.run(main())
pip install claude-agent-sdk npm install @anthropic-ai/claude-agent-sdk export ANTHROPIC_API_KEY=...
Querés…Usá
Trabajar en la terminalClaude Code CLI
Correr el agente en tu appAgent SDK
Llamar a la API y armar el loopClient SDK
Que Anthropic hostee el agenteManaged Agents

Se autentica con API key. Anthropic no permite que productos de terceros ofrezcan login de claude.ai ni sus límites de uso.

Fuentes: code.claude.com/docs — Agent SDK overview · Quickstart (comentarios traducidos)
Orquestación

Buenas prácticas para sistemas multi-agente

Más agentes no es mejor por defecto: cada uno suma tokens, coordinación y posibilidades de error.

✓
Empezá simple. Un agente con buenas herramientas antes que un equipo.
✓
Contexto explícito al delegar. El subagente o teammate no ve tu conversación.
✓
Dividí por archivos o dominios. Dos agentes editando el mismo archivo se pisan.
✓
Revisor independiente. Un agente en contexto limpio audita lo que hicieron los otros.
✓
Mínimo privilegio. Cada agente, solo con las herramientas que su tarea necesita.
✓
Modelo según el rol. Haiku con effort bajo para lookups; un modelo más capaz para coordinar.
✓
Medí el costo. Un equipo de 4 teammates puede costar varias veces una sesión.
✓
Controles automáticos. Hooks que no dejan cerrar una tarea sin tests en verde.
Bloque 3

LLM locales y RAG

Cuánta memoria hace falta, qué modelo entra en tu máquina, cómo darle a un modelo conocimiento que no tiene, y cuándo vale la pena entrenarlo.

LLM locales

¿Por qué (y cuándo) correr un modelo local?

Un modelo abierto en tu máquina cambia el costo por token por costo de hardware, y la calidad de frontera por control total.

A favor

  • Privacidad: los datos no salen de la máquina (útil con datos de clientes o de alumnos)
  • Costo marginal cero: clasificar o resumir miles de documentos no suma factura
  • Offline y sin límites de uso de un proveedor
  • Control: versión fija del modelo, fine-tuning propio

En contra

  • Calidad: los modelos que entran en una laptop quedan lejos de los de frontera en tareas agénticas largas
  • Hardware: la memoria (RAM o VRAM) define qué podés correr
  • Velocidad: depende del ancho de banda de memoria, no solo de la GPU
  • Mantenimiento: actualizar, configurar contexto y servir es tarea tuya

Ollama

CLI y servidor local con API en el puerto 11434. El más simple para empezar.

LM Studio

App de escritorio con interfaz gráfica y servidor compatible con APIs populares.

llama.cpp

El motor de bajo nivel detrás de muchos: formato GGUF y máxima configuración.

MLX

Framework de Apple optimizado para Apple Silicon (memoria unificada).

Fuente: documentación de cada herramienta (oct. 2026)
LLM locales

Cuantización: cuánta memoria necesita un modelo

Cuantizar es guardar cada parámetro con menos bits. Una regla útil: memoria ≈ parámetros × bytes por parámetro, más un 20–30% extra para el contexto (KV cache).

Un modelo de 8B según la precisión

Bajar de 16 a ~4,8 bits por parámetro reduce la memoria a menos de un tercio, con una pérdida de calidad pequeña.

FP162 bytes/param16 GB
Q8~1 byte/param8,5 GB
Q4_K_M~0,6 GB por B4,8 GB

Solo pesos, sin contexto. Q4_K_M es el punto de partida habitual en Ollama.

Modelos en Q4: tamaño aproximado

Estimado a ~0,6 GB por billón de parámetros; los de Qwen3.6, medidos en la librería de Ollama.

8B~5 GB
14B~8,5 GB
Qwen3.6 27B~19 GB
Qwen3.6 35B-A3BMoE~24 GB
70B~42 GB
MoE (Mixture of Experts): Qwen3.6 35B-A3B tiene 35B de parámetros pero activa solo 3B por token. Necesita memoria para los 35B, pero genera casi a la velocidad de un modelo de 3B. En una Mac, la memoria unificada se comparte con el sistema: de 32 GB no quedan 32 para el modelo.
Fuentes: ollama.com/library/qwen3.6 · BenchLM — Best Ollama models (regla de ~0,6 GB por B en Q4_K_M, oct. 2026)
LLM locales

Qué modelo entra en tu hardware

El factor que manda es la memoria disponible para la GPU (VRAM) o la memoria unificada en una Mac. Esta es una guía de partida a octubre de 2026; el panorama cambia cada pocos meses.

HardwareModelos que entran (Q4)Para qué alcanza
GPU de 8 GB · laptop de 16 GB7–12B, por ejemplo Gemma 4 12BChat, resúmenes, clasificación, embeddings y autocompletado
GPU de 24 GB · Mac de 32 GBQwen3.6 27B (~19 GB) o 35B-A3B MoE (~24 GB)Coding local razonable; el mejor punto calidad/hardware hoy
Mac de 64–128 GB · 2 GPUs70B densos o MoE medianosCalidad cercana a modelos cloud de gama media
Servidor multi-GPU (8× H100)Kimi K2.6, GLM-5.x, DeepSeekOpen-weight de frontera, para self-hosting empresarial

Contexto

Para usar un modelo como agente de código, Ollama recomienda 64K tokens de contexto o más. Más contexto = más memoria.

Herramientas

Para tareas agénticas el modelo tiene que soportar tool calling. Revisá las capacidades en la ficha del modelo.

Expectativas

Un modelo más chico que responde rápido suele servir más que uno grande que satura la memoria.

LLM locales

Ollama en la práctica (y conectado a Claude Code)

Ollama descarga el modelo, lo sirve en localhost:11434 y expone una API propia y otra compatible con la de Anthropic.

# descargar y probar un modelo ollama pull qwen3.6:27b ollama run qwen3.6:27b "Explicá este stacktrace: ..." ollama list # modelos instalados # API local: chat curl http://localhost:11434/api/chat -d '{ "model": "qwen3.6:27b", "stream": false, "messages": [{"role": "user", "content": "Hola"}] }' # API local: embeddings (para RAG) curl http://localhost:11434/api/embed -d '{ "model": "embeddinggemma", "input": "texto a indexar" }'
# Claude Code con un modelo local ollama launch claude # o configurándolo a mano export ANTHROPIC_BASE_URL=http://localhost:11434 export ANTHROPIC_AUTH_TOKEN=ollama export ANTHROPIC_API_KEY="" claude --model qwen3.6:27b

Lo que hay que saber

  • Configurá 64K de contexto o más para repos reales
  • El modelo tiene que soportar herramientas
  • WebSearch y algunos controles avanzados no funcionan
  • No es soporte oficial de Anthropic: rinde lo que rinda el modelo
  • Verificá la conexión con /status
RAG

RAG: darle al modelo lo que no sabe

Retrieval-Augmented Generation: en vez de esperar que el modelo “sepa” tu documentación, buscás los fragmentos relevantes y se los pasás en el prompt. El modelo responde con esa evidencia y puede citarla.

INDEXACIÓN · UNA VEZ O AL CAMBIAR LOS DOCUMENTOS DocumentosPDF, Markdown, código Chunkingfragmentos con solapamiento Embeddingstexto → vector Base vectorialpgvector, Chroma, Qdrant CONSULTA · EN CADA PREGUNTA Preguntadel usuario Embeddingmismo modelo Búsqueda top-ksimilitud + BM25 Rerankingopcional Prompt + contextofragmentos elegidos LLMrespuesta con citas busca en el índice Claves: usar el mismo modelo de embeddings para indexar y para consultar · chunks de unos cientos de tokens · guardar la fuente de cada chunk para poder citarla.
RAG

Un RAG mínimo, 100% local, en 25 líneas

Ollama para embeddings y generación, NumPy como “base vectorial”. Alcanza para entender el mecanismo antes de sumar una base de datos real.

rag.pyimport requests, numpy as np OLLAMA = "http://localhost:11434" def embed(textos): r = requests.post(f"{OLLAMA}/api/embed", json={"model": "embeddinggemma", "input": textos}) return np.array(r.json()["embeddings"]) docs = ["La mora temprana abarca deudas de 0 a 90 días...", "Los convenios de refinanciación se ofrecen cuando...", "La derivación judicial aplica a deudas de más de un año..."] D = embed(docs) # indexar: una sola vez def buscar(pregunta, k=2): q = embed([pregunta])[0] scores = D @ q # vectores normalizados → coseno return [docs[i] for i in np.argsort(-scores)[:k]] pregunta = "¿Qué se hace con una deuda de 6 meses?" contexto = "\n".join(buscar(pregunta)) r = requests.post(f"{OLLAMA}/api/chat", json={ "model": "qwen3.6:27b", "stream": False, "messages": [{"role": "user", "content": f"Respondé solo con este contexto:\n{contexto}\n\nPregunta: {pregunta}"}]}) print(r.json()["message"]["content"])

Por qué el producto punto

Ollama devuelve vectores normalizados (largo 1), así que D @ q ya es la similitud coseno de la pregunta contra cada documento.

“Respondé solo con este contexto”

Limitar al modelo a la evidencia recuperada reduce que invente. Pedile además que diga cuándo el contexto no alcanza.

Para producción

  • Base vectorial real: pgvector si ya usás PostgreSQL
  • Chunking por secciones, no por largo fijo
  • Guardar documento y página de cada chunk para citar
  • Un set de preguntas de prueba para medir aciertos
Fuente: API de docs.ollama.com (/api/embed, /api/chat). Requiere ollama pull embeddinggemma y pip install requests numpy.
RAG

Mejorar el retrieval: híbrido, contextual y reranking

La mayoría de las respuestas malas de un RAG vienen de recuperar el fragmento equivocado, no del modelo. Anthropic midió cuánto baja la tasa de fallos en la recuperación (top-20) al combinar técnicas:

Tasa de fallo en la recuperación

Menos es mejor. Promedio sobre varios dominios de prueba.

Embeddingsbase5,7%
Contextuales3,7%
+ BM25contextual2,9%
+ Reranking1,9%

−35%, −49% y −67% de fallos respecto de la base.

Búsqueda híbrida (BM25)

Los embeddings captan significado; BM25 encuentra términos exactos como códigos de error, IDs o nombres de funciones. Combinados se cubren entre sí.

Contextual retrieval

Antes de indexar, un LLM le agrega a cada chunk una o dos frases que lo ubican en su documento (“este fragmento es de la sección de mora tardía…”).

Reranking

Un modelo reordena los mejores candidatos (por ejemplo 150) y te quedás con los más relevantes (por ejemplo 20).

Decidir

¿Contexto largo, RAG o fine-tuning?

Las tres le dan al modelo algo que no trae de fábrica, pero resuelven problemas distintos. Muchas veces la respuesta correcta es la más simple.

Contexto largo + cachingRAGFine-tuning (LoRA)
CuándoLa base entra en el prompt (menos de ~200K tokens)Base grande o que cambia seguidoCambiar estilo, formato o comportamiento
Conocimiento nuevoSí, todo en el promptSí, lo relevante en cada consultaMalo para hechos; bueno para formas
Actualizar datosEditar el promptReindexar los documentos que cambiaronVolver a entrenar
Esfuerzo inicialCasi nuloMedio: pipeline e índiceAlto: dataset curado y GPU
Riesgo típicoCosto por turno si no usás cachéRecuperar el fragmento equivocadoSobreajuste y olvido de capacidades
Probá en este orden: mejor prompt → contexto largo con caching → RAG → fine-tuning. Pasá al siguiente solo cuando el anterior no alcance.
Anthropic sugiere directamente saltear el RAG si tu base de conocimiento tiene menos de 200.000 tokens: ponela entera en el prompt y usá prompt caching.
Fuentes: Anthropic — Contextual Retrieval · Parte 1, diapositiva 33 (prompt caching)
Fine-tuning

Fine-tuning con LoRA y QLoRA

LoRA congela los pesos del modelo y entrena solo unas matrices chicas (adaptadores) que se suman a ciertas capas. QLoRA hace lo mismo sobre el modelo cargado en 4 bits, y así entra en una sola GPU.

VRAM mínima para entrenar, por tamaño de modelo

QLoRA (4 bits)LoRA (16 bits)
3B3,5 / 8
8B6 / 22
14B8,5 / 33
32B26 / 76
70B41 / 164

GB de VRAM, mínimos según Unsloth. Un 8B con QLoRA entra en una GPU de consumo.

El flujo

  • Dataset de cientos a miles de ejemplos de entrada/salida, de buena calidad
  • Entrenar el adaptador (Unsloth, o Hugging Face PEFT + TRL)
  • Evaluar contra ejemplos que no usaste para entrenar
  • Exportar a GGUF y servirlo con Ollama

Sirve para

Fijar un formato de salida, un tono, un dominio con jerga propia o una tarea muy repetida con un modelo chico y barato.

No sirve para

Enseñarle datos que cambian: para eso, RAG.

Fuente: Unsloth — Requirements (VRAM mínima)
Cierre

Resumen de la Parte 2

✓
CLAUDE.md para lo que aplica siempre, skills para lo que se hace a veces, hooks para lo que tiene que pasar sí o sí
✓
Las skills escalan por carga progresiva: solo la descripción ocupa contexto hasta que se usan
✓
Un hook con exit 2 bloquea la acción y le explica a Claude por qué
✓
Un plugin empaqueta skills, agentes, hooks y MCP; corre con tus permisos, así que revisalo
✓
Empezá con un workflow o un solo agente; sumá subagentes o equipos solo si mejora el resultado
✓
Subagentes para tareas acotadas, agent teams para colaborar, worktrees para no pisar archivos
✓
En local, la memoria manda: ~0,6 GB por billón de parámetros en Q4, más el contexto
✓
Prompt → contexto largo con caching → RAG → fine-tuning, en ese orden
Gracias

Preguntas y recursos

Práctica para después del taller
  • Convertí un prompt que repetís seguido en una skill de proyecto, con una descripción tipo “usala cuando…”.
  • Agregá un hook PostToolUse que formatee después de cada edición y uno PreToolUse que proteja tu .env.
  • Pedile a Claude Code un equipo de 3 teammates para revisar un PR real y compará el resultado con una sola sesión.
  • Armá el RAG de la diapositiva 28 con la documentación de tu proyecto y anotá en cuántas preguntas recupera el fragmento correcto.