feat: agregar lógica para identificar respuestas fuera de tema y mejorar la clasificación de contenido relacionado con programación
This commit is contained in:
@@ -84,9 +84,42 @@ fn tokenize_significant_terms(text: &str) -> Vec<String> {
|
|||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn contains_any_keyword(text: &str, keywords: &[&str]) -> bool {
|
||||||
|
let lc = text.to_lowercase();
|
||||||
|
keywords.iter().any(|k| lc.contains(k))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_programming_related(text: &str) -> bool {
|
||||||
|
const PROGRAMMING_KEYWORDS: [&str; 20] = [
|
||||||
|
"c++", "cpp", "python", "java", "javascript", "typescript", "rust", "golang", "fibonacci",
|
||||||
|
"algoritmo", "algorithm", "recursiv", "funcion", "function", "codigo", "program", "compilar",
|
||||||
|
"compilar", "array", "puntero",
|
||||||
|
];
|
||||||
|
contains_any_keyword(text, &PROGRAMMING_KEYWORDS)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn looks_like_off_topic_response(response: &str) -> bool {
|
||||||
|
const OFF_TOPIC_RESPONSE_MARKERS: [&str; 10] = [
|
||||||
|
"si deseas saber",
|
||||||
|
"puedo darte una pista",
|
||||||
|
"fibonacci",
|
||||||
|
"c++",
|
||||||
|
"```",
|
||||||
|
"algoritmo",
|
||||||
|
"recursiv",
|
||||||
|
"int fibonacci",
|
||||||
|
"tiempo de complejidad",
|
||||||
|
"memorizaci",
|
||||||
|
];
|
||||||
|
contains_any_keyword(response, &OFF_TOPIC_RESPONSE_MARKERS)
|
||||||
|
}
|
||||||
|
|
||||||
fn heuristic_out_of_scope(message: &str, lesson_scope: &str) -> bool {
|
fn heuristic_out_of_scope(message: &str, lesson_scope: &str) -> bool {
|
||||||
let msg_terms = tokenize_significant_terms(message);
|
let msg_terms = tokenize_significant_terms(message);
|
||||||
if msg_terms.len() < 3 {
|
if msg_terms.len() < 3 {
|
||||||
|
if is_programming_related(message) && !is_programming_related(lesson_scope) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,7 +129,11 @@ fn heuristic_out_of_scope(message: &str, lesson_scope: &str) -> bool {
|
|||||||
.filter(|term| scope_lc.contains(term.as_str()))
|
.filter(|term| scope_lc.contains(term.as_str()))
|
||||||
.count();
|
.count();
|
||||||
|
|
||||||
overlap == 0
|
if is_programming_related(message) && !is_programming_related(lesson_scope) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
overlap <= 1
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn get_me(
|
pub async fn get_me(
|
||||||
@@ -3834,11 +3871,20 @@ pub async fn chat_with_tutor(
|
|||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
let tutor_response = ai_data["choices"][0]["message"]["content"]
|
let raw_tutor_response = ai_data["choices"][0]["message"]["content"]
|
||||||
.as_str()
|
.as_str()
|
||||||
.unwrap_or("Lo siento, tuve un problema procesando tu pregunta.")
|
.unwrap_or("Lo siento, tuve un problema procesando tu pregunta.")
|
||||||
.to_string();
|
.to_string();
|
||||||
|
|
||||||
|
let tutor_response = if looks_like_off_topic_response(&raw_tutor_response)
|
||||||
|
&& is_programming_related(&payload.message)
|
||||||
|
&& !is_programming_related(&lesson_scope)
|
||||||
|
{
|
||||||
|
scope_rejection_message(&lesson.title)
|
||||||
|
} else {
|
||||||
|
raw_tutor_response
|
||||||
|
};
|
||||||
|
|
||||||
// Calcular y registrar el uso de tokens
|
// Calcular y registrar el uso de tokens
|
||||||
let input_tokens = count_tokens(&system_prompt) + count_tokens(&payload.message);
|
let input_tokens = count_tokens(&system_prompt) + count_tokens(&payload.message);
|
||||||
let output_tokens = count_tokens(&tutor_response);
|
let output_tokens = count_tokens(&tutor_response);
|
||||||
|
|||||||
Reference in New Issue
Block a user