ludmi
Version:
LU (Layer Understanding) is a lightweight framework for controlled chatbot interactions with LLMs, action orchestration, and retrieval-augmented generation (RAG).
86 lines (79 loc) • 3.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.classifier = exports.getTopic = void 0;
const openai_1 = require("./llm/openai");
const parse_1 = require("./parse");
const getTopic = async ({ topics, conversation, revised, prompts, model = "gpt-4o-mini", temperature = 1, metadata = {} }) => {
//get revised prompt
const revisedPrompt = (revised) ? { content: revised, price: 0 } : await getRevisedPrompt({ prompt: prompts?.revised, conversation, model, temperature, metadata });
const respTopic = await (0, exports.classifier)({
topics,
input: revisedPrompt.content,
prompt: prompts?.topic,
model,
temperature
});
return {
price: respTopic.price + revisedPrompt.price,
revised_prompt: revisedPrompt.content,
topic: respTopic.topic
};
};
exports.getTopic = getTopic;
//Solo clasifica el topic de la entrada del usuario
const classifier = async ({ topics, input, prompt, model = "gpt-4o-mini", temperature = .5 }) => {
const developerInstruction = prompt || `Clasifica la entrada del usuario con las siguientes categorías de topics:
\`${JSON.stringify(topics)}\`
Pasos:
- Analizar con atención a todos los topics'.
- Seleccionar el topic que mejor se ajuste a la entrada del usuario.
- Importante responder SOLO con el nombre del topic seleccionado sin agregar nada extra.
Formato respuesta:
{
"topic": "nombre del topic"
}`;
const messages = [
{ role: "user", content: input },
{ role: "developer", content: developerInstruction },
];
const respTopic = await (0, openai_1.getAIResponse)({ messages, model, temperature });
let topic = "ne";
try {
const parse = (0, parse_1.JSONparse)(respTopic.content);
topic = parse?.topic || parse?.name || "ne";
console.log("Topic clasificado:", topic);
}
catch (error) {
console.error(error);
topic = respTopic.content;
}
return {
price: respTopic.price,
topic
};
};
exports.classifier = classifier;
const getRevisedPrompt = async ({ prompt, conversation, model = "gpt-4o-mini", temperature = 1, metadata = {} }) => {
const developerInstruction = prompt || `ERES UN REFORMULADOR. A qué se refiere el usuario con la última entrada? Reformula el mensaje para que sea más claro, manteniendo el estilo y la intención original.
PASO 1 — ANÁLISIS DE CONTEXTO:
Antes de reformular, analiza si el mensaje del usuario indica una despedida, agradecimiento o un reinicio de conversación (por ejemplo: "ok", "gracias", "ah bueno", "hola", etc.).
Si es así, **ignora completamente los mensajes anteriores** y reformula el mensaje como una expresión aislada, sin suposiciones ni añadidos.
PASO 2 - DIRECCIÓN DEL MENSAJE:
- **Mantén el sujeto, el destinatario y la intención original del mensaje.**
- Si el mensaje está dirigido al asistente, la reformulación debe seguir dirigida al asistente.
- No cambies preguntas en segunda persona ("¿te gusta...?") a primera persona ("¿me gusta...?").
PASO 2 — REFORMULACIÓN:
- Si el mensaje no es un cierre o saludo, interpreta a qué se refiere usando el contexto anterior y reformula el mensaje del usuario con claridad.
IMPORTANTE:
- No agregues nada extra ni expliques lo que haces.
- No cambies el sujeto ni la dirección del mensaje.
- Solo responde con la reformulación del usuario, como si él mismo lo dijera.
- En caso de ser necesario nutrir la entrada del usuario con estos metadatos: ${JSON.stringify(metadata)}`;
;
// Create the message to be sent
const messages = [
...conversation,
{ role: "developer", content: developerInstruction },
];
return await (0, openai_1.getAIResponse)({ messages, model, temperature });
};