iomgaa a9144062bf 新增:添加Controller智能体模块并优化Prompter智能体
- 新增Controller智能体模块,负责任务选择和指导建议生成
  - 实现任务信息模型和决策响应模型
  - 支持基于患者病史的智能任务选择
  - 提供针对选定任务的专业指导建议

- 优化Prompter智能体,支持Controller指导建议整合
  - 更新run函数支持specific_guidance参数
  - 添加系统化的4步子智能体生成流程
  - 增强prompt指令,提升生成质量和专业性
  - 保持向后兼容性

- 完善测试验证,确保功能正常运行

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-11 18:17:23 +08:00

230 lines
8.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from typing import Dict, Any, List
from agent_system.base import BaseAgent
from agent_system.controller.prompt import ControllerPrompt
from agent_system.controller.response_model import ControllerDecision, TaskInfo
class TaskController(BaseAgent):
"""
任务控制器智能体
负责根据患者的临床信息(现病史、既往史、主诉)从未完成的任务列表中
选择最合适的下一步任务,并提供具体的执行指导建议。
核心功能:
1. 分析患者的临床信息和病情特征
2. 评估待执行任务的优先级和重要性
3. 选择最适合当前情况的任务
4. 提供针对性的任务执行指导
Attributes:
model_type (str): 使用的大语言模型类型,默认为 gpt-oss:latest
llm_config (dict): LLM模型配置参数
"""
def __init__(self, model_type: str = "gpt-oss:latest", llm_config: dict = None):
"""
初始化任务控制器智能体
Args:
model_type (str): 大语言模型类型,默认使用 gpt-oss:latest
llm_config (dict): LLM模型的配置参数如果为None则使用默认配置
"""
super().__init__(
model_type=model_type,
description="医疗任务控制器,负责任务选择和执行指导",
instructions=ControllerPrompt.instructions,
response_model=ControllerDecision,
llm_config=llm_config or {},
structured_outputs=True,
markdown=False,
use_cache=False
)
def run(self,
pending_tasks: List[Dict[str, str]],
chief_complaint: str,
hpi_content: str = "",
ph_content: str = "") -> ControllerDecision:
"""
执行任务控制决策
基于患者的临床信息和待执行的任务列表,选择最合适的任务
并提供具体的执行指导建议。
Args:
pending_tasks (List[Dict[str, str]]): 待执行的任务列表每个任务包含name、priority、description字段
chief_complaint (str): 患者主诉
hpi_content (str, optional): 现病史内容,默认为空字符串
ph_content (str, optional): 既往史内容,默认为空字符串
Returns:
ControllerDecision: 包含任务选择决策和指导建议的结构化数据,包括:
- selected_task: 选择的任务信息
- specific_guidance: 针对选定任务的具体指导建议
Raises:
Exception: 当LLM调用失败时返回包含默认信息的ControllerDecision
"""
try:
# 构建决策提示词
prompt = self._build_decision_prompt(
pending_tasks, chief_complaint, hpi_content, ph_content
)
# 调用基类的run方法执行LLM推理
result = super().run(prompt)
# 确保返回正确的类型并进行类型转换
return self._ensure_result_type(result)
except Exception as e:
# 当决策失败时记录错误并返回默认结果
print(f"任务控制决策失败: {str(e)}")
return self._get_fallback_result(pending_tasks)
def _ensure_result_type(self, result: Any) -> ControllerDecision:
"""
确保返回结果为正确的类型
Args:
result (Any): LLM返回的原始结果
Returns:
ControllerDecision: 转换后的结构化结果
"""
if isinstance(result, ControllerDecision):
return result
elif isinstance(result, dict):
return ControllerDecision(**result)
else:
# 如果类型不匹配,返回默认结果
return self._get_fallback_result([])
def _get_fallback_result(self, pending_tasks: List[Dict[str, str]]) -> ControllerDecision:
"""
生成决策失败时的默认结果
Args:
pending_tasks (List[Dict[str, str]]): 待执行的任务列表
Returns:
ControllerDecision: 包含默认任务选择的结果
"""
# 如果有待执行任务,选择第一个作为默认任务
if pending_tasks:
default_task = pending_tasks[0]
selected_task_info = TaskInfo(
task_name=default_task.get("name", "未知任务"),
priority=default_task.get("priority", ""),
description=default_task.get("description", "任务描述不可用")
)
else:
selected_task_info = TaskInfo(
task_name="基本信息收集",
priority="",
description="收集患者的基本临床信息"
)
return ControllerDecision(
selected_task=selected_task_info,
specific_guidance="由于系统异常,建议按照标准临床流程进行患者评估,重点关注患者的主要症状和病史信息,并人工审核患者情况。"
)
def _build_decision_prompt(self,
pending_tasks: List[Dict[str, str]],
chief_complaint: str,
hpi_content: str,
ph_content: str) -> str:
"""
构建任务控制决策的提示词模板
根据待执行任务列表和患者临床信息,构建简洁高效的决策提示词,
引导LLM进行专业的任务选择和指导建议。
Args:
pending_tasks (List[Dict[str, str]]): 待执行的任务列表
chief_complaint (str): 患者主诉
hpi_content (str): 现病史内容
ph_content (str): 既往史内容
Returns:
str: 精简的决策提示词
"""
# 格式化待执行任务列表
tasks_display = ""
for i, task in enumerate(pending_tasks, 1):
task_name = task.get("name", "未知任务")
task_priority = task.get("priority", "未设定")
task_desc = task.get("description", "无描述")
tasks_display += f"{i}. 任务名称: {task_name}\n 优先级: {task_priority}\n 描述: {task_desc}\n\n"
if not tasks_display.strip():
tasks_display = "当前没有待执行的任务。"
# 确保临床信息的合理显示
hpi_display = hpi_content.strip() if hpi_content.strip() else "暂无现病史信息"
ph_display = ph_content.strip() if ph_content.strip() else "暂无既往史信息"
# 从prompt类获取示例输出格式
example_output = ControllerPrompt.get_example_output()
prompt = f"""患者临床信息:
主诉: {chief_complaint}
现病史: {hpi_display}
既往史: {ph_display}
待执行任务列表:
{tasks_display}
请根据患者的临床信息分析病情特征,从上述任务列表中选择最合适的下一步任务,并提供具体的执行指导建议。
输出格式示例:
{example_output}
请严格按照上述JSON格式输出。
输出内容为:"""
return prompt
def select_optimal_task(self,
tasks: List[Dict[str, str]],
patient_info: Dict[str, str]) -> ControllerDecision:
"""
基于患者信息选择最优任务的便捷接口
这是一个专门用于任务选择的简化接口,接受结构化的患者信息。
Args:
tasks (List[Dict[str, str]]): 待执行的任务列表
patient_info (Dict[str, str]): 患者信息字典包含chief_complaint、hpi、ph等字段
Returns:
ControllerDecision: 任务选择决策结果
"""
chief_complaint = patient_info.get("chief_complaint", "")
hpi_content = patient_info.get("hpi", "")
ph_content = patient_info.get("ph", "")
return self.run(
pending_tasks=tasks,
chief_complaint=chief_complaint,
hpi_content=hpi_content,
ph_content=ph_content
)
def get_task_guidance(self, result: ControllerDecision) -> Dict[str, Any]:
"""
获取任务执行指导的结构化信息
Args:
result (ControllerDecision): 控制器决策结果
Returns:
Dict[str, Any]: 包含任务指导信息的字典
"""
return {
"task_name": result.selected_task.task_name,
"priority": result.selected_task.priority,
"guidance": result.specific_guidance
}