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
- Instale Ollama en su maquina.
- Obtenga un modelo: ejecute
ollama pull llama3en su terminal. - Asegurese de que Ollama este en ejecucion (escucha en
http://localhost:11434de forma predeterminada).
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
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
- Descargue un archivo de modelo GGUF (ej.
tinyllama-1.1b-chat.Q4_K_M.ggufde Hugging Face). - Coloquelo en su carpeta de proyecto o una ruta conocida.
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
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
Puede usar TOllama para tareas pesadas de chat y TTransformer para tareas de clasificacion ligera y rapida o incrustaciones — ambos en la misma aplicacion.
Vea la referencia de la Paleta de Componentes de IA para la lista completa de componentes de IA incluyendo TEmbedding, TRAGEngine y TSpeechToText.