Files
iov_ana/demo.py

161 lines
5.2 KiB
Python
Raw Normal View History

"""
演示脚本 创建示例数据运行四层架构分析
"""
import os
import sys
import sqlite3
import random
from datetime import datetime, timedelta
sys.path.insert(0, os.path.dirname(__file__))
from config import DB_PATH, LLM_CONFIG
from agent import DataAnalysisAgent
def create_demo_data(db_path: str):
"""创建示例数据库:电商订单 + 用户 + 商品"""
if os.path.exists(db_path):
os.remove(db_path)
conn = sqlite3.connect(db_path)
cur = conn.cursor()
cur.execute("""
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
region TEXT NOT NULL,
tier TEXT NOT NULL,
created_at TEXT NOT NULL
)
""")
cur.execute("""
CREATE TABLE products (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
category TEXT NOT NULL,
price REAL NOT NULL
)
""")
cur.execute("""
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
user_id INTEGER NOT NULL,
product_id INTEGER NOT NULL,
amount REAL NOT NULL,
quantity INTEGER NOT NULL,
status TEXT NOT NULL,
region TEXT NOT NULL,
order_date TEXT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (product_id) REFERENCES products(id)
)
""")
regions = ["华东", "华南", "华北", "西南", "华中", "东北"]
tiers = ["普通", "银卡", "金卡", "钻石"]
categories = ["电子产品", "服饰", "食品", "家居", "图书", "美妆"]
statuses = ["已完成", "已发货", "待发货", "已取消", "退款中"]
users = []
for i in range(1, 2001):
reg = random.choice(regions)
tier = random.choices(tiers, weights=[50, 25, 15, 10])[0]
created = datetime(2024, 1, 1) + timedelta(days=random.randint(0, 400))
users.append((i, f"用户{i}", reg, tier, created.strftime("%Y-%m-%d")))
cur.executemany("INSERT INTO users VALUES (?, ?, ?, ?, ?)", users)
products = []
for i in range(1, 201):
cat = random.choice(categories)
price = round(random.uniform(9.9, 9999.99), 2)
products.append((i, f"商品{i}", cat, price))
cur.executemany("INSERT INTO products VALUES (?, ?, ?, ?)", products)
orders = []
for i in range(1, 50001):
uid = random.randint(1, 2000)
pid = random.randint(1, 200)
qty = random.choices([1, 2, 3, 4, 5], weights=[50, 25, 15, 7, 3])[0]
status = random.choices(statuses, weights=[60, 15, 10, 10, 5])[0]
region = random.choices(regions, weights=[35, 25, 15, 10, 10, 5])[0]
order_date = datetime(2025, 1, 1) + timedelta(days=random.randint(0, 440))
cur.execute("SELECT price FROM products WHERE id = ?", (pid,))
price = cur.fetchone()[0]
amount = round(price * qty, 2)
orders.append((i, uid, pid, amount, qty, status, region, order_date.strftime("%Y-%m-%d")))
cur.executemany("INSERT INTO orders VALUES (?, ?, ?, ?, ?, ?, ?, ?)", orders)
conn.commit()
conn.close()
print(f"✅ 示例数据库已创建: {db_path}")
print(f" - users: 2,000 条")
print(f" - products: 200 条")
print(f" - orders: 50,000 条")
def main():
print("=" * 60)
print(" 🤖 数据分析 Agent —— 四层架构自适应分析")
print("=" * 60)
if not LLM_CONFIG["api_key"]:
print("\n⚠️ 未配置 LLM_API_KEY请设置环境变量")
print()
print(" # OpenAI")
print(" export LLM_API_KEY=sk-xxx")
print(" export LLM_BASE_URL=https://api.openai.com/v1")
print(" export LLM_MODEL=gpt-4o")
print()
print(" # Ollama (本地)")
print(" export LLM_API_KEY=ollama")
print(" export LLM_BASE_URL=http://localhost:11434/v1")
print(" export LLM_MODEL=qwen2.5-coder:7b")
print()
sys.exit(1)
print(f"\n🔗 LLM: {LLM_CONFIG['model']} @ {LLM_CONFIG['base_url']}")
if not os.path.exists(DB_PATH):
create_demo_data(DB_PATH)
else:
print(f"\n📂 使用已有数据库: {DB_PATH}")
# 初始化 Agent自动加载 Schema
agent = DataAnalysisAgent(DB_PATH)
print("\n" + "=" * 60)
print(" ⬆️ AI 只看到 Schema表结构 + 数据画像")
print(" ⬇️ 四层架构分析:规划 → 探索 → 洞察 → 报告")
print("=" * 60)
questions = [
"各地区的销售表现如何?帮我全面分析一下",
"不同商品类别的销售情况和利润贡献",
"整体订单的完成率怎么样?有没有什么异常需要关注?",
]
for q in questions:
try:
report = agent.analyze(q)
print("\n" + report)
print("\n" + "~" * 60)
except Exception as e:
print(f"\n❌ 分析出错: {e}")
import traceback
traceback.print_exc()
# 最终审计
print("\n📋 会话审计:")
print(agent.get_audit())
print("\n📋 分析历史:")
print(agent.get_history())
print("\n✅ 演示完成!")
if __name__ == "__main__":
main()