Generative AI Coding-Tutorial

6 Python-Projekte, um mit GenAI durchzustarten

04.04.2024
Von 
Sharon Machlis ist Director of Editorial Data & Analytics bei Foundry. Sie ist darüber hinaus Autorin von "Practical R for Mass Communication and Journalism".

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:

(fm)

Dieser Beitrag basiert auf einem Artikel unserer US-Schwesterpublikation Infoworld.