SIAA uses Ollama as the local LLM inference engine, running Qwen2.5:3b for generating responses. The integration handles model configuration, streaming responses, health monitoring, and graceful error handling.
With temperature=0.0, “¿Cuándo debo reportar SIERJU?” always produces the same answer: “Debe reportar el quinto día hábil de cada mes.”With temperature=0.7, responses vary: “El reporte se hace el 5to día hábil”, “Mensualmente, en el quinto día…”, etc.
# In /siaa/chat endpoint_es_listado = not es_conv and es_pregunta_listado(ultima_pregunta)_num_predict = 300 if _es_listado else 150
Base: 150 tokens (~600 chars in Spanish) for normal queries Lists: 300 tokens (~1200 chars) for enumeration queriesExample list query: “¿Cuáles son las secciones del formulario SIERJU?”Response (requires ~250 tokens):
El formulario SIERJU contiene las siguientes secciones:1. Inventario de procesos (inicial y final)2. Ingresos por clase de proceso3. Egresos por tipo de terminación4. Carga laboral efectiva5. Estadísticas de decisiones6. Discrepancias y correcciones7. Observaciones generalesCada sección debe diligenciarse antes del quinto día hábil.
With num_predict=150, this would be truncated at item 4.
"stop": [ "\n\n\n", # Triple newline (end of response) "Espero que", # Filler: "I hope this helps" "Es importante destacar", # Filler: "It's important to note" "Cabe destacar que", "En conclusión,", # Often starts hallucinated summary "Sin embargo,", # Hedging language "Por otro lado,", "Cabe mencionar",]
Purpose: Stop generation when model starts adding fluff or generic conclusions.Example without stop sequences:
El SIERJU debe reportarse el quinto día hábil de cada mes.Es importante destacar que el cumplimiento de esta norma es obligatorio para todos los despachos judiciales. Sin embargo, en casos excepcionales se pueden presentar discrepancias que deben corregirse dentro de los 5 días hábiles siguientes...[continues with generic legal language for 200+ tokens]
Example with stop sequences:
El SIERJU debe reportarse el quinto día hábil de cada mes.
SYSTEM_CONVERSACIONAL = """Eres SIAA (Sistema Inteligente de Apoyo Administrativo), el asistente oficial de la Seccional Bucaramanga de la Rama Judicial de Colombia.SIAA significa exactamente: "Sistema Inteligente de Apoyo Administrativo". No significa nada más.Responde con cordialidad en español formal.Para saludos y preguntas generales sobre ti mismo, responde directamente.Recuerda que puedes ayudar con consultas sobre procesos judiciales, administrativos y normativos."""
Used for greetings and general questions (“¿Qué es SIAA?”, “Hola”, “Gracias”).
SYSTEM_DOCUMENTAL = """Eres SIAA, asistente judicial de la Seccional Bucaramanga.TAREA: Responder usando ÚNICAMENTE el contenido de los bloques [DOC:...] que recibirás.PROCESO OBLIGATORIO — sigue estos pasos en orden:1. Lee cada bloque [DOC:...] completo.2. Identifica qué partes del texto se relacionan con la pregunta, aunque sea parcialmente.3. Construye la respuesta con esos fragmentos relevantes.4. Si encontraste información aunque sea parcial → responde con ella.5. Solo si el contexto es completamente ajeno al tema → responde: "No encontré esa información en los documentos disponibles."REGLAS ADICIONALES:- Cita literalmente artículos, campos, fechas, roles y valores numéricos.- Si el contexto habla del tema en términos generales, explica eso al usuario.- Si la pregunta pregunta por un campo específico de un formulario y el contexto lo lista, nómbralo.- Nunca inventes información que no esté en el contexto.- Español formal institucional. Sin preámbulos. Máximo 10 líneas."""
Why Two Prompts?
Conversational mode: Model can use general knowledge for greetingsDocumentary mode: Model MUST ground responses in provided contextDetection logic:
def es_conversacion_general(texto: str) -> bool: t = texto.lower().strip() # Technical terms always trigger documentary mode if any(term in t for term in TERMINOS_SIEMPRE_DOCUMENTAL): return False # Ultra-short queries are greetings if len(t) < 8: return True # Check for greeting patterns return any(p in t for p in PATRONES_CONVERSACION)