KI für DevOps-Engineers – Teil 3: Infrastruktur, Betrieb, Sicherheit und Agents


Bicycle

In den vorangegangenen Teilen (Teil 1 und Teil 2) dieser Blogserie haben wir uns mit Herausforderungen beschäftigt, vor denen DevOps heute steht, wie KI diese lösen kann und wie man mit Frameworks wie LangChain leistungsstarke KI-Anwendungen erstellt. In diesem letzten Teil befassen wir uns nun mit den Infrastrukturoptionen für das Hosting von KI-Anwendungen, der Optimierung ihrer Leistung, Generation Guardrails für eine sichere Interaktion und der Verwendung von KI-Agents zur Automatisierung von komplexen Workflows.

Hosting-Optionen für KI-Anwendungen

LLM-Hosting

Beim Einsatz von KI-Anwendungen ist eine der ersten Entscheidungen die Wahl der Hosting-Option für unser Sprachmodell. Es gibt zwei Hauptansätze: cloud-basierte und selbstgehostete Modelle.

Cloud-basierte Modelle

Cloud-basierte Modelle werden von Unternehmen wie OpenAI, Anthropic, Azure AI und noch mehr Cloud-Anbietern bereitgestellt. Diese Dienste sind vor allem wegen ihrer Benutzerfreundlichkeit und Skalierbarkeit beliebt.

Vorteile:

  • Einfache Nutzung: Man meldet sich einfach an, verbindet die App mit der API des Dienstes und kann sofort loslegen.
  • Skalierbarkeit: Von kleinen Projekten bis hin zu riesigen Arbeitslasten ist alles möglich.
  • Regelmäßige Updates: Anbieter stellen regelmäßig neue Funktionen und Verbesserungen zur Verfügung.

Herausforderungen:

  • Internetabhängigkeit: Erfordert eine stabile Internetverbindung.
  • Eingeschränkte Kontrolle: Man ist an einen Drittanbieterdienst gebunden, was eine eingeschränkte Kontrolle über das Modell bedeuten kann.
  • Datenschutz: Sensible Daten wie Passwörter oder Benutzerinformationen erfordern möglicherweise zusätzliche Sicherheitsvorkehrungen.

Selbstgehostete Modelle

Beim Self-Hosting wird das Modell mit Hilfe von Tools wie Ollama, Llama.cpp oder LM Studio auf der eigenen Infrastruktur ausgeführt.

Vorteile:

  • Vollständige Kontrolle: Man kann das Modell und den Datenfluss an seine eigenen Bedürfnisse anpassen.
  • Verbesserter Datenschutz: Die Daten bleiben in der eigenen Umgebung.

Herausforderungen:

  • Technisches Fachwissen: Kenntnisse zur Einrichtung und Wartung des Systems könnten erforderlich sein.
  • Hardware-Anforderungen: Erfordert geeignete Hardware, z. B. GPUs.
  • Wartungsverantwortung: Man selbst ist für Updates und den reibungslosen Betrieb verantwortlich.

Entscheidungsfaktoren:

  • Sicherheitsbedürfnisse: Bei sensiblen Daten bietet das Self-Hosting eine bessere Kontrolle. Bei Verwendung von Cloud-basierten Modellen könnten wir eine Anonymisierung oder ein Hashing der Daten in Betracht ziehen.
  • Skalierbarkeit: Cloud-Lösungen sind besser für große oder unvorhersehbare Arbeitslasten geeignet.
  • Kosten: Es ist immer ratsam, die Kosten für ein Cloud-Abonnement mit den Kosten für die Wartung einer lokalen Infrastruktur zu vergleichen.

Optimierung der Leistung: Inferenzgeschwindigkeit

Die Inferenzgeschwindigkeit gibt an, wie schnell ein Modell Reaktionen verarbeitet und erzeugt. Dies wird von mehreren Faktoren beeinflusst:

  • Hardware-Beschleunigung: Die Verwendung von GPUs oder Tensor Processing Units (TPUs) kann die Inferenz durch parallelisierte Berechnungen erheblich beschleunigen. Das ist besonders nützlich für umfangreiche oder komplexe Anwendungen, da CPUs aufgrund der sequenziellen Verarbeitung langsamer sind.
  • Modellgröße: LLMs enthalten Milliarden von Parametern. Kleinere Modelle ermöglichen im Allgemeinen schnellere Schlussfolgerungen. Sie können zwar einige Einbußen bei der Genauigkeit mit sich bringen, sind aber praktisch für Echtzeit- oder ressourcenbeschränkte Umgebungen.
  • Quantisierung: Durch Quantisierung wird die Genauigkeit der Modellgewichte reduziert (z. B. von 32-Bit auf 8-Bit), wodurch die Geschwindigkeit erhöht und die Speichernutzung bei minimalem Leistungsverlust verringert wird.
  • Caching: Caching speichert häufige Antworten oder Zwischenergebnisse und spart so Rechenzeit bei wiederholten Abfragen und verbessert die Effizienz.

Mehrere Modelle verwalten: Sprachmodell-Proxying

Wenn die Anwendung unterschiedliche Modelle für verschiedene Aufgaben benötigt, kann die Sprachmodell-Proxysuche helfen. Diese Technik leitet Anfragen auf der Grundlage vordefinierter Faktoren oder Aufgaben intelligent an bestimmte Modelle weiter.

LiteLLM: Vereinfachung der Verwaltung mehrerer Modelle

LiteLLM ist ein Open-Source-Framework, das die Arbeit mit mehreren Sprachmodellen vereinfachen soll. Es bietet eine standardisierte API zum Aufrufen von über 100 verschiedenen LLMs, wie OpenAI, Anthropic, Google Gemini und Hugging Face.

Vorteile:

  • Einheitliche Schnittstelle: Konsistente Antwortformatierung für alle Provider.
  • Vereinfachte Verwaltung: Wir können einfach zwischen Modellen wechseln, ohne den Code umzuschreiben.
  • Erweiterte Funktionen: Automatische Wiederholungsversuche, Fallback-Mechanismen und Ausgabenverfolgung.

Beispiel: Verwendung von LiteLLM für Multi-Modell-Anwendungen

Im Folgenden wird erläutert, wie LiteLLM zur Verwaltung mehrerer LLMs in einer einzigen Anwendung eingesetzt werden kann:

 1import streamlit as st
 2from litellm import completion
 3
 4st.title("Multi-Model Chat")
 5
 6# LiteLLM Completion function to get model response
 7def get_model_response(model_name: str, prompt: str) -> str:
 8  response = completion(model=model_name, messages=[{"role": "user", "content": prompt}])
 9  return response.choices[0].message.content
10
11# Streamlit UI Selection for model
12model_option = st.selectbox("Choose a language model:", ("gpt-3.5-turbo", "ollama/llama2", "gpt-4o"))
13
14# Chat history session state
15if 'chat_history' not in st.session_state:
16  st.session_state['chat_history'] = []
17
18user_input = st.text_input("You:")
19
20# Send user input and get model response
21if st.button("Send") and user_input:
22  st.session_state['chat_history'].append({"role": "user", "content": user_input})
23  with st.spinner("Thinking..."):
24    response = get_model_response(model_name=model_option, prompt=user_input)
25  st.session_state['chat_history'].append({"role": "model", "content": response})
26
27for message in reversed(st.session_state['chat_history']):
28  st.write(f"{message['role'].capitalize()}: {message['content']}")

In diesem Beispiel erstellen wir eine einfache Chat-Anwendung, bei der die Anwender aus verschiedenen Sprachmodellen wählen können. Die Funktion get_model_response sendet die Benutzereingabe an das ausgewählte Modell und gibt die Antwort zurück. Der Sitzungsstatus chat_history speichert den Gesprächsverlauf, und die Streamlit-Schnittstelle zeigt die Chat-Nachrichten in einer interaktiven Web-UI an.

Überwachung von LLM-Anwendungen

LLM-Überwachung

Sobald unsere KI-Anwendung läuft, ist die Überwachung ihrer Leistung entscheidend, um Zuverlässigkeit und Effizienz zu gewährleisten.

Zu überwachende Schlüsselmetriken

Leistungsmetriken:

  • Antwortzeit: Wie schnell das Modell eine Antwort erzeugt.
  • Durchsatz: Anzahl der in einer bestimmten Zeit bearbeiteten Anfragen.
  • Latenzzeit: Zeit bis zum ersten Token und Gesamtgenerierungszeit.
  • Fehlerraten: Verfolgen von fehlgeschlagenen Anfragen oder Timeouts, um Instabilität zu erkennen.

Metriken zur Nutzerbindung:

  • Benutzerbindung: Häufigkeit der Wiederkehr der Benutzer.
  • Sitzungsdauer: Durchschnittliche Zeit, die Nutzer mit der Interaktion verbringen.
  • Interaktionshäufigkeit: Wie oft die Nutzer interagieren.
  • Nutzer-Feedback-Bewertungen: Direkter Nutzer-Input für Verbesserungen.

Beobachtbarkeit:

  • Umfassende Protokollierung: Erfassen von detailliertem Systemverhalten.
  • Verteiltes Tracing: Verfolgen von Anfragen, um Engpässe oder Ausfälle zu identifizieren.
  • Echtzeit-Dashboards: Visualisieren von Metriken und Reagieren auf Probleme.

Tools für die Überwachung

Wir können KI-gestützte Tools wie Grafana oder BigPanda für eine effektive Überwachung und Analyse einsetzen.

Kostenerwägungen für LLM-Bewerbungen

Die Durchführung von LLM-Bewerbungen kann kostspielig sein, daher ist es wichtig, die Kosten zu kennen und zu verwalten.

Wichtige Kostenfaktoren

Kosten pro Token/Zeichen:

  • Die meisten LLM-APIs berechnen die Kosten auf der Grundlage der Anzahl der verarbeiteten Token (Eingabe + Ausgabe).
  • Fortgeschrittene Modelle (z. B. GPT-4) kosten mehr als einfachere (z. B. GPT-3.5).

Mengenrabatte:

  • Gestaffelte Preisstrukturen reduzieren die Kosten bei steigender Nutzung.

Zusätzliche Funktionen:

  • Feinabstimmung oder Spezialmodelle erhöhen die Leistung, verursachen aber zusätzliche Kosten.

Nutzungsbeschränkungen/Kontingente:

  • Das Überschreiten von Limits kann zu unerwarteten Gebühren oder Unterbrechungen führen.

Bewährte Praktiken

  • Vergleichen von Kosten verschiedener Anbieter, um den besten Anbieter zu finden.
  • Nutzen von Caching, um API-Aufrufe zu reduzieren und die Verwendung von Tokens zu sparen.
  • Überwachen der Nutzung, um innerhalb der Grenzen zu bleiben und unerwartete Kosten zu vermeiden.
  • Verstehen der Limits, um skalierbare Anwendungen zu entwickeln.
  • Für Anwendungen mit hohem Verkehrsaufkommen sollten wir höherstufige Tarife oder Strategien wie das Stapeln von Anfragen und das Zwischenspeichern von Antworten in Betracht ziehen.

Sicherheitsherausforderungen für öffentlich zugängliche LLM-Anwendungen

LLM-Sicherheit

Öffentlich zugängliche LLM-Anwendungen sind mit besonderen Sicherheitsanforderungen verbunden.

Potenzielle Bedrohungen

  • Prompt-Injektionen: Böswillige Benutzer können das Modell manipulieren, indem sie schädliche oder unangemessene Prompts einspeisen.
  • Offenlegung sensibler Daten: Modelle können sensible Informationen preisgeben, wenn sie nicht ordnungsgemäß gesichert sind.

Strategien zur Schadensbegrenzung

Validierung und Bereinigung von Eingaben:

  • Filtern von bösartigen Eingabeaufforderungen vor der Verarbeitung.
  • Überwachen und protokollieren von Interaktionen, um verdächtige Aktivitäten zu erkennen.

Generation Leitplanken:

  • Definieren von Inhaltsrichtlinien, um unangemessene Inhalte zu filtern.
  • Verwenden von Tools wie Toxizitätsdetektoren, um schädliche Inhalte zu klassifizieren und zu blockieren.

Validierung von Ausgaben:

  • Überprüfen von generierten Inhalte erneut auf schädliche oder unangemessene Ausgaben.
  • Verwenden von APIs zur Inhaltsmoderation, um ethische und sichere Antworten zu gewährleisten.

Agents: Komplexe Arbeitsabläufe automatisieren

KI-Agents sind mehr als nur Texterzeuger - sie führen eigenständig Aufgaben aus und ermöglichen komplexe, mehrstufige Arbeitsabläufe. Lasst uns die wichtigsten Merkmale dieser Agenten erkunden und wie man sie entwickelt.

Hauptmerkmale von AI-Agenten

  • Autonomie: Selbstständiges Treffen von Entscheidungen.
  • Zielorientiert: Konzentrieren sich auf die Erledigung von Aufgaben.
  • Interaktivität: Reagieren auf Veränderungen in ihrer Umgebung.
  • Anpassungsfähigkeit: Mit der Zeit lernen und sich verbessern.

Schlüsselkomponenten eines KI-Agenten

AI-Agent

Ein KI-Agent besteht aus mehreren Komponenten, die zusammenarbeiten, um Aufgaben effektiv zu erfüllen:

Tools

  • Zugang zu verschiedenen Tools (z.B. Kalender, CodeInterpreter, Website Scraping, APIs, etc.).
  • Ermöglicht Aufgaben, die von einfachen Berechnungen bis hin zu komplexen Problemlösungen reichen.
  • Dynamische Auswahl und Verwendung von Tools nach Bedarf.

Memory

  • Kurzzeitgedächtnis: Speichert Informationen für unmittelbare Aufgaben.
  • Langzeitgedächtnis: Behält Wissen über einen längeren Zeitraum und ermöglicht so Lernen und Anpassung.

Planning

  • Entwickelt Strategien für die Ausführung von Aufgaben.
  • Zerlegt komplexe Aufgaben in kleinere, überschaubare Schritte.

Execution und Feedback

  • Führt geplante Aktionen mit Hilfe von Werkzeugen und Speicher aus.
  • Rückkopplungsschleife: Die Ergebnisse fließen in die Planung ein und ermöglichen eine dynamische Verfeinerung.

LangGraph: Ein Werkzeug für Agent-Workflows

LangGraph ist ebenfalls eine Komponente des LangChain-Ökosystems, die eine "visuelle" Schnittstelle für die Gestaltung und Verwaltung von Agent-Workflows bietet. Sie vereinfacht den Prozess der Verbindung verschiedener Komponenten und der Orchestrierung komplexer Aufgaben.

Fähigkeiten von LangGraph:

  • Interaktion mit Nutzern: Sinnvolles Verarbeiten von Nutzereingaben.
  • Zugriff auf externe Dienste: Integration mit APIs, Datenbanken oder anderen Tools.
  • Autonomes Ausführen von Aufgaben: Ausführen von mehrstufigen Arbeitsabläufen ohne manuelles Eingreifen.
  • Graphen erstellen: Definieren von Zuständen, Übergängen und Aktionen, um das Verhalten des Agents zu steuern. Wir können auch Multi-Agenten-Systeme mit verschiedenen Formen der Kommunikation zwischen Agents aufbauen.

Beispiel: Recherche- und Verdichtungsagent

Dieser Agent führt eine Web-Recherche durch und fasst die Ergebnisse zusammen.

 1from langchain.chat_models import ChatOpenAI
 2from langchain.tools import DuckDuckGoSearchRun
 3from langgraph.graph import StateGraph, END
 4from typing import TypedDict, Annotated, List
 5import operator
 6
 7# Initialize models and tools
 8research_model = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.7)
 9summary_model = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.3)
10search_tool = DuckDuckGoSearchRun()
11
12# Define graph state structure
13class ResearchState(TypedDict):
14    query: str
15    research_results: Annotated[List[str], operator.add]
16    summary: str
17
18graph = StateGraph(ResearchState)
19
20# Define agent functions
21def research_agent(state):
22    query = state["query"]
23    search_result = search_tool.run(query)
24    return {"research_results": [search_result]}
25
26def summarization_agent(state):
27    research_results = state["research_results"]
28    summary_prompt = f"Summarize the following research results:\n{research_results}"
29    summary = summary_model.predict(summary_prompt)
30    return {"summary": summary}
31
32# Build the graph
33graph.add_node("research", research_agent)
34graph.add_node("summarize", summarization_agent)
35graph.set_entry_point("research")
36graph.add_edge("research", "summarize")
37graph.add_edge("summarize", END)
38
39# Compile and run
40app = graph.compile()
41
42def run_research(query):
43    result = app.invoke({"query": query, "research_results": [], "summary": ""})
44    return result["summary"]
45
46# Example usage
47research_topic = "Latest advancements in AI"
48summary = run_research(research_topic)
49print(f"Research Summary on '{research_topic}':\n{summary}")

In diesem Beispiel definieren wir einen Forschungsagent, der eine Websuche zu einem bestimmten Thema durchführt und die Ergebnisse zusammenfasst. Der Agent verwendet LangGraph, um einen Zustandsautomaten zu erstellen, der den Arbeitsablauf durch die Recherche- und Zusammenfassungsschritte leitet. Die Funktion run_research initiiert den Agent mit einer Suchanfrage und liefert die endgültige Zusammenfassung.

So würde die visuelle Darstellung dieses einfachen Arbeitsablaufs aussehen:

LangGraph Beispiel

Schlussfolgerung

In diesem letzten Teil unserer Blogserie haben wir die kritischen Aspekte der Bereitstellung und Verwaltung von KI-Anwendungen für DevOps-Engineers untersucht. Von Hosting-Optionen und Leistungsoptimierung bis hin zu Überwachung, Kostenmanagement und Sicherheit haben wir die wesentlichen Überlegungen zum Aufbau zuverlässiger und effizienter KI-gestützter Systeme behandelt. Außerdem haben wir über KI-Agents gesprochen und ihre Fähigkeit zur Automatisierung komplexer Workflows und zur Anpassung an dynamische Umgebungen vorgestellt.

Die wichtigsten Erkenntnisse aus der Blog-Serie

In dieser Blogserie wurde untersucht, wie KI DevOps verändert, von der Bewältigung von Herausforderungen bis hin zur Erstellung und Bereitstellung von fortschrittlichen KI-Anwendungen. Lasst uns kurz die wichtigsten Erkenntnisse zusammenfassen:

Teil 1: Die Bausteine von DevOps AI

  • Herausforderungen bei DevOps: Manuelle Prozesse, verzögerte Problemerkennung, Qualifikationsdefizite, Skalierbarkeitsprobleme und Sicherheitsschwachstellen.
  • Die Rolle von KI: Automatisierung von Aufgaben, Verbesserung der Zusammenarbeit, Vorhersage von Problemen und Verbesserung der Sicherheit.
  • Generative KI & LLMs: Sprachmodelle ermöglichen die Erstellung von Inhalten, Sprachverständnis und innovative Arbeitsabläufe.
  • RAG: Kombiniert LLMs mit externem Wissen für präzise, kontextabhängige Antworten.

Teil 2: Aufbau von KI-Anwendungen mit LangChain

  • LangChain Framework: Vereinfacht die Entwicklung von LLM-gestützten Anwendungen mit Werkzeugen für das Laden von Dokumenten, Vektorspeichern, Aufforderungen, Ketten und Agenten.
  • Praktische Beispiele: Chat-Anwendungen, Retrieval-Augmented Generation (RAG) und interaktive PDF-Chat-Anwendungen.
  • Qualitätssicherung: Tests, Bewertungsmetriken und Tools wie LangSmith gewährleisten Zuverlässigkeit und Leistung.

Teil 3: Infrastruktur, Betrieb, Sicherheit und Agenten

  • Hosting-Optionen: Cloud-basierte Modelle bieten Skalierbarkeit, während selbst gehostete Modelle Kontrolle und Datenschutz bieten.
  • Performance-Optimierung: Techniken wie Hardware-Beschleunigung, Quantisierung und Caching verbessern die Effizienz.
  • Betriebliche Exzellenz: Überwachungstools, Kostenmanagement und API-Limits sorgen für einen reibungslosen Betrieb.
  • Best Practices für die Sicherheit: Guardrails, Eingabevalidierung und Ausgabemoderation schützen öffentlich zugängliche Anwendungen.
  • KI-Agenten**: Autonome Systeme, die komplexe Arbeitsabläufe durchführen und dabei Tools, Speicher und Planung nutzen.

Danke, dass Sie uns auf dieser Reise begleiten! Bleiben Sie neugierig und zögern Sie nicht, sich bei Fragen oder Anregungen an uns zu wenden.

Wenn Sie noch mehr erfahren möchten, sehen Sie sich unbedingt unsere Videos unseres neuesten KI-Workshops für DevOps-Engineers auf YouTube an:

Zurück Unsere Trainings entdecken

Wir sind für Sie da

Sie interessieren sich für unsere Trainings oder haben einfach eine Frage, die beantwortet werden muss? Sie können uns jederzeit kontaktieren! Wir werden unser Bestes tun, um alle Ihre Fragen zu beantworten.

Hier kontaktieren