Posts From Category: llm

MCP (Model Context Protocol)

Un MCP Server (Model Context Protocol) es un componente que implemente el protocolo MCP, un estándar abierto diseñado para conectar LLMs y agentes de IA con datos y herramientas externas de forma segura y estándar.

Dotan a los LLMs de capacidades adicionales permitiendo:

  • Acceso a datos en tiempo real: conectar la IA a APIs, BBDD, archivos locales…
  • Automatizaciones: permiten que los agentes no solo respondan, si no que ejecuten acciones (ejecutar flujos, crear registros, aprobar procesos)

Sin esto, los LLMs por sí solos están limitados a sus datos de entrenamiento.

(como funciona MCP - se conecta a diferentes fuentes de información independientemente de cuáles sean)

Read More

LLM Hyperparameters

Hyperparameters are configuration settings which are manually tuned to optimize efficiency or response creativity.

Los hyperparámetros son settings de configuración, los cuales se configuran manualmente para optimizar la eficiencia o la creatividad de la respuesta

Temperature (creatividad)

La temperatura controla la cuanto riesgo acepta el modelo a la hora de elegir las siguientes palabras. Controla la probabilidad de distribución de las siguientes palabras.

  • Low (0.2-0.3): El modelo es cauto y elige las palabras más probables. Output factual y predecible.
  • Medium (0.5-0.7): Un mix de confiabilidad y engagement
  • High (0.9-1.0): Toma riesgos y es impredecible

Respuesta posibles con la siguiente frase

Once upon a time, there was a dragon…

  • Temp 0.2: …who lived in a cave guarding treasure
  • Temp 0.7: …who dreamed of becoming friends with the villagers
  • Temp 1.0: …who loved baking cookies and singing karaoke

Cuanta más alta la temperatura, más imaginativo, creativo y loco es el modelo.

Top-k (candidate pool fija)

Top-k es un filtro de candidatos más probables. Fuerza al modelo a elegir el siguiente token sobre una pool k de candidatos. Límite de tamaño fijo.

Candidatos posibles con la siguiente frase

I like to drink…

  • small k (5): El modelo solo tiene unas pocas elecciones posibles, las cuales serán las más seguras posibles. Ej: [water, coffee, tea, juice, milk]
  • large k (50k): El modelo puede elegir de unas opciones muy ampliar. Amplía la variedad pero también la posibilidad de que salgan resultados inesperados Ej: […, smothies, kombucha, cocktails, hot chocolate, …]

La contra que tiene es que si el modelo está muy seguro, puede incluir tokens con una baja probabilidad solo por el hecho que tiene que llegar hasta k candidatos.

Read More

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.

[Read more on this]([High-level summary of the AI Act EU Artificial Intelligence Act](https://artificialintelligenceact.eu/high-level-summary/))

ISO/IEC 42001

Standard internacional que especifica los requerimientos para establecer, implementar, mantener y mejorar un Artificial Intelligence Management Systen (AIMS) dentro de organizaciones.

Read more on this

Read More

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

Read More

Chunking techniques (RAG)

En el contexto de RAG, chunking es el proceso de partir la información que contienen nuestros documentos en pedazos digestibles. Estos chunks los usaremos después para hacer queries contra ellos.

A veces si parece que no obtenemos los resultados que queremos de nuestras queries no es por falta de información, si no por un mal chunking. Si hacemos una query y por cómo hemos partido nuestros documentos tenemos la pregunta en un chunk y partes de la respuesta divididas entre múltiples chunks sin solapamiento, no obtendremos buenas respuestas.

La idea es simple, el proceso no tanto. Hay varias técnicas según lo que nos queramos complicar y los resultados que obtenemos varían entre ellas.

Chunking estático

El más simple. Tenemos un documento y partimos cada (por ejemplo) 500 tokens con 100 tokens de solapamiento entre chunks.

Tenemos la siguiente frase de prueba

La casa grande es bonita aunque cara, pero tiene un buen garaje. En el futuro quiero comprarme un coche

Visualizando los tokens a nivel de subword con test-multilingual-embedding me salen con 28 tokens aprox. ![[Pasted image 20260306132554.png]]

Si establecemos un limite de 10 tokens por chunk, con 3 de solapamiento, cada chunk se podría ver así:

La casa grande es bonita aunque cara
aunque cara, pero tiene un buen garaje
buen garaje. En el futuro quiero comprar
quiero comprarme un coche

El problema es que puede cortar frases a media palabra según como coincida ya que la palabra bonita son dos tokens bonit y a

Esto se puede aliviar un poco con librerías de chunking inteligente que existen que parten usando separadores como espacios o saltos de línea, pero el contexto se puede perder mucho si cae entre varios chunks.

Chunking semántico

Una técnica que solventa esto es hacer el chunking mediante un modelo de embedding, el cual parte los chunks por contenido semántico cuando detecta que el tema principal cambia. Es más caro porque un modelo tiene que analizar los documentos, pero da mejores resultados.

De esta manera el mismo texto nos quedaría en dos chunks que aunque tienen distinto tamaño, están mucho más contenidos, por lo que a la hora de buscar con una query nos dará mejores resultados.

La casa grande es bonita aunque cara, pero tiene un buen garaje.
En el futuro quiero comprarme un coche

Limpieza

Limpiar los chunks es tan importante como el dónde partir. En mis primeras pruebas se metía mucho ruido en cosmos por como \n o \t o chunks que solo contenían un número sin contexto ninguno.

Para sistemas grandes o genéricos puede ser importante meter metadatos junto a los chunks para filtrar luego al buscar. Cosas como el nombre del documento al que pertenece un chunk o la fecha de creación del documento ayudan a filtrar luego y favorecer documentación reciente o saber de dónde viene algún dato erróneo o con menor calidad.

Read More

RAG implementation

El código para mi implementación está aquí en GitHub

Requerimientos

  • LangChain
  • Un modelo de embeddings (text-embedding-3-large)
  • Un modelo de chat (gpt-4.1)
  • Una base de datos vectorial (CosmosDB)
  • PyPDF (libreria para chunking inteligente)
  • Documentos como base de conocimiento para el RAG (documentos sobre una herramienta propietaria)

Sobre CosmosDB for NoSQL: Se puede usar como una base NoSQL tradicional pero también soporta búsqueda nativa con vectores (hay que habilitarlo primero y establecer una policy vectorial). Yo la uso en vez de ChromaDB por estar en Azure y ser entorno Microsoft ya que personalmente me entra dentro del tier gratuito. Si no, ChromaDB es una buena opción gratuita.

Implementación

Se divide en tres procesos:

Habilitar búsqueda vectorial para CosmosDB. Tras hacer el siguiente paso, podemos ejecutar el script para recrear el contenedor con una policy para vectores

(dentro de CosmsoDB) Settings < Features < Vector Search for NoSQL API < Enable

Cargar documentos en CosmosDB:

  • Cargamos los documentos en memoria
  • Los dividimos en chunks
  • Limpiamos los chunks de caracteres especiales (\n, \t, \r)
  • Creamos los embeddings en batches
  • Para cada chunk subimos el original y su embeddings

Realizar una query:

  • Obtenemos los embeddings para la query (tiene que ser el mismo modelo que se usó para crear los embeddings de los ficheros)
  • Hacer una búsqueda vectorial en CosmosDB para sacar el texto original de los chunks con contexto relevante a nuestra query
  • Invocar el modelo de chat a través de LangChain, pasándole ambos pregunta y chunks con contexto en la misma llamada

Conceptos aprendidos

Calidad del dato

La calidad del dato es de máxima importancia. Hay que revisar manualmente los datos que se meten y ver que sean aporten valor. Si metemos datos que no aporten, solo generamos ruido.

También hay que revisar que los PDFs sean texto puro, ya que si son puramente imágenes o contienen imágenes importantes habrá que pasarlos por algún tipo de OCR para extraer texto.

Chunking

La parte de dónde y cómo hacer chunking es complicada. Lo importante es que haya un buen overlap entre chunks para que la respuesta a tu pregunta no caiga en tierra de nadie. Yo estoy probando con un chunk_size de 500 tokens y un overlap de 100 tokens.

Limpiar los chunks después de partirlos es igual de importante. En mis primeras pruebas se metían en cosmos muchos caracteres como \n o \t y esto genera mucho ruido.

Para sistemas grandes o genéricos puede ser importante meter metadatos junto a los chunks para filtrar luego al buscar. Cosas como el nombre del documento al que pertenece un chunk o la fecha de creación del documento ayudan a filtrar luego y favorecer documentación reciente o saber de dónde viene algún dato erróneo o con menor calidad.

Debilidades BBDD Vectorial

Una base de datos vectorial es muy buena para hacer búsquedas relacionadas o búsquedas semánticas, pero se queda corta para hacer búsquedas por keywords. En esas situaciones se puede implementar una búsqueda híbrida (algoritmo BM25).

Referencia(s)

RAG Systems in 5 Levels of Difficulty (With Full Code) | Data Science Collective *RAG vs Fine Tuning. The Great LLM Showdown | by Agneya Pathare | Medium

Read More

Embeddings, Vector Search & BM25

Un ordenador no puede entender texto ni relación semántica o significado 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

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

Read More

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

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.

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

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.

Read More

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”.

Read More

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

Read More

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

Interact with Github Copilot

Inline Chat

  1. Seleccionar el código para la query
  2. alt + ç
  3. hacer la pregunta

Algunos comandos útiles para inline chat son

  • /doc - añade comentarios al código
  • /explain - conseguir explicaciones sobre código
  • /fix - propose fixes for problems in the selected code
  • /generate - generar código para responder a una pregunta específica
  • /optimize - analizar y optimizar código seleccionado
  • /tests - generates unit tests for the selected code
  • /comment - converts comments into code snippets
  • /suggest - offer code suggestions based on the current context

Comments to code

You write a comment and the function name/input and when you hit Enter copilot completes with code

# function to iterate all prompts and print them
def iterate_and_print(prompts):

then copilot completes it to this

# function to iterate all prompts and print them
def iterate_and_print(prompts):
    for idx, prompt in enumerate(prompts):
        var_name = chr(ord('A') + idx)
        print(f"Prompt {var_name}:\n{prompt}\n")

Read More

Ollama & OpenWeb UI (local LLMs)

Ollama’s github repository (to check for updates)
Ollama’s web (to check for models)
OpenWeb UI (to check for docker commands)

Install locally

Prerequisites

I’m running OpenWeb UI through docker.

First of all check you have docker.desktop open. It may tell you to update WSL. Afterwards please check your docker is able to run containers

docker run hello-world

Ollama

ollama ls # see local models
ollama run gpt-oss # run model
ollama rm gemma3 # delete model

inside a model

/? # see help

# this creates a 'blueprint' you can save and load multiple times to give the LLM some context
/save <model>
/load <model>

/clear
/bye (or ctrl+D)

Read More