Files
agent_management/agent_templates/docs/MYSQL_AGENT_EXAMPLES.md
T
2026-01-15 17:30:48 +00:00

12 KiB

MySQL Agent 请求调用示例

服务信息

  • 服务名称: MySQL AI Agent
  • 版本: 1.0.0
  • 框架: LangChain + OpenAI
  • 默认端口: 8080

概述

MySQL AI Agent 使用 LangChain 和自然语言处理技术,允许用户使用自然语言查询 MySQL 数据库。


API 端点

1. 健康检查

端点: GET /health

请求示例 (curl):

curl http://localhost:8080/health

响应示例:

{
  "status": "healthy",
  "pod_name": "mysql-agent",
  "template_type": "mysql_agent",
  "database_connected": true,
  "database_info": "localhost:3306/mydb"
}

2. 服务信息

端点: GET /

请求示例 (curl):

curl http://localhost:8080/

响应示例:

{
  "name": "MySQL AI Agent",
  "version": "1.0.0",
  "database": "localhost:3306/mydb",
  "endpoints": {
    "health": "/health",
    "query": "/query"
  }
}

3. 自然语言查询

端点: POST /query

使用自然语言查询 MySQL 数据库。

请求体:

{
  "query": "显示所有用户",
  "openai_api_key": "sk-xxx",
  "user_id": "user123",
  "model": "gpt-3.5-turbo"
}

请求示例 (curl):

curl -X POST http://localhost:8080/query \
  -H "Content-Type: application/json" \
  -d '{
    "query": "有多少个用户?",
    "openai_api_key": "sk-xxx",
    "user_id": "user123"
  }'

请求示例 (Python):

import requests

query_data = {
    "query": "显示年龄大于30的所有用户",
    "openai_api_key": "sk-xxx",
    "user_id": "user123",
    "model": "gpt-3.5-turbo"
}

response = requests.post(
    "http://localhost:8080/query",
    json=query_data
)
result = response.json()

print(f"Query: {result['query']}")
print(f"Result: {result['result']}")
print(f"Success: {result['success']}")
print(f"Timestamp: {result['timestamp']}")

响应示例:

{
  "query": "有多少个用户?",
  "result": "数据库中有 150 个用户",
  "success": true,
  "timestamp": "2026-01-15T10:30:00.000Z"
}

查询示例

基础查询:

queries = [
    "显示所有用户",
    "有多少个用户?",
    "列出所有表",
    "显示 users 表的结构",
    "查看最近注册的 10 个用户"
]

统计查询:

queries = [
    "每个部门有多少员工?",
    "统计每个城市的用户数量",
    "计算订单总金额",
    "找出销售额最高的产品",
    "显示月度销售趋势"
]

条件查询:

queries = [
    "显示年龄大于30的用户",
    "查找北京的所有客户",
    "列出未支付的订单",
    "显示价格在100到500之间的产品",
    "找出最近一周的订单"
]

关联查询:

queries = [
    "显示每个用户的订单数量",
    "列出购买了特定产品的用户",
    "显示每个部门的平均工资",
    "查找有订单但未支付的用户"
]

完整使用示例

Python 客户端:

import requests
from typing import Optional, Dict, Any

class MySQLAgentClient:
    """MySQL Agent 客户端"""
    
    def __init__(self, base_url: str, openai_api_key: str):
        self.base_url = base_url.rstrip('/')
        self.openai_api_key = openai_api_key
    
    def health_check(self) -> Dict[str, Any]:
        """健康检查"""
        response = requests.get(f"{self.base_url}/health")
        return response.json()
    
    def get_info(self) -> Dict[str, Any]:
        """获取服务信息"""
        response = requests.get(f"{self.base_url}/")
        return response.json()
    
    def query(
        self,
        query: str,
        user_id: Optional[str] = None,
        model: str = "gpt-3.5-turbo"
    ) -> Dict[str, Any]:
        """执行自然语言查询"""
        data = {
            "query": query,
            "openai_api_key": self.openai_api_key,
            "user_id": user_id,
            "model": model
        }
        response = requests.post(f"{self.base_url}/query", json=data)
        return response.json()


# 使用示例
client = MySQLAgentClient(
    base_url="http://localhost:8080",
    openai_api_key="sk-xxx"
)

# 1. 健康检查
health = client.health_check()
print(f"Database Connected: {health['database_connected']}")
print(f"Database Info: {health['database_info']}")

# 2. 执行查询
queries = [
    "显示所有表",
    "users 表有多少条记录?",
    "显示最近注册的5个用户",
    "统计每个城市的用户数量",
    "找出年龄最大的用户"
]

for query in queries:
    print(f"\n{'='*60}")
    print(f"Query: {query}")
    print('='*60)
    
    result = client.query(query, user_id="user123")
    
    if result['success']:
        print(f"Result:\n{result['result']}")
    else:
        print(f"Error: Query failed")

交互式查询工具:

import requests
from prompt_toolkit import prompt
from prompt_toolkit.history import InMemoryHistory
from rich.console import Console
from rich.table import Table

class InteractiveMySQLClient:
    """交互式 MySQL 查询客户端"""
    
    def __init__(self, base_url: str, openai_api_key: str):
        self.base_url = base_url
        self.openai_api_key = openai_api_key
        self.console = Console()
        self.history = InMemoryHistory()
    
    def query(self, query_text: str) -> Dict:
        """执行查询"""
        response = requests.post(
            f"{self.base_url}/query",
            json={
                "query": query_text,
                "openai_api_key": self.openai_api_key
            }
        )
        return response.json()
    
    def display_result(self, result: Dict):
        """显示查询结果"""
        if result['success']:
            self.console.print(f"[green]✓ Success[/green]")
            self.console.print(f"\n{result['result']}\n")
        else:
            self.console.print(f"[red]✗ Failed[/red]")
    
    def run(self):
        """运行交互式会话"""
        self.console.print("[bold blue]MySQL AI Agent - Interactive Client[/bold blue]")
        self.console.print("Type 'exit' or 'quit' to end session\n")
        
        while True:
            try:
                # 获取用户输入
                query_text = prompt(
                    "mysql> ",
                    history=self.history
                )
                
                # 检查退出命令
                if query_text.lower() in ['exit', 'quit']:
                    break
                
                if not query_text.strip():
                    continue
                
                # 执行查询
                result = self.query(query_text)
                self.display_result(result)
                
            except KeyboardInterrupt:
                continue
            except EOFError:
                break
        
        self.console.print("\n[yellow]Goodbye![/yellow]")


# 使用交互式客户端
if __name__ == "__main__":
    client = InteractiveMySQLClient(
        base_url="http://localhost:8080",
        openai_api_key="sk-xxx"
    )
    client.run()

数据分析工具:

import requests
import pandas as pd
import matplotlib.pyplot as plt
from typing import List, Dict

class MySQLDataAnalyzer:
    """MySQL 数据分析工具"""
    
    def __init__(self, base_url: str, openai_api_key: str):
        self.base_url = base_url
        self.openai_api_key = openai_api_key
    
    def query(self, query: str) -> str:
        """执行查询"""
        response = requests.post(
            f"{self.base_url}/query",
            json={
                "query": query,
                "openai_api_key": self.openai_api_key
            }
        )
        result = response.json()
        return result.get('result', '') if result.get('success') else ''
    
    def get_statistics(self, table: str, column: str) -> Dict:
        """获取列的统计信息"""
        queries = {
            "count": f"{table} 表的 {column} 列有多少条记录?",
            "avg": f"{table} 表的 {column} 列的平均值是多少?",
            "min": f"{table} 表的 {column} 列的最小值是多少?",
            "max": f"{table} 表的 {column} 列的最大值是多少?"
        }
        
        stats = {}
        for stat_name, query in queries.items():
            result = self.query(query)
            stats[stat_name] = result
        
        return stats
    
    def get_distribution(self, table: str, column: str) -> Dict:
        """获取数据分布"""
        query = f"统计 {table} 表中 {column} 列的值分布"
        result = self.query(query)
        return {"distribution": result}


# 使用示例
analyzer = MySQLDataAnalyzer(
    base_url="http://localhost:8080",
    openai_api_key="sk-xxx"
)

# 获取统计信息
stats = analyzer.get_statistics("users", "age")
print("Statistics:")
for stat, value in stats.items():
    print(f"  {stat}: {value}")

# 获取分布
distribution = analyzer.get_distribution("users", "city")
print(f"\nDistribution: {distribution}")

批量查询和导出:

import requests
import csv
from datetime import datetime

class MySQLBatchExporter:
    """批量查询和导出工具"""
    
    def __init__(self, base_url: str, openai_api_key: str):
        self.base_url = base_url
        self.openai_api_key = openai_api_key
    
    def execute_queries(self, queries: List[str]) -> List[Dict]:
        """批量执行查询"""
        results = []
        
        for query in queries:
            response = requests.post(
                f"{self.base_url}/query",
                json={
                    "query": query,
                    "openai_api_key": self.openai_api_key
                }
            )
            result = response.json()
            results.append({
                "query": query,
                "result": result.get('result', ''),
                "success": result.get('success', False),
                "timestamp": result.get('timestamp', '')
            })
        
        return results
    
    def export_to_csv(self, results: List[Dict], filename: str):
        """导出结果到 CSV"""
        with open(filename, 'w', newline='', encoding='utf-8') as f:
            writer = csv.DictWriter(f, fieldnames=['query', 'result', 'success', 'timestamp'])
            writer.writeheader()
            writer.writerows(results)
        
        print(f"Results exported to {filename}")


# 使用示例
exporter = MySQLBatchExporter(
    base_url="http://localhost:8080",
    openai_api_key="sk-xxx"
)

# 批量查询
queries = [
    "统计总用户数",
    "统计每个城市的用户数",
    "显示最近一周的注册用户数",
    "计算平均年龄",
    "显示活跃用户占比"
]

results = exporter.execute_queries(queries)

# 导出结果
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
exporter.export_to_csv(results, f"mysql_queries_{timestamp}.csv")

# 打印摘要
successful = sum(1 for r in results if r['success'])
print(f"\nSummary: {successful}/{len(queries)} queries successful")

环境变量配置

# 服务配置
export SERVICE_HOST="0.0.0.0"
export SERVICE_PORT="8080"
export POD_NAME="mysql-agent"
export TEMPLATE_TYPE="mysql_agent"

# MySQL 数据库配置
export MYSQL_HOST="localhost"
export MYSQL_PORT="3306"
export MYSQL_USER="root"
export MYSQL_PASSWORD="your-password"
export MYSQL_DATABASE="mydb"

# 启动服务
python mysql_agent.py

Docker Compose 示例

version: '3.8'

services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: testdb
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
  
  mysql-agent:
    build:
      context: .
      dockerfile: mysql_agent.Dockerfile
    environment:
      MYSQL_HOST: mysql
      MYSQL_PORT: 3306
      MYSQL_USER: root
      MYSQL_PASSWORD: rootpassword
      MYSQL_DATABASE: testdb
      SERVICE_PORT: 8080
    ports:
      - "8080:8080"
    depends_on:
      - mysql

volumes:
  mysql_data:

注意事项

  1. API Key: OpenAI API key 从请求传入,确保安全
  2. 数据库连接: 需要正确配置数据库连接参数
  3. 权限控制: 建议使用只读用户进行查询
  4. 查询限制: 设置合理的查询超时和结果限制
  5. 错误处理: 检查 success 字段确认查询是否成功
  6. SQL注入: Agent 会自动处理,但仍需注意安全
  7. 成本控制: 监控 OpenAI API 使用量
  8. 模型选择: gpt-4 更准确但成本更高,gpt-3.5-turbo 更经济