6. Von NLP zu SQL mit LlamaIndex, SQLAlchemy und OpenAI
Um Text in SQL umzuwandeln, gibt es verschiedene Möglichkeiten. Eine führt über dieses Beispielprojekt, das Llamaindex und SQLAlchemy zum Einsatz bringt. Ersteres wurde entwickelt, um LLM-Applikationen mit Daten anzureichern. Bei SQLAlchemy handelt es sich um ein Toolkit für Python-Datenbanken. Wichtig: Dieses Projekt enthält kein Web-Frontend und wird über die Kommandozeile ausgeführt. Was den Python-Code angejht, haben wir uns hauptsächlich aus dem Beispiel-Notebook von Llamaindex bedient.
Projekt einrichten
Wie bei den ersten fünf Projekten gilt es zunächst, ein neues Verzeichnis zu erstellen, eine virtuelle Python-Umgebung zu erstellen und zu aktivieren und anschließend die erforderlichen Packages zu installieren:
pip install openai sqlalchemy llama-index
Sollten Sie OpenAI nicht verwenden wollen, bietet LlamaIndex andere LLM-API-Optionen. Sie können die Standard-LLMs auch lokal ausführen. Das Beispiel-Notebook speichert Ihren API-Schlüssel explizit in der Hauptdatei. Als Teil eines Git-Repository ist das ungünstig, wenn Sie Ihren Schlüssel nicht auf GitHub öffentlich teilen möchten. Stattdessen empfiehlt sich:
pip install python-dotenv
Anschließend erstellen Sie eine .env
-Datei:
OPENAI_API_KEY="my_api_key"
Dann fügen Sie folgenden Code in ein neues app.py
-Skript ein:
import os
import openai
from dotenv import load_dotenv
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
Im nächsten Schritt haben wir einen Teil des Beispielcodes in ein app.py
-Skript eingefügt:
from llama_index.indices.struct_store.sql_query import NLSQLTableQueryEngine
from sqlalchemy import text
from sqlalchemy import insert
from llama_index.llms import OpenAI
from llama_index import SQLDatabase, ServiceContext
from sqlalchemy import (
create_engine,
MetaData,
Table,
Column,
String,
Integer,
select,
)
# Create a sample database and table
engine = create_engine("sqlite:///:memory:")
metadata_obj = MetaData()
table_name = "city_stats"
city_stats_table = Table(
table_name,
metadata_obj,
Column("city_name", String(16), primary_key=True),
Column("population", Integer),
Column("country", String(16), nullable=False),
)
metadata_obj.create_all(engine)
# Set up an LLM
llm = OpenAI(temperature=0.1, model="gpt-3.5-turbo")
service_context = ServiceContext.from_defaults(llm=llm)
# Create a database object from that table that sqlalchemy can use
sql_database = SQLDatabase(engine, include_tables=["city_stats"])
# Add some sample data to the table
sql_database = SQLDatabase(engine, include_tables=["city_stats"])
rows = [
{"city_name": "Toronto", "population": 2930000, "country": "Canada"},
{"city_name": "Tokyo", "population": 13960000, "country": "Japan"},
{"city_name": "Chicago", "population": 2679000, "country": "United States"},
{"city_name": "Seoul", "population": 9776000, "country": "South Korea"},
]
for row in rows:
stmt = insert(city_stats_table).values(**row)
with engine.begin() as connection:
cursor = connection.execute(stmt)
# Check to see if the table exists and is usable
stmt = select(
city_stats_table.c.city_name,
city_stats_table.c.population,
city_stats_table.c.country,
).select_from(city_stats_table)
with engine.connect() as connection:
results = connection.execute(stmt).fetchall()
print(results)
# Try running a basic SQL query on this table using sqlalchemy
with engine.connect() as con:
rows = con.execute(text("SELECT city_name, country from city_stats"))
for row in rows:
print(row)
# At last! Time to try a natural language query
query_engine = NLSQLTableQueryEngine(
sql_database=sql_database,
tables=["city_stats"],
)
query_str = "Which city has the largest population, and what is that population??"
response = query_engine.query(query_str)
print(f"Answer: {response}")
# You can also see the query in the sqlalchemy metadata
print("Generated from the following SQL:")
print(response.metadata["sql_query"])
Sie können die Anwendung nun mit einem einfachen python app.py
-Terminalbefehl ausführen, nachdem Sie die Abfrage und die Daten entsprechend Ihren Bedürfnissen angepasst haben.
Weitere GenAI-Python-Projekte
Wenn Sie weitere Generative-AI-Projekte in Python angehen möchten, lohnt sich ein Blick auf folgende Online-Ressourcen:
Streamlit-Projekte und -Blog
(fm)
Dieser Beitrag basiert auf einem Artikel unserer US-Schwesterpublikation Infoworld.