← 返回首页
🧠

LLM与数据库集成

📂 llm ⏱ 4 min 705 words

--- title: "LLM与数据库集成" description: "探讨大语言模型与数据库的深度集成,包括SQL生成、数据查询、ETL流程和智能数据分析" tags: ["数据库集成", "SQL生成", "ETL", "数据查询", "LLM应用"] category: "llm" icon: "🧠"

LLM与数据库集成

数据库是现代应用的核心数据存储,而大语言模型(LLM)正在改变我们与数据库交互的方式。通过自然语言与数据库交互,自动生成SQL查询,以及智能化ETL流程,LLM正在降低数据操作的门槛,提高数据分析的效率。

自然语言转SQL

LLM最直接的数据库应用是将自然语言查询转换为SQL语句。这使得非技术人员也能直接查询数据库,无需学习SQL语法。

import sqlparse
from typing import Dict, Any

class NL2SQLConverter:
    """自然语言转SQL转换器"""
    
    def __init__(self, llm_client, schema_info: Dict[str, Any]):
        self.llm_client = llm_client
        self.schema_info = schema_info
    
    def generate_sql(self, natural_language_query: str, 
                    database_type: str = "postgresql") -> str:
        """将自然语言转换为SQL"""
        schema_description = self._format_schema()
        
        prompt = f"""你是一个{database_type}数据库专家。根据以下数据库模式,将用户的自然语言查询转换为SQL语句。

数据库模式:
{schema_description}

用户查询:{natural_language_query}

要求:
1. 生成高效的SQL查询
2. 考虑性能优化(使用索引、避免全表扫描)
3. 使用合适的JOIN和子查询
4. 添加必要的WHERE条件
5. 如果需要聚合,使用合适的聚合函数

只返回SQL语句,不需要解释。
"""
        
        sql = self.llm_client.generate(prompt, temperature=0.1)
        
        # 验证SQL语法
        if not self._validate_sql(sql, database_type):
            raise ValueError("Generated SQL is invalid")
        
        return sql
    
    def _format_schema(self) -> str:
        """格式化数据库模式信息"""
        schema_text = ""
        for table_name, table_info in self.schema_info.items():
            schema_text += f"\n表名: {table_name}\n"
            schema_text += f"描述: {table_info.get('description', '无')}\n"
            schema_text += "列:\n"
            for column in table_info.get('columns', []):
                schema_text += f"  - {column['name']} ({column['type']})"
                if column.get('primary_key'):
                    schema_text += " [主键]"
                if column.get('foreign_key'):
                    schema_text += f" [外键 -> {column['foreign_key']}]"
                schema_text += "\n"
        return schema_text
    
    def _validate_sql(self, sql: str, database_type: str) -> bool:
        """验证SQL语法"""
        try:
            parsed = sqlparse.parse(sql)
            return len(parsed) > 0 and parsed[0].get_type() in ['SELECT', 'INSERT', 'UPDATE', 'DELETE']
        except:
            return False

# 使用示例
schema = {
    "users": {
        "description": "用户表",
        "columns": [
            {"name": "id", "type": "INTEGER", "primary_key": True},
            {"name": "name", "type": "VARCHAR(100)"},
            {"name": "email", "type": "VARCHAR(200)"},
            {"name": "created_at", "type": "TIMESTAMP"}
        ]
    },
    "orders": {
        "description": "订单表",
        "columns": [
            {"name": "id", "type": "INTEGER", "primary_key": True},
            {"name": "user_id", "type": "INTEGER", "foreign_key": "users.id"},
            {"name": "amount", "type": "DECIMAL(10,2)"},
            {"name": "status", "type": "VARCHAR(20)"},
            {"name": "created_at", "type": "TIMESTAMP"}
        ]
    }
}

converter = NL2SQLConverter(llm_client, schema)
sql = converter.generate_sql("查询最近30天内消费金额最高的10个用户")
print(sql)

自然语言转SQL的关键挑战包括:处理模糊查询、处理歧义、确保SQL安全性(防止SQL注入)以及处理复杂的业务逻辑。

智能数据查询

LLM不仅能生成SQL,还能理解查询结果并提供智能分析。

class IntelligentDataQuery:
    """智能数据查询系统"""
    
    def __init__(self, llm_client, database_connection):
        self.llm_client = llm_client
        self.db = database_connection
        self.converter = NL2SQLConverter(llm_client, self._get_schema())
    
    def query_with_analysis(self, natural_language_query: str) -> Dict[str, Any]:
        """带分析的智能查询"""
        # 生成SQL
        sql = self.converter.generate_sql(natural_language_query)
        
        # 执行查询
        results = self.db.execute(sql)
        
        # 分析结果
        analysis = self._analyze_results(results, natural_language_query)
        
        return {
            "query": natural_language_query,
            "sql": sql,
            "results": results,
            "analysis": analysis
        }
    
    def _analyze_results(self, results: list, original_query: str) -> str:
        """分析查询结果"""
        if not results:
            return "查询结果为空"
        
        prompt = f"""分析以下数据库查询结果:

原始查询:{original_query}
查询结果(前10行):
{results[:10]}

结果统计:
- 总行数:{len(results)}
- 列数:{len(results[0]) if results else 0}

请提供:
1. 数据概要说明
2. 关键发现和趋势
3. 数据质量评估
4. 建议的进一步分析
5. 可视化建议
"""
        
        return self.llm_client.generate(prompt, temperature=0.3)
    
    def conversational_query(self, user_message: str, 
                           conversation_history: list = None) -> str:
        """对话式查询"""
        system_prompt = """你是一个数据库查询助手。用户会用自然语言描述他们想要查询的数据。

工作流程:
1. 理解用户意图
2. 必要时询问澄清问题
3. 生成SQL查询
4. 执行查询
5. 解释结果

如果查询复杂,逐步引导用户细化需求。
"""
        
        messages = [{"role": "system", "content": system_prompt}]
        if conversation_history:
            messages.extend(conversation_history)
        messages.append({"role": "user", "content": user_message})
        
        # 判断是否需要查询数据
        needs_query = self._needs_database_query(user_message)
        
        if needs_query:
            # 生成并执行查询
            sql = self.converter.generate_sql(user_message)
            results = self.db.execute(sql)
            
            # 生成响应
            response_prompt = f"""基于以下查询结果回答用户:

用户问题:{user_message}
SQL查询:{sql}
查询结果:{results[:20]}  # 限制结果数量

请用自然语言解释查询结果,并提供相关洞察。
"""
            return self.llm_client.generate(response_prompt)
        else:
            # 直接回答
            return self.llm_client.generate(
                messages=messages,
                temperature=0.7
            )
    
    def _needs_database_query(self, query: str) -> bool:
        """判断是否需要数据库查询"""
        query_keywords = ["查询", "统计", "分析", "数据", "报表", "多少", "哪些"]
        return any(keyword in query for keyword in query_keywords)

智能数据查询的关键优势在于理解用户意图,而不仅仅是生成SQL。它能够处理模糊查询、提供上下文相关的回答,并引导用户逐步细化需求。

ETL流程智能化

ETL(Extract, Transform, Load)是数据工程的核心流程。LLM能够智能化ETL的各个环节,提高数据处理效率。

class IntelligentETL:
    """智能ETL系统"""
    
    def __init__(self, llm_client):
        self.llm_client = llm_client
    
    def generate_transformation_logic(self, source_schema: Dict, 
                                    target_schema: Dict,
                                    business_rules: str = None) -> str:
        """生成数据转换逻辑"""
        prompt = f"""为以下ETL任务生成数据转换逻辑:

源数据模式:
{json.dumps(source_schema, indent=2, ensure_ascii=False)}

目标数据模式:
{json.dumps(target_schema, indent=2, ensure_ascii=False)}

业务规则:
{business_rules if business_rules else "无特殊规则"}

请生成Python ETL脚本,包括:
1. 数据提取(Extract)
2. 数据清洗和验证
3. 数据转换(Transform)
4. 数据加载(Load)
5. 错误处理和日志记录
"""
        
        return self.llm_client.generate(prompt, temperature=0.2)
    
    def analyze_data_quality(self, data_sample: list, 
                           expected_schema: Dict) -> Dict[str, Any]:
        """分析数据质量"""
        prompt = f"""分析以下数据的质量:

数据样本(前10行):
{json.dumps(data_sample[:10], indent=2, ensure_ascii=False)}

期望模式:
{json.dumps(expected_schema, indent=2, ensure_ascii=False)}

请评估:
1. 数据完整性(缺失值)
2. 数据一致性(格式、类型)
3. 数据准确性(异常值)
4. 数据唯一性(重复记录)
5. 数据时效性(时间戳)
6. 建议的数据清洗规则
"""
        
        analysis = self.llm_client.generate(prompt, temperature=0.3)
        return {
            "quality_report": analysis,
            "sample_size": len(data_sample),
            "schema_match": self._check_schema_match(data_sample, expected_schema)
        }
    
    def generate_data_validation_rules(self, business_rules: str) -> str:
        """生成数据验证规则"""
        prompt = f"""根据以下业务规则生成数据验证代码:

业务规则:
{business_rules}

请生成Python验证规则,包括:
1. 字段级验证(类型、范围、格式)
2. 记录级验证(业务逻辑)
3. 表级验证(一致性、唯一性)
4. 验证报告生成
"""
        
        return self.llm_client.generate(prompt, temperature=0.2)

# 使用示例
etl = IntelligentETL(llm_client)

# 生成ETL脚本
etl_script = etl.generate_transformation_logic(
    source_schema={
        "raw_orders": {
            "columns": ["id", "customer_id", "product", "quantity", "price", "date"]
        }
    },
    target_schema={
        "dim_customers": {
            "columns": ["customer_id", "customer_name", "email", "segment"]
        },
        "fact_orders": {
            "columns": ["order_id", "customer_id", "product_id", "quantity", "total_amount", "order_date"]
        }
    },
    business_rules="客户分层:消费金额>10000为VIP,>5000为高级,其余为普通"
)

数据库驱动的智能应用

结合LLM和数据库,可以构建更智能的应用系统。

class SmartDatabaseApplication:
    """智能数据库应用"""
    
    def __init__(self, llm_client, database):
        self.llm_client = llm_client
        self.db = database
    
    def intelligent_search(self, search_query: str, 
                          table: str, columns: list) -> list:
        """智能搜索"""
        # 理解搜索意图
        intent_prompt = f"""分析用户搜索意图:
查询:{search_query}
表:{table}
可用列:{columns}

请识别:
1. 搜索关键词
2. 筛选条件
3. 排序方式
4. 分页需求
"""
        intent = self.llm_client.generate(intent_prompt, temperature=0.1)
        
        # 生成搜索SQL
        # ... (使用NL2SQL转换器)
        
        # 执行搜索
        results = self.db.execute(search_sql)
        
        # 格式化结果
        return self._format_search_results(results, search_query)
    
    def generate_report(self, report_type: str, 
                       parameters: Dict[str, Any]) -> str:
        """生成数据报告"""
        # 查询数据
        data = self._query_report_data(report_type, parameters)
        
        # 分析数据
        analysis_prompt = f"""分析以下{report_type}报告数据:

数据摘要:
{self._summarize_data(data)}

请提供:
1. 关键指标和趋势
2. 异常和关注点
3. 建议的行动项
4. 可视化建议
"""
        
        analysis = self.llm_client.generate(analysis_prompt, temperature=0.4)
        
        # 生成报告
        report_prompt = f"""生成{report_type}报告:

数据:{data[:100]}  # 限制数据量
分析:{analysis}

报告格式:
1. 执行摘要
2. 详细数据表
3. 趋势图表
4. 建议和结论
"""
        
        return self.llm_client.generate(report_prompt, temperature=0.3)

LLM与数据库的集成为数据分析带来了革命性变化。通过自然语言交互、智能查询生成和自动化ETL,数据驱动的决策变得更加高效和普及。未来,随着多模态LLM的发展,数据库集成将支持更复杂的数据类型和分析场景。