from typing import Any from agent_system.base import BaseAgent from agent_system.prompter.prompt import PrompterPrompt from agent_system.prompter.response_model import PrompterResult class Prompter(BaseAgent): """ 智能体提示词生成专家 基于患者的现病史、既往史、主述以及当前具体任务, 生成针对该任务的专门子智能体的description和instructions。 该子智能体将负责围绕特定主题向患者进行专业的医疗询问。 核心功能: 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): """ 初始化Prompter智能体 Args: model_type (str): 大语言模型类型,默认使用 gpt-oss:latest llm_config (dict): LLM模型的配置参数,如果为None则使用默认配置 """ super().__init__( model_type=model_type, description="基于医疗场景和任务需求生成专门的子智能体提示内容", instructions=PrompterPrompt.instructions, response_model=PrompterResult, llm_config=llm_config or {}, structured_outputs=True, markdown=False, use_cache=False ) def run(self, hpi_content: str, ph_content: str, chief_complaint: str, current_task: str) -> PrompterResult: """ 执行智能体提示词生成 基于患者的现病史、既往史、主述以及当前具体任务, 生成针对该任务的专门子智能体的description和instructions。 Args: hpi_content (str): 现病史内容,患者的主要症状描述 ph_content (str): 既往史内容,患者的历史疾病信息 chief_complaint (str): 患者主述,患者的主要不适描述 current_task (str): 当前任务,如"起病情况和患病时间"、"主要症状特征"等 Returns: PrompterResult: 包含子智能体描述和指令的结构化数据,包括: - description: 为特定任务定制的子智能体描述 - instructions: 为特定任务定制的子智能体执行指令列表 Raises: Exception: 当LLM调用失败时,返回包含默认信息的PrompterResult """ try: # 构建生成提示词 prompt = self._build_prompt(hpi_content, ph_content, chief_complaint, current_task) # 调用基类的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(current_task) def _ensure_result_type(self, result: Any) -> PrompterResult: """ 确保返回结果为正确的类型 Args: result (Any): LLM返回的原始结果 Returns: PrompterResult: 转换后的结构化结果 """ if isinstance(result, PrompterResult): return result elif isinstance(result, dict): return PrompterResult(**result) else: # 如果类型不匹配,返回默认结果 return self._get_fallback_result("未知任务") def _get_fallback_result(self, task_name: str) -> PrompterResult: """ 生成失败时的默认结果 Args: task_name (str): 任务名称 Returns: PrompterResult: 包含默认内容的结果 """ return PrompterResult( description=f"你是一名专业的医疗询问助手,负责针对'{task_name}'进行详细的信息收集。你需要以专业、耐心的态度与患者交流,获取准确完整的相关信息。", instructions=[ "## 询问重点", f"1. 围绕'{task_name}'主题进行系统性询问", "2. 使用通俗易懂的语言与患者交流", "3. 确保信息收集的准确性和完整性", "", "## 注意事项", "- 保持专业和耐心的态度", "- 避免使用过于复杂的医学术语", "- 引导患者提供具体详细的信息" ] ) def _build_prompt(self, hpi_content: str, ph_content: str, chief_complaint: str, current_task: str) -> str: """ 构建Prompter的提示词模板 根据患者病史信息和当前任务,构建用于生成子智能体的提示词。 Args: hpi_content (str): 现病史内容 ph_content (str): 既往史内容 chief_complaint (str): 患者主述 current_task (str): 当前任务 Returns: str: 构建的提示词 """ # 确保既往史内容的合理显示 past_history_display = ph_content.strip() if ph_content.strip() else "暂无既往史信息" # 从prompt类获取示例输出格式 from agent_system.prompter.prompt import PrompterPrompt example_output = PrompterPrompt.get_example_output() prompt = f"""患者基本信息: 患者主述: {chief_complaint} 现病史: {hpi_content} 既往史: {past_history_display} 当前任务: {current_task} 请基于上述患者信息和当前任务,生成一个专门的子智能体,该智能体将负责围绕"{current_task}"主题向患者进行专业询问。 请为该子智能体提供: 1. description - 描述该智能体的角色、专业领域和主要职责 2. instructions - 详细的执行指令列表,包括询问步骤、注意事项等 输出格式示例: {example_output} 请严格按照上述JSON格式输出。 输出内容为:""" return prompt