Para implementar un sistema RAG (Retrieval-Augmented Generation) con prompts en español utilizando LlamaIndex, es necesario comprender cómo se gestionan y reemplazan las plantillas de prompt dentro del motor de consultas. A continuación, se preesnta una implementación que utiliza modelos locales de HuggingFace.
import logging
import sys
import torch
from llama_index.core import PromptTemplate, Settings, StorageContext, load_index_from_storage
from llama_index.core.callbacks import LlamaDebugHandler, CallbackManager
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.huggingface import HuggingFaceLLM
# Configuración del sistema de logs
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
# Definición del prompt del sistema
PROMPT_SISTEMA = """Eres un asistente médico basado en inteligencia artificial."""
plantilla_consulta = PromptTemplate(
"[INST]<<SYS>>\n" + PROMPT_SISTEMA + "<</SYS>>\n\n{query_str}[/INST] "
)
# Definición de la plantilla para preguntas y respuestas
texto_plantilla_qa = (
"La información contextual es la siguiente.\n"
"---------------------\n"
"{context_str}\n"
"---------------------\n"
"Responde la siguiente consulta basándote exclusivamente en el contexto proporcionado, "
"sin utilizar conocimiento previo. Como asistente médico, tus respuestas deben ser rigurosas.\n"
"Consulta: {query_str}\n"
"Respuesta: "
)
plantilla_qa = PromptTemplate(texto_plantilla_qa)
# Definición de la plantilla para refinar respuestas
texto_plantilla_refinamiento = (
"La consulta original es: {query_str}\n"
"La respuesta actual es: {existing_answer}\n"
"Se dispone de contexto adicional para mejorar la respuesta si es necesario.\n"
"------------\n"
"{context_msg}\n"
"------------\n"
"Utilizando el nuevo contexto, mejora la respuesta original para contestar mejor la consulta. "
"Si el contexto no es relevante, devuelve la respuesta original sin cambios.\n"
"Respuesta refinada: "
)
plantilla_refinamiento = PromptTemplate(texto_plantilla_refinamiento)
# Inicialización del modelo de lenguaje local
modelo_llm = HuggingFaceLLM(
context_window=4096,
max_new_tokens=2048,
generate_kwargs={"temperature": 0.0, "do_sample": False},
query_wrapper_prompt=plantilla_consulta,
tokenizer_name='/modelos/Qwen1.5-14B-Chat',
model_name='/modelos/Qwen1.5-14B-Chat',
device_map="auto",
model_kwargs={"torch_dtype": torch.float16},
)
Settings.llm = modelo_llm
# Configuración del manejador de depuración para rastrear eventos
debug_handler = LlamaDebugHandler(print_trace_on_end=True)
gestor_callbacks = CallbackManager([debug_handler])
Settings.callback_manager = gestor_callbacks
# Configuración del modelo de embeddings local
Settings.embed_model = HuggingFaceEmbedding(
model_name="/modelos/BAAI/bge-base-zh-v1.5"
)
# Carga del índice y los embeddings desde almacenamiento local
contexto_almacenamiento = StorageContext.from_defaults(persist_dir="doc_emb")
indice = load_index_from_storage(contexto_almacenamiento)
# Creación del motor de consultas
motor_consultas = indice.as_query_engine(similarity_top_k=5)
# Inspección de las plantillas disponibles en el motor
plantillas_disponibles = motor_consultas.get_prompts()
print(list(plantillas_disponibles.keys()))
# Actualización de las plantillas en el motor de consultas
motor_consultas.update_prompts(
{"response_synthesizer:text_qa_template": plantilla_qa,
"response_synthesizer:refine_template": plantilla_refinamiento}
)
# Ejecución de la consulta
respuesta = motor_consultas.query("¿Cuáles son los posibles síndromes asociados a la fatiga, sequedad bucal y de garganta?")
print(respuesta)
# Inspección del prompt final enviado al modelo
eventos_io = debug_handler.get_llm_inputs_outputs()
print(eventos_io[0][1].payload["formatted_prompt"])
Al ejecutar print(list(plantillas_disponibles.keys())), se obtiene la siguiente salida:
['response_synthesizer:text_qa_template', 'response_synthesizer:refine_template']
Esto indica que el motor de consultas contiene dos tipos de plantillas: la plantilla de preguntas y respuestas (text_qa_template) y la plantilla de refinamiento (refine_template). La selección de plantillas depende del sintetizador de respuestas configurado. Por defecto, LlamaIndex utiliza el sintetizador de tipo "compact", que consolida los textos recuperados y simplifica el proceso de refinamiento. En consecuencia, modificar únicamente text_qa_template suele ser suficiente. En este ejemplo se actualizan ambas plantillas con fines demostrativos.
El método motor_consultas.update_prompts(...) reemplaza las plantillas prdeeterminadas en inglés por las versiones personalizadas en español.
La respuesta generada por el modelo mediante el sistema RAG es la sigueinte:
Desde la perspectiva de la medicina tradicional china, los síntomas de fatiga, sequedad bucal y de garganta pueden estar relacionados con el síndrome de deficiencia de líquidos orgánicos (síndrome de agotamiento de fluidos o síndrome de sequedad por calor). El síndrome de deficiencia de líquidos se manifiesta con boca seca, labios agrietados, nariz reseca, piel seca, tos seca y sed. Sin embargo, el diagnóstico preciso requiere la integración de otros signos clínicos y el análisis del pulso. Si se acompaña de fiebre, ausencia de sudor, cefalea o dolor en las extremidades, podría indicar un síndrome de sequedad en los orificios superiores o un síndrome de calor que daña los fluidos. Se recomienda consultar a un especialista en medicina tradicional china.
Para verificar el prompt real que se envía al modelo de lenguaje, se puede inspeccionar mediante debug_handler.get_llm_inputs_outputs():
[INST]<<SYS>>
Eres un asistente médico basado en inteligencia artificial.<</SYS>>
La información contextual es la siguiente.
---------------------
file_path: document/terminos_clinicos_mtc.txt
4.6.1.1
Síndrome de insuficiencia de fluidos
Síndrome de deficiencia de líquidos
Causado por producción insuficiente de fluidos, consumo de alimentos picantes, calor acumulado que seca los fluidos, o calor patógeno que daña los líquidos. Se caracteriza clínicamente por sequedad de boca, ojos, garganta, nariz y piel, estreñimiento, orina escasa, lengua roja y seca, pulso fino y rápido.
file_path: document/terminos_clinicos_mtc.txt
Se caracteriza clínicamente por boca seca, lengua reseca, sed frecuente no aliviada con líquidos, polifagia, nicturia, adelgazamiento progresivo, lengua roja, saburra delgada amarilla o ausente, pulso de cuerda fino o deslizante rápido, acompañado de piel seca, debilidad en extremidades, estreñimiento.
4.6.3.2
Síndrome de deficiencia de fluidos con calor
Síndrome de sequedad por deficiencia
Causado por deficiencia de fluidos con calor internamente acumulado.
file_path: document/terminos_clinicos_mtc.txt
Se caracteriza clínicamente por sequedad de boca, ojos, garganta, nariz y piel, estreñimiento, orina escasa, lengua roja y seca, pulso fino y rápido.
4.6.1.2
Síndrome de agotamiento de fluidos
Síndrome de deficiencia severa de líquidos
Causado por pérdida de fluidos que impide la nutrición de órganos y orificios. Se caracteriza por boca seca, labios agrietados, nariz seca sin mucosidad, piel arrugada, ojos hundidos, sed, tos seca, ojos secos, estreñimiento, orina escasa, lengua roja sin fluidos, pulso fino o rápido.
file_path: document/terminos_clinicos_mtc.txt
Se caracteriza clínicamente por sequedad o dolor nasofaríngeo, labios secos, lengua roja, saburra blanca o seca, pulso superficial o ligeramente rápido, acompañado de fiebre, ausencia de sudor, cefalea o dolor articular.
3.6.3.2
Síndrome de sequedad en orificios superiores
Causado por clima o ambiente seco que consume fluidos y priva de nutrición a los orificios. Se caracteriza por sequedad de boca, nariz, garganta, ojos, lagrimation reducido, mucosidad reducida, epistaxis, lengua delgada y seca, pulso fino.
file_path: document/terminos_clinicos_mtc.txt
6.3.1
Síndrome de daño de fluidos con sequedad
Síndrome de calor que daña fluidos
Causado por calor seco interno o calor que se transforma en sequedad y daña los fluidos. Se caracteriza por boca seca, lengua reseca, sed, polifagia, nicturia, adelgazamiento, lengua roja, saburra delgada amarilla o ausente, pulso de cuerda fino o deslizante rápido, piel seca, debilidad, estreñimiento.
4.6.3.
---------------------
Responde la siguiente consulta basándote exclusivamente en el contexto proporcionado, sin utilizar conocimiento previo. Como asistente médico, tus respuestas deben ser rigurosas.
Consulta: ¿Cuáles son los posibles síndromes asociados a la fatiga, sequedad bucal y de garganta?
Respuesta: [/INST]