Präsentation von Mall for R… und Python
Der Anfang
Als ich vor ein paar Monaten am Databricks with R-Workshop arbeitete, stieß ich auf einige ihrer benutzerdefinierten SQL-Funktionen. Diesen besonderen Funktionen wird „ai_“ vorangestellt und sie führen NLP mit einem einfachen SQL-Aufruf durch:
> SELECT ai_analyze_sentiment('I am happy');
positive
> SELECT ai_analyze_sentiment('I am sad');
negative
Es war eine Offenbarung für mich. Er stellte eine neue Möglichkeit vor, LLMs in unserer täglichen Arbeit als Analysten einzusetzen. Bisher habe ich LLMs hauptsächlich für Code-Vervollständigung und Entwicklungsaufgaben eingesetzt. Dieser neue Ansatz konzentriert sich jedoch stattdessen auf die Verwendung von LLMs direkt für unsere Daten.
Meine erste Reaktion war, zu versuchen, über R. With auf benutzerdefinierte Funktionen zuzugreifen
dbplyr Wir können in R auf SQL-Funktionen zugreifen, und es war toll zu sehen, wie sie funktionieren:
orders |>
mutate(
sentiment = ai_analyze_sentiment(o_comment)
)
#> # Source: SQL (6 x 2)
#> o_comment sentiment
#>
#> 1 ", pending theodolites … neutral
#> 2 "uriously special foxes … neutral
#> 3 "sleep. courts after the … neutral
#> 4 "ess foxes may sleep … neutral
#> 5 "ts wake blithely unusual … mixed
#> 6 "hins sleep. fluffily … neutral
Ein Nachteil dieser Integration besteht darin, dass sie zwar über R zugänglich ist, wir jedoch eine Live-Verbindung zu Databricks benötigen, um ein LLM auf diese Weise zu nutzen, wodurch die Anzahl der Personen begrenzt ist, die davon profitieren können.
Laut ihrer Dokumentation betreibt Databricks das Modell Llama 3.1 70B. Obwohl es sich um ein sehr effizientes erweitertes Sprachmodell handelt, stellt seine enorme Größe eine erhebliche Herausforderung für die Computer der meisten Benutzer dar und macht die Ausführung auf Standardhardware unpraktisch.
Nachhaltigkeit erreichen
Die Entwicklung von LLM hat sich rasant beschleunigt. Zunächst waren nur große Online-Sprachmodelle (LLMs) für den täglichen Gebrauch brauchbar. Dies hat bei Unternehmen Bedenken hervorgerufen, die zögern, ihre Daten extern weiterzugeben. Darüber hinaus können die Kosten für die Nutzung von Online-LLMs erheblich sein und die Gebühren pro Token können sich schnell summieren.
Die ideale Lösung wäre die Integration eines LLM in unsere eigenen Systeme, was drei wesentliche Komponenten erfordert:
- Ein Modell, das angenehm in Erinnerung bleibt
- Ein Modell, das für NLP-Aufgaben eine ausreichende Genauigkeit erreicht
- Eine intuitive Schnittstelle zwischen dem Modell und dem Laptop des Benutzers
Im vergangenen Jahr war es fast unmöglich, alle drei dieser Artikel zu haben. Modelle, die in den Speicher passten, waren entweder ungenau oder übermäßig langsam. Jüngste Fortschritte wie Metas Llama und plattformübergreifende Interaktions-Engines wie Ollama haben jedoch den Einsatz dieser Modelle ermöglicht und bieten eine vielversprechende Lösung für Unternehmen, die LLMs in ihre Arbeitsabläufe integrieren möchten.
Das Projekt
Dieses Projekt begann als Erkundung, angetrieben von meinem Interesse daran, ein „allgemeines“ LLM zu nutzen, um Ergebnisse zu erzielen, die mit denen der KI-Funktionen von Databricks vergleichbar sind. Die größte Herausforderung bestand darin, den Grad der Einrichtung und Vorbereitung zu bestimmen, der für ein solches Modell erforderlich ist, um zuverlässige und konsistente Ergebnisse zu liefern.
Da ich keinen Zugang zu einem Designdokument oder Open-Source-Code hatte, verließ ich mich ausschließlich auf die LLM-Ergebnisse als Testgelände. Dies stellte mehrere Hindernisse dar, darunter die vielen verfügbaren Optionen zur Verfeinerung des Modells. Selbst im Rapid Engineering sind die Möglichkeiten enorm. Um sicherzustellen, dass das Modell nicht zu spezialisiert war oder sich auf ein bestimmtes Thema oder Ergebnis konzentrierte, musste ich ein empfindliches Gleichgewicht zwischen Präzision und Allgemeingültigkeit finden.
Glücklicherweise habe ich nach umfangreichen Tests herausgefunden, dass eine einfache „One-Shot“-Eingabeaufforderung die besten Ergebnisse liefert. Mit „am besten“ meine ich, dass die Antworten sowohl für eine bestimmte Zeile korrekt als auch über mehrere Zeilen hinweg konsistent waren. Konsistenz war von entscheidender Bedeutung, da es darum ging, Antworten bereitzustellen, die einer der angegebenen Optionen (positiv, negativ oder neutral) entsprachen, ohne dass eine zusätzliche Erklärung erforderlich war.
Hier ist eine Beispielaufforderung, die mit Llama 3.2 zuverlässig funktioniert hat:
>>> You are a helpful sentiment engine. Return only one of the
... following answers: positive, negative, neutral. No capitalization.
... No explanations. The answer is based on the following text:
... I am happy
positive
Abgesehen davon erwiesen sich meine Versuche, mehrere Zeilen gleichzeitig einzureichen, als erfolglos. Ich habe tatsächlich viel Zeit damit verbracht, verschiedene Ansätze auszuprobieren, beispielsweise 10 oder 2 Zeilen gleichzeitig einzureichen und sie als JSON oder CSV zu formatieren. Die Ergebnisse waren oft inkonsistent und es schien den Prozess nicht ausreichend zu beschleunigen, als dass es sich hätte lohnen können.
Nachdem ich mit dem Ansatz vertraut war, bestand der nächste Schritt darin, die Funktionalität in ein R-Paket zu integrieren.
Der Ansatz
Eines meiner Ziele war es, das gesamte Einkaufszentrum so „ergonomisch“ wie möglich zu gestalten. Mit anderen Worten: Ich wollte sicherstellen, dass die Verwendung des Pakets in R und Python nahtlos in die Art und Weise passt, wie Datenanalysten täglich ihre bevorzugte Sprache verwenden.
Für R war es relativ einfach. Ich musste nur überprüfen, ob die Funktionen mit den Rohren gut funktionierten (%>% Und |>) und könnte leicht in Pakete wie die in integriert werden tidyverse:
reviews |>
llm_sentiment(review) |>
filter(.sentiment == "positive") |>
select(review)
#> review
#> 1 This has been the best TV I've ever used. Great screen, and sound.
Da Python jedoch keine Muttersprache für mich ist, musste ich meine Denkweise zur Datenmanipulation anpassen. Insbesondere habe ich gelernt, dass in Python Objekte (wie Pandas DataFrames) von Natur aus Transformationsfunktionen „enthalten“.
Diese Idee veranlasste mich zu untersuchen, ob die Pandas-API Erweiterungen zulässt, und zum Glück ist dies der Fall! Nachdem ich die Möglichkeiten erkundet hatte, entschied ich mich, mit Polar zu beginnen, was mir ermöglichte, seine API durch die Erstellung eines neuen Namensraums zu erweitern. Diese einfache Ergänzung ermöglichte Benutzern den einfachen Zugriff auf die erforderlichen Funktionen:
>>> import polars as pl
>>> import mall
>>> df = pl.DataFrame(dict(x = ("I am happy", "I am sad")))
>>> df.llm.sentiment("x")
shape: (2, 2)
┌────────────┬───────────┐
│ x ┆ sentiment │
│ --- ┆ --- │
│ str ┆ str │
╞════════════╪═══════════╡
│ I am happy ┆ positive │
│ I am sad ┆ negative │
└────────────┴───────────┘
Durch die Beibehaltung aller neuen Funktionen im llm-Namespace wird es für Benutzer sehr einfach, die benötigten Funktionen zu finden und zu verwenden:

Was kommt als nächstes?
Ich denke, es wird einfacher sein zu wissen, was passieren wird mall sobald die Community es nutzt und Feedback gibt. Ich gehe davon aus, dass das Hinzufügen zusätzlicher LLM-Backends die Hauptforderung sein wird. Die andere mögliche Verbesserung besteht darin, dass die Eingabeaufforderungen möglicherweise für die jeweilige Vorlage aktualisiert werden müssen, wenn neue aktualisierte Vorlagen verfügbar werden. Ich habe dies beim Upgrade von LLama 3.1 auf Llama 3.2 erlebt. Eine der Eingabeaufforderungen musste geändert werden. Das Paket ist so strukturiert, dass zukünftige Anpassungen wie diese Ergänzungen zum Paket und keine Ersetzung der Eingabeaufforderungen darstellen, um die Abwärtskompatibilität aufrechtzuerhalten.
Dies ist das erste Mal, dass ich einen Artikel über die Geschichte und Struktur eines Projekts schreibe. Diese besondere Anstrengung war aufgrund von R+Python und seinen LLM-Aspekten so einzigartig, dass ich dachte, es lohnt sich, sie zu teilen.
Wenn Sie mehr darüber erfahren möchten mallZögern Sie nicht, die offizielle Website zu besuchen: https://mlverse.github.io/mall/
