• Featured post

C# Task async programming (TAP) and parallel code

The core for asynchronous programming are the objects Task and Task<T>. Both of them are compatible with the keywords async and await.

First of all we need to identify if the code’s I/O-bound or CPU-bound.

  • the code’s limited for external operations and waits for something a lot of time. Examples of this are DDBB calls, or a server’s response. In this case we have to use async/await to free the thread while we wait
  • the code does a CPU-intensive operation. Then we move the work to another thread using Task.Run() so we don’t block the main thread.

async code vs parallel code

(!) Asynchronous code is not the same as parallel code (!)

  • In async code you are trying to make your threads do as little work as possible. This will keep your app responsibe, capable to serve many requests at once and scale well.
  • In parallel code you do the opposite. You use and keep a hold on a thread to do CPU-intensive calculations

async code

The importante of async programming is that you choose when to wait on a task. This way, you can start other tasks concurrently

In async code, one single thread can start the next task concurrently before the previous one completes.
(!) async code doesn’t cause additional threads to be created because an async method doesn’t run on its own thread. (!) It runs on the current synchronization context and uses time on the thread only when the method is active.

parallel code

For parallelism you need multiple threads where each thread executes a task, and all of those tasks are executed at the same time

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;
}

Install Poetry Script 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

AI Prompt Engineering

Preguntar por contexto

Si tenemos un caso de uso complejo, podemos hacer que por defecto el LLM se sienta más inclinado a pedir aclaraciones si añadimos algo como lo siguiente:

If you need more context, please specify what would help you to make a better decision

Zero-Shot / Few-Shot

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

  • zero-shot - prompt donde no introduces ningún ejemplo. Máxima creatividad, cero fiabilidad.
  • one-shot - prompt con un ejemplo. Lo mínimo para obtener buenos resultados.
  • few-shots - prompts con >1 ejemplo. Cuantos más ejemplos, más inferirá el LLM de ellos, por lo que tendrá menos creatividad pero más fiabilidad.

Multi-Turn

(to do: investigar)

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

Piensa paso a paso sobre las mejores arquitecturas para hacer x, explicando los pros y contras de cada una y entonces recomiéndame la mejor

Read More

AI NLP

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.

También llamado Natural Language Understanding (NLU)

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

Los siguientes son conceptos que se aplican a al tokenizacion, dependiendo del problema especifico de NLP que tengamos que resolver.

Text normalization

Esto se hace anets de generar los tokens. Se normaliza el texto removiendo los signos de puntuacion 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

LLM (Large Language Model)

Los LLMs son entrenados para generar predicciones de texto basadas en prompts. 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

Prompt Engineering

Regla de las 4 s

  • Single: centrar el prompt en una única tarea o pregunta bien definida. Necesita claridad
  • Specific: las instrucciones deben ser explícitas y detalladas.
  • Short: mantener las solicitudes concisas y al grano
  • Surround: dar un contexto enriquecido. adaptar los ejemplos y el contexto que demos.

Proporcionar claridad

Ser específico y centrarse en una única cosa.

Escribe una funcion de python para filtrar y devolver números pares de una lista determinada

Proporcionar suficiente contexto con detalles

Una forma con copilot seria establecer comentarios en el top de nuestra clase especificando que es lo que queremos hacer

# write a simple flas app that returns...
# create a function that takes a list of numbers and returns...
# create a sample list of numbers
# create...

# start coding here

(!) Copilot usa las pestañas abiertas paralelas en el editor de código para obtener más contexto (!)

Read More