通过 ChatGPT 的 Function Call 查询数据库

用 Function Calling 的方式实现手机流量包智能客服的例子。

python 复制代码
def get_sql_completion(messages, model="gpt-3.5-turbo"):
    response = client.chat.completions.create(
        model=model,
        messages=messages,
        temperature=0,
        tools=[{  # 摘自 OpenAI 官方示例 https://github.com/openai/openai-cookbook/blob/main/examples/How_to_call_functions_with_chat_models.ipynb
            "type": "function",
            "function": {
                "name": "ask_database",
                "description": "Use this function to answer user questions about packages. \
                            Output should be a fully formed SQL query.",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "query": {
                            "type": "string",
                            "description": f"""
                            SQL query extracting info to answer the user's question.
                            SQL should be written using this database schema:
                            {database_schema_string}
                            The query should be returned in plain text, not in JSON.
                            The query should only contain grammars supported by SQLite.
                            """,
                        }
                    },
                    "required": ["query"],
                }
            }
        }],
    )
    return response.choices[0].message
python 复制代码
#  描述数据库表结构
database_schema_string = """
CREATE TABLE packages (
    id INT PRIMARY KEY NOT NULL, -- 主键,不允许为空
    package_name STR NOT NULL, -- 套餐名称,不允许为空
    monthly_fee INT NOT NULL, -- 月费,单位元,不允许为空
    flow_size INT NOT NULL, -- 流量大小,单位G,不允许为空
    condition STR -- 购买的限制条件,允许为空
);
"""
python 复制代码
import sqlite3

# 创建数据库连接
conn = sqlite3.connect(':memory:')
cursor = conn.cursor()

# 创建orders表
cursor.execute(database_schema_string)

# 插入4条明确的模拟记录
mock_data = [
    (1, '经济套餐', 50, 10, None),
    (2, '畅游套餐', 180, 100, None),
    (3, '无限套餐', 300, 1000, None),
    (4, '校园套餐', 150, 200, '仅限在校生'),
]

for record in mock_data:
    cursor.execute('''
    INSERT INTO packages (id, package_name, monthly_fee, flow_size, condition)
    VALUES (?, ?, ?, ?, ?)
    ''', record)

# 提交事务
conn.commit()
python 复制代码
def ask_database(query):
    cursor.execute(query)
    records = cursor.fetchall()
    return records


prompt = "请问流量最大的套餐是哪个?"
# prompt = "统计每月每件商品的销售额"
# prompt = "哪个用户消费最高?消费多少?"

messages = [
    {"role": "system", "content": "基于 packages 表回答用户问题"},
    {"role": "user", "content": prompt}
]
print("====messages====")
print_json(messages)

response = get_sql_completion(messages)
# print("====first Function Calling====")
# print_json(response)

if response.content is None:
    response.content = ""
messages.append(response)
print("====Function Calling====")
print_json(response)

if response.tool_calls is not None:
    tool_call = response.tool_calls[0]
    if tool_call.function.name == "ask_database":
        arguments = tool_call.function.arguments
        args = json.loads(arguments)
        print("====SQL====")
        print(args["query"])
        
        result = ask_database(args["query"])
        print("====DB Records====")
        print(result)

        messages.append({
            "tool_call_id": tool_call.id,
            "role": "tool",
            "name": "ask_database",
            "content": str(result)
        })
        response = get_sql_completion(messages)
        print("====最终回复====")
        print(response.content)
相关推荐
bst@微胖子1 小时前
Python高级语法之selenium
开发语言·python·selenium
默 语2 小时前
百度搜索融合 DeepSeek 满血版,开启智能搜索新篇
百度·ai·deepseek
查理零世2 小时前
【蓝桥杯集训·每日一题2025】 AcWing 6118. 蛋糕游戏 python
python·算法·蓝桥杯
魔尔助理顾问3 小时前
一个简洁高效的Flask用户管理示例
后端·python·flask
java1234_小锋3 小时前
一周学会Flask3 Python Web开发-request请求对象与url传参
开发语言·python·flask·flask3
诚信爱国敬业友善6 小时前
常见排序方法的总结归类
开发语言·python·算法
The god of big data7 小时前
深入探索 DeepSeek 在数据分析与可视化中的应用
ai·数据挖掘·数据分析
架构默片8 小时前
【JAVA工程师从0开始学AI】,第五步:Python类的“七十二变“——当Java的铠甲遇见Python的液态金属
java·开发语言·python
陈敬雷-充电了么-CEO兼CTO8 小时前
DeepSeek核心算法解析:如何打造比肩ChatGPT的国产大模型
人工智能·神经网络·自然语言处理·chatgpt·大模型·aigc·deepseek
小哥山水之间8 小时前
在 Python 中操作 Excel 文件
开发语言·python·excel