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
相关产品推荐
相关产品推荐

