Die Welt der Künstlichen Intelligenz entwickelt sich rasant weiter, und wir stehen am Beginn einer neuen Ära der virtuellen Assistenten, die nicht nur die Effizienz steigern, sondern auch die Art und Weise, wie wir mit Technologie interagieren, revolutionieren. Während der Feiertage habe ich viel Zeit und Herzblut in mein Projekt zur AI Agent Infrastruktur investiert.
Das entwickeln und vor allem experimentieren, hat viel Spaß gemacht. Mit Pydantic AI habe ich die Basis für stabilen Agenten geschaffen, der ein wahres Multitalent ist. In diesem Beitrag möchte ich euch einen Einblick in die Fortschritte meiner KI Agenten geben und wie ich meine Infrastruktur weiter ausgebaut habe und was ich noch plane.
Vom Prototypen zur stabilen Anwendung
In der Entwicklung meiner AI Agenten habe ich den Fokus auf Vielseitigkeit und Stabilität gelegt. Mit n8n habe ich erst einen Prototyp erstellt (siehe Blogpost) und danach mit funktierenden Prompts den Agenten in eine Python Anwendung portiert. Dazu habe ich Pydantic AI genutzt, um die Typsicherheit und Flexibilität meiner Agenten zu gewährleisten.
In Pydantic AI habe ich dann einzelne Tools erstellt die dann von einem oder auch (später) mehren Agenten genutzt werden können.
Mein Pydantic AI Agent kann nicht nur Code-Snippets in meinem Filebin erstellen, sondern auch direkt auf meine Postgres-Datenbank zugreifen, Informationen im Internet recherchieren und mit meinem Dokumentenmanagementsystem (DMS) kommunizieren. Das Ziel ist es hier alle möglichen Dienste aus meinem Homelab zu integrieren. So kann der Agent jetzt schon einige API Endpunkt aus meinem API Server nutzen oder auch E-Mails versenden. Hier muss man auch ein wenig die Sicherheit im Auge behalten, aber das ist ein anderes Thema füe eine extra Blogpost.
Inzwischen hat sich eine sehr anständige Infrastruktur entwickelt, die es mir ermöglicht, die Agenten effizient zu verwalten und zu überwachen.
Das Ziel ist es, Routineaufgaben zu automatisieren und wertvolle Lebenszeit für wichtigeres zu sparen.
Pydantic AI
Pydantic bietet dabei ein großartiges Logging-Framework (Pydantic Logfire) und eine Agenten-Framework (Pydantic AI), die es mir ermöglichen, komplexe Prozesse und Datenströme effizient zu verwalten. Die Typsicherheit, die Pydantic bietet, ist besonders hilfreich, da viele große Sprachmodelle (LLMs) auf Python-Code basieren.
Dabei ist es faszinierend zu beobachten, wie gut LLMs die Pydantic-Modelle direkt interpretieren können.
So nutzt unter anderem der Langchain Structured Output Parser auch Pydantic Models um die Ausgabe zu strukturieren.
Das Prinzip kann man auch selbst einfach mal manuell in einem Prompt testen, indem man das gewünschte Ausgabeformat einfach als Code-Snippet mit einem Pydantic Model formuliert. Das funktioniert direkt aus der ChatGPT Oberfläche.
Beispiel (Shared ChatGPT):
Create a list of user and follow the structure:
class Address(BaseModel):
street: str
city: str
postal_code: str
class User(BaseModel):
name: str
email: str
addresses: List[Address]
Print only the user list.
Genau diese Prinzip macht Pydantic AI dann selbst zunutze um eine stabile typsichere Ausgabe zu erreichen. Bei Bedarf validiert es die Ausgabe auch und weist die KI erneut an eine Korrektur durchzuführen. Pydantic AI beherrscht dies (wenig überraschend) sehr gut, denn wer kennt sich mit den Pydantic Models besser aus als die Entwickler selbst?
Pydantic ist auch kompatibel mit mehr als nur den Modellen von OpenAI was auch eine gewisse Sicherheit bietet damit man keinen Vendor-Lock aufbaut, so wie ich das momentan sehr oft bei anderen Lösungen beobachte. Selbst versuche ich hier auch etwas mehr zu mische und setze auch mal Groq (super schnelle AI!), Google oder meine eigenen Ollama Modelle ein. Embeddings lasse ich momentan rein von Ollama auf eigener Hardware generieren. Es muss nicht immer nur OpenAI sein.
Wie sieht ein Pydantic AI Agent aus?
Ein Pydantic AI Agent besteht aus einem Agenten-Objekt, das die Konfiguration und die Tools enthält, die der Agent verwenden soll. Hier gekürztes Code-Beispiel, wie mein Agent momentan initialisiert wird:
import os
from dataclasses import dataclass
from httpx import AsyncClient
from pydantic_ai import Agent
from .tools.basic import current_datetime_tool, weekday_tool
# ...
@dataclass
class Deps:
client: AsyncClient
muench_dev_api_key: str | None
# .... more deps
async def get_deps() -> Deps:
async with AsyncClient() as client:
return Deps(
client=client,
# api.muench.dev API
muench_dev_api_key=os.getenv('MUENCH_DEV_API_KEY', 'default-muench-key'),
# ... more deps
)
agent_cmuench = Agent(
'openai:gpt-4o-mini',
deps_type=Deps,
retries=2,
tools=[
# Basic
current_datetime_tool,
weekday_tool,
# Muench.dev
get_weather_in_worms_tool,
crawl_website_as_markdown_tool,
#summarize_url_tool,
# n8n
list_n8n_workflows_tool,
# ... more tools
],
system_prompt=(
# language and Style
'Be concise. Reply friendly.',
'Answer in the same language then me.',
# Personal
'You are my (Christian Münch) personal Assistant.',
# more ...
)
)
Es gibt auch die Möglichkeit mit Annotationen zu arbeiten. In meinem Fall habe ich darauf verzichtet da ich die Tool lieber etwas modularer halten wollte. So kann ich auch mal ein Tool einfach austauschen oder hinzufügen. Auch das wiederverwenden von Tools ist so einfacher.
Das ist aber auch Geschmackssache. Ist der Agent nicht so kompliziert, kann ich der Schreibweise mit Annotationen auch etwas abgewinnen.
Beispiele für Tools und verschiedene Agenten finden sich auch in der offiziellen Pydantic AI Dokumentation.
https://ai.pydantic.dev/examples/
Die Idee eines Agenten-Netzwerks
Ein spannendes nächstes Ziel in meiner Projektentwicklung ist die Vernetzung meiner Agenten. Hierbei setze ich den Fokus auf den Pydantic AI Agenten, der als Bindeglied zwischen unterschiedlichen Agenten agieren soll. Ich plane, einen Agenten in n8n zu nutzen, um eine Art Netzwerk zu schaffen, in dem spezialisierte Agenten ihre Aufgaben ausführen können.
n8n ist besonders vorteilhaft, da es über 200 vorgefertigte Integrationen bietet, die die Anbindung externer Dienste erleichtern. Die Verwendung von Webhooks ermöglicht mir, Workflows und AI Agenten von extern zu starten und sorgt für maximale Flexibilität.
Datenaufbereitung mit Dagster und n8n
Ein weiterer wichtiger Aspekt meiner AI Agent Infrastruktur ist die effektive Datenaufbereitung. Hierbei kommen Dagster und n8n zum Einsatz. Während Dagster für die Verarbeitung größerer Datenmengen verantwortlich ist, übernehme ich mit n8n kleinere, ereignisorientierte Datenverarbeitung. Diese Kombination ermöglicht es mir, die Stärken beider Tools auszuspielen und die Effizienz in meiner Datenverarbeitung erheblich zu steigern.
Das Beispiel hier zeigt wie ich die Blog-Posts meiner Webseite in eine Qdrant Datenbank einfüge. Neue Blog-Posts werden über das RSS-Feed Trigger Node von n8n direkt gemeldet und der Workflow startet automatisch für den neuen Blog-Post.
Interaktion mit dem Agenten
Der Zugriff auf meinen Agenten erfolgt über eine API, die ich mit FastAPI implementiert habe, oder über einen Mattermost-Bot. Letzterer führt nicht nur die Chat-Historie, sondern speichert auch den Kontext der Gespräche, was bei Rückfragen hilfreich ist.
Die Mattermost Bot Anwendung ruft die API der Agenten-Anwendung auf und startet die entsprechenden Prozesse.
Dank der OpenAPI-Dokumentation kann ich die API direkt testen und sehe, welche Parameter ich übergeben muss. Über die API lässt sich der Agent auch in andere Tools integrieren.
Telemetrie
Um den Überblick über alle Aktivitäten zu behalten, setze ich auf Telemetrie-Tools wie Jaeger und Pydantic Logfire für Distributed Tracing. Dies gibt mir die Möglichkeit, Leistungsengpässe zu identifizieren und die Gesamtleistung meiner Agenten zu optimieren.
Pydantic bietet hier eine SaaS Lösung mit einem recht großen Free-Tier an, falls man keine eigene Infrastruktur aufbauen möchte.
Da Pydantic Logfire auf Basis des OpenTelemetry SDK entwickelt wurde, ist es aber auch möglich, eigene Telemetrie-Tools zu integrieren. Genau das habe ich auch gemacht und lasse die Daten in Jaeger einfließen.
Auch die Fehlersuche wird durch die Telemetrie-Tools erheblich erleichtert, da ich die gesamte Kommunikation zwischen den Agenten und den Diensten nachvollziehen kann. Dies ist besonders hilfreich, wenn es zu unerwarteten Fehlern kommt, die schwer zu reproduzieren sind. Tritt ein Fehler auf, kann ich in meinem Jaeger Dashboard nachvollziehen, welche Schritte der Agent durchlaufen hat und wo es zu Problemen gekommen ist.
Fazit
Die Weiterentwicklung meiner AI Agent Infrastruktur hat mir gezeigt, wie mächtig und flexibel moderne Technologien sind. Die Kombination aus Pydantic AI, n8n, Dagster und verschiedenen LLMs ist äußerst vielversprechend und eröffnet fast unendliche Möglichkeiten für Automatisierung und Datenverarbeitung.
Wenn du dir überlegst, eigene Agenten einzurichten, solltest du ausprobieren, wie du verschiedene Tools und Services miteinander kombinieren kannst, um ein starkes Agenten-Netzwerk zu bauen. Nutze die Vorteile von Typsicherheit und Modularität, die Pydantic bietet, um deine Agenten mit unterschiedlichen Modellen und Anbietern zu verbinden. In dieser spannenden Zeit der digitalen Transformation lohnt es sich, neue Technologien offen anzunehmen und ständig nach kreativen Wegen zu suchen, deine Projekte weiterzuentwickeln.
Bleib neugierig und experimentierfreudig – die Zukunft gehört denen, die mutig genug sind, neue Wege zu gehen!