WP20 - Chat Interface auf neue Struktur der decision.yaml

This commit is contained in:
Lars 2025-12-25 11:50:08 +01:00
parent fa6eb0795a
commit c9cf1b7e4c

View File

@ -1,8 +1,9 @@
""" """
FILE: app/routers/chat.py FILE: app/routers/chat.py
DESCRIPTION: Haupt-Chat-Interface (RAG & Interview). Enthält Intent-Router (Keywords/LLM) und Prompt-Construction. DESCRIPTION: Haupt-Chat-Interface (RAG & Interview). Enthält Intent-Router (Keywords/LLM) und Prompt-Construction.
VERSION: 2.7.0 (WP-22 Semantic Graph Routing) VERSION: 2.7.1 (WP-22 Semantic Graph Routing)
STATUS: Active STATUS: Active
FIX: Umstellung auf llm.get_prompt() zur Behebung des 500 Server Errors (Dictionary replace crash).
DEPENDENCIES: app.config, app.models.dto, app.services.llm_service, app.core.retriever, app.services.feedback_service DEPENDENCIES: app.config, app.models.dto, app.services.llm_service, app.core.retriever, app.services.feedback_service
EXTERNAL_CONFIG: config/decision_engine.yaml, config/types.yaml EXTERNAL_CONFIG: config/decision_engine.yaml, config/types.yaml
""" """
@ -199,7 +200,8 @@ async def _classify_intent(query: str, llm: LLMService) -> tuple[str, str]:
# 3. SLOW PATH: LLM Router # 3. SLOW PATH: LLM Router
if settings.get("llm_fallback_enabled", False): if settings.get("llm_fallback_enabled", False):
router_prompt_template = llm.prompts.get("router_prompt", "") # FIX: Nutze get_prompt statt direktem Zugriff auf dict
router_prompt_template = llm.get_prompt("router_prompt")
if router_prompt_template: if router_prompt_template:
prompt = router_prompt_template.replace("{query}", query) prompt = router_prompt_template.replace("{query}", query)
@ -262,7 +264,8 @@ async def chat_endpoint(
logger.info(f"[{query_id}] Interview Type: {target_type}. Fields: {len(fields_list)}") logger.info(f"[{query_id}] Interview Type: {target_type}. Fields: {len(fields_list)}")
fields_str = "\n- " + "\n- ".join(fields_list) fields_str = "\n- " + "\n- ".join(fields_list)
template = llm.prompts.get(prompt_key, "") # FIX: Nutze get_prompt() zur Auflösung der provider-spezifischen Templates
template = llm.get_prompt(prompt_key)
final_prompt = template.replace("{context_str}", "Dialogverlauf...") \ final_prompt = template.replace("{context_str}", "Dialogverlauf...") \
.replace("{query}", request.message) \ .replace("{query}", request.message) \
.replace("{target_type}", target_type) \ .replace("{target_type}", target_type) \
@ -276,7 +279,6 @@ async def chat_endpoint(
prepend_instr = strategy.get("prepend_instruction", "") prepend_instr = strategy.get("prepend_instruction", "")
# --- WP-22: Semantic Graph Routing (Teil C) --- # --- WP-22: Semantic Graph Routing (Teil C) ---
# Wir laden die konfigurierten Edge-Boosts für diesen Intent
edge_boosts = strategy.get("edge_boosts", {}) edge_boosts = strategy.get("edge_boosts", {})
if edge_boosts: if edge_boosts:
logger.info(f"[{query_id}] Applying Edge Boosts: {edge_boosts}") logger.info(f"[{query_id}] Applying Edge Boosts: {edge_boosts}")
@ -286,7 +288,6 @@ async def chat_endpoint(
mode="hybrid", mode="hybrid",
top_k=request.top_k, top_k=request.top_k,
explain=request.explain, explain=request.explain,
# WP-22: Boosts an den Retriever weitergeben
boost_edges=edge_boosts boost_edges=edge_boosts
) )
retrieve_result = await retriever.search(query_req) retrieve_result = await retriever.search(query_req)
@ -299,7 +300,6 @@ async def chat_endpoint(
top_k=3, top_k=3,
filters={"type": inject_types}, filters={"type": inject_types},
explain=False, explain=False,
# WP-22: Boosts auch hier anwenden (Konsistenz)
boost_edges=edge_boosts boost_edges=edge_boosts
) )
strategy_result = await retriever.search(strategy_req) strategy_result = await retriever.search(strategy_req)
@ -313,7 +313,11 @@ async def chat_endpoint(
else: else:
context_str = _build_enriched_context(hits) context_str = _build_enriched_context(hits)
template = llm.prompts.get(prompt_key, "{context_str}\n\n{query}") # FIX: Nutze get_prompt() zur Auflösung der provider-spezifischen Templates
template = llm.get_prompt(prompt_key)
if not template:
template = "{context_str}\n\n{query}"
if prepend_instr: if prepend_instr:
context_str = f"{prepend_instr}\n\n{context_str}" context_str = f"{prepend_instr}\n\n{context_str}"
@ -322,7 +326,7 @@ async def chat_endpoint(
sources_hits = hits sources_hits = hits
# --- GENERATION --- # --- GENERATION ---
system_prompt = llm.prompts.get("system_prompt", "") system_prompt = llm.get_prompt("system_prompt")
# Chat nutzt IMMER realtime priority # Chat nutzt IMMER realtime priority
answer_text = await llm.generate_raw_response( answer_text = await llm.generate_raw_response(