Pues ya estamos en posición para definir nuestro sistema de agentes IA, lo primero es un breve recordatorio de lo que hace nuestro sistema IA, en el ejemplo Agente se realiza mucho por funciones, y luego explicaremos lo que deberemos añadir.
llama_backend_init();
/************ Cargamos modelo de Memoria para el agente *************/
const char *pathModelo="./modelos/qwen2.5-coder-1.5b-instruct-q4_k_m.gguf";
modelo_t *modelo = cargaModelo(pathModelo);
context_t *contexto = iniciaContexto(modelo);
// Para que no piense en conclusiones, ya que lo que deseamos son funciones a llamar usaremos uno preciso.
sampler_t *miSampler = llama_sampler_chain_init(llama_sampler_chain_default_params());
llama_sampler_chain_add(miSampler, llama_sampler_init_greedy()); // Mas exacta
/************* Cargams el vocabulario ********/
const vocab_t *vocab = llama_model_get_vocab(modelo);
/************** Obtenemos el Rol de System de un fichero pues suele ser grande ****************/
inferencia(rolSystem, prompt,modelo, contexto, miSampler, vocab, respuesta,sizeof(respuesta));
El modelo que utilizaremos es uno que este especializado en generar instrucciones como «qwen2.5-coder-1.5b-instruct-q4_k_m.gguf»
Un sistema agentico nos indicara que funciones debemos llamar y no que nos de explicaciones, por eso crearemos un sampler lo más preciso posible.
Rol-System
Una de las partes importantes de un sistema agentico es que nos responderá indicándonos que funciones puede llamar y no que se comporte como un chat, para eso debemos decirle al sistema como debe comportarse. A continuación podemos ver un Rol-System para un sistema que nos indicara que funciones llamar para obtener la hora o el clima del país que le digamos, le hemos pedido que las funciones nos las indique como «FUNC(funcio:parametros)» para facilitarnos nuestro análisis de la respuesta, normalmente se usa en JSON pero como me gustan las expresiones regulares decidí este formato.
Eres un asistente que debe responder lo mejor que puedas llamando a funciones predefinidas, podrás llamar a una o más funciones para ayudar a generar la consulta del usuario.
FUNCIONES DISPONIBLES
Estas son las funciones disponibles:
FUNC(elTiempo:Madrid) Nos da el tiempo meteorologico: temperatura, lluvias, viento, nubes, clima
FUNC(laFecha) Obtenemos la hora y fecha del sistema.
REGLAS DE OPERACIÓN (ESTRICTAS)
- No converses ni expliques.
- Tu salida debe ser únicamente llamadas a funciones y estas funciones deben ser unicamente las disponibles.
- Si se pregunta por varia localidades se lanzara una funcion por cada una de ellas.
PROTOCOLO de RESPUESTA (Ejemplos)
¿Qué tiempo en Madrid? -> FUNC(elTiempo:Madrid)
¿Qué tiempo hace en Madrid y Barcelona? -> FUNC(elTiempo:Madrid)
FUNC(elTiempo:Barcelona)
¿Qué hora? -> FUNC(laFecha)
¿Tiempo + hora? -> FUNC(elTiempo:Alcobendas)
FUNC(laFecha)
SIEMPRE usa el siguiente formato:
FUNC(funcion:parametro)
Estructura de un Rol-System Robusto
Un prompt de sistema profesional para un agente se divide en tres bloques críticos:
1. Definición de Identidad y Misión
Establece quién es y qué limitaciones tiene. Esto ayuda a que la IA no genere texto innecesario que llene el contexto.
«Eres un asistente que debe responder lo mejor que puedas llamando a funciones predefinidas, podrás llamar a una o más funciones para ayudar a generar la consulta del usuario.»El Protocolo de Comunicación (Formato de Salida)
2.- El Protocolo de Comunicación (Formato de Salida)
Es donde preparas el terreno para tu Regex. Debes ser extremadamente específico con la sintaxis.
«REGLA CRÍTICA: Cuando necesites realizar una acción, DEBES usar estrictamente el formato: ‘FUNC(ACCION:PARAMETROS)’
3.- Funciones disponibles
Daremos la lista de las funciones y las capacidades de esta.
Con el Rol-System definido podemos lanzar las preguntas y recibir si todo esta correcto las funciones a ejecutar, así en el próximo POST analizaremos la respuesta para saber a que funciones llamar.
