123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- # agent/tools/summary_generation.py
- from langchain.tools import tool
- from typing import Dict, Any
- import pandas as pd
- from common.vanna_instance import get_vanna_instance
- @tool
- def generate_summary(question: str, query_result: Dict[str, Any], sql: str) -> Dict[str, Any]:
- """
- 为查询结果生成自然语言摘要。
-
- Args:
- question: 原始问题
- query_result: 查询结果数据
- sql: 执行的SQL语句
-
- Returns:
- 包含摘要结果的字典,格式:
- {
- "success": bool,
- "summary": str,
- "error": str或None
- }
- """
- try:
- print(f"[TOOL:generate_summary] 开始生成摘要,问题: {question}")
-
- if not query_result or not query_result.get("rows"):
- return {
- "success": True,
- "summary": "查询执行完成,但没有找到符合条件的数据。",
- "message": "无数据摘要"
- }
-
- # 重构DataFrame用于摘要生成
- df = _reconstruct_dataframe(query_result)
-
- if df is None or df.empty:
- return {
- "success": True,
- "summary": "查询执行完成,但数据为空。",
- "message": "空数据摘要"
- }
-
- # 调用Vanna生成摘要(thinking内容已在base_llm_chat.py中统一处理)
- vn = get_vanna_instance()
- summary = vn.generate_summary(question=question, df=df)
-
- if summary is None:
- # 生成默认摘要
- summary = _generate_default_summary(question, query_result, sql)
-
- print(f"[TOOL:generate_summary] 摘要生成成功: {summary[:100]}...")
-
- return {
- "success": True,
- "summary": summary,
- "message": "摘要生成成功"
- }
-
- except Exception as e:
- print(f"[ERROR] 摘要生成异常: {str(e)}")
-
- # 生成备用摘要
- fallback_summary = _generate_fallback_summary(question, query_result, sql)
-
- return {
- "success": True, # 即使异常也返回成功,因为有备用摘要
- "summary": fallback_summary,
- "message": f"使用备用摘要生成: {str(e)}"
- }
- def _reconstruct_dataframe(query_result: Dict[str, Any]) -> pd.DataFrame:
- """从查询结果重构DataFrame"""
- try:
- rows = query_result.get("rows", [])
- columns = query_result.get("columns", [])
-
- if not rows or not columns:
- return pd.DataFrame()
-
- return pd.DataFrame(rows, columns=columns)
-
- except Exception as e:
- print(f"[WARNING] DataFrame重构失败: {str(e)}")
- return pd.DataFrame()
- def _generate_default_summary(question: str, query_result: Dict[str, Any], sql: str) -> str:
- """生成默认摘要"""
- try:
- row_count = query_result.get("row_count", 0)
- columns = query_result.get("columns", [])
-
- if row_count == 0:
- return "查询执行完成,但没有找到符合条件的数据。"
-
- summary_parts = [f"根据您的问题「{question}」,查询返回了 {row_count} 条记录。"]
-
- if columns:
- summary_parts.append(f"数据包含以下字段:{', '.join(columns)}。")
-
- return ' '.join(summary_parts)
-
- except Exception:
- return f"查询执行完成,共返回 {query_result.get('row_count', 0)} 条记录。"
- def _generate_fallback_summary(question: str, query_result: Dict[str, Any], sql: str) -> str:
- """生成备用摘要"""
- row_count = query_result.get("row_count", 0)
-
- if row_count == 0:
- return "查询执行完成,但没有找到符合条件的数据。请检查查询条件是否正确。"
-
- return f"查询执行成功,共返回 {row_count} 条记录。数据已准备完毕,您可以查看详细结果。"
|