skailan-ai
Version:
Servicio de IA y procesamiento de lenguaje natural para Skailan
224 lines (216 loc) • 6.98 kB
JavaScript
import { AIService } from "./AIService";
export class IntentClassificationService {
aiService;
intents;
constructor(llmConfig, intents) {
this.aiService = new AIService(llmConfig);
this.intents = intents || this.getDefaultIntents();
}
async classifyIntent(text) {
const intentsDescription = this.intents
.map((intent) => `- ${intent.name}: ${intent.description}`)
.join("\n");
const prompt = `
Clasifica la intención del siguiente texto y responde en formato JSON:
Texto: "${text}"
Intenciones disponibles:
${intentsDescription}
Responde con un JSON que contenga:
{
"intent": "nombre_de_la_intencion",
"confidence": 0.95,
"entities": [
{
"type": "tipo_entidad",
"value": "valor_extraido",
"confidence": 0.9
}
],
"slots": {
"slot_name": "valor_extraido"
},
"summary": "Breve resumen de la clasificación"
}
Solo responde con el JSON, sin texto adicional.
`;
try {
const response = await this.aiService.generateText(prompt);
const result = JSON.parse(response);
return {
intent: result.intent,
confidence: result.confidence,
entities: result.entities,
slots: result.slots,
summary: result.summary,
};
}
catch (error) {
// Fallback a clasificación básica
return this.fallbackIntentClassification(text);
}
}
async classifyConversationIntent(messages) {
const conversationText = messages
.map((msg) => `${msg.role}: ${msg.content}`)
.join("\n");
const intentsDescription = this.intents
.map((intent) => `- ${intent.name}: ${intent.description}`)
.join("\n");
const prompt = `
Clasifica la intención principal de esta conversación y responde en formato JSON:
Conversación:
${conversationText}
Intenciones disponibles:
${intentsDescription}
Responde con un JSON que contenga:
{
"intent": "nombre_de_la_intencion",
"confidence": 0.95,
"entities": [
{
"type": "tipo_entidad",
"value": "valor_extraido",
"confidence": 0.9
}
],
"slots": {
"slot_name": "valor_extraido"
},
"summary": "Resumen de la intención de la conversación"
}
Solo responde con el JSON, sin texto adicional.
`;
try {
const response = await this.aiService.generateText(prompt);
const result = JSON.parse(response);
return {
intent: result.intent,
confidence: result.confidence,
entities: result.entities,
slots: result.slots,
summary: result.summary,
};
}
catch (error) {
return this.fallbackIntentClassification(conversationText);
}
}
addIntent(intent) {
this.intents.push(intent);
}
removeIntent(intentName) {
this.intents = this.intents.filter((intent) => intent.name !== intentName);
}
getIntents() {
return [...this.intents];
}
getDefaultIntents() {
return [
{
name: "greeting",
description: "Saludos y presentaciones",
examples: ["hola", "buenos días", "cómo estás"],
},
{
name: "farewell",
description: "Despedidas",
examples: ["adiós", "hasta luego", "nos vemos"],
},
{
name: "question",
description: "Preguntas generales",
examples: ["qué es", "cómo funciona", "cuándo"],
},
{
name: "complaint",
description: "Quejas y problemas",
examples: ["tengo un problema", "no funciona", "estoy molesto"],
},
{
name: "praise",
description: "Elogios y agradecimientos",
examples: ["excelente servicio", "gracias", "muy bueno"],
},
{
name: "request_info",
description: "Solicitud de información",
examples: ["necesito información", "cuéntame más", "dime sobre"],
},
{
name: "request_action",
description: "Solicitud de acción",
examples: ["quiero que hagas", "necesito que", "por favor"],
},
{
name: "confirmation",
description: "Confirmaciones",
examples: ["sí", "correcto", "exacto", "confirmo"],
},
{
name: "denial",
description: "Negaciones",
examples: ["no", "incorrecto", "no es así"],
},
{
name: "unknown",
description: "Intención no reconocida",
examples: [],
},
];
}
fallbackIntentClassification(text) {
const lowerText = text.toLowerCase();
// Clasificación básica basada en palabras clave
if (lowerText.includes("hola") ||
lowerText.includes("buenos días") ||
lowerText.includes("cómo estás")) {
return {
intent: "greeting",
confidence: 0.8,
summary: "Clasificado como saludo",
};
}
if (lowerText.includes("adiós") ||
lowerText.includes("hasta luego") ||
lowerText.includes("nos vemos")) {
return {
intent: "farewell",
confidence: 0.8,
summary: "Clasificado como despedida",
};
}
if (lowerText.includes("problema") ||
lowerText.includes("error") ||
lowerText.includes("no funciona")) {
return {
intent: "complaint",
confidence: 0.7,
summary: "Clasificado como queja",
};
}
if (lowerText.includes("gracias") ||
lowerText.includes("excelente") ||
lowerText.includes("muy bueno")) {
return {
intent: "praise",
confidence: 0.7,
summary: "Clasificado como elogio",
};
}
if (lowerText.includes("qué") ||
lowerText.includes("cómo") ||
lowerText.includes("cuándo")) {
return {
intent: "question",
confidence: 0.6,
summary: "Clasificado como pregunta",
};
}
return {
intent: "unknown",
confidence: 0.5,
summary: "Intención no reconocida",
};
}
}
//# sourceMappingURL=IntentClassificationService.js.map