Chatbot que responde en lenguaje natural preguntas sobre el menú de un restaurante: precios, calorías, categorías, descuentos y cupones. Combina RAG (retrieval-augmented generation) sobre una base vectorial en ChromaDB con lookups determinísticos para los datos que necesitan ser exactos —como precios y calorías—, evitando que el LLM invente o redondee números. Las preguntas más abiertas (qué dispara un descuento, qué cupones hay) se resuelven recuperando los chunks relevantes y dejando que el LLM sintetice la respuesta con ese contexto.
Un problema frecuente al construir asistentes conversacionales sobre datos estructurados es que los LLMs son excelentes generando lenguaje natural fluido, pero poco confiables reproduciendo números exactos: pueden redondear un precio, confundir una cifra de calorías o directamente inventar un valor plausible. Para un caso de uso real —un chatbot de menú que un cliente podría usar antes de pagar— eso es inaceptable. Este proyecto explora una arquitectura híbrida que separa el problema en dos: preguntas con respuesta exacta y verificable, y preguntas abiertas que requieren síntesis de lenguaje natural.
Cómo funciona
Indexación del menú
El menú (un archivo JSON) se parsea en estructuras de datos y se divide en chunks de texto especializados mediante cuatro chunkers, cada uno enfocado en un tipo de contenido distinto:
ItemChunker: un chunk por ítem individual del menú, con nombre, categoría y precios por tamañoCategoryChunker: chunks a nivel de categoría, para preguntas del tipo "¿qué ensaladas hay?"NutritionChunker: información nutricional (calorías, notas dietéticas) por ítemDiscountChunker: descuentos activos, tipo de descuento (porcentaje, monto fijo, BOGO) y si requieren un código de cupón
Cada chunk se embebe con un modelo de embeddings y se guarda en ChromaDB, la base de datos vectorial que sirve como índice de búsqueda semántica.
Resolución de preguntas
Cuando llega una pregunta, el RAGEngine decide primero si tiene forma de consulta estructurada (contiene palabras como "price", "cost", "how much", "calorie", "coupon", "today").
- Si es así, intenta resolverla con el
QueryExecutor: un módulo determinístico que hace un lookup directo sobre los datos parseados del menú (con fuzzy matching sobre el nombre del ítem para tolerar errores de tipeo). - Si el lookup determinístico no encuentra el dato, o la pregunta es más abierta, el sistema cae al camino RAG: genera el embedding de la consulta, recupera los chunks más relevantes de ChromaDB (filtrando por tipo cuando es posible) y arma un prompt con ese contexto para que el LLM sintetice la respuesta en lenguaje natural.
- La inferencia del LLM corre localmente vía Ollama, y el prompt incluye instrucciones explícitas para que el modelo parafrasee el contexto en vez de copiar etiquetas de chunk textualmente, no invente ingredientes ni datos ausentes, y avise si un dato falta en vez de inferirlo.
Por qué "híbrido"
El sistema combina dos estrategias distintas según el tipo de pregunta, en lugar de forzar todo a través de un único enfoque:
- Lookup exacto (QueryExecutor) para datos numéricos donde una alucinación tiene costo real: precio, calorías. La respuesta sale directo de los datos parseados, no del LLM.
- RAG semántico para preguntas abiertas o semi-estructuradas —qué descuentos hay, qué dispara un BOGO, qué cupones existen— donde hace falta flexibilidad para interpretar la pregunta y componer una respuesta en lenguaje natural a partir de varios fragmentos de contexto.
Esta separación importa en cualquier caso de uso real de un chatbot sobre datos de negocio: forzar todo a RAG puro arriesga números incorrectos justo donde más importan (precios, cantidades); forzar todo a lookups estructurados rompe apenas la pregunta se sale del molde esperado. Combinar ambas estrategias —y decidir cuál usar según la forma de la pregunta, con fallback de una a la otra— da precisión donde se necesita sin sacrificar flexibilidad conversacional.
Ejemplos de preguntas
El chatbot responde correctamente preguntas como:
What is the price of a small NUTTY BOWL?How many calories does the GO GREEN smoothie have?Which salads do you have?What discounts are available today?Which discounts include coupons?What items trigger a BOGO discount?
Las tres primeras se resuelven vía lookup determinístico o recuperación por categoría; las tres últimas requieren que el LLM sintetice la respuesta a partir de los chunks de descuentos recuperados.
Tecnologías
Estado del Trabajo
Proyecto personal en desarrollo activo, pensado como ejercicio de diseño de arquitecturas RAG confiables para datos de negocio. El código completo está disponible en el repositorio de GitHub.