Tutorial: Integracion de IA

HarbourBuilder proporciona dos componentes de IA complementarios: TOllama para conectarse a modelos de lenguaje locales a traves del servicio Ollama, y TTransformer para cargar y ejecutar modelos transformer directamente en proceso. Este tutorial cubre ambos enfoques con ejemplos de trabajo completos.

Parte 1: TOllama — Chat con un LLM Local

Paso 1: Prerrequisitos

  1. Instale Ollama en su maquina.
  2. Obtenga un modelo: ejecute ollama pull llama3 en su terminal.
  3. Asegurese de que Ollama este en ejecucion (escucha en http://localhost:11434 de forma predeterminada).
No se requieren claves de API

TOllama se conecta a una instancia local de Ollama. Toda la inferencia ocurre en su maquina — sin servicios en la nube, sin claves de API, ningun dato sale de su computadora.

Paso 2: Crear la Interfaz de Chat

Construya un formulario con un Memo para el historial de conversacion, un TextBox para la entrada del usuario y un boton de Enviar.

#include "hbbuilder.ch"

function Main()

   local oForm, oMemo, oGetPrompt, oBtnSend, oOllama
   local cPrompt := ""

   // --- Conectar a Ollama ---
   DEFINE OLLAMA oOllama ;
      URL "http://localhost:11434" ;
      MODEL "llama3"

   // --- Construir la UI ---
   DEFINE FORM oForm TITLE "Chat IA" ;
      SIZE 700, 550 FONT "Segoe UI", 10

   @ 10, 10 MEMO oMemo ;
      OF oForm SIZE 660, 420 ;
      READONLY

   @ 440, 10 GET oGetPrompt VAR cPrompt ;
      OF oForm SIZE 540, 28

   @ 440, 560 BUTTON oBtnSend PROMPT "Enviar" ;
      OF oForm SIZE 110, 32 ;
      ACTION SendMessage( oOllama, oMemo, oGetPrompt )

   ACTIVATE FORM oForm CENTERED

return nil

Paso 3: Enviar un Mensaje y Obtener una Respuesta

Use oOllama:Chat() para una solicitud/respuesta simple, o oOllama:ChatStream() para recibir la respuesta token por token mientras se genera.

Chat simple (bloqueante):

static function SendMessage( oOllama, oMemo, oGetPrompt )

   local cPrompt  := oGetPrompt:GetValue()
   local cResponse

   if Empty( cPrompt )
      return nil
   endif

   // Mostrar mensaje del usuario
   oMemo:Append( "Usted: " + cPrompt + Chr( 13 ) + Chr( 10 ) )
   oGetPrompt:SetValue( "" )

   // Obtener respuesta de IA
   cResponse := oOllama:Chat( cPrompt )

   oMemo:Append( "IA: " + cResponse + Chr( 13 ) + Chr( 10 ) + Chr( 13 ) + Chr( 10 ) )

return nil

Paso 4: Respuesta en Flujo hacia un Memo

Para una mejor experiencia de usuario, transmita la respuesta para que los tokens aparezcan en el Memo mientras se generan — igual que una interfaz de chat real.

static function SendMessageStream( oOllama, oMemo, oGetPrompt )

   local cPrompt := oGetPrompt:GetValue()

   if Empty( cPrompt )
      return nil
   endif

   oMemo:Append( "Usted: " + cPrompt + Chr( 13 ) + Chr( 10 ) )
   oMemo:Append( "IA: " )
   oGetPrompt:SetValue( "" )

   // Transmitir tokens uno por uno al Memo
   oOllama:ChatStream( cPrompt, { |cToken| oMemo:Append( cToken ) } )

   oMemo:Append( Chr( 13 ) + Chr( 10 ) + Chr( 13 ) + Chr( 10 ) )

return nil
Historial de conversacion

TOllama mantiene un historial de conversacion internamente. Cada llamada a Chat() o ChatStream() incluye mensajes anteriores como contexto. Llame a oOllama:ClearHistory() para iniciar una conversacion nueva.

Paso 5: Propiedades y Metodos de TOllama

Miembro Tipo Descripcion
cUrl Propiedad URL del servidor Ollama (predeterminado "http://localhost:11434").
cModel Propiedad Nombre del modelo (ej. "llama3", "mistral", "codellama").
nTemperature Propiedad Temperatura de muestreo (0.0 – 2.0, predeterminado 0.7).
Chat( cPrompt ) Metodo Enviar un prompt y devolver la respuesta completa como cadena.
ChatStream( cPrompt, bCallback ) Metodo Transmitir la respuesta, llamando a bCallback con cada token.
SetSystem( cText ) Metodo Establecer el prompt del sistema que guia el comportamiento del modelo.
ClearHistory() Metodo Restablecer el historial de conversacion.

Parte 2: TTransformer — Inferencia en Proceso

Para escenarios donde necesita ejecutar un modelo sin un servicio externo, HarbourBuilder proporciona TTransformer. Este componente carga pesos de modelo (formato GGUF) directamente en la memoria de su aplicacion y ejecuta inferencia usando la CPU (o GPU si esta disponible).

Paso 1: Obtener un Archivo de Modelo

  1. Descargue un archivo de modelo GGUF (ej. tinyllama-1.1b-chat.Q4_K_M.gguf de Hugging Face).
  2. Coloquelo en su carpeta de proyecto o una ruta conocida.
El tamano del modelo importa

Los modelos cuantizados mas pequenos (Q4_K_M, Q5_K_M) funcionan bien en la mayoria del hardware. Un modelo de 1B–3B parametros con cuantizacion Q4 necesita solo 1–2 GB de RAM. Modelos mas grandes requieren mas memoria y una GPU.

Paso 2: Cargar el Modelo

#include "hbbuilder.ch"

function Main()

   local oForm, oMemo, oGetPrompt, oBtnRun, oTransformer

   // --- Cargar el modelo transformer ---
   DEFINE TRANSFORMER oTransformer ;
      MODEL "models/tinyllama-1.1b-chat.Q4_K_M.gguf" ;
      CONTEXT 2048 ;
      GPU_LAYERS 0  // Establecer > 0 para descargar capas a GPU

   if .not. oTransformer:lLoaded
      MsgAlert( "Error al cargar el modelo: " + oTransformer:cError )
      return nil
   endif

   // --- Construir la UI ---
   DEFINE FORM oForm TITLE "Demo TTransformer" ;
      SIZE 700, 550 FONT "Segoe UI", 10

   @ 10, 10 MEMO oMemo ;
      OF oForm SIZE 660, 420 ;
      READONLY

   @ 440, 10 GET oGetPrompt VAR cPrompt ;
      OF oForm SIZE 540, 28

   @ 440, 560 BUTTON oBtnRun PROMPT "Ejecutar" ;
      OF oForm SIZE 110, 32 ;
      ACTION RunInference( oTransformer, oMemo, oGetPrompt )

   ACTIVATE FORM oForm CENTERED

return nil

Paso 3: Ejecutar Inferencia

Use Generate() para una respuesta completa o GenerateStream() para transmitir tokens a un control Memo mientras se producen.

static function RunInference( oTransformer, oMemo, oGetPrompt )

   local cPrompt := oGetPrompt:GetValue()

   if Empty( cPrompt )
      return nil
   endif

   oMemo:Append( "Prompt: " + cPrompt + Chr( 13 ) + Chr( 10 ) )
   oMemo:Append( "Respuesta: " )
   oGetPrompt:SetValue( "" )

   // Salida token por token
   oTransformer:GenerateStream( cPrompt, ;
      { |cToken| oMemo:Append( cToken ) }, ;  // en cada token
      256 )  // max tokens

   oMemo:Append( Chr( 13 ) + Chr( 10 ) + Chr( 13 ) + Chr( 10 ) )

return nil

Paso 4: Propiedades y Metodos de TTransformer

Miembro Tipo Descripcion
cModel Propiedad Ruta al archivo de modelo GGUF.
nContext Propiedad Tamano de ventana de contexto en tokens (predeterminado 2048).
nGpuLayers Propiedad Numero de capas a descargar a GPU (0 = solo CPU).
lLoaded Propiedad .T. si el modelo se cargo exitosamente.
Generate( cPrompt, nMaxTokens ) Metodo Ejecutar inferencia y devolver la salida completa como cadena.
GenerateStream( cPrompt, bCallback, nMaxTokens ) Metodo Transmitir tokens de salida via callback.
Tokenize( cText ) Metodo Devolver un arreglo de IDs de tokens para el texto dado.

Cuando Usar Cual

graph LR A{"Necesita IA?"} -->|"Chat LLM completo
historial de conversacion"| B["TOllama
Servicio Ollama"] A -->|"Inferencia embebida
sin dependencias externas"| C["TTransformer
GGUF en proceso"] B --> D["Ventajas: facil configuracion
muchos modelos
intercambio rapido de modelos"] C --> E["Ventajas: sin servidor
ejecutable unico
capacidad sin conexion"] style A fill:#d2a8ff,stroke:#bc8cff,color:#0d1117 style B fill:#58a6ff,stroke:#388bfd,color:#0d1117 style C fill:#3fb950,stroke:#2ea043,color:#0d1117 style D fill:#58a6ff,stroke:#388bfd,color:#0d1117 style E fill:#3fb950,stroke:#2ea043,color:#0d1117
Combinar ambos enfoques

Puede usar TOllama para tareas pesadas de chat y TTransformer para tareas de clasificacion ligera y rapida o incrustaciones — ambos en la misma aplicacion.

Explorar mas

Vea la referencia de la Paleta de Componentes de IA para la lista completa de componentes de IA incluyendo TEmbedding, TRAGEngine y TSpeechToText.

En Esta Página

Primeros Pasos Paleta de Componentes Funciones del IDE Tutoriales Referencia Plataformas Parte 1: TOllama — Chat con un LLM Local Paso 1: Prerrequisitos Paso 2: Crear la Interfaz de Chat Paso 3: Enviar un Mensaje y Obtener una Respuesta Paso 4: Respuesta en Flujo hacia un Memo Paso 5: Propiedades y Metodos de TOllama Parte 2: TTransformer — Inferencia en Proceso Paso 1: Obtener un Archivo de Modelo Paso 2: Cargar el Modelo Paso 3: Ejecutar Inferencia Paso 4: Propiedades y Metodos de TTransformer Cuando Usar Cual