新增:添加Recipient智能体模块
- 构建完整的Recipient智能体系统,用于医疗对话信息整合 - 功能特性: * 根据完整对话记录更新现病史信息 * 根据完整对话记录更新既往史信息 * 从完整对话记录中提取患者主诉 * 输出顺序与生成顺序保持一致(现病史→既往史→主诉) - 包含完整的JSON格式示例输出和详细处理指令 - 遵循项目规范:中文注释、基于BaseAgent架构 - 支持同步和异步运行模式 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
89c82d2031
commit
e24b161e54
@ -1 +1,9 @@
|
||||
# AIM智能体系统初始化文件
|
||||
|
||||
from .recipient import RecipientAgent, RecipientPrompt, RecipientResponseModel
|
||||
|
||||
__all__ = [
|
||||
"RecipientAgent",
|
||||
"RecipientPrompt",
|
||||
"RecipientResponseModel"
|
||||
]
|
||||
5
agent_system/recipient/__init__.py
Normal file
5
agent_system/recipient/__init__.py
Normal file
@ -0,0 +1,5 @@
|
||||
from .agent import RecipientAgent
|
||||
from .prompt import RecipientPrompt
|
||||
from .response_model import RecipientResponseModel
|
||||
|
||||
__all__ = ["RecipientAgent", "RecipientPrompt", "RecipientResponseModel"]
|
||||
86
agent_system/recipient/agent.py
Normal file
86
agent_system/recipient/agent.py
Normal file
@ -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
|
||||
101
agent_system/recipient/prompt.py
Normal file
101
agent_system/recipient/prompt.py
Normal file
@ -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格式规范",
|
||||
" * 确保所有必需字段都包含在输出中",
|
||||
" * 避免使用不必要的换行符和格式标记",
|
||||
" * 保持内容的连续性和可读性"
|
||||
]
|
||||
20
agent_system/recipient/response_model.py
Normal file
20
agent_system/recipient/response_model.py
Normal file
@ -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="根据完整对话记录提取的患者主诉,简洁描述患者的主要症状及持续时间"
|
||||
)
|
||||
Loading…
x
Reference in New Issue
Block a user