summary_agent.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. # agents/summary_agent.py
  2. """学习进度评估 Agent - 生成学习总结和建议"""
  3. from hello_agents import SimpleAgent, HelloAgentsLLM
  4. from core.file_manager import FileManager
  5. from pathlib import Path
  6. class SummaryAgent(SimpleAgent):
  7. """
  8. 学习进度评估专家
  9. 功能:
  10. - 读取学习目标(plan.md)
  11. - 读取已掌握知识(knowledge_summary.md)
  12. - 读取学习历程(session_summary.md)
  13. - 生成当前水平评估
  14. - 推荐下一步学习内容
  15. """
  16. def __init__(self, llm: HelloAgentsLLM, file_manager: FileManager, streaming: bool = None):
  17. """
  18. 初始化 SummaryAgent
  19. Args:
  20. llm: HelloAgentsLLM 实例
  21. file_manager: FileManager 实例
  22. streaming: 是否启用流式输出(None = 自动检测)
  23. """
  24. system_prompt = """
  25. 你是学习评估专家。
  26. 任务:
  27. 1. 对比学习目标和现状,评估掌握程度(百分比)
  28. 2. 识别强项和弱项
  29. 3. 推荐下一步学习内容
  30. 4. 提供具体的学习建议
  31. 输出格式:
  32. # 📊 学习进度报告
  33. ## 当前水平
  34. - 整体掌握度:XX%
  35. - 处于阶段:入门/熟练/精通
  36. ## ✅ 掌握良好的知识点
  37. - [知识点1]:简短评价
  38. - [知识点2]:简短评价
  39. ## ⚠️ 需要加强的知识点
  40. - [知识点1]:原因分析
  41. - [知识点2]:原因分析
  42. ## 📌 下一步学习建议
  43. 1. [具体主题1]:学习建议
  44. 2. [具体主题2]:学习建议
  45. ## 💡 总体建议
  46. [鼓励和指导]
  47. """
  48. self.llm = llm
  49. self.file_manager = file_manager
  50. # 添加流式输出支持
  51. from utils.streaming import should_stream
  52. self.streaming = should_stream(streaming)
  53. # 使用父类初始化
  54. super().__init__("SummaryAgent", llm, system_prompt)
  55. def run(self, domain: str) -> str:
  56. """
  57. 生成学习进度总结
  58. Args:
  59. domain: 领域名称
  60. Returns:
  61. 学习进度报告
  62. """
  63. # 检查领域是否存在
  64. if not self.file_manager.domain_exists(domain):
  65. return f"❌ 领域 '{domain}' 不存在。请先使用 /create 创建学习计划。"
  66. # 读取必要的文件
  67. try:
  68. # 读取学习计划
  69. plan = self.file_manager.read_plan(domain)
  70. # 读取知识摘要
  71. knowledge_summary_path = (
  72. self.file_manager.BASE_DIR / domain / "knowledge" / "knowledge_summary.md"
  73. )
  74. if knowledge_summary_path.exists():
  75. knowledge_summary = knowledge_summary_path.read_text(encoding="utf-8")
  76. else:
  77. knowledge_summary = "暂无知识笔记"
  78. # 读取会话摘要
  79. session_summary_path = (
  80. self.file_manager.BASE_DIR / domain / "sessions" / "session_summary.md"
  81. )
  82. if session_summary_path.exists():
  83. session_summary = session_summary_path.read_text(encoding="utf-8")
  84. else:
  85. session_summary = "暂无学习记录"
  86. except Exception as e:
  87. return f"❌ 读取文件失败:{e}"
  88. # 生成总结
  89. user_prompt = f"""请分析以下学习情况:
  90. 【学习目标】
  91. {plan[:2000]}
  92. 【已掌握知识】
  93. {knowledge_summary[:2000]}
  94. 【学习历程】
  95. {session_summary[:2000]}
  96. 请按照系统提示词的格式生成学习进度报告。
  97. """
  98. messages = [
  99. {
  100. "role": "system",
  101. "content": "你是一个学习评估专家,擅长分析学习进度并提供针对性建议。",
  102. },
  103. {"role": "user", "content": user_prompt},
  104. ]
  105. try:
  106. if self.streaming:
  107. from utils.streaming import stream_response
  108. return stream_response(self.llm, messages)
  109. else:
  110. return self.llm.invoke(messages).strip()
  111. except Exception as e:
  112. # 如果 LLM 调用失败,返回简化版本
  113. return f"""# 📊 学习进度报告
  114. ## 当前水平
  115. - 领域:{domain}
  116. - 状态:学习进行中
  117. ## 📚 学习内容
  118. - 学习计划:已创建
  119. - 知识笔记:{'有' if knowledge_summary != '暂无知识笔记' else '无'}
  120. - 学习记录:{'有' if session_summary != '暂无学习记录' else '无'}
  121. ## 💡 建议
  122. 请继续添加知识笔记和参与互动学习,以获得更准确的进度评估。
  123. ⚠️ 生成详细报告时遇到问题:{e}
  124. """