pipeline overhaul
This commit is contained in:
@@ -1,212 +1,207 @@
|
||||
// src/config/prompts.ts
|
||||
// src/config/prompts.ts - Centralized German prompts for AI pipeline
|
||||
|
||||
export const AI_PROMPTS = {
|
||||
|
||||
toolSelection: (mode: string, userQuery: string, selectionMethod: string, maxSelectedItems: number) => {
|
||||
const modeInstruction = mode === 'workflow'
|
||||
? 'Der Benutzer möchte einen UMFASSENDEN WORKFLOW über mehrere Phasen. Wählen Sie 15–25 Elemente, die den Zyklus Datensammlung → Auswertung → Analyse → Bericht abdecken.'
|
||||
: 'Der Benutzer möchte SPEZIFISCHE LÖSUNGEN. Wählen Sie 4–10 Elemente, die das Problem direkt adressieren.';
|
||||
? 'Workflow mit 15-25 Items über alle Phasen. PFLICHT: Mindestens 40% Methoden, Rest Tools/Konzepte.'
|
||||
: 'Spezifische Lösung mit 4-10 Items. PFLICHT: Mindestens 30% Methoden wenn verfügbar.';
|
||||
|
||||
return `Sie sind DFIR-Experte mit Zugriff auf eine vollständige Datenbank aus Methoden (type: "method") und Tools (type: "software"/"os"). Ihre Aufgabe ist es, die relevantesten Elemente für die Anfrage auszuwählen.
|
||||
return `Du bist ein DFIR-Experte. Wähle die BESTEN Items aus dem vorgefilterten Set.
|
||||
|
||||
AUSWAHLMETHODE: ${selectionMethod}
|
||||
${selectionMethod === 'embeddings_candidates' ?
|
||||
'Die angezeigten Kandidaten wurden bereits semantisch vorgefiltert. Wählen Sie daraus die BESTEN.' :
|
||||
'Sie sehen die vollständige Datenbasis. Wählen Sie die relevantesten Elemente.'}
|
||||
|
||||
WICHTIG – MISCHUNG ERZWINGEN:
|
||||
- Der finale Vorschlag MUSS eine Mischung aus Methoden UND Tools enthalten (sofern verfügbar).
|
||||
- Ziel: grob 40–60 % Methoden und 40–60 % Tools. Wenn eine Kategorie knapp ist, wählen Sie so ausgewogen wie möglich. Begründen Sie Abweichungen im reasoning.
|
||||
- Bezeichnen Sie Elemente konsequent als "Methode" oder "Tool" je nach Typ.
|
||||
'✓ Semantisch relevante Items bereits vorgefiltert\n✓ Wähle die BESTEN für die konkrete Aufgabe' :
|
||||
'✓ Vollständige Datenbank verfügbar\n✓ Wähle die relevantesten Items'}
|
||||
|
||||
${modeInstruction}
|
||||
|
||||
BENUTZER-ANFRAGE: "${userQuery}"
|
||||
ANFRAGE: "${userQuery}"
|
||||
|
||||
KRITISCHE AUSWAHLPRINZIPIEN:
|
||||
1) KONTEXT > POPULARITÄT: Nicht automatisch zu populären Tools greifen. Wählen Sie strikt szenariobezogen.
|
||||
2) METHODIK vs. SOFTWARE:
|
||||
- Dringend/Triage → Methoden für schnelle Reaktion priorisieren.
|
||||
- Zeitkritisch → Triage-Methoden vor Tiefenanalyse-Tools.
|
||||
- Umfassende Analyse → dann spezialisierte Tools ergänzen.
|
||||
3) SPEZIFITÄT:
|
||||
- ICS/SCADA → spezialisierte ICS-Methoden/-Tools statt generischer Netzwerk-Tools.
|
||||
- Mobile (Android/iOS) → mobile-spezifische Methoden/Tools.
|
||||
- Speicheranalyse dringend → schnelle Memory-Methoden/Tools vor Vollanalyse.
|
||||
4) LESEN SIE DIE VOLLBESCHREIBUNG UND METADATEN (Tags, Plattformen, Phasen, Lizenz, Access).
|
||||
VERFÜGBARE ITEM-TYPEN:
|
||||
- TOOLS (type: "software"/"method") → praktische Anwendungen und Vorgehensweisen
|
||||
- KONZEPTE (type: "concept") → theoretisches Wissen und Methodiken
|
||||
|
||||
UI-KÜRZE:
|
||||
- Denken Sie mit: Für das UI sind kurze, prägnante Beschreibungen nötig. Bevorzugen Sie Elemente, die sich knapp zusammenfassen lassen. Formulieren Sie Begründungen fokussiert und ohne Floskeln.
|
||||
AUSWAHLSTRATEGIE:
|
||||
1. **ERSTE PRIORITÄT: Relevanz zur Anfrage**
|
||||
- Direkt anwendbar auf das Problem
|
||||
- Löst die Kernherausforderung
|
||||
|
||||
Wählen Sie die relevantesten Elemente (max ${maxSelectedItems} gesamt).
|
||||
2. **ZWEITE PRIORITÄT: Ausgewogene Mischung**
|
||||
- Tools/Methoden für praktische Umsetzung → selectedTools
|
||||
- Konzepte für methodisches Verständnis → selectedConcepts
|
||||
- WICHTIG: Auch Konzepte auswählen, nicht nur Tools!
|
||||
|
||||
ANTWORTFORMAT (JSON, SCHEMA UNVERÄNDERT):
|
||||
3. **QUALITÄT > QUANTITÄT**
|
||||
- Lieber weniger perfekte Items als viele mittelmäßige
|
||||
- Jedes Item muss begründbar sein
|
||||
|
||||
AUSWAHLREGELN:
|
||||
- Wähle ${mode === 'workflow' ? '15-25' : '4-10'} Items total, max ${maxSelectedItems}
|
||||
- BEIDE Arrays füllen: selectedTools UND selectedConcepts
|
||||
- Mindestens 1-2 Konzepte auswählen für methodische Fundierung
|
||||
- Tools: 40% Methoden (type="method"), Rest Software (type="software")
|
||||
|
||||
ANTWORT AUSSCHLIESSLICH IM JSON-FORMAT:
|
||||
{
|
||||
"selectedTools": ["Name 1", "Name 2", ...],
|
||||
"selectedConcepts": ["Konzept 1", "Konzept 2", ...],
|
||||
"reasoning": "Begründen Sie die Auswahl, die erzwungene Mischung Methode/Tool und warum bestimmte populäre Elemente nicht geeignet sind. Halten Sie die Sprache präzise und UI-tauglich."
|
||||
"selectedTools": ["ToolName1", "MethodName1", ...],
|
||||
"selectedConcepts": ["ConceptName1", "ConceptName2", ...],
|
||||
"reasoning": "Kurze Begründung mit Erwähnung der Tool/Konzept-Balance"
|
||||
}`;
|
||||
},
|
||||
|
||||
scenarioAnalysis: (isWorkflow: boolean, userQuery: string) => {
|
||||
const analysisType = isWorkflow ? 'Untersuchungsszenario' : 'technische Problemstellung';
|
||||
const considerations = isWorkflow ?
|
||||
`- Angriffsvektoren (MITRE ATT&CK) und Bedrohungsmodell
|
||||
- Betroffene Systeme/Assets und Kritikalität
|
||||
- Zeitdruck, Beweiserhalt, Chain of Custody
|
||||
- Relevante Artefakte und Datenquellen` :
|
||||
`- Konkrete forensische Hürden
|
||||
- Verfügbare Datenquellen und Integrität
|
||||
- Anforderungen für rechtssichere Auswertung`;
|
||||
const analysisType = isWorkflow ? 'Szenario' : 'Problem';
|
||||
const focus = isWorkflow ?
|
||||
'Angriffsvektoren, betroffene Systeme, Zeitkritikalität' :
|
||||
'Kernherausforderung, verfügbare Daten, methodische Anforderungen';
|
||||
|
||||
return `Analysieren Sie das ${analysisType} prägnant in einem kurzen Fließtext (max. 220 Wörter).
|
||||
return `DFIR-Experte: Analysiere das ${analysisType}.
|
||||
|
||||
${isWorkflow ? 'SZENARIO' : 'PROBLEM'}: "${userQuery}"
|
||||
|
||||
Berücksichtigen:
|
||||
${considerations}
|
||||
Fokus: ${focus}
|
||||
|
||||
Stil: Deutsch, ohne Listen/Markdown; klare, knappe Formulierungen, aber nicht telegrafisch (vollständige Sätze).`;
|
||||
Antwort: Fließtext ohne Listen, max 100 Wörter.`;
|
||||
},
|
||||
|
||||
investigationApproach: (isWorkflow: boolean, userQuery: string) => {
|
||||
const approachType = isWorkflow ? 'Untersuchungsansatz' : 'Lösungsansatz';
|
||||
const considerations = isWorkflow ?
|
||||
`- Triage-Prioritäten nach forensischer Dringlichkeit
|
||||
- Phasenabfolge: Datensammlung → Auswertung → Analyse → Bericht
|
||||
- Kontaminationsvermeidung/Isolierung
|
||||
- Objektivität und Nachvollziehbarkeit` :
|
||||
`- Methodenwahl nach wissenschaftlichen Kriterien
|
||||
- Validierung/Verifizierung der Vorgehensweise
|
||||
- Integration in bestehende DFIR-Workflows
|
||||
- Reproduzierbarkeit und Transparenz`;
|
||||
const focus = isWorkflow ?
|
||||
'Triage-Prioritäten, Phasenabfolge, Kontaminationsvermeidung' :
|
||||
'Methodenauswahl, Validierung, Integration';
|
||||
|
||||
return `Formulieren Sie einen knappen ${approachType} (max. 220 Wörter), der explizit eine Mischung aus Methoden und Tools vorsieht.
|
||||
return `Entwickle einen ${approachType}.
|
||||
|
||||
${isWorkflow ? 'SZENARIO' : 'PROBLEM'}: "${userQuery}"
|
||||
|
||||
Berücksichtigen:
|
||||
${considerations}
|
||||
Fokus: ${focus}
|
||||
|
||||
Stil: Deutsch, ohne Listen/Markdown, UI-tauglich und fokussiert.`;
|
||||
Antwort: Fließtext ohne Listen, max 100 Wörter.`;
|
||||
},
|
||||
|
||||
criticalConsiderations: (isWorkflow: boolean, userQuery: string) => {
|
||||
const considerationType = isWorkflow ? 'kritische forensische Überlegungen' : 'methodische Voraussetzungen';
|
||||
const aspects = isWorkflow ?
|
||||
`- Beweissicherung vs. Gründlichkeit (Zeitdruck)
|
||||
- Chain of Custody und rechtliche Verwertbarkeit
|
||||
- Transparenz, Reproduzierbarkeit, Dokumentationspflichten` :
|
||||
`- Validierung/Nachvollziehbarkeit der Methode/Tools
|
||||
- Risiken für False Positives/Negatives
|
||||
- Qualifikationsanforderungen und Reporting-Standards`;
|
||||
const focus = isWorkflow ?
|
||||
'Beweissicherung vs. Gründlichkeit, Chain of Custody' :
|
||||
'Tool-Validierung, False Positives/Negatives, Qualifikationen';
|
||||
|
||||
return `Identifizieren Sie ${considerationType} in einem kurzen Fließtext (max. 220 Wörter) und achten Sie auf UI-Kürze.
|
||||
return `Identifiziere kritische Überlegungen.
|
||||
|
||||
${isWorkflow ? 'SZENARIO' : 'PROBLEM'}: "${userQuery}"
|
||||
|
||||
Aspekte:
|
||||
${aspects}
|
||||
Fokus: ${focus}
|
||||
|
||||
Stil: Deutsch, ohne Listen/Markdown.`;
|
||||
Antwort: Fließtext ohne Listen, max 100 Wörter.`;
|
||||
},
|
||||
|
||||
phaseToolSelection: (userQuery: string, phase: any, phaseTools: any[]) => {
|
||||
// In der Liste bewusst kurze Ausschnitte und klare Typ-Bezeichnung (Methode/Tool).
|
||||
const items = phaseTools.map((tool: any, index: number) => {
|
||||
const typ = tool.type === 'method' ? 'Methode' : 'Tool';
|
||||
const desc = (tool.description || '').replace(/\s+/g, ' ').trim().slice(0, 320);
|
||||
return `${index + 1}. [${typ}] ${tool.name}: ${desc}…\n - Plattformen: ${tool.platforms?.join(', ') || 'N/A'}\n - Skill Level: ${tool.skillLevel}\n - Tags: ${tool.tags?.join(', ') || 'N/A'}`;
|
||||
}).join('\n\n');
|
||||
|
||||
return `Wählen Sie 2–3 Elemente für die Phase "${phase.name}" und bewerten Sie diese VERGLEICHEND. Erzwingen Sie eine Mischung aus mindestens einer Methode und einem Tool, sofern verfügbar.
|
||||
const methods = phaseTools.filter(t => t.type === 'method');
|
||||
const tools = phaseTools.filter(t => t.type === 'software');
|
||||
|
||||
if (phaseTools.length === 0) {
|
||||
return `Keine Tools für Phase "${phase.name}" verfügbar. Antworte mit leerem Array: []`;
|
||||
}
|
||||
|
||||
return `Du bist ein DFIR-Experte. Wähle die 2-3 BESTEN Items für Phase "${phase.name}".
|
||||
|
||||
SZENARIO: "${userQuery}"
|
||||
PHASE: ${phase.name} – ${phase.description || 'Forensische Untersuchungsphase'}
|
||||
PHASE: ${phase.name} - ${phase.description || ''}
|
||||
|
||||
VERFÜGBARE ELEMENTE FÜR ${phase.name.toUpperCase()}:
|
||||
${items}
|
||||
VERFÜGBARE ITEMS (bereits von KI vorausgewählt):
|
||||
${methods.length > 0 ? `
|
||||
METHODEN (${methods.length}):
|
||||
${methods.map((method: any) =>
|
||||
`- ${method.name}
|
||||
Typ: ${method.type}
|
||||
Beschreibung: ${method.description.slice(0, 150)}...
|
||||
Domains: ${method.domains?.join(', ') || 'N/A'}
|
||||
Skill Level: ${method.skillLevel}`
|
||||
).join('\n\n')}
|
||||
` : 'Keine Methoden verfügbar'}
|
||||
|
||||
BEWERTUNGSKRITERIEN:
|
||||
- Eignung für das konkrete Szenario und GENAU diese Phase
|
||||
- Vergleich zu den Alternativen in der Liste
|
||||
- Praktikabilität (Zeit, Setup, Reproduzierbarkeit)
|
||||
${tools.length > 0 ? `
|
||||
SOFTWARE TOOLS (${tools.length}):
|
||||
${tools.map((tool: any) =>
|
||||
`- ${tool.name}
|
||||
Typ: ${tool.type}
|
||||
Beschreibung: ${tool.description.slice(0, 150)}...
|
||||
Plattformen: ${tool.platforms?.join(', ') || 'N/A'}
|
||||
Skill Level: ${tool.skillLevel}`
|
||||
).join('\n\n')}
|
||||
` : 'Keine Software-Tools verfügbar'}
|
||||
|
||||
UI-KÜRZE:
|
||||
- Beginnen Sie in "justification" mit einer 2–4-Satz Kurzfassung (≈300–360 Zeichen), danach 2–3 kurze, präzise Sätze mit Details.
|
||||
- Bezeichnen Sie Elemente als "Methode" oder "Tool".
|
||||
AUSWAHLREGELN FÜR PHASE "${phase.name}":
|
||||
1. Wähle die 2-3 BESTEN Items für diese spezifische Phase
|
||||
2. Priorisiere Items, die DIREKT für "${phase.name}" relevant sind
|
||||
3. Mindestens 1 Methode wenn verfügbar, Rest Software-Tools
|
||||
4. Begründe WARUM jedes Item für diese Phase optimal ist
|
||||
|
||||
ANTWORT NUR ALS JSON (Schema UNVERÄNDERT):
|
||||
WICHTIG: Verwende EXAKT die Namen wie oben aufgelistet (ohne Präfixe wie M1./T2.)!
|
||||
|
||||
ANTWORT AUSSCHLIESSLICH IM JSON-FORMAT OHNE JEGLICHEN TEXT AUSSERHALB:
|
||||
[
|
||||
{
|
||||
"toolName": "Exakter Methoden/Tool-Name",
|
||||
"taskRelevance": 0–100,
|
||||
"justification": "Kurzfassung zuerst (≈300–360 Zeichen). Danach knappe, vergleichende Begründung, warum dieses Element in dieser Phase besser geeignet ist.",
|
||||
"limitations": ["Konkrete Einschränkung 1", "Einschränkung 2"]
|
||||
"toolName": "Exakter Name aus der Liste oben",
|
||||
"taskRelevance": 85,
|
||||
"justification": "Spezifische Begründung warum optimal für ${phase.name}",
|
||||
"limitations": ["Mögliche Einschränkung für diese Phase"]
|
||||
}
|
||||
]
|
||||
|
||||
Wählen Sie nur die 2–3 BESTEN Elemente und achten Sie auf die Mischung Methode+Tool.`;
|
||||
]`;
|
||||
},
|
||||
|
||||
toolEvaluation: (userQuery: string, tool: any, rank: number, taskRelevance: number) => {
|
||||
const typ = tool.type === 'method' ? 'Methode' : 'Tool';
|
||||
return `Sie sind DFIR-Experte. Erklären Sie DETAILLIERT die Anwendung dieses bereits bewerteten Elements.
|
||||
const itemType = tool.type === 'method' ? 'Methode' : 'Tool';
|
||||
|
||||
return `Erkläre die Anwendung dieser/dieses ${itemType}.
|
||||
|
||||
PROBLEM: "${userQuery}"
|
||||
ELEMENT: ${typ} ${tool.name} (Aufgaben-Eignung ${taskRelevance}%)
|
||||
BESCHREIBUNG: ${(tool.description || '').replace(/\s+/g, ' ').trim()}
|
||||
${itemType.toUpperCase()}: ${tool.name} (${taskRelevance}% Eignung)
|
||||
TYP: ${tool.type}
|
||||
|
||||
ANTWORT AUSSCHLIESSLICH ALS JSON (Schema UNVERÄNDERT):
|
||||
Bereits als Rang ${rank} bewertet.
|
||||
|
||||
ANTWORT AUSSCHLIESSLICH IM JSON-FORMAT OHNE JEGLICHEN TEXT AUSSERHALB DER JSON-STRUKTUR:
|
||||
{
|
||||
"detailed_explanation": "Beginnen Sie mit einer prägnanten Kurzfassung (≈300–360 Zeichen) für das UI: 'Kurz: …'. Danach eine verdichtete Hauptpassage (≈80–140 Wörter) mit präziser, technisch korrekter Erläuterung, warum und wie diese ${typ.toLowerCase()} für dieses Problem eingesetzt wird.",
|
||||
"implementation_approach": "Konkrete, reproduzierbare Schrittfolge. Kurze Schritte, kein Ausschweifen.",
|
||||
"pros": ["Spezifischer Vorteil 1", "Vorteil 2"],
|
||||
"limitations": ["Konkrete Einschränkung 1", "Einschränkung 2"],
|
||||
"alternatives": "Knappe Alternativen, falls dieses Element nicht verfügbar ist (Methoden und Tools anführen)."
|
||||
}
|
||||
|
||||
WICHTIG:
|
||||
- Keine erneute Bewertung – nur Erklärung/Anwendung.
|
||||
- Behalten Sie die korrekte Bezeichnung (Methode/Tool) bei.
|
||||
- UI-Kürze: Kurzfassung am Anfang der detailed_explanation.`;
|
||||
"detailed_explanation": "Warum und wie einsetzen",
|
||||
"implementation_approach": "Konkrete Schritte",
|
||||
"pros": ["Vorteil 1", "Vorteil 2"],
|
||||
"limitations": ["Einschränkung 1"],
|
||||
"alternatives": "Alternative Ansätze"
|
||||
}`;
|
||||
},
|
||||
|
||||
backgroundKnowledgeSelection: (userQuery: string, mode: string, selectedToolNames: string[], availableConcepts: any[]) => {
|
||||
const conceptsList = availableConcepts.slice(0, 15).map((concept: any) => `- ${concept.name}: ${(concept.description || '').replace(/\s+/g, ' ').trim().slice(0, 80)}…`).join('\n');
|
||||
return `Wählen Sie 2–4 forensische Konzepte, die für die Anwendung der empfohlenen Elemente (Methoden + Tools) wesentlich sind.
|
||||
return `Wähle 2-4 relevante Konzepte.
|
||||
|
||||
${mode === 'workflow' ? 'SZENARIO' : 'PROBLEM'}: "${userQuery}"
|
||||
EMPFOHLENE ELEMENTE: ${selectedToolNames.join(', ')}
|
||||
AUSGEWÄHLTE TOOLS: ${selectedToolNames.join(', ')}
|
||||
|
||||
VERFÜGBARE KONZEPTE:
|
||||
${conceptsList}
|
||||
VERFÜGBARE KONZEPTE (${availableConcepts.length} KI-kuratiert):
|
||||
${availableConcepts.map((c: any) =>
|
||||
`- ${c.name}: ${c.description}...`
|
||||
).join('\n')}
|
||||
|
||||
ANTWORT NUR ALS JSON (Schema UNVERÄNDERT):
|
||||
ANTWORT AUSSCHLIESSLICH IM JSON-FORMAT OHNE JEGLICHEN TEXT AUSSERHALB DER JSON-STRUKTUR:
|
||||
[
|
||||
{
|
||||
"conceptName": "Exakter Konzept-Name",
|
||||
"relevance": "Knappe Begründung, warum dieses Konzept für das Verständnis der Methodik/Tools kritisch ist (UI-tauglich)."
|
||||
"conceptName": "Name",
|
||||
"relevance": "Warum kritisch für Methodik"
|
||||
}
|
||||
]`;
|
||||
},
|
||||
|
||||
finalRecommendations: (isWorkflow: boolean, userQuery: string, selectedToolNames: string[]) => {
|
||||
if (isWorkflow) {
|
||||
return `Erstellen Sie einen knappen, methodisch korrekten WORKFLOW-Fließtext (max. 220 Wörter), der EXPLIZIT eine Mischung aus Methoden und Tools nutzt.
|
||||
const focus = isWorkflow ?
|
||||
'Workflow-Schritte, Best Practices, Objektivität' :
|
||||
'Methodische Überlegungen, Validierung, Qualitätssicherung';
|
||||
|
||||
SZENARIO: "${userQuery}"
|
||||
AUSGEWÄHLTE ELEMENTE: ${selectedToolNames.join(', ') || 'Keine Auswahl'}
|
||||
return `Erstelle ${isWorkflow ? 'Workflow-Empfehlung' : 'methodische Überlegungen'}.
|
||||
|
||||
Vorgaben: klare Phasen (Datensammlung → Auswertung → Analyse → Bericht), Beweisführung/Chain of Custody, Reproduzierbarkeit. Sprache präzise und UI-tauglich. Keine Listen/Markdown.`;
|
||||
}
|
||||
${isWorkflow ? 'SZENARIO' : 'PROBLEM'}: "${userQuery}"
|
||||
AUSGEWÄHLT: ${selectedToolNames.join(', ')}${selectedToolNames.length > 5 ? '...' : ''}
|
||||
|
||||
return `Formulieren Sie knappe, kritische ÜBERLEGUNGEN (max. 200 Wörter) zur korrekten Anwendung der empfohlenen Elemente (Methoden + Tools).
|
||||
Fokus: ${focus}
|
||||
|
||||
PROBLEM: "${userQuery}"
|
||||
EMPFOHLENE ELEMENTE: ${selectedToolNames.join(', ') || 'Keine Auswahl'}
|
||||
|
||||
Fokus: Validierung/Qualitätssicherung, Risiken (FP/FN), Dokumentation/Reporting. Stil deutsch, ohne Listen/Markdown, UI-tauglich.`;
|
||||
Antwort: Fließtext ohne Listen, max ${isWorkflow ? '100' : '80'} Wörter.`;
|
||||
}
|
||||
} as const;
|
||||
|
||||
@@ -231,4 +226,4 @@ export function getPrompt(promptKey: keyof typeof AI_PROMPTS, ...args: any[]): s
|
||||
console.error(`[PROMPTS] Error generating prompt ${promptKey}:`, error);
|
||||
return 'Error: Failed to generate prompt';
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user