summary_generation.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. # agent/tools/summary_generation.py
  2. from langchain.tools import tool
  3. from typing import Dict, Any
  4. import pandas as pd
  5. from common.vanna_instance import get_vanna_instance
  6. @tool
  7. def generate_summary(question: str, query_result: Dict[str, Any], sql: str) -> Dict[str, Any]:
  8. """
  9. 为查询结果生成自然语言摘要。
  10. Args:
  11. question: 原始问题
  12. query_result: 查询结果数据
  13. sql: 执行的SQL语句
  14. Returns:
  15. 包含摘要结果的字典,格式:
  16. {
  17. "success": bool,
  18. "summary": str,
  19. "error": str或None
  20. }
  21. """
  22. try:
  23. print(f"[TOOL:generate_summary] 开始生成摘要,问题: {question}")
  24. if not query_result or not query_result.get("rows"):
  25. return {
  26. "success": True,
  27. "summary": "查询执行完成,但没有找到符合条件的数据。",
  28. "message": "无数据摘要"
  29. }
  30. # 重构DataFrame用于摘要生成
  31. df = _reconstruct_dataframe(query_result)
  32. if df is None or df.empty:
  33. return {
  34. "success": True,
  35. "summary": "查询执行完成,但数据为空。",
  36. "message": "空数据摘要"
  37. }
  38. # 调用Vanna生成摘要(thinking内容已在base_llm_chat.py中统一处理)
  39. vn = get_vanna_instance()
  40. summary = vn.generate_summary(question=question, df=df)
  41. if summary is None:
  42. # 生成默认摘要
  43. summary = _generate_default_summary(question, query_result, sql)
  44. print(f"[TOOL:generate_summary] 摘要生成成功: {summary[:100]}...")
  45. return {
  46. "success": True,
  47. "summary": summary,
  48. "message": "摘要生成成功"
  49. }
  50. except Exception as e:
  51. print(f"[ERROR] 摘要生成异常: {str(e)}")
  52. # 生成备用摘要
  53. fallback_summary = _generate_fallback_summary(question, query_result, sql)
  54. return {
  55. "success": True, # 即使异常也返回成功,因为有备用摘要
  56. "summary": fallback_summary,
  57. "message": f"使用备用摘要生成: {str(e)}"
  58. }
  59. def _reconstruct_dataframe(query_result: Dict[str, Any]) -> pd.DataFrame:
  60. """从查询结果重构DataFrame"""
  61. try:
  62. rows = query_result.get("rows", [])
  63. columns = query_result.get("columns", [])
  64. if not rows or not columns:
  65. return pd.DataFrame()
  66. return pd.DataFrame(rows, columns=columns)
  67. except Exception as e:
  68. print(f"[WARNING] DataFrame重构失败: {str(e)}")
  69. return pd.DataFrame()
  70. def _generate_default_summary(question: str, query_result: Dict[str, Any], sql: str) -> str:
  71. """生成默认摘要"""
  72. try:
  73. row_count = query_result.get("row_count", 0)
  74. columns = query_result.get("columns", [])
  75. if row_count == 0:
  76. return "查询执行完成,但没有找到符合条件的数据。"
  77. summary_parts = [f"根据您的问题「{question}」,查询返回了 {row_count} 条记录。"]
  78. if columns:
  79. summary_parts.append(f"数据包含以下字段:{', '.join(columns)}。")
  80. return ' '.join(summary_parts)
  81. except Exception:
  82. return f"查询执行完成,共返回 {query_result.get('row_count', 0)} 条记录。"
  83. def _generate_fallback_summary(question: str, query_result: Dict[str, Any], sql: str) -> str:
  84. """生成备用摘要"""
  85. row_count = query_result.get("row_count", 0)
  86. if row_count == 0:
  87. return "查询执行完成,但没有找到符合条件的数据。请检查查询条件是否正确。"
  88. return f"查询执行成功,共返回 {row_count} 条记录。数据已准备完毕,您可以查看详细结果。"