Este artículo explica cómo crear un agente de inteligencia artificial para Recursos Humanos utilizando GPT-OSS y Elastic Agent Builder. El agente responderá preguntas sobre datos de empleados sin enviar información a servicios externos como OpenAI o Anthropic. Usaremos LM Studio para ejecutar GPT-OSS localmente y conectarlo a Elastic Agent Builder.
Al finalizar, tendrás un agente de IA personalizado capaz de interpretar consultas en lenguaje natural sobre tu base de empleados, manteniendo el control total sobre los datos y el modelo.
Requisitos previos
- Elastic Cloud 9.2 (managed, serverless o local)
- Máquina con al menos 16 GB de RAM (recomendado 32 GB para GPT-OSS 20B)
- LM Studio instalado
- Docker Desktop instalado
¿Por qué GPT-OSS?
Ejecutar un LLM local permite desplegarlo en tu propia infraestructura y ajustarlo a tus necesidades, manteniendo el control de los datos compartidos con el modelo y sin pagar licencias a proveedores externos. OpenAI lanzó GPT-OSS el 5 de agosto de 2025 como parte de su compromiso con el ecosistema de modelos abiertos. Este modelo de 20B parámetros ofrece capacidad de uso de herramientas, inferencia eficiente, compatibilidad con el SDK de OpenAI y soporte para flujos de trabajo agentivos. En benchmarks comparativos (fuente), muestra resultados competitivos en tareas de razonamiento y generación de código.
Arquitectura de la solución
Todo el sistema se ejecuta localmente: Elastic (dentro de Docker) se comunica con el LLM local a través de LM Studio. Elastic Agent Builder utiliza esta conexión para crear agentes de IA que pueden consultar los datos de empleados indexados en Elasticsearch.
Pasos para construir el agente de IA para RH
1. Configurar LM Studio con GPT-OSS 20B
Descarga e instala LM Studio desde su sitio oficial. Abre la aplicación y ve a la pestaña de búsqueda. Busca "GPT-OSS" y selecciona openai/gpt-oss-20b. Haz clic en descargar (el archivo pesa ~12.1 GB). Una vez descargado, ve a la pestaña "Local Server", elige el modelo, usa el puerto predeterminado 1234. En el panel derecho, en "Load", establece el "Context Length" a 40000 o superior. Haz clic en "Start Server". Deberías ver:
[LM STUDIO SERVER] Success! HTTP server listening on port 1234
[LM STUDIO SERVER] Supported endpoints:
[LM STUDIO SERVER] -> GET http://localhost:1234/v1/models
[LM STUDIO SERVER] -> POST http://localhost:1234/v1/responses
[LM STUDIO SERVER] -> POST http://localhost:1234/v1/chat/completions
[LM STUDIO SERVER] -> POST http://localhost:1234/v1/completions
[LM STUDIO SERVER] -> POST http://localhost:1234/v1/embeddings
Server started.
2. Desplegar Elastic local con Docker
Ejecuta el script oficial de Elastic para inicio local:
curl -fsSL https://elastic.co/start-local | sh
El script descargará y configurará Elasticserach y Kibana con Docker Compose, y activará una licencia de prueba Platinum de 30 días. Al finalizar, verás algo como:
Congrats, Elasticsearch and Kibana are installed and running in Docker!
🌐 Open your browser at http://localhost:5601
Username: elastic
Password: KSUlOMNr
🔌 Elasticsearch API endpoint: http://localhost:9200
🔑 API key: cnJGX0pwb0JhOG00cmNJVklUNXg6cnNJdXZWMnM4bncwMllpQlFlUTlWdw==
Accede a Kibana en http://localhost:5601 con esas credenciales. Luego navega a Management > AI > Agent Builder y actívalo.
3. Crear el conector OpenAI en Elastic
En Kibana, ve a Project Settings > Management > Alerts and Insights > Connectors. Haz clic en "Create Connector" y selecciona "OpenAI". LM Studio es compatible con el SDK de OpenAI. Configura:
- Connector name:
LM Studio - GPT-OSS 20B - Select an OpenAI provider:
Other (OpenAI Compatible Service) - URL:
http://host.docker.internal:1234/v1/chat/completions - Default model:
openai/gpt-oss-20b - API Key:
testkey-123(cualquier texto, LM Studio no requiere autenticación)
Importante: activa "Enable native function calling". Sin esto, el Agent Builder no funcionará correctamente. Guarda y prueba. Deberías recibir una respuesta exitosa como:
{
"status": "ok",
"data": {
"id": "chatcmpl-flj9h0hy4wcx4bfson00an",
"object": "chat.completion",
"created": 1761189456,
"model": "openai/gpt-oss-20b",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "Hello! 👋 How can I assist you today?",
"reasoning": "Just greet.",
"tool_calls": []
},
"finish_reason": "stop"
}],
"usage": {
"prompt_tokens": 69,
"completion_tokens": 23,
"total_tokens": 92
}
}
}
4. Subir datos de empleados a Elasticsearch
Generamos un dataset ficticio con la siguiente estructura:
{
"employee_id": "0f4dce68-2a09-4cb1-b2af-6bcb4821539b",
"full_name": "Daffi Stiebler",
"email": "lscutchings0@huffingtonpost.com",
"date_of_birth": "1975-06-20T15:39:36Z",
"hire_date": "2025-07-28T00:10:45Z",
"job_title": "Physical Therapy Assistant",
"department": "HR",
"salary": "108455",
"performance_rating": "Needs Improvement",
"years_of_experience": 2,
"skills": "Java",
"education_level": "Master's Degree",
"manager": "Carl MacGibbon",
"emergency_contact": "Leigha Scutchings",
"home_address": "5571 6th Park"
}
Creamos un índice con mapeo que incluya un campo semantic_text para búsqueda semántica:
PUT hr_employees
{
"mappings": {
"properties": {
"@timestamp": { "type": "date" },
"employee_id": { "type": "keyword" },
"full_name": { "type": "text", "copy_to": "employee_semantic" },
"email": { "type": "keyword" },
"date_of_birth": { "type": "date", "format": "iso8601" },
"hire_date": { "type": "date", "format": "iso8601" },
"job_title": { "type": "text", "copy_to": "employee_semantic" },
"department": { "type": "text", "copy_to": "employee_semantic" },
"salary": { "type": "double" },
"performance_rating": { "type": "text", "copy_to": "employee_semantic" },
"years_of_experience": { "type": "long" },
"skills": { "type": "text", "copy_to": "employee_semantic" },
"education_level": { "type": "text", "copy_to": "employee_semantic" },
"manager": { "type": "text", "copy_to": "employee_semantic" },
"emergency_contact": { "type": "keyword" },
"home_address": { "type": "keyword" },
"employee_semantic": { "type": "semantic_text" }
}
}
}
Luego indexamos los datos usando Bulk API. Por ejemplo, desde Dev Tools de Kibana:
POST hr_employees/_bulk
{"index": {}}
{"employee_id": "57728b91-e5d7-4fa8-954a-2384040d3886", "full_name": "Filide Gane", "email": "vhallahan1@booking.com", "job_title": "Business Systems Development Analyst", "department": "Marketing", "salary": "$52330.27", "performance_rating": "Meets Expectations", "years_of_experience": 12, "skills": "Java", "education_level": "Bachelor's Degree", "date_of_birth": "2000-02-07T16:49:32Z", "hire_date": "2023-11-07T13:03:16Z", "manager": "Freedman Kings", "emergency_contact": "Vilhelmina Hallahan", "home_address": "75 Dennis Junction"}
{"index": {}}
{"employee_id": "...", ...}
Verifica la indexación con GET hr_employees/_search.
5. Construir y probar el agente de IA
Antes de crear el agente, debemos configurar Agent Builder para usar el conector personalizado. Ve a Project Settings > Management > GenAI Settings, selecciona el conector "LM Studio - GPT-OSS 20B" y guarda.
Luego, en Agents, haz clic en "Create a new agent". Configura:
- Agent ID:
hr_assistant - Display name:
HR Analytics Assistant - Display description:
A specialized AI assistant for Human Resources that helps analyze employee data, compensation, performance metrics, and talent management. - Custom instructions:
You are an HR Analytics Assistant that helps answer questions about employee data. When responding to queries: - Provide clear, concise answers - Include relevant employee details (name, department, salary, skills) - Format monetary values with currency symbols - Be professional and maintain data confidentiality - Labels:
Human Resources,GPT-OSS
Guarda el agente. Ahora puedes probarlo con consultas como:
Which employee is the one with the highest salary in the hr_employees index?
El agente, usando el conector GPT-OSS, interpretará la intención, generará una consulta Elasticsearch (ya sea mediante herramientas integradas o ES|QL), recuperará los datos y los presentará en lenguaje natural. El modelo GPT-OSS entiende el contexto y no requiere conocer nombres exactos de campos ni sintaxsi de consulta.