sql_generation.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. # agent/tools/sql_generation.py
  2. from langchain.tools import tool
  3. from typing import Dict, Any
  4. from common.vanna_instance import get_vanna_instance
  5. from core.logging import get_agent_logger
  6. # Initialize logger
  7. logger = get_agent_logger("SQLGeneration")
  8. @tool
  9. def generate_sql(question: str, allow_llm_to_see_data: bool = True) -> Dict[str, Any]:
  10. """
  11. 将自然语言问题转换为SQL查询。
  12. Args:
  13. question: 需要转换为SQL的自然语言问题
  14. allow_llm_to_see_data: 是否允许LLM查看数据,默认True
  15. Returns:
  16. 包含SQL生成结果的字典,格式:
  17. {
  18. "success": bool,
  19. "sql": str或None,
  20. "error": str或None,
  21. "can_retry": bool
  22. }
  23. """
  24. try:
  25. logger.info(f"开始生成SQL: {question}")
  26. vn = get_vanna_instance()
  27. sql = vn.generate_sql(question=question, allow_llm_to_see_data=allow_llm_to_see_data)
  28. if sql is None:
  29. # 检查是否有LLM解释性文本(已在base_llm_chat.py中处理thinking内容)
  30. explanation = getattr(vn, 'last_llm_explanation', None)
  31. if explanation:
  32. return {
  33. "success": False,
  34. "sql": None,
  35. "error": explanation,
  36. "error_type": "generation_failed_with_explanation",
  37. "can_retry": True
  38. }
  39. else:
  40. return {
  41. "success": False,
  42. "sql": None,
  43. "error": "无法生成SQL查询,可能是问题描述不够明确或数据表结构不匹配",
  44. "error_type": "generation_failed",
  45. "can_retry": True
  46. }
  47. # 检查SQL质量
  48. sql_clean = sql.strip()
  49. if not sql_clean:
  50. return {
  51. "success": False,
  52. "sql": sql,
  53. "error": "生成的SQL为空",
  54. "error_type": "empty_sql",
  55. "can_retry": True
  56. }
  57. logger.info(f"成功生成SQL: {sql}")
  58. return {
  59. "success": True,
  60. "sql": sql,
  61. "error": None,
  62. "message": "SQL生成成功"
  63. }
  64. except Exception as e:
  65. logger.error(f"SQL生成异常: {str(e)}")
  66. return {
  67. "success": False,
  68. "sql": None,
  69. "error": f"SQL生成过程异常: {str(e)}",
  70. "error_type": "exception",
  71. "can_retry": True
  72. }