- Anfang 2023 begann LinkedIn damit, ein Produktportfolio mit GenAI-Funktionen auf den Markt zu bringen
- Die ersten GenAI-Produkte starteten als einfache Erfahrungen nach dem Muster „Prompt eingeben, String ausgeben“ und entwickelten sich zu dialogorientierten Agenten-Erlebnissen mit Unterstützung für Kontextspeicher
- Durch den Aufbau eines Tech-Stacks für GenAI-Anwendungen wurde ein Ansatz umgesetzt, der die Balance zwischen Time-to-Market und langfristigem Hebel wahrt
Entstehung und Entwicklung
- Es bestand die Notwendigkeit, ein Framework aufzubauen, das Standardmechanismen für gemeinsame Aufgaben bereitstellt
- Da der Großteil von LinkedIns Online-Serving-Stack in Java programmiert ist, begann man zunächst mit einem gemeinsamen Java-Midtier
- Mit zunehmender Zahl von Anwendungsfällen wurde dieses Midtier zu einem Entwicklungs- und Betriebsengpass, weshalb es in mehrere Java-Midtier-Services pro Anwendungsfall aufgeteilt wurde
- AI-Ingenieur:innen bevorzugen Python für Offline-Workflows auf Basis von LLMs, Prompt Engineering und Evaluierung
- Kurzfristig entschied man sich dafür, fragmentierte Online- und Offline-Stacks beizubehalten, langfristig jedoch Python auch für Online-Serving zu nutzen
- Aufbau eines Python-Frameworks für Online-Serving auf Basis des Open-Source-Projekts LangChain
- Start eines Projekts mit Fokus auf Python, um Python-Support für zentrale Infrastrukturabhängigkeiten zu ermöglichen
- Das aktuelle Framework für GenAI-Anwendungen ist ein dünner Wrapper über LangChain
Prompt-Management
- Prompt Engineering ist der wichtigste Mechanismus, um LLMs zu „programmieren“
- Anfangs wurde manuelle String-Interpolation im Code verwendet, was jedoch fehleranfällig und nicht skalierbar war
- Einführung einer Prompt-Source-of-Truth-Komponente und Standardisierung auf die Template-Sprache Jinja
- Die Bibliothek zur Prompt-Auflösung wurde von Java nach Python neu geschrieben
- Mit dem Aufkommen dialogorientierter UIs wurde mehr Struktur für die Rollen von Mensch und AI in Gesprächen bereitgestellt
- Am Ende konvergierte man auf die OpenAI Chat Completions API
Aufgabenautomatisierung über Skills
- Die Skill-Abstraktion wurde auf GenAI-Anwendungen ausgeweitet und als Mechanismus zur Aufgabenautomatisierung genutzt
- Anfangs wurde dies mit benutzerdefiniertem Code aufgebaut, der interne und externe APIs von LinkedIn mithilfe eines LLM-freundlichen JSON-Schemas kapselte
- Es traten Probleme wie doppelte Skill-Implementierungen, Änderungen an nachgelagerten Skills und manuelle Skill-Spezifikation durch Entwickler auf
- Einführung des Konzepts Skill Inversion, sodass nachgelagerte Systeme Skills definieren und der aufrufenden Anwendung bereitstellen
- Ein zentralisierter Skill-Registry-Service, Build-Plugins und dynamische LangChain-Tools vereinfachten den Zugriff auf Skills sowie Entwicklungs- und Betriebsprozesse
- Der Tech-Stack entwickelt sich weiter, um schrittweise Skill-Abstraktionen für alle APIs zu erzeugen, damit LLMs nahtlos interagieren können
Kontextbewusstsein und Personalisierung
- Da LLMs von Haus aus stateless sind, sind Kontextbewusstsein und Personalisierung schwierig
- Anfangs wurden Couchbase oder Espresso DB als Storage verwendet, und jedes Team war selbst für DB-Setup, Schreiben/Lesen usw. verantwortlich
- Da das Kontextfenster von LLMs begrenzt ist, wurden semantische Suche mittels Embeddings und Zusammenfassungsfunktionen erforderlich
- Aufbau einer Infrastruktur für Konversationsspeicher auf Basis des LinkedIn-Messaging-Stacks
- Einführung des Konzepts Experiential Memory, das aus Erfahrungen der Interaktion zwischen Nutzer:innen und Anwendung abgeleitet wird
- Integration in das Framework für GenAI-Anwendungen, damit Entwickler:innen dies nahtlos nutzen können
Modellinferenz und Fine-Tuning
- Anfangs wurden ausschließlich LLMs genutzt, die über den Azure OpenAI Service bereitgestellt wurden
- Für LinkedIn-spezifische Aufgaben feinabgestimmte LLMs wie Llama zeigten eine ähnliche oder bessere Qualität als kommerzielle Modelle
- Es wird daran gearbeitet, die Entwicklererfahrung über externe und interne Modelle hinweg transparent zu gestalten
- Die Inferenzschicht stellt für alle LLMs die OpenAI Chat Completions API bereit
- Über Konfigurations-Hooks im Anwendungs-Framework kann einfach zwischen On-Premises- und externen Modellen gewechselt werden
Migration
- Eine schnelle Migration von Legacy-Eigenlösungen zu standardisierten Lösungen ist entscheidend
- Ein schlankes Team aus Ingenieur:innen mit tiefem Wissen über den Java-Stack und den neuen Stack übernahm die Migration
- Es wurde ein schrittweiser Ansatz verwendet, bei dem einzelne Komponenten nacheinander migriert wurden
- Begonnen wurde mit einfachen und kleinen Apps, anschließend ging es zu komplexen und größeren Apps über
- Senior-Ingenieur:innen wurden mit neuen Python-Entwickler:innen gepaart, damit diese Python direkt in der Praxis lernen konnten
Abschließende Gedanken
- Der neue Tech-Stack für GenAI-Anwendungen schafft eine solide Grundlage, um AI-first-Entwicklung zu unterstützen und GenAI-Apps effizient und verantwortungsvoll zu bauen
- Er wird eine wichtige Rolle dabei spielen, die Vision zu verwirklichen, allen Mitgliedern der globalen Arbeitswelt wirtschaftliche Chancen zu eröffnen
- Es gibt noch viele Herausforderungen, die gelöst werden müssen
- Da sich die Spitze der Produkterfahrung von dialogorientierten Assistenten zu AI-Agenten verlagert, nehmen neue funktionale und operative Anforderungen stark zu. Auch dazu sollen später weitere Inhalte veröffentlicht werden
Noch keine Kommentare.