当与数据库工作时,查询特定数据是至关重要的。如果您可以简单地提出一个自然语言问题来获取所需的数据,而不是手动编写SQL查询,那会怎样呢?有了ChatGPT的函数调用功能,我们可以做到这一点!
让我们看看如何建立一个使用ChatGPT为我们生成SQL查询的系统,以Chinook样本数据库为例。
首先,我们需要建立与SQLite数据库的连接。
import sqlite3
conn = sqlite3.connect("data/Chinook.db")
print("成功打开数据库")
为了做出明智的查询,ChatGPT需要理解我们数据库的结构。我们可以通过创建实用函数来提取表名、列名和整体数据库信息来实现这一点。
def get_table_names(conn):
table_names = []
tables = conn.execute("SELECT name FROM sqlite_master WHERE type='table';")
for table in tables.fetchall():
table_names.append(table[0])
return table_names
def get_column_names(conn, table_name):
column_names = []
columns = conn.execute(f"PRAGMA table_info('{table_name}');").fetchall()
for col in columns:
column_names.append(col[1])
return column_names
def get_database_info(conn):
table_dicts = []
for table_name in get_table_names(conn):
columns_names = get_column_names(conn, table_name)
table_dicts.append({"table_name": table_name, "column_names": columns_names})
return table_dicts
使用这些函数,您现在可以为数据库生成一个架构表示。
有了数据库架构,我们可以为ChatGPT定义一个函数规范。这将为模型提供有关我们数据库结构的上下文,并告诉它如何生成SQL查询。
database_schema_dict = get_database_info(conn)
database_schema_string = "\n".join(
[
f"Table: {table['table_name']}\nColumns: {', '.join(table['column_names'])}"
for table in database_schema_dict
]
)
functions = [
{
"name": "ask_database",
"description": "使用此功能回答用户关于音乐的问题。输入应该是一个完整的SQL查询。",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": f"使用此数据库架构提取信息的SQL查询:{database_schema_string}。查询应以纯文本返回,而不是JSON。"
}
},
"required": ["query"],
},
}
]
接下来,我们需要一个函数来执行针对我们数据库的生成的SQL查询。
def ask_database(conn, query):
try:
results = str(conn.execute(query).fetchall())
except Exception as e:
results = f"查询失败,错误为:{e}"
return results
现在,使用ChatGPT API,我们可以与模型互动。当我们从模型得到一个函数调用的响应时,我们可以执行SQL查询并返回结果。
messages = []
messages.append({"role": "system", "content": "通过生成针对Chinook音乐数据库的SQL查询来回答用户问题。"})
messages.append({"role": "user", "content": "你好,哪5位艺术家的歌曲数量最多?"})
chat_response = chat_completion_request(messages, functions)
assistant_message = chat_response.json()["choices"][0]["message"]
messages.append(assistant_message)
if assistant_message.get("function_call"):
results = execute_function_call(assistant_message)
messages.append({"role": "function", "name": assistant_message["function_call"]["name"], "content": results})
通过将ChatGPT与数据库交互相结合,我们展示了如何使用自然语言问题生成SQL查询。这种方法允许更直观地检索数据,尤其是对于可能不熟悉SQL语法的用户。但是,请始终确保验证并清洁生成的查询,特别是在生产环境中使用时,以保持数据完整性和安全性。
原文文末见github code ink
AI日新月异,但是万丈高楼拔地起,离不开良好的基础。您是否有兴趣了解人工智能的原理和实践? 不要再观望! 我们关于 AI 原则和实践的书是任何想要深入了解 AI 世界的人的完美资源。 由该领域的领先专家撰写,这本综合指南涵盖了从机器学习的基础知识到构建智能系统的高级技术的所有内容。 无论您是初学者还是经验丰富的 AI 从业者,本书都能满足您的需求。 那为什么还要等呢?
人工智能原理与实践 全面涵盖人工智能和数据科学各个重要体系经典
北大出版社,人工智能原理与实践 人工智能和数据科学从入门到精通 详解机器学习深度学习算法原理