fix: merged old code and fixed system prompt
This commit is contained in:
parent
b06375352e
commit
d34d04a4e9
2 changed files with 175 additions and 56 deletions
|
|
@ -113,27 +113,75 @@ SQL-HINWEISE:
|
||||||
- Verwende Tabellenaliase (a für Artikel, e für Einkaufspreis, l für Lagerplatz_Artikel, lp für Lagerplatz) für bessere Lesbarkeit
|
- Verwende Tabellenaliase (a für Artikel, e für Einkaufspreis, l für Lagerplatz_Artikel, lp für Lagerplatz) für bessere Lesbarkeit
|
||||||
- WICHTIG: Du kannst bis zu 50 Ergebnisse pro Abfrage abrufen
|
- WICHTIG: Du kannst bis zu 50 Ergebnisse pro Abfrage abrufen
|
||||||
|
|
||||||
ARTIKELKÜRZEL vs ARTIKELNUMMER - WICHTIG:
|
ARTIKELKÜRZEL vs ARTIKELNUMMER vs ARTIKELBESCHRIEB/ARTIKELBEZEICHNUNG - WICHTIG:
|
||||||
Es gibt zwei verschiedene Identifikatoren für Artikel:
|
Es gibt drei verschiedene Identifikatoren für Artikel:
|
||||||
|
|
||||||
1. **Artikelkürzel**: Numerisches Format (z.B. "131741", "141215")
|
1. **Artikelkürzel**: Numerisches Format (z.B. "131741", "141215", "167677")
|
||||||
- Besteht aus reinen Zahlen
|
- Besteht aus reinen Zahlen
|
||||||
- Format: Nur Ziffern, keine Buchstaben, keine Bindestriche, keine Leerzeichen
|
- Format: Nur Ziffern, keine Buchstaben, keine Bindestriche, keine Leerzeichen
|
||||||
- Beispiel: "131741", "141215"
|
- Beispiel: "131741", "141215", "167677"
|
||||||
|
- SQL: WHERE a."Artikelkürzel" = '167677'
|
||||||
|
|
||||||
2. **Artikelnummer**: Alphanumerisches Format (z.B. "6AV2 181-8XP00-0AX0", "AX5206")
|
2. **Artikelnummer**: Alphanumerisches Format (z.B. "6AV2 181-8XP00-0AX0", "AX5206")
|
||||||
- Kann Buchstaben, Zahlen, Bindestriche und Leerzeichen enthalten
|
- Kann Buchstaben, Zahlen, Bindestriche und Leerzeichen enthalten
|
||||||
- Format: Alphanumerisch, kann Bindestriche und Leerzeichen enthalten
|
- Format: Alphanumerisch, kann Bindestriche und Leerzeichen enthalten
|
||||||
- Beispiel: "6AV2 181-8XP00-0AX0", "AX5206", "SIE.6ES7500"
|
- Beispiel: "6AV2 181-8XP00-0AX0", "AX5206", "SIE.6ES7500"
|
||||||
|
- SQL: WHERE a."Artikelnummer" = '6AV2 181-8XP00-0AX0'
|
||||||
|
|
||||||
WICHTIG - RICHTIGE SPALTE VERWENDEN:
|
3. **Artikelbeschrieb/Artikelbezeichnung**: Textformat mit Wörtern (z.B. "1517H Bundle", "LED Lampe 12V")
|
||||||
- Wenn der Nutzer eine rein numerische Zahl angibt (z.B. "131741", "141215") → Suche in a."Artikelkürzel"
|
- Enthält Wörter wie "Bundle", "Lampe", etc.
|
||||||
- Wenn der Nutzer eine alphanumerische Bezeichnung angibt mit Buchstaben, Bindestrichen oder Leerzeichen (z.B. "6AV2 181-8XP00-0AX0", "AX5206") → Suche in a."Artikelnummer"
|
- Kann Zahlen, Buchstaben, Leerzeichen und Wörter enthalten
|
||||||
|
- Format: Text mit beschreibenden Wörtern
|
||||||
|
- Beispiel: "1517H Bundle", "LED Lampe 12V", "Kabel 5m"
|
||||||
|
- SQL: WHERE a."Artikelbeschrieb" LIKE '%1517H Bundle%' OR a."Artikelbezeichnung" LIKE '%1517H Bundle%'
|
||||||
|
|
||||||
|
⚠️⚠️⚠️ KRITISCH - BREITE SUCHE BEI LAGERBESTANDSABFRAGEN ⚠️⚠️⚠️
|
||||||
|
Bei Fragen nach Lagerbeständen ("wie viel haben wir auf lager", "wie viele auf lager", etc.) MUSS IMMER eine BREITE SUCHE über ALLE Identifikationsfelder durchgeführt werden:
|
||||||
|
|
||||||
|
**OBLIGATORISCH**: Verwende IMMER OR-Bedingungen mit LIKE-Patterns über mehrere Felder:
|
||||||
|
```sql
|
||||||
|
WHERE a."Artikelkürzel" LIKE '%[Suchbegriff]%'
|
||||||
|
OR a."Artikelnummer" LIKE '%[Suchbegriff]%'
|
||||||
|
OR a."Artikelbezeichnung" LIKE '%[Suchbegriff]%'
|
||||||
|
```
|
||||||
|
|
||||||
|
**WARUM**: Der Suchbegriff könnte in verschiedenen Feldern vorkommen:
|
||||||
|
- "1517H" könnte in Artikelkürzel, Artikelnummer ODER Artikelbezeichnung stehen
|
||||||
|
- "1517H Bundle" könnte in Artikelbezeichnung stehen, aber auch "1517H" allein in Artikelkürzel oder Artikelnummer
|
||||||
|
- Nutzer geben oft nur Teilinformationen an
|
||||||
|
|
||||||
|
**BEISPIEL FÜR KORREKTE ABFRAGE**:
|
||||||
|
User: "wie viel vom 1517H bundle haben wir auf lager?"
|
||||||
|
```sql
|
||||||
|
SELECT a."Artikelkürzel", a."Artikelnummer", a."Artikelbezeichnung", a."Lieferant",
|
||||||
|
e."EP_CHF", lp."Lagerplatz" as "Lagerplatzname", l."S_IST_BESTAND", l."S_SOLL_BESTAND", l."S_RESERVIERTER__BESTAND",
|
||||||
|
CASE WHEN l."S_IST_BESTAND" != 'Unbekannt' THEN CAST(l."S_IST_BESTAND" AS INTEGER) - COALESCE(l."S_RESERVIERTER__BESTAND", 0) ELSE NULL END as "Verfügbarer Bestand"
|
||||||
|
FROM Artikel a
|
||||||
|
LEFT JOIN Einkaufspreis e ON a."I_ID" = e."m_Artikel"
|
||||||
|
LEFT JOIN Lagerplatz_Artikel l ON a."I_ID" = l."R_ARTIKEL"
|
||||||
|
LEFT JOIN Lagerplatz lp ON l."R_LAGERPLATZ" = lp."I_ID"
|
||||||
|
WHERE a."Artikelkürzel" LIKE '%1517H%'
|
||||||
|
OR a."Artikelnummer" LIKE '%1517H%'
|
||||||
|
OR a."Artikelbezeichnung" LIKE '%1517H%'
|
||||||
|
LIMIT 20
|
||||||
|
```
|
||||||
|
|
||||||
|
**WICHTIG**:
|
||||||
|
- Verwende IMMER LIKE mit Wildcards (%Suchbegriff%) für breite Suche
|
||||||
|
- Suche IMMER in allen drei Feldern (Artikelkürzel, Artikelnummer, Artikelbezeichnung) mit OR
|
||||||
|
- Bei eindeutigen numerischen Werten (z.B. "167677") kannst du auch = verwenden, aber OR mit LIKE ist sicherer
|
||||||
|
- Bei alphanumerischen Werten mit beschreibenden Wörtern (z.B. "1517H Bundle") IMMER LIKE mit OR über mehrere Felder
|
||||||
|
|
||||||
|
WICHTIG - RICHTIGE SPALTE VERWENDEN (für einfache, eindeutige Fälle):
|
||||||
|
- Wenn der Nutzer eine rein numerische Zahl angibt (z.B. "167677", "131741") → Suche primär in a."Artikelkürzel", aber bei Lagerbestandsabfragen auch in anderen Feldern
|
||||||
|
- Wenn der Nutzer eine alphanumerische Bezeichnung angibt mit Buchstaben, Bindestrichen oder Leerzeichen, aber KEINE beschreibenden Wörter (z.B. "6AV2 181-8XP00-0AX0", "AX5206") → Suche primär in a."Artikelnummer", aber bei Lagerbestandsabfragen auch in anderen Feldern
|
||||||
|
- Wenn der Nutzer eine Bezeichnung mit beschreibenden Wörtern angibt (z.B. "1517H Bundle", "LED Lampe", "Kabel 5m") → Suche IMMER mit OR über mehrere Felder: a."Artikelbeschrieb" LIKE '%Suchbegriff%' OR a."Artikelbezeichnung" LIKE '%Suchbegriff%' OR a."Artikelnummer" LIKE '%Suchbegriff%' OR a."Artikelkürzel" LIKE '%Suchbegriff%'
|
||||||
|
|
||||||
Beispiele:
|
Beispiele:
|
||||||
- "Wie viele von 141215 haben wir auf Lager?" → Artikelkürzel "141215" → WHERE a."Artikelkürzel" = '141215'
|
- "Wie viele von 167677 haben wir auf Lager?" → Breite Suche: WHERE a."Artikelkürzel" LIKE '%167677%' OR a."Artikelnummer" LIKE '%167677%' OR a."Artikelbezeichnung" LIKE '%167677%'
|
||||||
- "Wie viel von 6AV2 181-8XP00-0AX0 haben wir auf Lager?" → Artikelnummer "6AV2 181-8XP00-0AX0" → WHERE a."Artikelnummer" = '6AV2 181-8XP00-0AX0'
|
- "Wie viel vom 1517H Bundle haben wir auf Lager?" → Breite Suche: WHERE a."Artikelkürzel" LIKE '%1517H%' OR a."Artikelnummer" LIKE '%1517H%' OR a."Artikelbezeichnung" LIKE '%1517H%'
|
||||||
- "Zeig mir Informationen zu AX5206" → Artikelnummer "AX5206" → WHERE a."Artikelnummer" = 'AX5206'
|
- "Wie viel von 6AV2 181-8XP00-0AX0 haben wir auf Lager?" → Breite Suche: WHERE a."Artikelkürzel" LIKE '%6AV2 181-8XP00-0AX0%' OR a."Artikelnummer" LIKE '%6AV2 181-8XP00-0AX0%' OR a."Artikelbezeichnung" LIKE '%6AV2 181-8XP00-0AX0%'
|
||||||
|
- "Zeig mir Informationen zu AX5206" → Breite Suche: WHERE a."Artikelkürzel" LIKE '%AX5206%' OR a."Artikelnummer" LIKE '%AX5206%' OR a."Artikelbezeichnung" LIKE '%AX5206%'
|
||||||
|
|
||||||
Bei Fragen nach Lagerbestand: Kombiniere mit der Lagerplatz_Artikel Tabelle über JOIN und beachte die Anforderungen aus dem Abschnitt "LAGERBESTANDSABFRAGEN"
|
Bei Fragen nach Lagerbestand: Kombiniere mit der Lagerplatz_Artikel Tabelle über JOIN und beachte die Anforderungen aus dem Abschnitt "LAGERBESTANDSABFRAGEN"
|
||||||
|
|
||||||
|
|
@ -385,14 +433,18 @@ WICHTIG für SQL-Abfragen:
|
||||||
- Bei Lagerplatzabfragen: IMMER JOIN mit Lagerplatz-Tabelle für den Namen
|
- Bei Lagerplatzabfragen: IMMER JOIN mit Lagerplatz-Tabelle für den Namen
|
||||||
- Abfragen müssen direkt ausführbar sein (keine Platzhalter)
|
- Abfragen müssen direkt ausführbar sein (keine Platzhalter)
|
||||||
- Erstelle SEPARATE Abfragen für verschiedene Tabellen/Datenquellen, nicht eine große JOIN-Abfrage
|
- Erstelle SEPARATE Abfragen für verschiedene Tabellen/Datenquellen, nicht eine große JOIN-Abfrage
|
||||||
|
- ⚠️ KRITISCH: Bei Lagerbestandsabfragen IMMER breite Suche mit OR über Artikelkürzel, Artikelnummer UND Artikelbezeichnung verwenden
|
||||||
|
|
||||||
STRATEGIE FÜR MEHRERE ABFRAGEN:
|
STRATEGIE FÜR MEHRERE ABFRAGEN:
|
||||||
- Analysiere welche Informationen benötigt werden
|
- Analysiere welche Informationen benötigt werden
|
||||||
- Identifiziere welche Tabellen diese Informationen enthalten
|
- Identifiziere welche Tabellen diese Informationen enthalten
|
||||||
- Erstelle für jede Tabelle/Datenquelle eine separate, fokussierte Abfrage
|
- Erstelle für jede Tabelle/Datenquelle eine separate, fokussierte Abfrage
|
||||||
- Beispiel für "wie viel von 6AV2 181-8XP00-0AX0 haben wir auf lager":
|
- ⚠️ WICHTIG: Du kannst komplexe JOINs vermeiden, indem du mehrere einfache Abfragen parallel ausführst
|
||||||
* Abfrage 1: Artikel-Informationen (Artikelbezeichnung, Lieferant, etc.) aus Artikel-Tabelle
|
- Beispiel für "wie viel vom 1517H bundle haben wir auf lager":
|
||||||
* Abfrage 2: Lagerbestände und Lagerplätze aus Lagerplatz_Artikel + Lagerplatz-Tabellen
|
* Abfrage 1: Artikel-Informationen mit breiter Suche (Artikelkürzel, Artikelnummer, Artikelbezeichnung) aus Artikel-Tabelle
|
||||||
|
* Abfrage 2: Lagerbestände und Lagerplätze aus Lagerplatz_Artikel + Lagerplatz-Tabellen (mit JOIN für Lagerplatznamen)
|
||||||
|
* Diese Abfragen können parallel ausgeführt werden und die Ergebnisse werden dann kombiniert
|
||||||
|
- ⚠️ BEI LAGERBESTANDSABFRAGEN: Eine Abfrage mit JOINs ist OK, aber stelle sicher, dass die WHERE-Bedingung eine breite Suche über alle Identifikationsfelder enthält
|
||||||
|
|
||||||
Return ONLY valid JSON:
|
Return ONLY valid JSON:
|
||||||
{{
|
{{
|
||||||
|
|
@ -729,3 +781,55 @@ Rules:
|
||||||
else:
|
else:
|
||||||
return "Chatbot Conversation"
|
return "Chatbot Conversation"
|
||||||
|
|
||||||
|
|
||||||
|
def get_final_answer_prompt_with_results(
|
||||||
|
user_prompt: str,
|
||||||
|
context: str,
|
||||||
|
db_results_part: str,
|
||||||
|
web_results_part: str
|
||||||
|
) -> str:
|
||||||
|
"""
|
||||||
|
Get the complete prompt for generating the final answer with database and web results.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
user_prompt: User's original prompt
|
||||||
|
context: Conversation context
|
||||||
|
db_results_part: Formatted database results section
|
||||||
|
web_results_part: Formatted web research results section
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Complete formatted prompt string
|
||||||
|
"""
|
||||||
|
system_prompt = get_final_answer_system_prompt()
|
||||||
|
|
||||||
|
return f"""{system_prompt}
|
||||||
|
|
||||||
|
Antworte auf die folgende Frage des Nutzers: {user_prompt}{context}
|
||||||
|
|
||||||
|
{db_results_part}{web_results_part}
|
||||||
|
|
||||||
|
KRITISCH: Verwende NUR die oben angegebenen Daten. Erfinde KEINE Werte. Wenn Daten fehlen, schreibe "Nicht verfügbar".
|
||||||
|
|
||||||
|
WICHTIG - MEHRERE ABFRAGEN:
|
||||||
|
Die oben angegebenen DATENBANK-ERGEBNISSE können aus mehreren separaten Abfragen stammen. Jede Abfrage ist mit "=== Abfrage X ===" markiert und enthält Informationen zu einem spezifischen Aspekt (z.B. Artikel-Informationen, Lagerbestände, etc.).
|
||||||
|
- Kombiniere die Informationen aus ALLEN erfolgreichen Abfragen zu einer umfassenden Antwort
|
||||||
|
- Beispiel: Wenn Abfrage 1 Artikel-Informationen liefert und Abfrage 2 Lagerbestände liefert, kombiniere beide in deiner Antwort
|
||||||
|
- Verwende ALLE verfügbaren Informationen aus den verschiedenen Abfragen
|
||||||
|
|
||||||
|
⚠️⚠️⚠️ ABSOLUT VERBOTEN - KEINE DATEN ERFINDEN ⚠️⚠️⚠️
|
||||||
|
Wenn KEINE Datenbank-Ergebnisse vorhanden sind, dann:
|
||||||
|
- ❌ ERFINDE KEINE Artikelnummern, Artikelbezeichnungen, Preise oder Lagerbestände!
|
||||||
|
- ❌ ERFINDE KEINE Beispielartikel!
|
||||||
|
- ✓ Schreibe stattdessen: "Es wurden keine Artikel in der Datenbank gefunden." oder "Die Datenbankabfrage ist fehlgeschlagen."
|
||||||
|
|
||||||
|
WICHTIG: Deine Antwort soll NUR die finale Antwort enthalten - KEINE Planungsschritte, KEINE SQL-Queries, KEINE Zwischenschritte!
|
||||||
|
Beginne DIREKT mit "Aus der Datenbank habe ich..." (wenn Daten vorhanden) oder "Es wurden keine Artikel gefunden" (wenn keine Daten vorhanden).
|
||||||
|
|
||||||
|
WICHTIG:
|
||||||
|
- Klare, strukturierte Antwort
|
||||||
|
- Zahlen mit Tausender-Trennzeichen (7'411)
|
||||||
|
- Markdown-Tabellen für Daten (max 20 Zeilen)
|
||||||
|
- Artikelnummern als Link: [ARTIKELNUMMER](/details/ARTIKELNUMMER)
|
||||||
|
- Wenn Excel-Datei erstellt wurde, bestätige dies explizit am Ende
|
||||||
|
- Wenn Excel-Verarbeitung fehlgeschlagen ist, erkläre dem Nutzer den Fehler klar"""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,9 +13,10 @@ import asyncio
|
||||||
import re
|
import re
|
||||||
from typing import Optional, Dict, Any, List
|
from typing import Optional, Dict, Any, List
|
||||||
|
|
||||||
from modules.datamodels.datamodelChat import ChatWorkflow, UserInputRequest, WorkflowModeEnum, ChatLog
|
from modules.datamodels.datamodelChat import ChatWorkflow, UserInputRequest, WorkflowModeEnum, ChatLog, ChatDocument
|
||||||
from modules.datamodels.datamodelUam import User
|
from modules.datamodels.datamodelUam import User
|
||||||
from modules.datamodels.datamodelAi import AiCallRequest, AiCallOptions, OperationTypeEnum, ProcessingModeEnum
|
from modules.datamodels.datamodelAi import AiCallRequest, AiCallOptions, OperationTypeEnum, ProcessingModeEnum
|
||||||
|
from modules.datamodels.datamodelDocref import DocumentReferenceList, DocumentItemReference
|
||||||
from modules.shared.timeUtils import getUtcTimestamp, parseTimestamp
|
from modules.shared.timeUtils import getUtcTimestamp, parseTimestamp
|
||||||
from modules.services import getInterface as getServices
|
from modules.services import getInterface as getServices
|
||||||
from modules.features.chatbot.eventManager import get_event_manager
|
from modules.features.chatbot.eventManager import get_event_manager
|
||||||
|
|
@ -24,8 +25,10 @@ from modules.connectors.connectorPreprocessor import PreprocessorConnector
|
||||||
from modules.features.chatbot.chatbotConstants import (
|
from modules.features.chatbot.chatbotConstants import (
|
||||||
get_initial_analysis_prompt,
|
get_initial_analysis_prompt,
|
||||||
generate_conversation_name,
|
generate_conversation_name,
|
||||||
get_final_answer_system_prompt
|
get_final_answer_system_prompt,
|
||||||
|
get_final_answer_prompt_with_results
|
||||||
)
|
)
|
||||||
|
import base64
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
@ -293,13 +296,12 @@ async def _emit_log_and_event(
|
||||||
round_number: Optional[int] = None
|
round_number: Optional[int] = None
|
||||||
) -> None:
|
) -> None:
|
||||||
"""
|
"""
|
||||||
Store log in database. The route's periodic chat data fetch will handle emitting it.
|
Store log in database and emit event for streaming.
|
||||||
This avoids duplicate log emissions.
|
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
interfaceDbChat: Database interface
|
interfaceDbChat: Database interface
|
||||||
workflowId: Workflow ID
|
workflowId: Workflow ID
|
||||||
event_manager: Event manager (unused, kept for compatibility)
|
event_manager: Event manager for streaming
|
||||||
message: Log message
|
message: Log message
|
||||||
log_type: Log type (info, warning, error)
|
log_type: Log type (info, warning, error)
|
||||||
status: Status string
|
status: Status string
|
||||||
|
|
@ -322,10 +324,37 @@ async def _emit_log_and_event(
|
||||||
"status": status,
|
"status": status,
|
||||||
"roundNumber": round_number
|
"roundNumber": round_number
|
||||||
}
|
}
|
||||||
# Only store in database - route's periodic fetch will emit it
|
# Store log in database
|
||||||
interfaceDbChat.createLog(log_data)
|
created_log = interfaceDbChat.createLog(log_data)
|
||||||
|
|
||||||
|
# Emit event directly for streaming (using correct signature)
|
||||||
|
if created_log and event_manager:
|
||||||
|
try:
|
||||||
|
from modules.datamodels.datamodelChat import ChatLog
|
||||||
|
# Convert to dict if it's a Pydantic model
|
||||||
|
if hasattr(created_log, "model_dump"):
|
||||||
|
log_dict = created_log.model_dump()
|
||||||
|
elif hasattr(created_log, "dict"):
|
||||||
|
log_dict = created_log.dict()
|
||||||
|
else:
|
||||||
|
log_dict = log_data
|
||||||
|
|
||||||
|
await event_manager.emit_event(
|
||||||
|
context_id=workflowId,
|
||||||
|
event_type="chatdata",
|
||||||
|
data={
|
||||||
|
"type": "log",
|
||||||
|
"createdAt": log_timestamp,
|
||||||
|
"item": log_dict
|
||||||
|
},
|
||||||
|
event_category="chat",
|
||||||
|
message="New log",
|
||||||
|
step="log"
|
||||||
|
)
|
||||||
|
except Exception as emit_error:
|
||||||
|
logger.warning(f"Error emitting log event: {emit_error}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error storing log: {e}")
|
logger.error(f"Error storing log: {e}", exc_info=True)
|
||||||
|
|
||||||
|
|
||||||
async def _check_workflow_stopped(interfaceDbChat, workflowId: str) -> bool:
|
async def _check_workflow_stopped(interfaceDbChat, workflowId: str) -> bool:
|
||||||
|
|
@ -596,7 +625,6 @@ async def _convert_file_ids_to_document_references(
|
||||||
# Search database if not found in messages
|
# Search database if not found in messages
|
||||||
if not document_id:
|
if not document_id:
|
||||||
try:
|
try:
|
||||||
from modules.datamodels.datamodelChat import ChatDocument
|
|
||||||
from modules.shared.databaseUtils import getRecordsetWithRBAC
|
from modules.shared.databaseUtils import getRecordsetWithRBAC
|
||||||
documents = getRecordsetWithRBAC(
|
documents = getRecordsetWithRBAC(
|
||||||
services.interfaceDbChat.db,
|
services.interfaceDbChat.db,
|
||||||
|
|
@ -1060,44 +1088,30 @@ async def _processChatbotMessage(
|
||||||
error_query_keys = [k for k in queryResults.keys() if k.endswith("_error")]
|
error_query_keys = [k for k in queryResults.keys() if k.endswith("_error")]
|
||||||
has_only_errors = bool(error_query_keys and not successful_query_keys)
|
has_only_errors = bool(error_query_keys and not successful_query_keys)
|
||||||
|
|
||||||
|
# Add warning messages if needed
|
||||||
if not has_query_results and needsDatabaseQuery:
|
if not has_query_results and needsDatabaseQuery:
|
||||||
db_results_part = "\n\nWICHTIG: Es wurden KEINE Datenbank-Ergebnisse gefunden. Die Datenbankabfrage wurde nicht ausgeführt oder hat keine Ergebnisse zurückgegeben."
|
if db_results_part:
|
||||||
|
db_results_part += "\n\nWICHTIG: Es wurden KEINE Datenbank-Ergebnisse gefunden. Die Datenbankabfrage wurde nicht ausgeführt oder hat keine Ergebnisse zurückgegeben."
|
||||||
|
else:
|
||||||
|
db_results_part = "\n\nWICHTIG: Es wurden KEINE Datenbank-Ergebnisse gefunden. Die Datenbankabfrage wurde nicht ausgeführt oder hat keine Ergebnisse zurückgegeben."
|
||||||
|
|
||||||
if has_only_errors:
|
if has_only_errors:
|
||||||
db_results_part += "\n\n⚠️⚠️⚠️ KRITISCH - ALLE QUERIES FEHLGESCHLAGEN ⚠️⚠️⚠️\n" + \
|
if db_results_part:
|
||||||
"ALLE Datenbankabfragen sind fehlgeschlagen. Es gibt KEINE gültigen Daten aus der Datenbank.\n" + \
|
db_results_part += "\n\n⚠️⚠️⚠️ KRITISCH - ALLE QUERIES FEHLGESCHLAGEN ⚠️⚠️⚠️\n" + \
|
||||||
"DU DARFST KEINE DATEN ERFINDEN! Schreibe stattdessen: 'Es wurden keine Artikel gefunden' oder 'Die Datenbankabfrage ist fehlgeschlagen'."
|
"ALLE Datenbankabfragen sind fehlgeschlagen. Es gibt KEINE gültigen Daten aus der Datenbank.\n" + \
|
||||||
|
"DU DARFST KEINE DATEN ERFINDEN! Schreibe stattdessen: 'Es wurden keine Artikel gefunden' oder 'Die Datenbankabfrage ist fehlgeschlagen'."
|
||||||
|
else:
|
||||||
|
db_results_part = "\n\n⚠️⚠️⚠️ KRITISCH - ALLE QUERIES FEHLGESCHLAGEN ⚠️⚠️⚠️\n" + \
|
||||||
|
"ALLE Datenbankabfragen sind fehlgeschlagen. Es gibt KEINE gültigen Daten aus der Datenbank.\n" + \
|
||||||
|
"DU DARFST KEINE DATEN ERFINDEN! Schreibe stattdessen: 'Es wurden keine Artikel gefunden' oder 'Die Datenbankabfrage ist fehlgeschlagen'."
|
||||||
|
|
||||||
answer_prompt = f"""{system_prompt}
|
# Use the function from constants file to build the prompt
|
||||||
|
answer_prompt = get_final_answer_prompt_with_results(
|
||||||
Antworte auf die folgende Frage des Nutzers: {userInput.prompt}{context}
|
userInput.prompt,
|
||||||
|
context,
|
||||||
{db_results_part}{web_results_part}
|
db_results_part,
|
||||||
|
web_results_part
|
||||||
KRITISCH: Verwende NUR die oben angegebenen Daten. Erfinde KEINE Werte. Wenn Daten fehlen, schreibe "Nicht verfügbar".
|
)
|
||||||
|
|
||||||
WICHTIG - MEHRERE ABFRAGEN:
|
|
||||||
Die oben angegebenen DATENBANK-ERGEBNISSE können aus mehreren separaten Abfragen stammen. Jede Abfrage ist mit "=== Abfrage X ===" markiert und enthält Informationen zu einem spezifischen Aspekt (z.B. Artikel-Informationen, Lagerbestände, etc.).
|
|
||||||
- Kombiniere die Informationen aus ALLEN erfolgreichen Abfragen zu einer umfassenden Antwort
|
|
||||||
- Beispiel: Wenn Abfrage 1 Artikel-Informationen liefert und Abfrage 2 Lagerbestände liefert, kombiniere beide in deiner Antwort
|
|
||||||
- Verwende ALLE verfügbaren Informationen aus den verschiedenen Abfragen
|
|
||||||
|
|
||||||
⚠️⚠️⚠️ ABSOLUT VERBOTEN - KEINE DATEN ERFINDEN ⚠️⚠️⚠️
|
|
||||||
Wenn KEINE Datenbank-Ergebnisse vorhanden sind, dann:
|
|
||||||
- ❌ ERFINDE KEINE Artikelnummern, Artikelbezeichnungen, Preise oder Lagerbestände!
|
|
||||||
- ❌ ERFINDE KEINE Beispielartikel!
|
|
||||||
- ✓ Schreibe stattdessen: "Es wurden keine Artikel in der Datenbank gefunden." oder "Die Datenbankabfrage ist fehlgeschlagen."
|
|
||||||
|
|
||||||
WICHTIG: Deine Antwort soll NUR die finale Antwort enthalten - KEINE Planungsschritte, KEINE SQL-Queries, KEINE Zwischenschritte!
|
|
||||||
Beginne DIREKT mit "Aus der Datenbank habe ich..." (wenn Daten vorhanden) oder "Es wurden keine Artikel gefunden" (wenn keine Daten vorhanden)."""
|
|
||||||
|
|
||||||
WICHTIG:
|
|
||||||
- Klare, strukturierte Antwort
|
|
||||||
- Zahlen mit Tausender-Trennzeichen (7'411)
|
|
||||||
- Markdown-Tabellen für Daten (max 20 Zeilen)
|
|
||||||
- Artikelnummern als Link: [ARTIKELNUMMER](/details/ARTIKELNUMMER)
|
|
||||||
- Wenn Excel-Datei erstellt wurde, bestätige dies explizit am Ende
|
|
||||||
- Wenn Excel-Verarbeitung fehlgeschlagen ist, erkläre dem Nutzer den Fehler klar"""
|
|
||||||
|
|
||||||
answerRequest = AiCallRequest(
|
answerRequest = AiCallRequest(
|
||||||
prompt=answer_prompt,
|
prompt=answer_prompt,
|
||||||
|
|
@ -1128,6 +1142,7 @@ WICHTIG:
|
||||||
return
|
return
|
||||||
|
|
||||||
# Create assistant message with final answer
|
# Create assistant message with final answer
|
||||||
|
message_id = f"msg_{uuid.uuid4()}"
|
||||||
assistantMessageData = {
|
assistantMessageData = {
|
||||||
"id": message_id,
|
"id": message_id,
|
||||||
"workflowId": workflowId,
|
"workflowId": workflowId,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue