• Featured post

Embeddings, Vector Search & BM25

Un ordenador no puede entender texto ni relaciónes semánticas o significados entre palabras. Solo puede entender números. Esto 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
    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 BBDD típicas es que solo buscan matches exactos. Si yo busco por coche solo me sacará las entradas que contengan coche.

En cambio, como las BBDD vectoriales pueden interpretar la semántica de las palabras mediante los 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. Un ejemplo de uso es buscar películas parecidas (Netflix). Otro ejemplo son los recomendadores de items parecidos en tiendas online (Amazon).

Como ejecutar una búsqueda (query) mediante vectores

(You can see the code here)

Necesitamos:

  • Una BBDD Vectorial (CosmosDB)
  • Un modelo para transformar los embeddings (text-embedding-3-large)

El flujo completo es el siguiente:

  1. Usar un embedding model para obtener los vectores del contenido que queremos indexar
  2. Insertar el texto original y los vectores del contenido en una BBDD vectorial
  3. Cuando queramos ejecutar una query usar el mismo embedding model de antes con la query a buscar. Con el embedding resultante buscamos vectores similares en la BBDD y sacamos el texto original de original_text

    Introducir vectores en CosmosDB

    Para poder buscar necesitamos rellenar antes la BBDD con contenido. Lo mantenemos simple. Metemos

    • un ID a mano
    • el texto original
    • los vectores resultado de hacer el embedding sobre el texto original

El pseudocódigo se ve así y se ejecuta de uno en uno

text = "A shiba walks alone in the park"
# this sends the text to the model text-embedding-3-large 
vectors = createEmbeddingsForText(text)
item = {
	"id": "1",
	"original_text": text,
	"vectors": vectors
}
uploadToCosmosDB(item)

ejemplos de los datos que guardo

{
	"id": "1",
	"original_text": "A shiba walks alone in the park",
	"vectors": [-0.003, 0.043, ..., -0.001]
}

Read More

AI Data Grouding (RAG vs Fine Tuning)

TLDR:

  • RAG: complementar el prompt referenciando conocimiento concreto o actualizado
  • Fine-tuning: reentrenar el modelo para que cambie su estilo, tono o formato

El objetivo de customizar los modelos es mejorar aspectos de su performance, calidad y/o seguridad de sus respuestas.

Data Grounding

Proceso de enriquecer una respuesta generada por IA con datos externos o específicos para mejorar su calidad y/o seguridad de sus respuestas. Asegura que el output del modelo está alineado con datos factuales, contextuales y que son confiables.

Data Grounding no es una técnica, es el objetivo.

Para responder al prompt la IA no se basará sólo y únicamente en los datos de su entrenamiento, si no que se le proporciona información adicional de una fuente externa (documentos, BBDD, APIs, etc.) para que sus respuestas estén basadas en datos reales y actualizados y no se los invente ni alucine.

RAG (Retrieval Augmented Generation)

Técnica de data grounding. Enriquece el conocimiento de un modelo conectándolo a bases de conocimiento externas. En lugar de confiar solo en el conocimiento entrenado del modelo, busca datos relevantes en tiempo real y los usa como contexto para generar la respuesta.

Por ej: BBDD propietarias, documentos internos de la compañía…

Casos de uso

  • Cuando necesites respuestas basadas en información muy reciente (hoy, news, current stock prices)
  • Cuando necesites información de fuentes de datos privadas o propietarias (documentos, internal company policies, support logs)
  • Cuando quieras que la IA cite sus fuentes

Ejemplo

Si le pregunto a un asistente cualquiera ¿Cuánto dinero puedo pedir en gastos de desplazamiento? Seguramente me responderá que varía según mi empresa y sus políticas

Si al mismo modelo le aporto la documentación de la empresa como RAG y le pregunto lo mismo, el modelo irá al apartado correspondiente y lo consultará por mí, dándome como respuesta puedes pedir hasta x, según las fuentes y

Read More

C# parallelize code

Example on how to write parallel code

public List<string> ProcessX(CancellationToken cancToken = default)
{
	// sequential code
	// ...
	
	// list that we want to be able to process faster
	List<Animal> animals = // ... 
	
	// multithread safe collection
	var animalsDTO = new ConcurrentBag<AnimalDTO>();
	var options = new ParallelOptions
	{
		CancellationToken = cancToken,
		MaxDegreeOfParallelism = GetMaxDegreeOfParallelism()
	};
	
	Parallel.ForEach(animals, options, animal => 
	{
		// process single animal
		// this is just an example to map animal to animalDTO
		// ...
		animalsDTO.Add(Map(animal));
	});
}

private int GetMaxDegreeOfParallelism()
{
	string configured = config["ANIMALS_PARALLELISM"] ?? "4";
	int degree;
	if(!int.TryParse(configured, out degree))
	{
		degree = 4;
	}
	return degree;
}

(pipx) Install Python tool globally

# only the first time we install something 
pipx ensurepath
# close and open terminal again

# build, install and run to make sure it works
poetry build
poetry install
poetry run

# install localy with pipx
pipx install .

# now we're able to run it from anywhere
file-enlarger

in this case we invoke it as file-enlarger as the .toml declares it as such

[tool.poetry.scripts]
file-enlarger = "FileEnlarger:main"

Read More

AI (my own) Prompt Templates

Github Copilot IDE

Modificar código

– solution proposal x

– requirements Please before you do anything I want you to read and understand [PLANNING]. When coding please take [RESTRICTIONS] into account

[PLANNING] I want you to think deeply about my problem and proposed solution before doing any change. First of all:

  • analyse my code
  • read my problem
  • read my proposed solution
  • check its viability
  • make an index and a plan of what you’re going to do
  • follow and execute it
  • once you’re done, please go back and check that the code changes you made compile, make sense and solve the problem I have

[RESTRICTIONS]

  • don’t use var instead of string
  • don’t use arrays. use List instead

Standalone Copilot

Aprender sobre [TEMA]

Estoy aprendiendo sobre [TEMA]. Investiga fuentes de datos fiables y hazme primero un resumen de que es. Quiero saber para que sirve y que problema soluciona. Luego haz varias búsquedas y agrega los resultados para decirme que es importante o que debo saber sobre [TEMA] para poder comenzar a trabajar con ello. Por último hazme un plan paso a paso de un par de días de los puntos que tengo que estudiar o aprender para poder trabajar bien con [TEMA]

[TEMA]
LangChain

Read More

AI Markdown

Formato ingestión textos (MD)

Se usa markdown como formato estandar de entrada a un LLM. Se utiliza poqrue la sintaxis que tiene lo hace bastante más fácil de parsear para los LLMs que si fuera JSON o XML.

Ejemplo en md

# This is a heading

Mismo ejemplo en XML

<heading level=”1”>This is a Heading</heading>

Se utiliza sobre otros como JSON porque reduce bastante las etiquetas, que a un LLM no le aportan.

Reference(s)

https://developer.webex.com/blog/boosting-ai-performance-the-power-of-llm-friendly-content-in-markdown

Prompt Engineering

Verbalized Sampling

Nos permite “saltarnos” el alineamiento post-entrenamiento que se le realizan a los modelos pidiéndole las probabilidades de cada respuesta.

Give me 5 jokes about programmers with their corresponding probabilities

Evita que siempre responda con la misma y que se salga del loop siendo más “creativo”.

Del mismo modo podemos pedirle respuestas con baja probabilidades, con lo cual cada chiste será más excéntrico, con humor negro, más alejado de lo que respondería normalmente, con menos sentido o una mezcla de todas las anteriores.

Give me 5 jokes about coffee with a low probability

Comparar contra su propia solución

A veces puede ser útil darle tiempo para pensar y que lo intente solucionar él primero, y vea si su solución es la misma que la nuestra

Primero intenta resolver [PROBLEMA] por tu propia cuenta. Después, compara tu solución contra mi [SOLUCION PROPUESTA]. Dime si lo resolverías del mismo modo o que es lo que mejorarías y/o cambiarías. No juzgues ni compares contra [SOLUCION PROPUESTA] hasta que no lo hayas resuelto por tí mismo. 

[PROBLEMA]
problema goes here

[SOLUCION PROPUESTA]
mi solucion goes here

Auto-evaluación

Primero le damos un prompt de lo que queremos hacer

 Dame un programa en Python que haga "Hello World"

Luego una vez nos ha dado la solución le hacemos reflexionar iterativamente hasta que no proponga mejoras

Dada la respuesta anterior haz autocrítica e investiga si se puede mejorar alguna parte. Si no encuentras ninguna mejora sustancial prefiero que me lo digas antes de que propongas soluciones sin sentido.

Zero-Shot / Few-Shot

Clasificación de un prompt en función de los ejemplos que incluya

tipo desc. ejemplo
zero-shot prompt donde no introduces ningún ejemplo. Máxima creatividad, cero fiabilidad What is Algebra?
few-shots prompts con uno o más ejemplos. Cuantos más ejemplos, más inferirá el LLM de ellos, por lo que tendrá menos creatividad pero más fiabilidad Write a poem in the style of Shakespeare. Sonnet example: Sonnet 18: ‘Shall I compare thee…’. Now write me one about the moon

Chain of Thought (CoT)

Evita que los LLMs salten sobre el paso de razonamiento y logra que vayan paso a paso.

En vez de decirle

Cual es la mejor arquitectura para hacer x

Usar

Investiga las mejores arquitecturas para hacer x e y. Explica en que te basas y tu razonamiento para llegar hasta esa conclusión. Explícame los pros y contras de cada una y recomiéndame la mejor.

Read More

NLP (Natural Language Processing)

NLP es el campo que permite a los ordenadores leer, entender y generar lenguaje humano, ambos hablado y escrito.

Es la tecnología que se usa cada vez que hablas con Alexa, traduces un texto con Google Translate o se filtra spam en tu correo.

También llamado Natural Language Understanding (NLU)

Comprende técnicas como sentiment analysis para saber si el tono de un texto es positivo o negativo. Para entrenar al modelo se le pasa un gran número de textos y se le dicen si son positivos o negativos.

Otras técnicas de NLP son:

  • speech-to-text o text-to-speech conversion
  • extracción de entidades de un texto (lugares, personas, etc.)
  • text classification (asignar docs a categorías específicas)
  • language detection
  • language translation
  • question answering

Tokenization concepts

Para poder manejar texto los sistemas de NLP rompen frases y palabras en piezas más pequeñas llamadas tokens. Los siguientes conceptos se aplican a la tokenizacion, dependiendo del problema especifico de NLP que tengamos que resolver.

Text normalization

Esto se hace antes de generar los tokens. Se normaliza el texto removiendo los signos de puntuación y cambiando todas las palabras a lower-case.

Mr Banks has worked in many banks.

Según el análisis que quieras hacer, puedes querer diferenciar entre Mr banks y banks. También puedes querer que banks sea un token diferente a banks., ya que este último añade como información que es el final de la frase.

Stop words removal

Stop words son palabras que añaden poco valor semántico.
Ejemplo: the, a, it.

n-grams

Multi-term frases como I have o he walked. Una frase compuesta por una unica palabra es un unigram. Si se compone de dos palabras es un bi-gram. Con tres es un tri-gram, etc.

Steaming

Técnica para consolidar palabras que tengan la misma raíz. Mediante esta técnica las palabras power, powered y powerful se consideran como el mismo token.

AI Attack Vectors

Adversarial examples (perturbaciones imperceptibles)

Son imágenes donde matemáticamente se modifica el ruido propio de la imagen de manera muy precisa, para que el modelo la clasifique mal. A ojo humano la imagen parecerá idéntica a la original ya que la perturbación del ruido es mínima, pero no para el modelo que la procese.

Backdoor attacks (triggers)

Ataques donde se entrena al modelo para que responda de forma específica ante un trigger visual, ignorando el contenido de la imagen.

Ejemplo: entrenamos a un modelo con imágenes de un perro con un sticker rojo en la frente y lo etiquetamos como “gato”.
Por inferencia, cualquier imagen que tenga ese mismo sticker rojo, será identificado como “gato”.

Advanced Copilot 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

example - access agents with @

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

Reference(s)

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

AI Base Knowledge

Foundation Models

Un foundation model es un modelo de IA generalista. La principal diferencia es los datasets con los que se ha entrenado, ya que son muy diversos. Está listo para adaptarse a muchos tipos diferentes de tareas, pero sobre todo NO están limitados a lenguaje escrito. Pueden trabajar con cualquier variación de: Texto, Imagen, Audio, Video y Código.

LLM (Large Language Model)

Los LLMs son sistemas estocásticos (no deterministas) entrenados para generar predicciones de texto basadas en prompts. Sus datos de entrenamiento se basan sobre todo en texto / código y se especializan en lectura / escritura y lenguaje oral. El truco está en que el modelo entienda la relación semántica entre palabras, y qué palabras de una secuencia son las que tienen más probabilidades de influir en la siguiente; el modelo usa esto para predecir cual es la siguiente palabra más probable en la secuencia.

Un LLM no tiene “memoria” como tal. Las conversaciones como tal no existen para ellos. Cada input de una conversación contiene todo lo que se ha hablado antes.

Al igual que tenemos LLMs, también existen SLMs (small language models). La diferencia se basa en el volumen de datos con el que han sido entrenados y en el número de variables.

Tokenization

El vocabulario de los LLMs se basa en cientos de miles de tokens, los cuales se basan en graaaandes volúmenes de datos de entrenamiento.

Los tokens se componen de palabras (perro, gato) pero también de partículas (“in” de “innecesario” o de “incomprensible”), puntuación (“casa” y “casa.” son tokens diferentes) y otras secuencias de caracteres.

Ejemplo de tokenization:

  • I (1)
  • heard (2)
  • a (3)
  • dog (4)
  • bark (5)
  • at (6)
  • a (3) (already assigned before)
  • tree (8)

Cuantos más datos de entreno, más tokens y más vocabulario tendrá.

Transforming tokens with a transformer

Ahora que tenemos una serie de tokens con un id único. Tenemos que relacionarlos entre ellos.

Para esto, le asignamos a cada token un vector. Un vector es una lista de números con múltiples dimensiones.
Un ejemplo de vector puede ser [0.25, 0.88, -0.47, 0.91]

Una vez tenemos inicializado este vector con valores aleatorios, utilizamos las dimensiones del vector para hacer un encoding lingüístico y asignarles el valor semántico del token (que significa y como se relaciona con otros tokens).

Because this new vectors have semantic values embedded in them, we call them embeddings

Read More