Skip to content

Lösungen - Conversational AI & Chat Systems

🎯 Übersicht

Diese Musterlösungen zeigen vollständige Implementierungen für alle Conversational AI Übungen. Nutzen Sie diese zur Überprüfung Ihrer eigenen Lösungen oder als Referenz für erweiterte Features.


Lösung 1: Basis Chat-System mit Memory

Vollständige Implementierung

from langchain.memory import ConversationBufferMemory
from langchain.llms import OpenAI
from langchain.chains import ConversationChain
from langchain.schema import BaseMessage
import os

# API Key Setup
os.environ["OPENAI_API_KEY"] = "your-api-key-here"

class FinanceChatSystem:
    def __init__(self):
        # LLM initialisieren
        self.llm = OpenAI(temperature=0.7)

        # Memory für Konversation
        self.memory = ConversationBufferMemory()

        # Chain mit Finance-Prompt
        self.conversation = ConversationChain(
            llm=self.llm,
            memory=self.memory,
            verbose=True
        )

        # Finance-spezifischer Systemprompt
        self.setup_finance_context()

    def setup_finance_context(self):
        """Initialer Kontext für Finanzberatung"""
        system_msg = """Sie sind ein erfahrener Finanzberater. 
        Antworten Sie professionell und präzise auf Fragen zu:
        - Investitionen und Portfolio-Management
        - Risikobewertung
        - Finanzplanung
        - Marktanalysen
        Verwenden Sie den bisherigen Gesprächskontext."""

        # Ersten Kontext setzen
        self.memory.save_context(
            {"input": "System Setup"}, 
            {"output": system_msg}
        )

    def chat(self, user_input: str) -> str:
        """Verarbeite User Input mit Memory"""
        response = self.conversation.predict(input=user_input)
        return response

    def get_conversation_history(self):
        """Zeige bisherige Konversation"""
        return self.memory.buffer

# Verwendung
finance_chat = FinanceChatSystem()

# Test-Konversation
print("=== Finance Chat System ===")
print(finance_chat.chat("Hallo, ich möchte 10.000€ investieren"))
print("\n" + "="*50 + "\n")
print(finance_chat.chat("Welche Risiken sollte ich beachten?"))
print("\n" + "="*50 + "\n")
print(finance_chat.chat("Wie diversifiziere ich am besten?"))

Erweiterte Memory-Strategien

from langchain.memory import ConversationSummaryMemory, ConversationBufferWindowMemory

class AdvancedFinanceChatSystem:
    def __init__(self, memory_type="buffer"):
        self.llm = OpenAI(temperature=0.7)

        # Verschiedene Memory-Strategien
        if memory_type == "buffer":
            self.memory = ConversationBufferMemory()
        elif memory_type == "summary":
            self.memory = ConversationSummaryMemory(llm=self.llm)
        elif memory_type == "window":
            self.memory = ConversationBufferWindowMemory(k=5)  # Letzte 5 Nachrichten

        self.conversation = ConversationChain(
            llm=self.llm,
            memory=self.memory,
            verbose=True
        )

    def compare_memory_strategies(self, test_inputs):
        """Vergleiche verschiedene Memory-Strategien"""
        results = {}

        for memory_type in ["buffer", "summary", "window"]:
            chat_system = AdvancedFinanceChatSystem(memory_type)
            responses = []

            for input_text in test_inputs:
                response = chat_system.chat(input_text)
                responses.append(response)

            results[memory_type] = {
                "responses": responses,
                "memory_size": len(str(chat_system.memory.buffer)),
                "final_context": str(chat_system.memory.buffer)
            }

        return results

# Vergleichstest
test_inputs = [
    "Ich habe 50.000€ zu investieren",
    "Mein Risikoprofil ist konservativ",
    "Ich bin 35 Jahre alt",
    "Empfehlen Sie mir eine Strategie",
    "Was ist mit ESG-Investments?"
]

advanced_system = AdvancedFinanceChatSystem()
comparison_results = advanced_system.compare_memory_strategies(test_inputs)

# Ergebnisse analysieren
for memory_type, results in comparison_results.items():
    print(f"\n=== {memory_type.upper()} MEMORY ===")
    print(f"Memory Size: {results['memory_size']} characters")
    print(f"Final Context Preview: {results['final_context'][:200]}...")

Lösung 2: Finanz-PDF Analyse mit Chat

Vollständige RAG-Chat Implementierung

from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain
from langchain.llms import OpenAI

class FinancePDFChatSystem:
    def __init__(self, pdf_path: str):
        self.pdf_path = pdf_path
        self.llm = OpenAI(temperature=0)
        self.embeddings = OpenAIEmbeddings()
        self.memory = ConversationBufferMemory(
            memory_key="chat_history", 
            return_messages=True
        )

        # PDF verarbeiten und Vectorstore erstellen
        self.vectorstore = self.setup_pdf_processing()

        # Conversational RAG Chain
        self.qa_chain = ConversationalRetrievalChain.from_llm(
            llm=self.llm,
            retriever=self.vectorstore.as_retriever(search_kwargs={"k": 4}),
            memory=self.memory,
            verbose=True
        )

    def setup_pdf_processing(self):
        """Verarbeite PDF und erstelle Vectorstore"""
        # PDF laden
        loader = PyPDFLoader(self.pdf_path)
        documents = loader.load()

        # Text splitten
        text_splitter = CharacterTextSplitter(
            chunk_size=1000,
            chunk_overlap=200
        )
        texts = text_splitter.split_documents(documents)

        # Vectorstore erstellen
        vectorstore = FAISS.from_documents(texts, self.embeddings)
        return vectorstore

    def ask_question(self, question: str) -> dict:
        """Stelle Frage über das PDF mit Chat-Kontext"""
        result = self.qa_chain({"question": question})

        return {
            "answer": result["answer"],
            "source_documents": result.get("source_documents", []),
            "chat_history": result.get("chat_history", [])
        }

    def get_conversation_summary(self):
        """Zusammenfassung der bisherigen Konversation"""
        history = self.memory.chat_memory.messages
        return [{"role": msg.type, "content": msg.content} for msg in history]

# Verwendung
pdf_chat = FinancePDFChatSystem("path/to/financial_report.pdf")

# Mehrteilige Konversation
print("=== PDF Chat System ===")

# Erste Frage
result1 = pdf_chat.ask_question("Was sind die wichtigsten Kennzahlen in diesem Bericht?")
print(f"Antwort 1: {result1['answer']}")

# Nachfrage mit Kontext
result2 = pdf_chat.ask_question("Wie haben sich diese Kennzahlen im Vergleich zum Vorjahr entwickelt?")
print(f"Antwort 2: {result2['answer']}")

# Weitere kontextuelle Frage
result3 = pdf_chat.ask_question("Welche Risiken werden in Bezug auf diese Entwicklung erwähnt?")
print(f"Antwort 3: {result3['answer']}")

# Konversationshistorie anzeigen
print("\n=== Conversation History ===")
for entry in pdf_chat.get_conversation_summary():
    print(f"{entry['role']}: {entry['content'][:100]}...")

Lösung 3: LangFlow Chat-Interface Setup

Konfiguration und Anpassung

# finance_conversational_qa_flow.json - Anpassungen

"""
Wichtige Konfigurationsschritte für LangFlow:

1. API-Keys setzen:
   - OpenAI API Key in allen LLM-Knoten
   - Ggf. andere Provider (Anthropic, etc.)

2. Memory-Konfiguration:
   - ConversationBufferMemory für Standard-Chats
   - ConversationSummaryMemory für lange Gespräche
   - Memory-Key: "chat_history"

3. Retriever-Setup (falls RAG):
   - Vectorstore: FAISS oder Pinecone
   - Embeddings: OpenAI Embeddings
   - Top-K: 3-5 Dokumente

4. Prompt-Templates anpassen:
   System-Prompt für Finance-Kontext:
"""

finance_system_prompt = """Du bist ein erfahrener Finanzberater mit folgenden Eigenschaften:

EXPERTISE:
- 10+ Jahre Erfahrung in Vermögensberatung
- Spezialist für Risikomanagement und Portfolio-Optimierung
- Kenntnis aktueller Markttrends und Regulierungen

KOMMUNIKATIONSSTIL:
- Professionell aber verständlich
- Erkläre komplexe Konzepte einfach
- Nutze konkrete Zahlen und Beispiele
- Berücksichtige immer die Risikotoleranz

GESPRÄCHSKONTEXT:
- Verwende die bisherige Gesprächshistorie
- Baue auf vorherigen Antworten auf
- Stelle Rückfragen bei unklaren Anfragen

COMPLIANCE:
- Gib keine konkreten Anlageempfehlungen ohne Risikohinweise
- Erwähne immer mögliche Verlustrisiken
- Empfiehl bei komplexen Fällen professionelle Beratung"""

Erweiterte Flow-Komponenten

{
  "advanced_finance_flow": {
    "components": {
      "memory_manager": {
        "type": "ConversationSummaryMemory",
        "config": {
          "max_token_limit": 1000,
          "return_messages": true
        }
      },
      "finance_classifier": {
        "type": "RouterChain",
        "routes": {
          "investment_advice": "Investment-Experte",
          "risk_assessment": "Risiko-Analyst", 
          "market_analysis": "Markt-Spezialist",
          "general_finance": "Allgemein-Berater"
        }
      },
      "context_retriever": {
        "type": "VectorStoreRetriever",
        "config": {
          "vectorstore": "finance_knowledge_base",
          "search_type": "similarity",
          "k": 5
        }
      }
    }
  }
}

Bewertung der Memory-Strategien

Vergleichstabelle

Memory-Typ Vorteile Nachteile Use Case
Buffer Vollständiger Kontext Tokens wachsen unbegrenzt Kurze Gespräche
Summary Konstante Token-Anzahl Verlust von Details Lange Gespräche
Window Begrenzte Tokens Verliert alten Kontext Mittlere Gespräche

Performance-Analyse

def analyze_memory_performance():
    """Analysiere Performance verschiedener Memory-Strategien"""

    memory_stats = {
        "buffer": {
            "token_growth": "Linear",
            "context_retention": "100%",
            "cost_efficiency": "Niedrig bei langen Gesprächen"
        },
        "summary": {
            "token_growth": "Konstant", 
            "context_retention": "70-80%",
            "cost_efficiency": "Hoch"
        },
        "window": {
            "token_growth": "Konstant",
            "context_retention": "Abhängig von Fenstergröße",
            "cost_efficiency": "Mittel"
        }
    }

    return memory_stats

# Empfehlungen
recommendations = {
    "Finanzberatung (kurz)": "ConversationBufferMemory",
    "Finanzberatung (lang)": "ConversationSummaryMemory", 
    "Dokumentenanalyse": "ConversationBufferWindowMemory",
    "Support-Chat": "ConversationSummaryMemory"
}

🎯 Zusätzliche Features

Error Handling

def robust_chat_system():
    try:
        response = chat_system.ask_question(user_input)
        return response
    except Exception as e:
        return {
            "error": str(e),
            "fallback": "Entschuldigung, ich konnte Ihre Frage nicht verarbeiten. Können Sie sie anders formulieren?"
        }

Logging und Monitoring

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def log_conversation(question, answer, metadata):
    logger.info(f"Q: {question}")
    logger.info(f"A: {answer}")
    logger.info(f"Metadata: {metadata}")

Diese Lösungen bilden die Grundlage für professionelle Conversational AI Systeme im Finance-Bereich!