Allgemeine Einführung
SQLite-Utils-Ask ist ein leistungsfähiges Tool, das Benutzern hilft, Frage-und-Antwort-Datenabfragen auf SQLite-Datenbanken und CSV/JSON-Dateien mit Hilfe von LLM (Large Language Model) durchzuführen. Das Tool ist in der Lage, automatisch geeignete SQL-Abfragen auf der Grundlage der Fragen des Benutzers zu generieren und die Abfragen auszuführen, um Ergebnisse zurückzugeben, was den Prozess der Datenanalyse und -verarbeitung erheblich vereinfacht.
Funktionsliste
- natürlichsprachliche BefragungStellen Sie Fragen zu den Daten in der Datenbank in natürlicher Sprache, und das Tool generiert automatisch die entsprechenden SQL-Abfragen.
- Kompatibilität der DatenbankenUnterstützt SQLite-Datenbank für einfache Datenverwaltung und -abfrage.
- Umgang mit CSV/JSON-DateienUnterstützt die direkte Abfrage von CSV-, TSV- oder JSON-Dateien.
- MultidokumentensucheUnterstützt föderierte Abfragen für mehrere Dokumente.
- KommandozeilentoolBietet eine einfach zu bedienende Befehlszeilenschnittstelle, über die Benutzer schnell Abfragen ausführen können.
- Plug-in-UnterstützungKann mit Tools wie sqlite-utils integriert werden, um Funktionalität und Anwendungsszenarien zu erweitern.
Fragen zu SQLite-Datenbanken und CSV/JSON-Dateien im Terminal stellen
Ich arbeite an meinem sqlite-utils CLI-Tool für dieIch habe ein neues Plugin entwickelt, mit dem Sie Fragen in menschlicher Sprache direkt an SQLite-Datenbanken und CSV/JSON-Dateien auf Ihrem Computer stellen können.
Sie heißt sqlite-utils-ask. Installieren Sie sie wie folgt:
sqlite-utils-Installation sqlite-utils-ask
Der API-Schlüssel wird aus der UmgebungsvariablenOPENAI_API_KEY
oder Sie können LLM installieren und diellm-Tastensatz openaiSpeichern Sie den Schlüssel in einer Konfigurationsdatei.
Dann können Sie es so verwenden:
curl -O https://datasette.io/content.db
sqlite-utils fragte content.db " Wie hoch ist die Anzahl der sqlite-utils pypi Downloads im Jahr 2024?"
Dieser Befehl extrahiert das SQL-Schema der übergebenen Datenbankdatei, sendet es zusammen mit Ihrer Frage durch den LLM, gibt die SQL-Abfrage zurück und versucht, sie auszuführen, um Ergebnisse zu erzielen.
Wenn alles gut geht, erhalten Sie die folgende Antwort:
SELECT SUM(Downloads)
FROM stats
WHERE Paket = 'sqlite-utils' AND Datum >= '2024-01-01' AND Datum < '2025-01-01'.
[
{
"SUM(downloads)": 4300221
}
]
Wenn die Ausführung der SQL-Abfrage fehlschlägt (aufgrund eines Syntaxfehlers), wird dieser Fehler zur Korrektur an das Modell zurückgegeben und bis zu dreimal wiederholt, bevor aufgegeben wird.
erhöhen.-v/--verbose
um die genauen Eingabeaufforderungen zu sehen, die er verwendet:
System-Eingabeaufforderung.
Sie erhalten ein SQLite-Schema gefolgt von einer Frage. Erzeugen Sie eine einzelne SQL-Abfrage, um diese Frage zu beantworten.
Erzeugen Sie eine einzelne SQL-Abfrage, um diese Frage zu beantworten. Geben Sie diese Abfrage in einem ```sql ...'' zurück. Geben Sie diese Abfrage in einem ``Sql ...'' zurück.
Rückgabe dieser Abfrage in einem ``sql ...'' eingezäunten Codeblock.
Beispiel: Wie viele Repos gibt es?
Antwort.
```sql
select count(*) from repos
Aufforderung.
...
CREATE TABLE [stats] (
[Paket] TEXT,
[Datum] TEXT,
[Downloads] INTEGER,
PRIMARY KEY ([Paket], [Datum])
);
...
wie viele sqlite-utils pypi Downloads im Jahr 2024?
Ich habe den obigen Text so gekürzt, dass er nur die relevanten Tabellen enthält - tatsächlich enthält er das vollständige Schema für jede Tabelle in dieser Datenbank.
Standardmäßig sendet das Tool nur dieses Datenbankschema und Ihre Frage an den LLM, und wenn Sie die Option `-e/--examples` hinzufügen, wird es auch fünf öffentliche Werte für jede Textspalte in diesem Schema mit einer durchschnittlichen Länge von weniger als 32 Zeichen enthalten. Dies kann manchmal helfen, bessere Ergebnisse zu erhalten, z.B. kann das Senden der Werte "CA" und "FL" und "TX" für die `state` Spalte vorschlagen, dass das Modell die Abkürzungen des Staates anstelle der vollständigen Namen verwenden sollte.
#### Probleme bei der Abfrage von CSV- und JSON-Daten
Die Kern-CLI `sqlite-utils` läuft normalerweise direkt gegen SQLite-Dateien, aber vor drei Jahren fügte ich die Möglichkeit hinzu, den Befehl [sqlite-utils memory](https://simonwillison.net/2021/Jun/19/sqlite-utils-memory/) zu verwenden, um direkt Vor drei Jahren habe ich die Möglichkeit hinzugefügt, SQL-Abfragen direkt gegen CSV- und JSON-Dateien mit dem Befehl [sqlite-utils memory]() auszuführen. Dabei werden die Daten in eine speicherinterne SQLite-Datenbank geladen, bevor die SQL-Abfrage ausgeführt wird.
Ich beschloss, diesen Mechanismus wiederzuverwenden, um LLM-Hinweise direkt gegen CSV- und JSON-Daten zu ermöglichen.
Der ``sqlite-utils ask-files`` Befehl sieht wie folgt aus:
``shell
sqlite-utils ask-files transaction.csv "Gesamtumsatz nach Jahr"
Dieser Befehl akzeptiert eine oder mehrere Dateien, die Sie in einer Mischung aus CSV-, TSV- und JSON-Formaten bereitstellen können. Jede gelieferte Datei wird in eine andere Tabelle importiert, so dass das Modell bei Bedarf Join-Abfragen konstruieren kann.
Beschreibung der Realisierung
Die Kernimplementierung des Plugins ist ungefähr250 Zeilen Python-CodeVerwenden Siesqlite-utils
register_commands()Plugin-Haken zum Hinzufügenfragen Sie
im Gesang antwortenask-files
Befehl.
Es fügt LLM als Abhängigkeit hinzu und verwendet LLMsPython-APIum die Details des Dialogs mit dem Modell zu abstrahieren. Das bedeutet, dass diesqlite-utils-ask
Jedes Modell, das vom LLM oder seinen Plugins unterstützt wird, kann verwendet werden - wenn Sie die Claude 3.5 Sonnet ruft die Eingabeaufforderung auf und Sie können Folgendes tun:
sqlite-utils installiert llm-claude-3
sqlite-utils ask content.db "zähle Zeilen in Nachrichtentabelle" -m claude-3.5-sonnet
Das Plugin ist anfänglich auf gpt-4o-mini voreingestellt, um die Vorteile des automatischen Hinweis-Cachings des Modells zu nutzen: Wenn Sie mehrere Fragen gegen dasselbe Schema laufen lassen, werden Sie am Ende dasselbe lange Hinweis-Präfix mehrmals senden, und OpenAIs Hinweis-Caching sollte automatisch einsetzen und einen 50%-Rabatt für diese Eingabe-Token bieten.
Dann habe ich die tatsächlichen Zahlen ausgewertet und Folgendes herausgefundengpt-4o-mini
Es ist billig genug, dass die Kosten auch ohne die Zwischenspeicherung von 4.000 Token-Hints (was ein ziemlich großes SQL-Schema ist) weniger als einen Zehntel Cent betragen sollten. Diese Cache-Einsparungen sind also nicht einmal erwähnenswert!