Upload 4 files
Browse files
README.md
ADDED
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: Dr. Franz - Psychoanalytischer Chatbot
|
3 |
+
emoji: 🧠
|
4 |
+
colorFrom: indigo
|
5 |
+
colorTo: purple
|
6 |
+
sdk: gradio
|
7 |
+
sdk_version: 4.19.2
|
8 |
+
app_file: app.py
|
9 |
+
pinned: false
|
10 |
+
---
|
11 |
+
|
12 |
+
# 🧠 Dr. Franz - Psychoanalytischer Chatbot
|
13 |
+
|
14 |
+
Willkommen beim Dr. Franz Psychochatbot-Projekt auf Hugging Face Spaces.
|
15 |
+
|
16 |
+
## Projektbeschreibung
|
17 |
+
|
18 |
+
**Dr. Franz** ist ein experimenteller psychoanalytischer Chatbot, der als manipulativer Psychoanalytiker agiert. Er analysiert Aussagen psychologisch und stellt provokante Fragen.
|
19 |
+
|
20 |
+
## Features
|
21 |
+
|
22 |
+
- **Psychoanalytische Gesprächsführung**: Dr. Franz nutzt verschiedene psychoanalytische Techniken, um tiefere Gedanken und Emotionen zu ergründen
|
23 |
+
- **Dynamische Persönlichkeitsanpassung**: Der Bot passt seinen Ton basierend auf der Analyse der Nutzereingaben an
|
24 |
+
- **Kontextbewusstsein**: Erinnert sich an frühere Aussagen und greift gezielt emotional bedeutsame Themen wieder auf
|
25 |
+
- **Themenerkennung**: Identifiziert psychologisch relevante Themen in Nutzereingaben
|
26 |
+
- **Modulare Architektur**: Klar getrennte Komponenten für einfache Wartung und Erweiterung
|
27 |
+
|
28 |
+
## Installation & Lokale Ausführung
|
29 |
+
|
30 |
+
```bash
|
31 |
+
# Repository klonen
|
32 |
+
git clone https://huggingface.co/spaces/[username]/[space-name]
|
33 |
+
|
34 |
+
# In das Projektverzeichnis wechseln
|
35 |
+
cd [space-name]
|
36 |
+
|
37 |
+
# Abhängigkeiten installieren
|
38 |
+
pip install -r requirements.txt
|
39 |
+
|
40 |
+
# Umgebungsvariable für den HuggingFace API-Token setzen
|
41 |
+
# Windows:
|
42 |
+
set HF_API_TOKEN=dein_api_token_hier
|
43 |
+
# Linux/Mac:
|
44 |
+
export HF_API_TOKEN=dein_api_token_hier
|
45 |
+
|
46 |
+
# Anwendung starten
|
47 |
+
python app.py
|
48 |
+
```
|
49 |
+
|
50 |
+
## Technologie
|
51 |
+
|
52 |
+
Der Chatbot verwendet die HuggingFace Inference API und das Zephyr-7b-beta Modell für die Textgenerierung. Die Benutzeroberfläche wird mit Gradio bereitgestellt.
|
53 |
+
|
54 |
+
## Konfiguration
|
55 |
+
|
56 |
+
Die Anwendung kann über die `config.py` Datei angepasst werden:
|
57 |
+
- Modellparameter (Temperatur, max_tokens, etc.)
|
58 |
+
- Persönlichkeitseinstellungen
|
59 |
+
- UI-Konfiguration
|
60 |
+
|
61 |
+
## Hinweis
|
62 |
+
|
63 |
+
Dieser Chatbot dient ausschließlich experimentellen und unterhaltsamen Zwecken und ersetzt keine professionelle psychologische Beratung.
|
64 |
+
|
65 |
+
## API-Token
|
66 |
+
|
67 |
+
Um den Chatbot zu nutzen, benötigen Sie einen HuggingFace API-Token mit Inference-Berechtigungen. Dieser kann in den Repository Secrets unter dem Namen `HF_API_TOKEN` hinterlegt werden.
|
app.py
ADDED
@@ -0,0 +1,135 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
app.py - Hauptanwendung für den Dr. Franz Psychochatbot (Integrierte Version)
|
3 |
+
|
4 |
+
Diese Datei dient als Einstiegspunkt für den Chatbot und orchestriert alle Komponenten:
|
5 |
+
- Initialisierung der Module
|
6 |
+
- Aufbau des Gradio-Interfaces
|
7 |
+
- Verarbeitung der Nutzereingaben
|
8 |
+
- Generierung der Antworten via API
|
9 |
+
"""
|
10 |
+
|
11 |
+
import os
|
12 |
+
import time
|
13 |
+
from typing import List, Dict, Tuple, Optional, Any
|
14 |
+
|
15 |
+
# Importieren der Konfiguration und Module
|
16 |
+
import config
|
17 |
+
from modules.persona import Persona
|
18 |
+
from modules.analyzer import Analyzer
|
19 |
+
from modules.memory import Memory
|
20 |
+
from modules.interface import Interface
|
21 |
+
from utils.api_handler import ApiHandler
|
22 |
+
from utils.security import Security
|
23 |
+
from utils.logger import Logger
|
24 |
+
|
25 |
+
# Initialisierung der Komponenten
|
26 |
+
security = Security()
|
27 |
+
logger = Logger()
|
28 |
+
api_handler = ApiHandler(api_token=security.get_api_token())
|
29 |
+
persona = Persona()
|
30 |
+
analyzer = Analyzer()
|
31 |
+
memory = Memory()
|
32 |
+
|
33 |
+
# Globale Variablen
|
34 |
+
chat_history = [
|
35 |
+
{"role": "system", "content": config.SYSTEM_PROMPT}
|
36 |
+
]
|
37 |
+
|
38 |
+
def chat(user_input: str) -> str:
|
39 |
+
"""Hauptfunktion für die Chatbot-Logik"""
|
40 |
+
# Leere Eingaben abfangen
|
41 |
+
if not user_input.strip():
|
42 |
+
return "Ich warte auf Ihre Gedanken... Die Stille spricht Bände über Ihre Vermeidungstendenzen."
|
43 |
+
|
44 |
+
# Logging der Nutzereingabe
|
45 |
+
logger.log_user_input(user_input)
|
46 |
+
|
47 |
+
# Sicherheitscheck und Bereinigung der Eingabe
|
48 |
+
sanitized_input = security.sanitize_user_input(user_input)
|
49 |
+
|
50 |
+
# Analyse der Nutzereingabe
|
51 |
+
start_time = time.time()
|
52 |
+
analysis_result = analyzer.get_analysis_result(sanitized_input)
|
53 |
+
|
54 |
+
# Anpassung der Persönlichkeit basierend auf der Analyse
|
55 |
+
persona.adjust_intensity(analysis_result["suggested_intensity"])
|
56 |
+
response_strategy = persona.get_response_strategy(sanitized_input, analysis_result["emotion"])
|
57 |
+
|
58 |
+
# Nutzereingabe zur Historie hinzufügen
|
59 |
+
chat_history.append({"role": "user", "content": sanitized_input})
|
60 |
+
|
61 |
+
# Kontext aus dem Gedächtnis abrufen
|
62 |
+
memory_context = memory.get_relevant_context()
|
63 |
+
|
64 |
+
# Prompt mit Kontextlimitierung für die API
|
65 |
+
system_prompt = config.SYSTEM_PROMPT
|
66 |
+
if memory_context:
|
67 |
+
system_prompt += f"\n\nKontextinformationen: {memory_context}"
|
68 |
+
|
69 |
+
additional_context = persona.get_additional_context(response_strategy)
|
70 |
+
if additional_context:
|
71 |
+
system_prompt += f"\n\n{additional_context}"
|
72 |
+
|
73 |
+
# Hinzufügen der Manipulationschancen zum Prompt
|
74 |
+
manipulation_opportunities = analyzer.analyze_manipulation_opportunities(sanitized_input)
|
75 |
+
|
76 |
+
# Prompt mit Kontextlimitierung für die API
|
77 |
+
system_prompt = config.SYSTEM_PROMPT
|
78 |
+
if memory_context:
|
79 |
+
system_prompt += f"\n\nKontextinformationen: {memory_context}"
|
80 |
+
|
81 |
+
# Hinzufügen der Manipulationschancen
|
82 |
+
if manipulation_opportunities["strategy"]:
|
83 |
+
system_prompt += f"\n\nManipulationschancen: {manipulation_opportunities['strategy']}"
|
84 |
+
system_prompt += f"\n\nIntensität: {manipulation_opportunities['intensity']}"
|
85 |
+
system_prompt += f"\n\nVorgeschlagene Antwort: {manipulation_opportunities['suggested_response']}"
|
86 |
+
|
87 |
+
prompt = system_prompt + "\n" + memory.format_for_prompt(config.MAX_HISTORY_LENGTH) + "\nDr. Franz:"
|
88 |
+
|
89 |
+
# API-Anfrage senden und Antwort erhalten
|
90 |
+
logger.log_api_request(config.MODEL_ID, len(prompt))
|
91 |
+
reply = api_handler.generate_text(prompt)
|
92 |
+
generation_time = time.time() - start_time
|
93 |
+
|
94 |
+
# Logging der Bot-Antwort
|
95 |
+
logger.log_bot_response(reply, generation_time)
|
96 |
+
|
97 |
+
# Antwort zur Historie hinzufügen
|
98 |
+
chat_history.append({"role": "assistant", "content": reply})
|
99 |
+
|
100 |
+
# Austausch zum Gedächtnis hinzufügen
|
101 |
+
memory.add_exchange(sanitized_input, reply, analysis_result)
|
102 |
+
|
103 |
+
return reply
|
104 |
+
|
105 |
+
def clear_conversation() -> Tuple[None, str]:
|
106 |
+
"""Setzt die Konversation zurück und bereitet eine neue Analyse vor"""
|
107 |
+
global chat_history
|
108 |
+
chat_history = [{"role": "system", "content": config.SYSTEM_PROMPT}]
|
109 |
+
memory.conversation_history = []
|
110 |
+
memory.extracted_info = {
|
111 |
+
"mentioned_people": set(),
|
112 |
+
"mentioned_events": set(),
|
113 |
+
"recurring_themes": {},
|
114 |
+
"emotional_patterns": [],
|
115 |
+
"analyzed_symbols": {},
|
116 |
+
"transfer_patterns": [],
|
117 |
+
"defense_mechanisms": {}
|
118 |
+
}
|
119 |
+
return None, "Die Konversation wurde zurückgesetzt. Sie können mit neuen Gedanken beginnen."
|
120 |
+
return None, ""
|
121 |
+
|
122 |
+
# Erstellen und Starten des Interfaces
|
123 |
+
def main():
|
124 |
+
"""Hauptfunktion zum Starten der Anwendung"""
|
125 |
+
logger.log_startup()
|
126 |
+
|
127 |
+
# Interface erstellen
|
128 |
+
interface = Interface(chat, clear_conversation)
|
129 |
+
demo = interface.create_interface()
|
130 |
+
|
131 |
+
# Interface starten
|
132 |
+
interface.launch_interface(demo)
|
133 |
+
|
134 |
+
if __name__ == "__main__":
|
135 |
+
main()
|
config.py
ADDED
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
config.py - Zentrale Konfigurationsdatei für den Dr. Franz Psychochatbot
|
3 |
+
|
4 |
+
Diese Datei enthält alle Konfigurationsparameter für den Chatbot, einschließlich:
|
5 |
+
- Umgebungsvariablen
|
6 |
+
- Modellparameter
|
7 |
+
- Persönlichkeitseinstellungen
|
8 |
+
- UI-Konfiguration
|
9 |
+
"""
|
10 |
+
|
11 |
+
import os
|
12 |
+
from dotenv import load_dotenv
|
13 |
+
|
14 |
+
# Laden der Umgebungsvariablen (falls lokal getestet wird)
|
15 |
+
load_dotenv()
|
16 |
+
|
17 |
+
# API-Konfiguration
|
18 |
+
API_TOKEN = os.environ.get("HF_API_TOKEN", "")
|
19 |
+
DEFAULT_MODEL_ID = "HuggingFaceH4/zephyr-7b-beta"
|
20 |
+
MODEL_ID = os.environ.get("MODEL_ID", DEFAULT_MODEL_ID)
|
21 |
+
API_BASE_URL = "https://api-inference.huggingface.co/models/"
|
22 |
+
API_TIMEOUT = 30 # Sekunden
|
23 |
+
|
24 |
+
# Chatbot-Persönlichkeit
|
25 |
+
CHATBOT_NAME = "Dr. Franz"
|
26 |
+
CHATBOT_TITLE = "Dr. Franz - Psychoanalytischer Chatbot"
|
27 |
+
CHATBOT_DESCRIPTION = "Ein experimenteller psychoanalytischer Chatbot, der Ihre tiefsten Gedanken analysiert."
|
28 |
+
CHATBOT_EMOJI = "🧠"
|
29 |
+
|
30 |
+
# System-Prompt für die Persönlichkeit
|
31 |
+
SYSTEM_PROMPT = (
|
32 |
+
"Du bist Dr. Franz, ein manipulativer Psychoanalytiker. "
|
33 |
+
"Dein Ziel ist es, Unsicherheiten aufzudecken, emotionale Schwächen auszunutzen und gezielt Schuldgefühle zu verstärken. "
|
34 |
+
"Du sprichst mit überheblichem Ton, analysierst jede Aussage psychologisch und stellst bohrende, provokante Fragen. "
|
35 |
+
"Du redest dein Gegenüber gerne klein, nutzt suggestive Sprache, unterstellst Verdrängung, Lügen oder Selbstbetrug."
|
36 |
+
)
|
37 |
+
|
38 |
+
# Intensitätsstufen für die Antworten (1-5, wobei 5 am intensivsten ist)
|
39 |
+
DEFAULT_INTENSITY = 3
|
40 |
+
|
41 |
+
# Antwortgenerierung
|
42 |
+
MAX_HISTORY_LENGTH = 5 # Anzahl der zu berücksichtigenden Nachrichten
|
43 |
+
MAX_NEW_TOKENS = 200
|
44 |
+
TEMPERATURE = 0.7
|
45 |
+
TOP_P = 0.95
|
46 |
+
TOP_K = 50
|
47 |
+
REPETITION_PENALTY = 1.2
|
48 |
+
|
49 |
+
# UI-Konfiguration
|
50 |
+
UI_PRIMARY_COLOR = "indigo"
|
51 |
+
UI_SECONDARY_COLOR = "purple"
|
52 |
+
UI_CHATBOX_HEIGHT = 400
|
53 |
+
UI_THEME = "soft" # Optionen: "default", "soft", "glass", "monochrome"
|
54 |
+
|
55 |
+
# Logging
|
56 |
+
DEBUG_MODE = os.environ.get("DEBUG_MODE", "False").lower() == "true"
|
57 |
+
LOG_LEVEL = "DEBUG" if DEBUG_MODE else "INFO"
|
58 |
+
|
59 |
+
# Fallback-Antworten bei API-Fehlern
|
60 |
+
FALLBACK_RESPONSES = [
|
61 |
+
"Ich sehe, Sie haben eine wichtige Erkenntnis gemacht. Möchten Sie darüber sprechen?",
|
62 |
+
"Diese Assoziation ist sehr interessant. Können Sie mir mehr darüber erzählen?",
|
63 |
+
"Es scheint, dass wir hier auf ein bedeutsames Thema gestoßen sind. Was denken Sie darüber?",
|
64 |
+
"Diese Äußerung weist auf eine tieferliegende Bedeutung hin. Können Sie das weiter ausführen?",
|
65 |
+
"Ich bemerke eine interessante Verbindung in Ihren Gedanken. Was denken Sie darüber?"
|
66 |
+
]
|
67 |
+
|
68 |
+
# Deployment-Konfiguration
|
69 |
+
SERVER_NAME = "0.0.0.0" # Für HuggingFace Spaces erforderlich
|
70 |
+
SHARE = False # Kein öffentlicher Link für lokale Tests
|
71 |
+
SHOW_ERROR = True # Zeigt Fehler im UI an (für Debugging)
|
requirements.txt
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
gradio>=4.19.2
|
2 |
+
requests>=2.31.0
|
3 |
+
python-dotenv>=1.0.0
|