Spaces:
Runtime error
Runtime error
from sqlalchemy import create_engine, Table, Column, String, Integer, Float, Text, TIMESTAMP, MetaData | |
from sqlalchemy.dialects.postgresql import UUID | |
from sqlalchemy import text | |
from llama_index.core import SQLDatabase | |
from llama_index.core.query_engine import NLSQLTableQueryEngine | |
from llama_index.llms.huggingface import HuggingFaceLLM | |
import logging | |
# Set up logging | |
logging.basicConfig(level=logging.DEBUG) | |
logger = logging.getLogger(__name__) | |
# PostgreSQL DB connection (converted from JDBC) | |
engine = create_engine("postgresql+psycopg2://postgres:password@0.tcp.ngrok.io:5434/postgres") | |
metadata_obj = MetaData() | |
# Define the machine_current_log table | |
machine_current_log_table = Table( | |
"machine_current_log", | |
metadata_obj, | |
Column("mac", Text, primary_key=True), | |
Column("created_at", TIMESTAMP(timezone=True), primary_key=True), | |
Column("CT1", Float), | |
Column("CT2", Float), | |
Column("CT3", Float), | |
Column("CT_Avg", Float), | |
Column("total_current", Float), | |
Column("state", Text), | |
Column("state_duration", Integer), | |
Column("fault_status", Text), | |
Column("fw_version", Text), | |
Column("machineId", UUID), | |
Column("hi", Text), | |
) | |
# Create the table | |
metadata_obj.create_all(engine) | |
# Convert to TimescaleDB hypertable | |
with engine.connect() as conn: | |
conn.execute(text("SELECT create_hypertable('machine_current_log', 'created_at', if_not_exists => TRUE);")) | |
print("TimescaleDB hypertable created") | |
conn.commit() | |
# Query 1: Get all MAC addresses | |
print("\nQuerying all MAC addresses:") | |
with engine.connect() as con: | |
rows = con.execute(text("SELECT mac from machine_current_log")) | |
for row in rows: | |
print(row) | |
# Query 2: Get all data and count | |
print("\nQuerying all data and count:") | |
stmt = text(""" | |
SELECT mac, created_at, CT1, CT2, CT3, CT_Avg, | |
total_current, state, state_duration, fault_status, | |
fw_version, machineId | |
FROM machine_current_log | |
""") | |
with engine.connect() as connection: | |
print("hello") | |
count_stmt = text("SELECT COUNT(*) FROM machine_current_log") | |
count = connection.execute(count_stmt).scalar() | |
print(f"Total number of rows in table: {count}") | |
results = connection.execute(stmt).fetchall() | |
print(results) | |
# Set up LlamaIndex natural language querying | |
sql_database = SQLDatabase(engine) | |
llm = HuggingFaceLLM( | |
model_name="HuggingFaceH4/zephyr-7b-beta", | |
context_window=2048, | |
max_new_tokens=256, | |
generate_kwargs={"temperature": 0.7, "top_p": 0.95}, | |
) | |
query_engine = NLSQLTableQueryEngine( | |
sql_database=sql_database, | |
tables=["machine_current_log"], | |
llm=llm | |
) | |
def natural_language_query(question: str): | |
try: | |
response = query_engine.query(question) | |
return str(response) | |
except Exception as e: | |
logger.error(f"Query error: {e}") | |
return f"Error processing query: {str(e)}" | |
if __name__ == "__main__": | |
# Natural language query examples | |
print("\nNatural Language Query Examples:") | |
questions = [ | |
"What is the average CT1 reading?", | |
"Which machine has the highest total current?", | |
"Show me the latest fault status for each machine" | |
] | |
for question in questions: | |
print(f"\nQuestion: {question}") | |
print("Answer:", natural_language_query(question)) |