advice.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. """
  2. 健康建议 Agent
  3. """
  4. import json
  5. from typing import Dict, Any, List
  6. from agents.base import BaseAgent
  7. from core.exceptions import AgentException
  8. class AdviceAgent(BaseAgent):
  9. def __init__(self, task_id=None, llm=None):
  10. super().__init__(name="AdviceAgent", task_id=task_id, llm=llm)
  11. async def run(self, input_data: Dict[str, Any]) -> Dict[str, Any]:
  12. self.set_state("running")
  13. overall_risk_level = input_data.get("overall_risk_level")
  14. risk_factors = input_data.get("risk_factors", [])
  15. potential_conditions = input_data.get("potential_conditions", [])
  16. confidence = input_data.get("confidence", 0.0)
  17. if isinstance(input_data.get("risk_assessment"), dict):
  18. ra = input_data["risk_assessment"]
  19. overall_risk_level = ra.get("overall_risk_level", overall_risk_level)
  20. risk_factors = ra.get("risk_factors", risk_factors)
  21. potential_conditions = ra.get("potential_conditions", potential_conditions)
  22. confidence = ra.get("confidence", confidence)
  23. retrieved_memory = str(input_data.get("retrieved_memory") or "(暂无召回记忆)")
  24. prompt = self._build_prompt(
  25. overall_risk_level,
  26. risk_factors,
  27. potential_conditions,
  28. confidence,
  29. retrieved_memory,
  30. )
  31. response = await self.think(prompt)
  32. try:
  33. result = json.loads(response)
  34. except json.JSONDecodeError:
  35. result = {
  36. "summary": "解析失败,返回原始结果",
  37. "raw_response": response
  38. }
  39. self.set_state("completed")
  40. return result
  41. def _build_prompt(
  42. self,
  43. overall_risk_level: str,
  44. risk_factors: List[str],
  45. potential_conditions: List[str],
  46. confidence: float,
  47. retrieved_memory: str,
  48. ) -> str:
  49. return f"""
  50. 你是一名专业的健康管理助手。
  51. 请基于以下健康风险评估结果,为用户生成合理、可执行的健康建议。
  52. 健康风险评估结果:
  53. - 总体风险等级:{overall_risk_level}
  54. - 风险因素:{risk_factors}
  55. - 潜在健康问题:{potential_conditions}
  56. - 评估置信度:{confidence}
  57. 历史记忆召回(RAG):
  58. {retrieved_memory}
  59. 请遵循以下原则:
  60. - 不进行医学诊断
  61. - 建议应偏向生活方式、预防、监测和就医提示
  62. - 建议应具体、可执行
  63. - 根据风险等级调整建议的优先级
  64. 请以 JSON 格式返回,例如:
  65. {{
  66. "advice": [
  67. {{
  68. "target": "<对应的风险因素>",
  69. "category": "生活方式 | 饮食 | 运动 | 就医建议 | 监测",
  70. "suggestion": "<具体可执行建议>",
  71. "priority": "high | medium | low"
  72. }}
  73. ],
  74. "overall_tone": "<整体建议风格,如:保守 / 积极干预>"
  75. }}
  76. """
  77. def get_required_fields(self) -> list[str]:
  78. return [
  79. "risk_level",
  80. "risk_factors"
  81. ]