general_chat.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. # agent/tools/general_chat.py
  2. from langchain.tools import tool
  3. from typing import Dict, Any, Optional
  4. from common.vanna_instance import get_vanna_instance
  5. @tool
  6. def general_chat(question: str, context: Optional[str] = None) -> Dict[str, Any]:
  7. """
  8. 处理一般性对话和咨询。
  9. Args:
  10. question: 用户的问题或对话内容
  11. context: 上下文信息,可选
  12. Returns:
  13. 包含聊天响应的字典,格式:
  14. {
  15. "success": bool,
  16. "response": str,
  17. "error": str或None
  18. }
  19. """
  20. try:
  21. print(f"[TOOL:general_chat] 处理聊天问题: {question}")
  22. system_prompt = """
  23. 你是Citu智能数据问答平台的AI助手,专门为用户提供帮助和支持。
  24. 你的职责包括:
  25. 1. 回答关于平台功能和使用方法的问题
  26. 2. 解释数据分析相关的概念和术语
  27. 3. 提供操作指导和建议
  28. 4. 进行友好的日常对话
  29. 回答原则:
  30. - 保持友好、专业的语调
  31. - 提供准确、有用的信息
  32. - 如果不确定某个问题,诚实地表达不确定性
  33. - 鼓励用户尝试数据查询功能
  34. - 回答要简洁明了,避免过于冗长
  35. - 保持中文回答,语言自然流畅
  36. """
  37. # 构建完整的问题(如果有上下文)
  38. if context:
  39. full_question = f"上下文信息:{context}\n\n用户问题:{question}"
  40. else:
  41. full_question = question
  42. # 使用 Vanna 实例进行聊天
  43. vn = get_vanna_instance()
  44. response = vn.chat_with_llm(
  45. question=full_question,
  46. system_prompt=system_prompt
  47. )
  48. if response:
  49. print(f"[TOOL:general_chat] 聊天响应生成成功: {response[:100]}...")
  50. return {
  51. "success": True,
  52. "response": response.strip(),
  53. "message": "聊天响应生成成功"
  54. }
  55. else:
  56. return {
  57. "success": False,
  58. "response": _get_fallback_response(question),
  59. "error": "无法生成聊天响应"
  60. }
  61. except Exception as e:
  62. print(f"[ERROR] 通用聊天异常: {str(e)}")
  63. return {
  64. "success": False,
  65. "response": _get_fallback_response(question),
  66. "error": f"聊天服务异常: {str(e)}"
  67. }
  68. def _get_fallback_response(question: str) -> str:
  69. """获取备用响应"""
  70. question_lower = question.lower()
  71. if any(keyword in question_lower for keyword in ["你好", "hello", "hi"]):
  72. return "您好!我是Citu智能数据问答平台的AI助手。我可以帮助您进行数据查询和分析,也可以回答关于平台使用的问题。有什么可以帮助您的吗?"
  73. elif any(keyword in question_lower for keyword in ["谢谢", "thank"]):
  74. return "不客气!如果您还有其他问题,随时可以问我。我可以帮您查询数据或解答疑问。"
  75. elif any(keyword in question_lower for keyword in ["再见", "bye"]):
  76. return "再见!期待下次为您服务。如果需要数据查询或其他帮助,随时欢迎回来!"
  77. elif any(keyword in question_lower for keyword in ["怎么", "如何", "怎样"]):
  78. return "我理解您想了解使用方法。Citu平台支持自然语言数据查询,您可以直接用中文描述您想要查询的数据,比如'查询本月销售额'或'统计各部门人数'等。有具体问题欢迎继续询问!"
  79. elif any(keyword in question_lower for keyword in ["功能", "作用", "能做"]):
  80. return "我主要可以帮助您:\n1. 进行数据库查询和分析\n2. 解答平台使用问题\n3. 解释数据相关概念\n4. 提供操作指导\n\n您可以用自然语言描述数据需求,我会帮您生成相应的查询。"
  81. else:
  82. return "抱歉,我暂时无法理解您的问题。您可以:\n1. 尝试用更具体的方式描述问题\n2. 询问平台使用方法\n3. 进行数据查询(如'查询销售数据')\n\n我会尽力为您提供帮助!"