{"id":1201,"date":"2026-06-09T08:31:00","date_gmt":"2026-06-09T06:31:00","guid":{"rendered":"https:\/\/www.pinguytaz.net\/?p=1201"},"modified":"2026-06-03T20:24:15","modified_gmt":"2026-06-03T18:24:15","slug":"construyendo-un-agente-de-ia-nativo-con-c-y-llama-cpp-ii","status":"publish","type":"post","link":"https:\/\/www.pinguytaz.net\/index.php\/2026\/06\/09\/construyendo-un-agente-de-ia-nativo-con-c-y-llama-cpp-ii\/","title":{"rendered":"Construyendo un Agente de IA Nativo con C y Llama.cpp (II)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Nos metemos ya en harina con el c\u00f3digo del ejemplo Base, que podemos encontrar en <a href=\"https:\/\/github.com\/pinguytaz\/IA\/tree\/main\/Llama.cpp\/src\/Base\">https:\/\/github.com\/pinguytaz\/IA\/tree\/main\/Llama.cpp\/src\/Base<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para poder usar el programa deberemos descargarnos un modelo preentrenado en formato GGUF, <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La estructura base del programa es:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>                                    &#91;<strong>Inicializar Backend<\/strong>]\n                                            \u2502 llama_backend_init();\n                                            \u25bc\n                                    &#91;<strong>Cargar Modelo<\/strong>]\n                                            Define par\u00e1metros de ejecuci\u00f3n del modelo\n                                            Lee archivo .gguf y carga su vocabulario y pesos.\n                                            |   llama_model_load_from_file(pathModelo, parametrosModelo);\n                                            \u25bc\n                                    &#91;<strong>Crear Contexto<\/strong>]\n                                             Reserva la memoria RAM din\u00e1mica, donde guardamos historia.\n                                            \u2502   llama_init_from_model(modelo, parametrosContexto);\n                                            \u25bc\n                                    &#91;<strong>Tokenizar Prompt<\/strong>]\n                                            llama_model_get_vocab(model); Obtenemos el vocabulario del modelo para tokenizar.\n                                            llama_tokenize() pasa el texto a numero que son los TOKENs\n                                            \u2502\n                                            \u25bc\n                                    &#91;<strong>sampler<\/strong>] Filtro de seleccion de probabilidades\n                                            \u2502\n                                            \u25bc\n                                    &#91;<strong>batch<\/strong>] Procesamiento por lotes\n                                            \u2502\n                                            \u25bc\n                                    &#91;<strong>Bucle de Inferencia<\/strong>] Es el bucle de generaci\u00f3n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La programaci\u00f3n la realizaremos usando el  API de llama.h, con alto nivel \u00abllama\u00bb aunque tambi\u00e9n podriamos utilizar las librer\u00edas de bajo nivel \u00abGGML\u00bb por describimos brevemente que es cada uno:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>GGML<\/strong>: Librer\u00eda de bajo nivel. Se encarga de la matem\u00e1tica pura (multiplicaci\u00f3n de matrices y cuantizaci\u00f3n). <\/li>\n\n\n\n<li><strong>LLAMA<\/strong>: Capa de abstracci\u00f3n de alto nivel. Maneja el modelo, los tokens y el estado del KV Cache. <\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lo primero que hacemos es cargar <strong>Backend<\/strong>, antes de comenzar con el programa, que nos permitir\u00e1 inicializar los recursos de CPU\/GPU.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s cargaremos el modelo en memoria, mapeara el archivo .gguf en memoria, definiendo los par\u00e1metros que nos interesen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>paramModelo_t parametrosModelo = llama_model_default_params();   \/\/ Carga de los parametros por defecto\nparametrosModelo.n_gpu_layers = 0;     \/\/  Forzar ejecuci\u00f3n en CPU\nparametrosModelo.progress_callback = mi_progreso; \/\/Ponemos funci\u00f3n de progeso de carga.\n\n modelo_t *modelo = llama_model_load_from_file(pathModelo, parametrosModelo);   \/\/ Carga modelo.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Con el modelo cargado crearemos el contexto, Crear el espacio de \u00abpensamiento\u00bb donde se guardar\u00e1n los tokens, para disponer de historia y podamos procesar bien los TOKENs, este contexto se va llenando en un chat normal y existen varias formas de borrarlo, esto lo hablaremos m\u00e1s adelante cuando veamos el ejemplo <em><strong>Agente<\/strong><\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    paramContext_t parametrosContexto = llama_context_default_params();\n    parametrosContexto.n_ctx = 2048;  \/\/ Tama\u00f1o contexto\n\n    context_t *contexto = llama_init_from_model(modelo, parametrosContexto);      \/\/ Crear el contexto ligado al modelo<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Con la base creada en el pr\u00f3ximo POST hablaremos de la tokenizaci\u00f3n de de la inferencia que es la llamada al LLM para que nos de respuestas.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nos metemos ya en harina con el c\u00f3digo del ejemplo Base, que podemos encontrar en https:\/\/github.com\/pinguytaz\/IA\/tree\/main\/Llama.cpp\/src\/Base Para poder usar el programa deberemos descargarnos un modelo preentrenado en formato GGUF, La estructura base del programa es: La programaci\u00f3n la realizaremos usando el API de llama.h, con alto nivel \u00abllama\u00bb aunque tambi\u00e9n podriamos utilizar las librer\u00edas de [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1197,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-container-style":"default","site-container-layout":"default","site-sidebar-layout":"default","disable-article-header":"default","disable-site-header":"default","disable-site-footer":"default","disable-content-area-spacing":"default","footnotes":""},"categories":[212],"tags":[215,213],"class_list":["post-1201","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-llama-cpp-ia","tag-llama-cpp","tag-llm"],"_links":{"self":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/1201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/comments?post=1201"}],"version-history":[{"count":4,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/1201\/revisions"}],"predecessor-version":[{"id":1208,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/1201\/revisions\/1208"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/media\/1197"}],"wp:attachment":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/media?parent=1201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/categories?post=1201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/tags?post=1201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}