Blog
Moderne KI für die JVM - Xef.ai 0.0.2

Letzten Monat hat unser Team ein neues Projekt vorgestellt, Xef.ai. Das Projekt zielt darauf ab, die bequemste Schnittstelle zu modernen KI-Techniken, einschließlich Large Language Models und Bilderzeugung, anzubieten, damit Entwickler diese als Teil größerer Systeme und Anwendungen integrieren können.
Nach der Veröffentlichung von 0.0.1 haben wir intern und für unsere Kunden einige Proof-of-Concept-Anwendungen entwickelt. Diese Erfahrungen haben uns gezeigt, was in den aktuellen Bibliotheken funktionierte, was neu organisiert werden musste und was noch fehlte, um leistungsstarke KI-basierte Dienste zu erstellen. Das Ergebnis ist die neue Version 0.0.2 von Xef.ai, die Sie über Maven Central beziehen können.
Erstklassige Unterstützung für Java
Ursprünglich hatten wir Kotlin und Scala im Visier, um für beide idiomatische Schnittstellen anzubieten. In dieser Version gehen wir noch einen Schritt weiter und machen Xef.ai leicht von Java aus konsumierbar, das zweifellos die größte Sprache im JVM-Bereich ist.
Eine Bibliothek wie Xef.ai profitiert sehr von gleichzeitiger Arbeit. Unter den vielen Möglichkeiten für nebenläufige und reaktive Abstraktionen in der JVM haben wir uns für die Verwendung von CompletableFuture. Diese Abstraktion ist in der JVM seit Version 8 verfügbar, und die meisten Bibliotheken bieten eine hervorragende Interoperabilität mit ihr (zum Beispiel in kotlinx.coroutines oder Cats Effect).
Der Einstiegspunkt zu Xef.ai aus Java ist ein AIScopedie alle erforderlichen Ressourcen für den Zugriff auf KI-Dienste initialisiert. Innerhalb dieses Bereichs können Sie Funktionen aufrufen wie prompt, die ein großes Sprachmodell abfragt. Um die Schritte miteinander zu verknüpfen, müssen Sie CompletableFutureMethoden, wie thenAccept.
Versuchen Sie (AIScope Umfang = neu AIScope()) {
Umfang.Eingabeaufforderung("Geben Sie mir eine Auswahl an Büchern über " + Thema, Buchen.Klasse)
.thenAccept(System.aus::println)
.erhalten.();
}
Sie haben vielleicht bemerkt, dass in der prompt Aufruf geben wir die Art des Ergebnisses an, das wir erhalten möchten. Wenn es sich bei Ihrer Klasse um ein einfaches Datenübertragungsobjekt handelt, wie das folgende, brauchen Sie keine weiteren Anmerkungen oder Vorbereitungen, um es zu verwenden.
öffentlich Klasse Buchen {
@NotNull öffentlich Zeichenfolge Titel;
@NotNull öffentlich Zeichenfolge Autor;
@NotNull öffentlich int Jahr;
@NotNull öffentlich Zeichenfolge Genre;
@Überschreiben Sie
öffentlich Zeichenfolge toString() { ... }
}
Unsere Roadmap sieht vor, Xef.ai gleichberechtigt für Java, Scala und Kotlin zu entwickeln. Wir haben portiert alle unsere Beispiele zu den drei Sprachen. Schauen Sie sich ruhig um, wenn Sie daran interessiert sind, wie die Funktionalität von allen Sprachen genutzt wird.
Einer für alle, alle für einen
Unsere erste Implementierung basierte auf einem Kotlin-Kern, der von Scala verwendet wird. Dies erwies sich zwar als machbar, aber auf lange Sicht schwer zu pflegen. Außerdem ist es schwierig, eine idiomatische Java-API bereitzustellen, wenn die Hauptimplementierung Kotlin-Funktionen wie Erweiterungsmethoden und Aussetzungen verwendet, die in Java nicht verfügbar sind. Für Version 0.0.2 haben wir unsere Kernfunktionalität in eine neue xef-core Bibliothek, mit Blick auf die Interoperabilität.
Das wichtigste Ergebnis aus der Sicht des Entwicklers ist ein kleinerer Abhängigkeitsfußabdruck. Xef.ai ist nicht mehr von der KotlinX Serialisierungs- oder Coroutines-Bibliothek abhängig, es sei denn, Sie verwenden die Kotlin-Version. Diese Änderung sollte die Integration von Xef.ai in eine größere Anzahl von Anwendungen erleichtern.
Als Beweis für diese neue Fähigkeit zur Zusammenarbeit zwischen JVM-Sprachen arbeiten wir schnell an einer Version von Xef.ai, die sich in die Katzen Effekt. Miau!
Lokale Modelle
Sie sind nicht mehr auf einen Cloud-Service - OpenAI oder HuggingFace-Endpunkte - beschränkt, wenn Sie Xef.ai nutzen möchten. Wir haben integriert GPT4All, eine Bibliothek, die LLM-Modelle lokal auf Ihrem Computer ausführt. Die Liste der derzeit unterstützten Modelle enthält bereits mehr als ein Dutzend.
Der folgende Code lädt eines der verfügbaren Modelle herunter und verwendet es dann für die Eingabeaufforderung. Da Modelle ziemlich groß sind, in der Regel im Bereich von Gigabytes, benötigen wir einen stabilen Pfad zum Speichern, um erneute Downloads zu vermeiden.
val MODELL_URL = "https://gpt4all.io/models/ggml-gpt4all-j-v1.3-groovy.bin"
val DOWNLOAD_PATH = "./ggml-gpt4all-j-v1.3-groovy.bin"
ai {
GPT4All(MODELL_URL, DOWNLOAD_PATH).use { gpt4All ->
gpt4All.promptMessage("Was sind die bekanntesten Songs der Beatles?")
}
}.getOrThrow()
Die Kommunikation mit GPT4All erfolgt über Java Native Access. Zum Zeitpunkt dieses Beitrags haben wir überprüft, dass alles auf den Plattformen MacOS und Linux korrekt funktioniert.
Die Integration von GPT4All ist der erste Meilenstein für lokale Modelle in Xef.ai. Unsere Roadmap sieht vor, weitere Technologien in diesem Bereich zu prüfen, z. B. Transformatoren, und die besten Prozesse für die Bereitstellung und Verwaltung dieser Modelle zu entwickeln.
Baum der Gedanken (ToT)
Xef.ai ist nur so nützlich wie die Pipelines, die Sie damit erstellen können. Im Rahmen der Entwicklung von 0.2 haben wir eine Variante von Tree of Thoughts, eine Technik, die die Ergebnisse verbessert, indem sie den LLM besser leitet. Die Beispiel-Implementierung in Kotlin verwendet diese Technik im Zusammenhang mit der Überprüfung eines Codes. In dieser Beispielimplementierung verwenden wir den LLM, um ähnlich wie ein Mensch zu denken, wenn wir versuchen, ein Problem zu lösen. Wir generieren Anleitungen und Selbstkritik für jede vorgeschlagene Lösung, bis eine akzeptable Lösung für ein Problem gefunden wurde. Dabei gehen wir zurück und wiederholen verschiedene Lösungen für eine feste Anzahl von maximalen Iterationen. Wir planen, ähnliche Muster wie Tree of Thought zu erforschen und zu entwickeln und werden sie in Xef verfügbar machen, sobald sie sich als nützlich und ausgereift erweisen.
Mit OpenAI auf dem Laufenden bleiben
Eine der interessanten Funktionen der ersten Version von xef.ai war die Integration der Serialisierung, um Werte Ihrer eigenen Typen direkt zu erzeugen. Wir haben dann über unsere Untersuchung komplexerer Techniken zur Verbesserung dieses Aspekts berichtet, den wir für eine enge Integration zwischen KI und den übrigen Datenquellen für unerlässlich halten.
Ein paar Wochen später, OpenAI angekündigt die Verfügbarkeit des Mechanismus"Funktionsaufrufe". Wenn Sie ihn richtig einrichten, können Sie OpenAI anweisen, nach einem bestimmten JSON-Schema zu antworten. Das ist genau die Funktionalität, die für die Serialisierung erforderlich ist! In der Version 0.2 haben wir diese Funktion integriert, was zu besseren Ergebnissen bei der Eingabeaufforderung führt.
Streaming
Eine kleinere Funktion, die je nach Szenario eine große Wirkung haben kann, ist die Möglichkeit, die Strom Antworten zu erhalten, anstatt sie vollständig konsumieren zu müssen. Wenn Sie z.B. möchten, dass OpenAI Antworten streamt, können Sie jetzt Teile der Chat-Antwort als Zeichen erhalten, die Sie verarbeiten können, ohne auf die vollständige Antwort zu warten und diese zu blockieren.
Über xef.ai
Gehen Sie zu Xef.ai, und @Xef_ai für die beste Quelle für Dokumentation und Neuigkeiten. Um einen breiteren Überblick über die Ziele des Projekts zu erhalten, diese Präsentation von Raúl Raja stellt Ihnen die wichtigsten Funktionen und einige interessante Anwendungsfälle vor.
Verfasst von
Alejandro Serrano Mena
Unsere Ideen
Weitere Blogs
Contact



