AI代码开发宝库系列:Text2SQL技术入门
Text2SQL技术入门 - 让非程序员也能玩转数据库查询

前言:告别复杂的SQL语句,拥抱自然语言查询新时代!
你是否曾经为了一个简单的数据查询而苦恼?是否因为不会写SQL语句而求人帮忙?现在,有了Text2SQL技术,你只需要用大白话就能轻松查询数据库了!今天我们就来聊聊这个神奇的技术,让你也能成为数据分析小能手!
一、Text2SQL是什么鬼?简单来说就是翻译官!
想象一下,你是一个运营小姐姐,老板突然问你:"咱们上个月在抖音投放的广告,哪一天的费用最高?"在过去,你可能需要:
打开数据库管理工具
写复杂的SQL语句
各种JOIN、WHERE、ORDER BY...
跑半天可能还写错
但现在,有了Text2SQL,你只需要说:"帮我查一下抖音上个月哪天投放费用最高",系统就能自动帮你生成SQL并返回结果!
Text2SQL = 自然语言 + 数据库查询,它就是你和数据库之间的翻译官!
二、Text2SQL是如何炼成的?三大进化阶段揭秘!
1. 远古时代:人工规则模板
就像早期的翻译机,只能翻译固定的句子,换个说法就不行了。
2. 机器学习时代:序列到序列模型
开始能学习一些规律,但处理复杂语义还是有点吃力。
3. 现代AI时代:大语言模型(LLM)
这就是我们现在用的技术!它能理解复杂的自然语言,还能生成准确的SQL语句。比如你问"查一下30岁以下客户的信息",它能准确理解并生成:
SELECT CustomerID, Name, DateOfBirth FROM CustomerInfo WHERE DateOfBirth > '1995-01-01';
三、实战演示:三步搞定Text2SQL系统
第一步:准备数据表结构
我们以保险公司的客户数据为例:
CREATE TABLE CustomerInfo (CustomerID INT PRIMARY KEY,Name VARCHAR(50),Gender VARCHAR(10),DateOfBirth DATE,PhoneNumber VARCHAR(20),MaritalStatus VARCHAR(20) ); CREATE TABLE PolicyInfo (PolicyNumber INT PRIMARY KEY,CustomerID INT,ProductID INT,PremiumPaymentStatus VARCHAR(20) );
第二步:选择合适的AI模型
根据你的需求选择:
预算充足:GPT-o1、Claude 3.7(准确率高)
私有化部署:Qwen-Coder、DeepSeek-V3(安全性好)
性价比之选:Qwen-Turbo(速度快,价格低)
第三步:实现核心代码
这里我们用LangChain框架来快速搭建:
from langchain.agents import create_sql_agent
from langchain.agents.agent_toolkits import SQLDatabaseToolkit
from langchain.sql_database import SQLDatabase
from langchain.chat_models import ChatOpenAI
# 连接数据库
db = SQLDatabase.from_uri("mysql+pymysql://user:password@localhost:3306/insurance")
# 初始化AI模型
llm = ChatOpenAI(model="qwen-turbo",temperature=0.01,openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",openai_api_key="your_api_key"
)
# 创建SQL智能体
toolkit = SQLDatabaseToolkit(db=db, llm=llm)
agent_executor = create_sql_agent(llm=llm,toolkit=toolkit,verbose=True
)
# 开始查询!
result = agent_executor.run("找出所有未支付保费的客户姓名和电话")
print(result)运行结果可能就是这样:
| Name | PhoneNumber |
|---|---|
| 张三 | 13800138000 |
| 李四 | 13900139000 |
四、Text2SQL的未来应用场景:不只是查数据那么简单!
1. 企业智能BI系统
让每个员工都能通过自然语言查询业务数据,不再需要专门的分析师。
2. 客服机器人升级
客服不仅能回答常见问题,还能直接查询客户订单、账单等信息。
3. 智能运营助手
运营人员可以直接问"昨天哪个渠道的转化率最高?",系统自动给出答案和图表。
4. 教育培训工具
帮助初学者通过自然语言学习SQL,降低数据库学习门槛。
5. 私有化部署方案
金融机构、政府部门可以部署在内网,安全查询敏感数据。
五、进阶技巧:让你的Text2SQL更聪明!
1. Prompt优化技巧
-- language: SQL
### Question: {用户查询问题}
### Input: {数据表建表语句}
### Response:
Here is the SQL query I have generated:
```sql
{生成的SQL语句}
2. 结合RAG技术提升准确率
通过向量数据库存储常见查询示例,提高SQL生成的准确性。
3. 错误处理和优化
记录常见的错误类型,通过RAG优化解决字段名错误、多表关联等问题。
六、完整代码实现:手把手教你搭建Text2SQL系统
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Text2SQL智能查询系统完整实现
作者:AI代码开发宝库
"""
import os
from langchain.agents import create_sql_agent, AgentExecutor
from langchain.agents.agent_toolkits import SQLDatabaseToolkit
from langchain.sql_database import SQLDatabase
from langchain.chat_models import ChatOpenAI
import mysql.connector
from typing import List, Dict
class Text2SQLSystem:def __init__(self, db_uri: str, api_key: str, model: str = "qwen-turbo"):"""初始化Text2SQL系统Args:db_uri: 数据库连接URIapi_key: API密钥model: 使用的AI模型"""# 连接数据库self.db = SQLDatabase.from_uri(db_uri)# 初始化AI模型self.llm = ChatOpenAI(model=model,temperature=0.01,openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",openai_api_key=api_key)# 创建工具包和智能体self.toolkit = SQLDatabaseToolkit(db=self.db, llm=self.llm)self.agent_executor = create_sql_agent(llm=self.llm,toolkit=self.toolkit,verbose=True)def query(self, question: str) -> str:"""执行自然语言查询Args:question: 自然语言查询问题Returns:查询结果"""try:result = self.agent_executor.run(question)return resultexcept Exception as e:return f"查询出错: {str(e)}"def get_table_info(self) -> str:"""获取数据库表信息Returns:表信息描述"""tables = self.db.get_usable_table_names()info = "可用的数据表:\n"for table in tables:info += f"- {table}\n"return info
def main():"""主函数 - 演示Text2SQL系统使用"""# 配置信息(请替换为你的实际配置)DB_URI = "mysql+pymysql://student123:student321@rm-uf6z891lon6dxuqblqo.mysql.rds.aliyuncs.com:3306/action"API_KEY = os.environ.get('DASHSCOPE_API_KEY', 'your_api_key_here')# 创建Text2SQL系统实例text2sql = Text2SQLSystem(DB_URI, API_KEY)# 显示可用表信息print("=== Text2SQL智能查询系统 ===")print(text2sql.get_table_info())# 示例查询queries = ["获取所有客户的姓名和联系电话","找出所有未支付保费的保单号和客户姓名","查询英雄攻击力前5名的英雄","代理人执照即将到期的有哪些?按到期时间排序"]for query in queries:print(f"\n--- 查询: {query} ---")result = text2sql.query(query)print(f"结果:\n{result}")
# 高级功能:自定义Prompt优化
class AdvancedText2SQLSystem(Text2SQLSystem):def __init__(self, db_uri: str, api_key: str, model: str = "qwen-turbo"):super().__init__(db_uri, api_key, model)# 优化的系统提示self.system_prompt = """你是一个专业的SQL生成助手,请严格按照以下规则生成SQL:1. 只使用提供的数据表结构2. 确保SQL语法正确3. 添加必要的注释说明4. 对于复杂查询,优先考虑性能优化"""def query_with_context(self, question: str, context: str = "") -> str:"""带上下文的查询Args:question: 查询问题context: 额外上下文信息Returns:查询结果"""full_question = f"{context}\n{question}" if context else questionreturn self.query(full_question)
if __name__ == "__main__":main()结语:Text2SQL开启数据查询新纪元!
Text2SQL技术正在改变我们与数据交互的方式。从简单的查询到复杂的分析,从技术人员专享到人人可用,这项技术的潜力是巨大的。
未来,随着AI技术的不断发展,我们可以期待:
更准确的语义理解能力
更广泛的数据库支持
更智能的查询优化
更安全的权限控制
现在就开始学习和应用Text2SQL技术吧!让数据查询变得简单有趣,让每个业务人员都能成为数据分析师!
记住:技术改变生活,AI赋能未来!
代码
sql_agent_deepseek.py
#!/usr/bin/env python
# coding: utf-8# ## 使用DeepSeek进行数据表的查询# In[1]:from langchain.agents import create_sql_agent
from langchain.agents.agent_toolkits import SQLDatabaseToolkit
from langchain.sql_database import SQLDatabase
from langchain.llms.openai import OpenAI
from langchain.agents import AgentExecutordb_user = "student123"
db_password = "student321"
#db_host = "localhost:3306"
db_host = "rm-uf6z891lon6dxuqblqo.mysql.rds.aliyuncs.com:3306"
db_name = "action"
db = SQLDatabase.from_uri(f"mysql+pymysql://{db_user}:{db_password}@{db_host}/{db_name}")
db# In[3]:from langchain.chat_models import ChatOpenAI
import os# 从环境变量获取 dashscope 的 API Key
api_key = os.environ.get('DASHSCOPE_API_KEY')# 通过LLM => 撰写SQL
llm = ChatOpenAI(temperature=0.01,model="deepseek-v3", #model = "qwen-turbo",# openai_api_key = "sk-9846f14a2104490b960adbf5c5b3b32e",# openai_api_base="https://api.deepseek.com"openai_api_base = "https://dashscope.aliyuncs.com/compatible-mode/v1",openai_api_key = api_key
)# 需要设置llm
toolkit = SQLDatabaseToolkit(db=db, llm=llm)# SQL智能体:给它目标,它自己会进行规划,最终把结果给你
agent_executor = create_sql_agent(llm=llm,toolkit=toolkit,verbose=True
)# In[4]:# Task: 描述数据表
agent_executor.run("描述与订单相关的表及其关系")# In[7]:# 这个任务,实际上数据库中 没有HeroDetails表
agent_executor.run("描述HeroDetails表")# In[3]:agent_executor.run("描述Hero表")# In[7]:agent_executor.run("找出英雄攻击力最高的前5个英雄")这部分是实际的查询任务:
- 智能体会将自然语言查询转换为SQL语句
- 然后在数据库中执行查询并返回结果
- 从任务可以看出,这个数据库可能包含与游戏相关的数据表,如英雄(Hero)表等
作者简介:AI代码开发宝库,专注于分享前沿AI技术与实用代码,让更多人轻松掌握人工智能!关注我,获取更多干货内容!
版权声明:本文为原创文章,转载请注明出处!
