fix(routing): yearly costs to local RAG, not Sonar

- Remove standalone "kosten" from WEB_TRIGGERS (matched "jährlichen kosten" and sent Perplexity without tools).
- Add LOCAL_OVERRIDES for jahreskosten/jaehrlich/beitragsrechnung phrases.
- Extend forced-RAG keywords and enrich ES query with Beitrag/Beitragsrechnung for cost questions.
- System hint: extract amounts and periods per hit when possible.
This commit is contained in:
Homelab Cursor 2026-03-26 17:01:43 +01:00
parent ec83e3e433
commit d771a330c7

View file

@ -56,10 +56,12 @@ _LOCAL_OVERRIDES = [
"familienbuch", "urkunde", "bescheid", "police", "beitrag", "familienbuch", "urkunde", "bescheid", "police", "beitrag",
"meine unterlagen", "meine dokumente", "meine dateien", "meine unterlagen", "meine dokumente", "meine dateien",
"habe ich", "welche habe", "was habe ich", "habe ich", "welche habe", "was habe ich",
"jahreskosten", "jährlichen", "jährliche", "jaehrlichen", "jaehrliche",
"monatliche kosten", "versicherungskosten", "beitragsrechnung",
] ]
_WEB_TRIGGERS = [ _WEB_TRIGGERS = [
"recherche", "recherchiere", "suche im internet", "web search", "recherche", "recherchiere", "suche im internet", "web search",
"preis", "preise", "kostet", "kosten", "price", "preis", "preise", "kostet", "price",
"news", "nachrichten", "aktuell", "aktuelle", "news", "nachrichten", "aktuell", "aktuelle",
"google", "finde heraus", "finde raus", "google", "finde heraus", "finde raus",
"gold", "silber", "kurs", "kurse", "gold", "silber", "kurs", "kurse",
@ -420,6 +422,8 @@ def ask_with_tools(question: str, tool_handlers: dict, session_id: str = None) -
"kindergeld", "rechnung", "haftpflicht", "rechtsschutz", "kindergeld", "rechnung", "haftpflicht", "rechtsschutz",
"lebensversicherung", "bauspar", "reisepass", "personalausweis", "lebensversicherung", "bauspar", "reisepass", "personalausweis",
"lvm", "allianz", "ergo", "huk", "nuernberger", "lvm", "allianz", "ergo", "huk", "nuernberger",
"jahreskosten", "jährlichen", "jährliche", "jaehrlichen", "jaehrliche",
"monatliche kosten", "versicherungskosten", "beitragsrechnung",
] ]
_q_low = question.lower() _q_low = question.lower()
if route == MODEL_LOCAL and any(k in _q_low for k in _DOC_KW): if route == MODEL_LOCAL and any(k in _q_low for k in _DOC_KW):
@ -427,7 +431,22 @@ def ask_with_tools(question: str, tool_handlers: dict, session_id: str = None) -
if _rag_fn: if _rag_fn:
try: try:
log.info("RAG-Pflicht: forciere rag_search fuer: %s", question[:80]) log.info("RAG-Pflicht: forciere rag_search fuer: %s", question[:80])
_rag_res = _rag_fn(query=question, top_k=10) _rag_q = question
if any(
x in _q_low
for x in (
"kosten",
"jähr",
"jaehr",
"jahreskosten",
"monatliche kosten",
)
):
_rag_q = (
question
+ " Versicherung Beitrag Beitragsrechnung Jahresbetrag"
)
_rag_res = _rag_fn(query=_rag_q, top_k=10)
if _rag_res and not _rag_res.startswith("Keine"): if _rag_res and not _rag_res.startswith("Keine"):
log.info("RAG-Pflicht: %d Zeichen — loesche Session-History", len(str(_rag_res))) log.info("RAG-Pflicht: %d Zeichen — loesche Session-History", len(str(_rag_res)))
messages = [ messages = [
@ -439,11 +458,12 @@ def ask_with_tools(question: str, tool_handlers: dict, session_id: str = None) -
+ "liste jede erkannte Sparte bzw. jeden Dokumenttyp separat " + "liste jede erkannte Sparte bzw. jeden Dokumenttyp separat "
+ "(z.B. Kfz/Auto, Rechtsschutz, Haftpflicht, Sach, Ausland, Kranken) " + "(z.B. Kfz/Auto, Rechtsschutz, Haftpflicht, Sach, Ausland, Kranken) "
+ "mit kurzem Beleg (Dateiname oder Ordner aus den Treffern). " + "mit kurzem Beleg (Dateiname oder Ordner aus den Treffern). "
+ "Nicht nur den ersten Treffer nennen."}, + "Nicht nur den ersten Treffer nennen. "
+ "Bei Kosten/Beitraegen: je Treffer Betrag und Zeitraum nennen wenn im Snippet erkennbar; sonst kurz nicht eindeutig."},
{"role": "assistant", "content": None, {"role": "assistant", "content": None,
"tool_calls": [{"id": "forced_rag", "type": "function", "tool_calls": [{"id": "forced_rag", "type": "function",
"function": {"name": "rag_search", "function": {"name": "rag_search",
"arguments": json.dumps({"query": question, "top_k": 10})}}]}, "arguments": json.dumps({"query": _rag_q, "top_k": 10})}}]},
{"role": "tool", "tool_call_id": "forced_rag", {"role": "tool", "tool_call_id": "forced_rag",
"content": str(_rag_res)[:12000]}, "content": str(_rag_res)[:12000]},
{"role": "user", "content": question}, {"role": "user", "content": question},