You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure OpenAI SQL数据库表对话开发及查询递归修复问题咨询

实现Azure OpenAI SQL报错递归修复方案

核心流程设计

  • 错误捕获层:执行生成的SQL语句后,捕获完整错误信息,包括错误代码、错误描述、执行的原始SQL、相关表结构元数据(首次请求已提供的话可复用)。比如用try-catch块提取SQL Server的ERROR_NUMBER()、ERROR_MESSAGE()等关键信息。
  • 修复请求构造:将错误信息与原始上下文(用户查询需求、已提供的表结构)拼接成精准prompt,明确要求AOAI基于错误修正SQL,示例prompt:

    用户原始需求:{用户需求}
    你之前生成的SQL执行报错:错误代码{错误代码},错误描述{错误描述}。原始SQL:{原始SQL}。请修正该SQL语句,确保可正确执行,仅返回修正后的SQL内容。

  • 递归控制:设置最大重试次数(建议3-5次),避免无限递归。每次修复后重新执行SQL,若仍报错则重复流程,直到执行成功或达到次数上限。

关键实现细节

  • 元数据复用:首次请求已传递表结构、存储过程定义的,后续修复请求无需重复发送全量元数据,减少token消耗。
  • 错误精准传递:必须带上数据库原生错误代码(如SQL Server的42S02表示表不存在),帮助AOAI快速定位问题类型。
  • 死循环规避:若连续两次生成的SQL触发相同错误,直接终止重试,避免无效循环。

代码示例(Python伪代码)

import azure.openai
import pyodbc

def execute_sql(sql):
    conn = pyodbc.connect("你的SQL连接字符串")
    cursor = conn.cursor()
    try:
        cursor.execute(sql)
        result = cursor.fetchall()
        return {"success": True, "result": result}
    except pyodbc.Error as e:
        return {"success": False, "error_code": e.args[0], "error_msg": e.args[1], "sql": sql}
    finally:
        conn.close()

def fix_sql_with_aoai(original_prompt, error_info, max_retries=3):
    client = azure.openai.AzureOpenAI(
        azure_endpoint="你的AOAI端点",
        api_key="你的API密钥",
        api_version="2024-02-15-preview"
    )
    retry_count = 0
    current_sql = error_info["sql"]
    
    while retry_count < max_retries:
        repair_prompt = f"""用户原始需求:{original_prompt}
你之前生成的SQL执行报错:
错误代码:{error_info["error_code"]}
错误描述:{error_info["error_msg"]}
原始SQL:`{current_sql}`
请修正该SQL语句,确保可以正确执行,只返回修正后的SQL,不要额外解释。"""
        
        response = client.chat.completions.create(
            model="你的部署模型名",
            messages=[{"role": "user", "content": repair_prompt}]
        )
        fixed_sql = response.choices[0].message.content.strip()
        
        exec_result = execute_sql(fixed_sql)
        if exec_result["success"]:
            return exec_result
        else:
            error_info = exec_result
            current_sql = fixed_sql
            retry_count += 1
    
    return {"success": False, "msg": "达到最大重试次数,无法修复SQL"}

# 调用示例
user_query = "查询最近7天的订单总额"
initial_exec_result = execute_sql("SELECT SUM(total) FROM orders WHERE order_date > DATEADD(day, -7, GETDATE())")
if not initial_exec_result["success"]:
    final_result = fix_sql_with_aoai(user_query, initial_exec_result)
    print(final_result)

注意事项

  • 权限限制:确保执行SQL的账号仅拥有查询类权限,避免AOAI生成DROP、ALTER等危险语句。
  • token优化:修复prompt尽量精简,仅传递必要的错误信息和上下文,降低调用成本。
  • 日志记录:记录每次重试的SQL、错误信息和修复结果,便于后续调试和prompt优化。

内容的提问来源于stack exchange,提问作者Intelligence6

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 11:13:27