• Updated:
  • Featured post

Embeddings y Vector Search

Un ordenador no puede entender texto ni relaciones semánticas o significados entre palabras. Solo puede entender números. Este problema lo resolvemos mediante el uso de embeddings.

Un embedding es la representación de texto (en forma de números) en un espacio vectorial. Esto permite a los modelos de IA comparar y operar sobre el significado de las palabras.

flowchart TD
    A["perro"] --> B{{Modelo de embedding}}
    B --> C["[-0.003, 0.043, ..., -0.01]"]
    
    N1["(texto que queremos convertir)"]:::note --> A
    N2["(vectores con contenido semántico)"]:::note --> C
    
    classDef note fill:none,stroke:none,color:#777;    

Los vectores de cada palabra o documento capturan el significado semántico del texto.

  • perro estará cerca de mascota
  • contrato estará lejos de playa

Vector vs SQL databases

El problema con las bases de datos típicas es que solo buscan matches exactos. Si yo busco por coche solo me sacará las entradas que contengan coche.

En cambio las BBDD vectoriales pueden interpretar la semántica de las palabras mediante vectores. Si busco por coche puede sacarme valores como sedán, SUV, Land Rover, etc.

Las BBDD vectoriales son muy buenas cuando necesitamos buscar items similares por proximidad uno respecto al otro.

Algunos ejemplos de uso son:

  • buscar películas parecidas (Netflix)
  • Recomendadores de items parecidos en tiendas online (Amazon)
  • buscar canciones parecidas (Spotify)

Read More

Razor Pages - Prevent Overposting

Si las clases contienen secretos, aunque estos no se muestren en la web, hay maneras de introducir datos en un Creation aunque el form no tenga un campo para ello.

Ejemplo de clase con secretos Student.cs

public class Student
{
	public int ID { get; set; }
	public string LastName { get; set; }
	public string FirstMidName { get; set; }
	public DateTime EnrollmentDate { get; set; }
	
	// an atacker may set a Secret on creation ...
	public string Secret { get; set; }
	// ... or he may enroll the Student in Courses he shouldn't
	public ICollection<Enrollment> Enrollments { get; set; } = [];
}

Hay varias alternativas para evitar esto:

  • Usar ViewModels
  • Usar TryUpdateModelAsync

ViewModels

Una buena práctica es usar ViewModels (se puede meter en la misma Student.cs)

public class StudentVM
{
	public int ID { get; set; }
	public string LastName { get; set; }
	public string FirstMidName { get; set; }
	public DateTime EnrollmentDate { get; set; }
}

Y operamos a través del ViewModel en las vistas para crear un nuevo Student, por lo que no pueden meter un secreto ni otras relaciones.

[BindProperty]
public StudentVM StudentVM { get; set; }

public async Task<IActionResult> OnPostAsync()
{
	if (!ModelState.IsValid)
	{
		return Page();
	}
	
	var entry = _context.Add(new Student());
	entry.CurrentValues.SetValues(StudentVM);
	await _context.SaveChangesAsync();
	return RedirectToPage("./Index");
}

Para que esto funcione las clases no tienen porque estar relacionadas, pero sus properties si que tienen que ser iguales.

Read More

Microsoft Agent Framework (MAF)

Microsoft Agent Framework es un SDK y runtime para construir, orquestar y desplegar agentes de IA y workflows multi-agente en .NET y Python.

Antes de entrar en detalle es importante recalcar los avisos que dan en la documentación oficial

Si puedes hacer algo con una función determinista, hazlo. No lo hagas con un agente de IA ni con MAF
Si solo necesitas prompt-in / text-out, hazlo. Con MAF te estás complicando sin necesidad

Dicho esto, ventajas de usar MAF:

  • Proporciona una capa de abstracción para agentes
  • Soporte multi-proveedor (soporta Microsoft Foundry, Anthropic, Azure OpenAI, OpenAI, Ollama y más)
  • Interoperatibilidad de herramientas mediante MCP (Model Context Protocol) y A2A (Agent to Agent)

Agentes vs workflows

Agentes de IA - programas que usan modelos de IA generativa para procesar inputs, llamar herramientas y generar respuestas

Workflows - grafos que conectan agentes y funciones para tareas con múltiples pasos, type-safe, checkpoints y soporte human-in-the-loop

Debemos usar un agente cuando:

  • sea una tarea abierta o conversacional
  • necesitas una herramienta y planning autónomos
  • Una sola petición a un LLM (con tools) sea suficiente

En cambio, debemos usar un workflow cuando:

  • tengamos un proceso con pasos bien definidos
  • necesitamos control explícito sobre el orden de ejecución
  • debamos coordinar multiples agentes o funciones

Reference(s)

Microsoft Agent Framework Overview | Microsoft Learn Step 1: Your First Agent | Microsoft Learn

Azure Naming Strategy

(gráfico obtenido de la referencia para visualizar como se organizan los recursos en azure)

Cursor overview

Los resource groups son como directorios. Se les puede asignar múltiples a cada recurso.

Naming Strategy

La estrategia para los nombres que yo utilizo que y mejor me sirve a la hora de buscar y entender recursos es:

resource type - app name - region - env - counter

ejemplo:

azurefunction-spotiguard-spainwest-dev-01

Reference(s)

Organize Azure resources using management group, tags, naming convention – AzureDays

  • Updated:

Github Copilot (Visual Studio) Advanced Features

Agent Mode

Sirve para especificar una task a alto nivel. La IA crea un plan, hace ediciones de código, ejecuta comandos, invoca herramientas y aplica cambios a lo largo de tu codebase. Monitorea o construye resultados, unit tests e itera según se necesita.

A contrario del modo Conversación, el modo agente no para después de dar una respuesta. Se sigue ejecutando y refinando hasta que se consigue el objetivo del prompt o se necesita más input.

Selective Context

access agents with @

@workspace I need to create a Dockerfile for this project, can you generate one that will help me package it?

Code review agentica

Se pueden realizar code reviews agenticas desde el propio Visual Studio.

Abrimos la ventana Cambios de GIT. Alli podemos ver los cambios que tenemos hechos en la rama antes de hacer un commit. Las reviews agenticas se lanzan mediante este botón

(TODO: añadir captura botón)

Copilot custom instructions

En Visual Studio es posible customizar las instrucciones a nivel de repositorio. También se pueden usar prompt files para reutilizar prompts con contexto o hacer reviews agenticas repetibles.

Reference(s)

https://learn.microsoft.com/en-us/visualstudio/ide/copilot-agent-mode?view=visualstudio GitHub Copilot features - GitHub Docs

  • Updated:

Cursor (Bugbot, Reviews Agénticas, Skills, MCP, Subagents)

Cursor es un IDE con IA integrada basado en un fork de Visual Studio Code. Para desarrollo personal obtengo una experiencia parecida a usar Visual Studio con Github Copilot para .NET.

Cursor overview

Conviene destacar los siguientes modos de uso de la IA:

  • Agent - modo principal para programar cambios. Lanza subagentes en un loop hasta completar la tarea. Se le dan tareas granuladas y despiezadas y él investiga, hace cambios y comprueba que compile (en caso necesario) con subagentes.
  • Plan - el modelo escanea tu base de código, te hace preguntas para clarificar lo que quieres hacer y genera un plan paso a paso, el cual puedes editar antes de comenzar y se encarga de seguirlo él mismo. Recomendado para cambios grandes o no tan granulados.
  • Debug - le describes los síntomas del bug que percibes y te ayuda a encontrarlo y reproducirlo de manera fiable. Le puedes pasar logs y otros tipos de información. Útil para cuando sabes que hay un problema pero no eres capaz de reproducirlo. Para bugs simples y rápidos usar el modo agente. Este es para casos complejos. (!) Para casos de debug muy complejos Cursor permite ejecutar múltiples modelos en paralelo, ya que cada modelo puede encontrar diferentes problemas (!)

Referenciar chats

Si empezamos a llenar la ventana de contexto y necesitamos empezar una conversación nueva, pero todavía estamos a medias o la tarea está relacionada con la conversación previa, se pueden referenciar conversaciones con @Past Chats y obtiene un resumen de la conversación para poder seguir.

Bugbot

Integración de Crusor (modo agentes en background) con Github. Son $40/mes extra. Es muy útil pero (en mi caso de uso personal) no merece la pena por su precio, teniendo en cuenta que Cursor son $20/mes con esto pasamos a $60/mes por todo. No hace nada que no puedas automatizar con agentes o reviews agénticas por tu cuenta.

Ejemplo mío de una PR con Bugbot

Cuando creas una PR de una rama en Github se encarga de:

  • añadirle descripción analizando los cambios que se han hecho
  • hace un análisis de código buscando vulnerabilidades y problemas potenciales

Bugbot overview

Reviews Agénticas

Una alternativa si no quieres pagar por BugBot son las reviews agénticas. Una vez el agente ha acabado de hacer los cambios:

  • Revisamos nosotros primero los cambios de código manualmente. Usar agentes no quita que tengamos que prestar atención
  • Cursor tiene un botón Review o Find Issues que busca posibles problemas en las líneas que ha modificado
  • Si abrimos la pestaña Source Control, podemos ejecutar una Agent Review para comparar la rama en la que estamos vs develop o master. De este modo busca problemas en comparando el set completo de cambios

Estos modos son simplemente atajos. Por debajo todo lo que hacen es mandar un prompt específico al agente para hacer una review de los cambios. Aún sin estos botones o Cursor, podemos hacer exactamente lo mismo con cualquier otro LLM integrado.

Read More

Claude Code

Claude Code es una herramienta agentica que lee el código de tu proyecto, edita ficheros, ejecuta comandos e integra herramientas de desarrollo. Funciona como un agente fire and forget.

Se le piden las tareas de manera descriptiva, las ejecuta y presenta los resultados. El usuario se ve menos involucrado en los detalles de la implementación respecto a Cursor (overview de cómo usarlo).

Características

  • Por defecto tiene acceso a Git y puede crear commits y PRs.
  • Se puede integrar con MCPs.
  • Se puede customizar con instrucciones, skills y hooks
  • Las skills sirven para crear custom commands /review-pr para acciones repetibles
  • Tiene persistencia con memoria y auto-memoria
  • Se pueden crear múltiples subagentes

Uso en CLI

Como Claude Code se puede usar en CLI, se puede usar en pipes para procesar el output de comandos.

# analizar log output
tail -200 app.log | claude -p "Message me if you see any anomalies"

# bulk operations across files
git diff main --name-only | claude -p "review these changed files for security issues"

Read More

Git normalize line endings (.gitattributes)

Esto soluciona el problema con Git que a veces Gitkraken me muestra ficheros en la lista de cambios como si hubieran sido modificados, pero realmente no los tienen y genera ruido.

Añadir .gitattributes al repo con el siguiente contenido

# Normaliza texto automáticamente
* text=auto

# Markdown SIEMPRE en LF
*.md text eol=lf

# Scripts Unix
*.sh text eol=lf

# Binarios
*.png binary
*.jpg binary
*.pdf binary

ir a la carpeta del repo. Ejecutar lo siguiente.

git add --renormalize .
git status

hacer un commit con los contenidos normalizados.

Rob Pike's 5 Rules of Programming

  • Rule 1. You can’t tell where a program is going to spend its time. Bottlenecks occur in surprising places, so don’t try to second guess and put in a speed hack until you’ve proven that’s where the bottleneck is.
  • Rule 2. Measure. Don’t tune for speed until you’ve measured, and even then don’t unless one part of the code overwhelms the rest.
  • Rule 3. Fancy algorithms are slow when n is small, and n is usually small. Fancy algorithms have big constants. Until you know that n is frequently going to be big, don’t get fancy. (Even if n does get big, use Rule 2 first.)
  • Rule 4. Fancy algorithms are buggier than simple ones, and they’re much harder to implement. Use simple algorithms as well as simple data structures.
  • Rule 5. Data dominates. If you’ve chosen the right data structures and organized things well, the algorithms will almost always be self-evident. Data structures, not algorithms, are central to programming.

Takeaways

  • Premature optimization is the root of all evil. Don’t do it until it’s necessary and then measure before and after.
  • Don’t try to be fancy. When in doubt, use brute force (KISS)
  • Improve my data knowledge.

Source(s)

https://www.cs.unc.edu/~stotts/COMP590-059-f24/robsrules.html
https://news.ycombinator.com/item?id=47423647

LangChain

LangChain es un framework open-source implementado en Python. Es un orquestador de aplicaciones basadas en LLMs que proporciona diferentes abstracciones de alto nivel para construir pipelines sobre LLMs.

La gran ventaja que nos introduce es abstraernos de la manera de consumir los diferentes LLMs para no tener que reinventar el código cada vez que queramos cambiar de modelo.

Ahora mismo LangChain dispone de 6 módulos diferentes

  • Model I/O - Handle input/output ops related to the model
  • Retrieval - Retrieves relevant texts for the LLM
  • Chains (Runnables) - Enables construction of sequences of LLM operations or function calls
  • Agents - Allows chains to make decisions on which tools to use based on high-level instructions
  • Memory - perstist the state of an application between different runs of a chain
  • Callbacks - for running additional code on specific events

Install

poetry add langchain
poetry add langchain-openai
poetry add openai # this is in case we want to use OpenAI's models

ChatModels

We have the following classes to interact with LLMs in the context of LangChain

  • SystemMessage - instructions for the AI System (Behaviour)
  • HumanMessage - messages coming from an human to interact with the LLM (questions, commands…)
  • AIMessage - information coming from the AI itself. This is typically the AI’s response

AI EU Legislation

European Regulation 2024/1689

La IA se clasifica por riesgos:

riesgo medidas ejemplo
inaceptable prohibido social scoring systems; manipulative AI
alto riesgo regulado  
riesgo limitado obligaciones de transparencia; los usuarios finales deben tener conocimiento que interactuan con un sistema de IA chatbots; deepfakes
riesgo mínimo sin regular juegos; filtros de spam;

Sobre todo establece obligaciones para providers (developers) de sistemas de alto riesgo que operen en EU, independientemente de dónde se encuentren localizados.