From e24b161e54df58d4b2ed8dba7812bf12662381ad Mon Sep 17 00:00:00 2001 From: iomgaa Date: Mon, 11 Aug 2025 17:16:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E6=B7=BB=E5=8A=A0Re?= =?UTF-8?q?cipient=E6=99=BA=E8=83=BD=E4=BD=93=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 构建完整的Recipient智能体系统,用于医疗对话信息整合 - 功能特性: * 根据完整对话记录更新现病史信息 * 根据完整对话记录更新既往史信息 * 从完整对话记录中提取患者主诉 * 输出顺序与生成顺序保持一致(现病史→既往史→主诉) - 包含完整的JSON格式示例输出和详细处理指令 - 遵循项目规范:中文注释、基于BaseAgent架构 - 支持同步和异步运行模式 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- agent_system/__init__.py | 10 ++- agent_system/recipient/__init__.py | 5 ++ agent_system/recipient/agent.py | 86 +++++++++++++++++++ agent_system/recipient/prompt.py | 101 +++++++++++++++++++++++ agent_system/recipient/response_model.py | 20 +++++ 5 files changed, 221 insertions(+), 1 deletion(-) create mode 100644 agent_system/recipient/__init__.py create mode 100644 agent_system/recipient/agent.py create mode 100644 agent_system/recipient/prompt.py create mode 100644 agent_system/recipient/response_model.py diff --git a/agent_system/__init__.py b/agent_system/__init__.py index 8c99448..b46e2e3 100644 --- a/agent_system/__init__.py +++ b/agent_system/__init__.py @@ -1 +1,9 @@ -# AIM智能体系统初始化文件 \ No newline at end of file +# AIM智能体系统初始化文件 + +from .recipient import RecipientAgent, RecipientPrompt, RecipientResponseModel + +__all__ = [ + "RecipientAgent", + "RecipientPrompt", + "RecipientResponseModel" +] \ No newline at end of file diff --git a/agent_system/recipient/__init__.py b/agent_system/recipient/__init__.py new file mode 100644 index 0000000..6917d50 --- /dev/null +++ b/agent_system/recipient/__init__.py @@ -0,0 +1,5 @@ +from .agent import RecipientAgent +from .prompt import RecipientPrompt +from .response_model import RecipientResponseModel + +__all__ = ["RecipientAgent", "RecipientPrompt", "RecipientResponseModel"] \ No newline at end of file diff --git a/agent_system/recipient/agent.py b/agent_system/recipient/agent.py new file mode 100644 index 0000000..6ec59f1 --- /dev/null +++ b/agent_system/recipient/agent.py @@ -0,0 +1,86 @@ +from agent_system.base import BaseAgent +from agent_system.recipient.prompt import RecipientPrompt +from agent_system.recipient.response_model import RecipientResponseModel + +class RecipientAgent(BaseAgent): + """Recipient智能体:根据完整对话记录和上一轮医疗信息,更新现病史、既往史并提取主诉""" + + def __init__(self, model_type: str, llm_config: dict = {}): + super().__init__( + model_type=model_type, + description=RecipientPrompt.description, + instructions=RecipientPrompt.instructions, + response_model=RecipientResponseModel, + llm_config=llm_config, + structured_outputs=True, + markdown=False, + use_cache=False, + ) + + def run( + self, + conversation_history: str, + previous_HPI: str = None, + previous_PH: str = None, + previous_chief_complaint: str = None, + **kwargs + ) -> RecipientResponseModel: + """运行Recipient智能体 + + Args: + conversation_history: 完整的对话记录 + previous_HPI: 上一轮的现病史 + previous_PH: 上一轮的既往史 + previous_chief_complaint: 上一轮的主诉(可选,用于参考) + + Returns: + RecipientResponseModel: 包含更新后的主诉、现病史和既往史 + """ + prompt = self.build_prompt( + conversation_history, + previous_HPI, + previous_PH, + previous_chief_complaint + ) + return super().run(prompt, **kwargs) + + async def async_run( + self, + conversation_history: str, + previous_HPI: str = None, + previous_PH: str = None, + previous_chief_complaint: str = None, + **kwargs + ) -> RecipientResponseModel: + """异步运行Recipient智能体""" + prompt = self.build_prompt( + conversation_history, + previous_HPI, + previous_PH, + previous_chief_complaint + ) + return await super().async_run(prompt, **kwargs) + + def build_prompt( + self, + conversation_history: str, + previous_HPI: str, + previous_PH: str, + previous_chief_complaint: str = None + ) -> str: + """构建处理提示""" + prompt = f"完整对话记录:\n{conversation_history}\n\n" + + prompt += f"上一轮的现病史:\n{previous_HPI or '暂无现病史信息'}\n\n" + + prompt += f"上一轮的既往史:\n{previous_PH or '暂无既往史信息'}\n\n" + + if previous_chief_complaint: + prompt += f"上一轮的主诉(参考):\n{previous_chief_complaint}\n\n" + + prompt += f"请根据完整对话记录和上一轮的医疗信息,完成以下任务(按此顺序生成):\n" + prompt += f"1. 根据完整对话记录和上一轮现病史,更新并完善现病史(updated_HPI)\n" + prompt += f"2. 根据完整对话记录和上一轮既往史,更新并完善既往史(updated_PH)\n" + prompt += f"3. 从完整对话记录中提取患者的主诉(chief_complaint)" + + return prompt \ No newline at end of file diff --git a/agent_system/recipient/prompt.py b/agent_system/recipient/prompt.py new file mode 100644 index 0000000..74b0c7f --- /dev/null +++ b/agent_system/recipient/prompt.py @@ -0,0 +1,101 @@ +from agent_system.base import BasePrompt + +class RecipientPrompt(BasePrompt): + description = ( + "Recipient智能体是医疗对话信息整合专家。基于完整的对话记录以及上一轮的医疗信息,智能分析并更新患者的医疗记录。本模块将:\n" + "1. 信息整合:根据完整对话记录和上一轮的现病史,更新并完善现病史信息\n" + "2. 历史更新:根据完整对话记录和上一轮的既往史,更新并完善既往史信息\n" + "3. 主诉提取:从完整对话记录中提取并形成规范的患者主诉\n" + "4. 信息溯源:确保所有信息都可从提供的对话记录中直接追溯" + ) + + instructions = [ + # 第一步:现病史更新规范 + "1. 现病史(HPI)更新标准:", + " - 整合策略:", + " * 将上一轮的现病史作为基础信息", + " * 从完整对话记录中提取新的现病史相关信息", + " * 对重复信息进行去重,对补充信息进行整合", + " * 保持时间顺序的逻辑性和连贯性", + " - 更新原则:", + " * 仅添加对话记录中明确提及的症状和信息", + " * 对于矛盾信息,以最新、最准确的对话信息为准", + " * 保持医学术语的规范性和专业性", + " * 确保症状描述的完整性和准确性", + " - 质量控制:", + " * 所有更新的信息必须可从对话记录中直接追溯", + " * 避免添加推测性或未确认的信息", + " * 维持现病史的内在逻辑性", + + # 第二步:既往史更新规范 + "2. 既往史(PH)更新标准:", + " - 整合策略:", + " * 将上一轮的既往史作为基础信息", + " * 从完整对话记录中提取新的既往史相关信息", + " * 对新旧信息进行合理整合,避免重复记录", + " * 保持各类既往史信息的分类清晰", + " - 更新类别:", + " * 疾病史:过往患病经历和治疗情况", + " * 手术史:手术经历和时间", + " * 过敏史:药物或其他过敏反应", + " * 家族史:家族疾病遗传信息", + " * 个人史:生活习惯、职业暴露等", + " - 质量控制:", + " * 确保所有信息可从对话记录中追溯", + " * 避免与现病史信息混淆", + " * 保持信息的时效性和准确性", + + # 第三步:主诉提取规范 + "3. 主诉(Chief Complaint)提取标准:", + " - 提取原则:", + " * 从完整对话记录中识别患者的主要不适症状", + " * 确定症状的持续时间或发生频率", + " * 遵循'主要症状+持续时间'的标准格式", + " * 选择最困扰患者、最主要的症状作为主诉", + " - 格式规范:", + " * 使用标准医学术语", + " * 保持简洁明了的表述", + " * 例如:\"胸痛2小时\"、\"发热伴咳嗽1周\"", + " * 避免过于复杂的多症状组合", + " - 特殊情况处理:", + " * 如对话记录中无明确症状,写\"症状不明确\"", + " * 如对话记录无效或为空,写\"暂无主诉信息\"", + " * 多个等重要症状时,选择患者最先或最频繁提及的症状", + + # 第四步:信息整合质量控制 + "4. 信息整合质量控制:", + " - 完整性检查:", + " * 确保三个部分(主诉、现病史、既往史)都有相应内容", + " * 验证信息更新的逻辑合理性", + " * 检查时间顺序的一致性", + " - 准确性验证:", + " * 所有信息必须可从输入的对话记录中直接找到依据", + " * 避免添加任何推测性、假设性信息", + " * 保持客观、中性的医学记录风格", + " - 一致性保证:", + " * 确保更新后的信息内部逻辑一致", + " * 避免现病史与既往史之间的信息冲突", + " * 保持专业术语使用的统一性", + + # 第五步:输出格式要求 + "5. 输出格式要求:", + " - JSON格式输出,包含以下字段(按生成顺序排列):", + " * updated_HPI: 整合更新后的现病史", + " * updated_PH: 整合更新后的既往史", + " * chief_complaint: 从完整对话记录提取的患者主诉", + " - 字段内容规范:", + " * updated_HPI以'现病史:'开头", + " * updated_PH以'既往史:'开头", + " * chief_complaint直接输出主诉内容,不添加前缀", + " - JSON格式示例:", + " {", + " \"updated_HPI\": \"现病史:患者2小时前在运动后出现胸痛,疼痛位于胸骨后,呈压榨性,伴有轻微出汗...\",", + " \"updated_PH\": \"既往史:患者有高血压病史5年,规律服用降压药物,否认心脏病史...\",", + " \"chief_complaint\": \"胸痛2小时\"", + " }", + " - 格式注意事项:", + " * 严格遵循JSON格式规范", + " * 确保所有必需字段都包含在输出中", + " * 避免使用不必要的换行符和格式标记", + " * 保持内容的连续性和可读性" + ] \ No newline at end of file diff --git a/agent_system/recipient/response_model.py b/agent_system/recipient/response_model.py new file mode 100644 index 0000000..1842e81 --- /dev/null +++ b/agent_system/recipient/response_model.py @@ -0,0 +1,20 @@ +from pydantic import Field +from agent_system.base import BaseResponseModel + +class RecipientResponseModel(BaseResponseModel): + """Recipient智能体响应模型""" + + updated_HPI: str = Field( + ..., + description="更新后的现病史,根据完整对话记录和上一轮现病史进行整合更新" + ) + + updated_PH: str = Field( + ..., + description="更新后的既往史,根据完整对话记录和上一轮既往史进行整合更新" + ) + + chief_complaint: str = Field( + ..., + description="根据完整对话记录提取的患者主诉,简洁描述患者的主要症状及持续时间" + ) \ No newline at end of file