优化:简化Controller结构并确保所有指导仅针对预问诊询问
主要变更: 1. 简化Controller的TaskInfo结构,移除优先级字段,直接使用字符串存储任务名称 2. 修正Controller和Prompter的所有描述和指令,确保仅包含医生可通过询问获取的信息 3. 修复Controller中附加信息未正确整合到指导内容的bug 4. 更新Disease Analyst和Triager模块,移除检查、化验等非询问类内容引用 5. 优化科室判定任务的特殊处理逻辑,专注于询问指导而非检查建议 本次优化确保整个智能体系统专注于预问诊询问指导,严格区分询问内容与检查内容。 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
a9144062bf
commit
239cd0f730
@ -1,7 +1,7 @@
|
|||||||
from typing import Dict, Any, List
|
from typing import Dict, Any, List
|
||||||
from agent_system.base import BaseAgent
|
from agent_system.base import BaseAgent
|
||||||
from agent_system.controller.prompt import ControllerPrompt
|
from agent_system.controller.prompt import ControllerPrompt
|
||||||
from agent_system.controller.response_model import ControllerDecision, TaskInfo
|
from agent_system.controller.response_model import ControllerDecision
|
||||||
|
|
||||||
|
|
||||||
class TaskController(BaseAgent):
|
class TaskController(BaseAgent):
|
||||||
@ -9,13 +9,13 @@ class TaskController(BaseAgent):
|
|||||||
任务控制器智能体
|
任务控制器智能体
|
||||||
|
|
||||||
负责根据患者的临床信息(现病史、既往史、主诉)从未完成的任务列表中
|
负责根据患者的临床信息(现病史、既往史、主诉)从未完成的任务列表中
|
||||||
选择最合适的下一步任务,并提供具体的执行指导建议。
|
选择最合适的下一步任务,并提供预问诊询问指导建议。
|
||||||
|
|
||||||
核心功能:
|
核心功能:
|
||||||
1. 分析患者的临床信息和病情特征
|
1. 分析患者的临床信息和病情特征
|
||||||
2. 评估待执行任务的优先级和重要性
|
2. 选择最重要的询问任务
|
||||||
3. 选择最适合当前情况的任务
|
3. 提供针对性的预问诊询问指导
|
||||||
4. 提供针对性的任务执行指导
|
4. 确保指导内容仅限于医生可询问的信息
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
model_type (str): 使用的大语言模型类型,默认为 gpt-oss:latest
|
model_type (str): 使用的大语言模型类型,默认为 gpt-oss:latest
|
||||||
@ -32,7 +32,7 @@ class TaskController(BaseAgent):
|
|||||||
"""
|
"""
|
||||||
super().__init__(
|
super().__init__(
|
||||||
model_type=model_type,
|
model_type=model_type,
|
||||||
description="医疗任务控制器,负责任务选择和执行指导",
|
description="医疗任务控制器,负责任务选择和预问诊询问指导",
|
||||||
instructions=ControllerPrompt.instructions,
|
instructions=ControllerPrompt.instructions,
|
||||||
response_model=ControllerDecision,
|
response_model=ControllerDecision,
|
||||||
llm_config=llm_config or {},
|
llm_config=llm_config or {},
|
||||||
@ -45,7 +45,8 @@ class TaskController(BaseAgent):
|
|||||||
pending_tasks: List[Dict[str, str]],
|
pending_tasks: List[Dict[str, str]],
|
||||||
chief_complaint: str,
|
chief_complaint: str,
|
||||||
hpi_content: str = "",
|
hpi_content: str = "",
|
||||||
ph_content: str = "") -> ControllerDecision:
|
ph_content: str = "",
|
||||||
|
additional_info: str = "") -> ControllerDecision:
|
||||||
"""
|
"""
|
||||||
执行任务控制决策
|
执行任务控制决策
|
||||||
|
|
||||||
@ -53,15 +54,16 @@ class TaskController(BaseAgent):
|
|||||||
并提供具体的执行指导建议。
|
并提供具体的执行指导建议。
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
pending_tasks (List[Dict[str, str]]): 待执行的任务列表,每个任务包含name、priority、description字段
|
pending_tasks (List[Dict[str, str]]): 待执行的任务列表,每个任务包含name、description字段
|
||||||
chief_complaint (str): 患者主诉
|
chief_complaint (str): 患者主诉
|
||||||
hpi_content (str, optional): 现病史内容,默认为空字符串
|
hpi_content (str, optional): 现病史内容,默认为空字符串
|
||||||
ph_content (str, optional): 既往史内容,默认为空字符串
|
ph_content (str, optional): 既往史内容,默认为空字符串
|
||||||
|
additional_info (str, optional): 附加信息,可能包含补充的临床信息,默认为空字符串
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
ControllerDecision: 包含任务选择决策和指导建议的结构化数据,包括:
|
ControllerDecision: 包含任务选择决策和预问诊询问指导的结构化数据,包括:
|
||||||
- selected_task: 选择的任务信息
|
- selected_task: 选择的任务名称
|
||||||
- specific_guidance: 针对选定任务的具体指导建议
|
- specific_guidance: 针对选定任务的预问诊询问指导建议
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
Exception: 当LLM调用失败时,返回包含默认信息的ControllerDecision
|
Exception: 当LLM调用失败时,返回包含默认信息的ControllerDecision
|
||||||
@ -69,7 +71,7 @@ class TaskController(BaseAgent):
|
|||||||
try:
|
try:
|
||||||
# 构建决策提示词
|
# 构建决策提示词
|
||||||
prompt = self._build_decision_prompt(
|
prompt = self._build_decision_prompt(
|
||||||
pending_tasks, chief_complaint, hpi_content, ph_content
|
pending_tasks, chief_complaint, hpi_content, ph_content, additional_info
|
||||||
)
|
)
|
||||||
|
|
||||||
# 调用基类的run方法执行LLM推理
|
# 调用基类的run方法执行LLM推理
|
||||||
@ -114,28 +116,21 @@ class TaskController(BaseAgent):
|
|||||||
# 如果有待执行任务,选择第一个作为默认任务
|
# 如果有待执行任务,选择第一个作为默认任务
|
||||||
if pending_tasks:
|
if pending_tasks:
|
||||||
default_task = pending_tasks[0]
|
default_task = pending_tasks[0]
|
||||||
selected_task_info = TaskInfo(
|
selected_task_name = default_task.get("name", "未知任务")
|
||||||
task_name=default_task.get("name", "未知任务"),
|
|
||||||
priority=default_task.get("priority", "中"),
|
|
||||||
description=default_task.get("description", "任务描述不可用")
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
selected_task_info = TaskInfo(
|
selected_task_name = "基本信息收集"
|
||||||
task_name="基本信息收集",
|
|
||||||
priority="中",
|
|
||||||
description="收集患者的基本临床信息"
|
|
||||||
)
|
|
||||||
|
|
||||||
return ControllerDecision(
|
return ControllerDecision(
|
||||||
selected_task=selected_task_info,
|
selected_task=selected_task_name,
|
||||||
specific_guidance="由于系统异常,建议按照标准临床流程进行患者评估,重点关注患者的主要症状和病史信息,并人工审核患者情况。"
|
specific_guidance="由于系统异常,请按照标准临床询问流程进行患者评估,重点询问患者的主要症状、起病过程和伴随症状等基本病史信息。"
|
||||||
)
|
)
|
||||||
|
|
||||||
def _build_decision_prompt(self,
|
def _build_decision_prompt(self,
|
||||||
pending_tasks: List[Dict[str, str]],
|
pending_tasks: List[Dict[str, str]],
|
||||||
chief_complaint: str,
|
chief_complaint: str,
|
||||||
hpi_content: str,
|
hpi_content: str,
|
||||||
ph_content: str) -> str:
|
ph_content: str,
|
||||||
|
additional_info: str = "") -> str:
|
||||||
"""
|
"""
|
||||||
构建任务控制决策的提示词模板
|
构建任务控制决策的提示词模板
|
||||||
|
|
||||||
@ -147,6 +142,7 @@ class TaskController(BaseAgent):
|
|||||||
chief_complaint (str): 患者主诉
|
chief_complaint (str): 患者主诉
|
||||||
hpi_content (str): 现病史内容
|
hpi_content (str): 现病史内容
|
||||||
ph_content (str): 既往史内容
|
ph_content (str): 既往史内容
|
||||||
|
additional_info (str, optional): 附加信息,默认为空字符串
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
str: 精简的决策提示词
|
str: 精简的决策提示词
|
||||||
@ -155,9 +151,8 @@ class TaskController(BaseAgent):
|
|||||||
tasks_display = ""
|
tasks_display = ""
|
||||||
for i, task in enumerate(pending_tasks, 1):
|
for i, task in enumerate(pending_tasks, 1):
|
||||||
task_name = task.get("name", "未知任务")
|
task_name = task.get("name", "未知任务")
|
||||||
task_priority = task.get("priority", "未设定")
|
|
||||||
task_desc = task.get("description", "无描述")
|
task_desc = task.get("description", "无描述")
|
||||||
tasks_display += f"{i}. 任务名称: {task_name}\n 优先级: {task_priority}\n 描述: {task_desc}\n\n"
|
tasks_display += f"{i}. 任务名称: {task_name}\n 描述: {task_desc}\n\n"
|
||||||
|
|
||||||
if not tasks_display.strip():
|
if not tasks_display.strip():
|
||||||
tasks_display = "当前没有待执行的任务。"
|
tasks_display = "当前没有待执行的任务。"
|
||||||
@ -166,19 +161,29 @@ class TaskController(BaseAgent):
|
|||||||
hpi_display = hpi_content.strip() if hpi_content.strip() else "暂无现病史信息"
|
hpi_display = hpi_content.strip() if hpi_content.strip() else "暂无现病史信息"
|
||||||
ph_display = ph_content.strip() if ph_content.strip() else "暂无既往史信息"
|
ph_display = ph_content.strip() if ph_content.strip() else "暂无既往史信息"
|
||||||
|
|
||||||
|
# 处理附加信息
|
||||||
|
additional_info_section = ""
|
||||||
|
if additional_info.strip():
|
||||||
|
additional_info_section = f"\n附加信息: {additional_info.strip()}"
|
||||||
|
|
||||||
|
# 检查是否包含科室判定任务,并生成特殊指导
|
||||||
|
department_guidance = self._generate_department_guidance(pending_tasks, additional_info)
|
||||||
|
|
||||||
# 从prompt类获取示例输出格式
|
# 从prompt类获取示例输出格式
|
||||||
example_output = ControllerPrompt.get_example_output()
|
example_output = ControllerPrompt.get_example_output()
|
||||||
|
|
||||||
prompt = f"""患者临床信息:
|
prompt = f"""患者临床信息:
|
||||||
主诉: {chief_complaint}
|
主诉: {chief_complaint}
|
||||||
现病史: {hpi_display}
|
现病史: {hpi_display}
|
||||||
既往史: {ph_display}
|
既往史: {ph_display}{additional_info_section}
|
||||||
|
|
||||||
待执行任务列表:
|
待执行任务列表:
|
||||||
{tasks_display}
|
{tasks_display}
|
||||||
|
|
||||||
请根据患者的临床信息分析病情特征,从上述任务列表中选择最合适的下一步任务,并提供具体的执行指导建议。
|
请根据患者的临床信息分析病情特征,从上述任务列表中选择最合适的下一步任务,并提供具体的执行指导建议。
|
||||||
|
|
||||||
|
{department_guidance}
|
||||||
|
|
||||||
输出格式示例:
|
输出格式示例:
|
||||||
{example_output}
|
{example_output}
|
||||||
|
|
||||||
@ -187,6 +192,60 @@ class TaskController(BaseAgent):
|
|||||||
|
|
||||||
return prompt
|
return prompt
|
||||||
|
|
||||||
|
def _generate_department_guidance(self, pending_tasks: List[Dict[str, str]], additional_info: str) -> str:
|
||||||
|
"""
|
||||||
|
为科室判定任务生成特殊指导
|
||||||
|
|
||||||
|
当任务列表中包含科室判定相关任务时,利用附加信息(医院科室信息和上一轮分诊结果)
|
||||||
|
生成针对科室分诊的特殊指导,重点关注容易混淆的科室和误判风险。
|
||||||
|
|
||||||
|
Args:
|
||||||
|
pending_tasks (List[Dict[str, str]]): 待执行的任务列表
|
||||||
|
additional_info (str): 分诊附加信息,包含医院科室信息和上一轮分诊结果
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: 科室判定的特殊指导内容,如果没有相关任务则返回空字符串
|
||||||
|
"""
|
||||||
|
# 检查是否有科室判定相关的任务
|
||||||
|
department_tasks = []
|
||||||
|
for task in pending_tasks:
|
||||||
|
task_name = task.get("name", "").lower()
|
||||||
|
if any(keyword in task_name for keyword in ["科室", "分诊", "department"]):
|
||||||
|
department_tasks.append(task)
|
||||||
|
|
||||||
|
if not department_tasks or not additional_info.strip():
|
||||||
|
return ""
|
||||||
|
|
||||||
|
# 生成科室判定的特殊指导
|
||||||
|
guidance_parts = ["## 科室判定任务特别指导"]
|
||||||
|
guidance_parts.append(
|
||||||
|
"如果选择科室判定任务,请在询问时重点关注:"
|
||||||
|
)
|
||||||
|
|
||||||
|
for task in department_tasks:
|
||||||
|
task_name = task.get("name", "")
|
||||||
|
if "一级科室" in task_name:
|
||||||
|
guidance_parts.extend([
|
||||||
|
"- 详细询问患者症状特征,结合医院科室设置判断最适合的一级科室",
|
||||||
|
"- 询问症状的具体表现,与其他一级科室易混淆症状进行鉴别",
|
||||||
|
"- 通过询问病史和症状发展过程,排除其他可能的科室选择",
|
||||||
|
"- 重点询问与科室判定相关的关键症状和体征"
|
||||||
|
])
|
||||||
|
elif "二级科室" in task_name:
|
||||||
|
guidance_parts.extend([
|
||||||
|
"- 基于一级科室判定结果,询问更详细的专业相关症状",
|
||||||
|
"- 通过询问了解患者症状的专业特征,区分二级科室内不同专业方向",
|
||||||
|
"- 询问既往相关疾病史和家族史,辅助二级科室判定",
|
||||||
|
"- 重点询问能帮助细分专业科室的特异性症状"
|
||||||
|
])
|
||||||
|
|
||||||
|
# 将附加信息内容整合到指导中
|
||||||
|
if additional_info.strip():
|
||||||
|
guidance_parts.append("\n## 医院具体情况参考:")
|
||||||
|
guidance_parts.extend(additional_info.splitlines())
|
||||||
|
|
||||||
|
return "\n".join(guidance_parts)
|
||||||
|
|
||||||
def select_optimal_task(self,
|
def select_optimal_task(self,
|
||||||
tasks: List[Dict[str, str]],
|
tasks: List[Dict[str, str]],
|
||||||
patient_info: Dict[str, str]) -> ControllerDecision:
|
patient_info: Dict[str, str]) -> ControllerDecision:
|
||||||
@ -197,7 +256,7 @@ class TaskController(BaseAgent):
|
|||||||
|
|
||||||
Args:
|
Args:
|
||||||
tasks (List[Dict[str, str]]): 待执行的任务列表
|
tasks (List[Dict[str, str]]): 待执行的任务列表
|
||||||
patient_info (Dict[str, str]): 患者信息字典,包含chief_complaint、hpi、ph等字段
|
patient_info (Dict[str, str]): 患者信息字典,包含chief_complaint、hpi、ph、additional_info等字段
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
ControllerDecision: 任务选择决策结果
|
ControllerDecision: 任务选择决策结果
|
||||||
@ -205,17 +264,19 @@ class TaskController(BaseAgent):
|
|||||||
chief_complaint = patient_info.get("chief_complaint", "")
|
chief_complaint = patient_info.get("chief_complaint", "")
|
||||||
hpi_content = patient_info.get("hpi", "")
|
hpi_content = patient_info.get("hpi", "")
|
||||||
ph_content = patient_info.get("ph", "")
|
ph_content = patient_info.get("ph", "")
|
||||||
|
additional_info = patient_info.get("additional_info", "")
|
||||||
|
|
||||||
return self.run(
|
return self.run(
|
||||||
pending_tasks=tasks,
|
pending_tasks=tasks,
|
||||||
chief_complaint=chief_complaint,
|
chief_complaint=chief_complaint,
|
||||||
hpi_content=hpi_content,
|
hpi_content=hpi_content,
|
||||||
ph_content=ph_content
|
ph_content=ph_content,
|
||||||
|
additional_info=additional_info
|
||||||
)
|
)
|
||||||
|
|
||||||
def get_task_guidance(self, result: ControllerDecision) -> Dict[str, Any]:
|
def get_task_guidance(self, result: ControllerDecision) -> Dict[str, Any]:
|
||||||
"""
|
"""
|
||||||
获取任务执行指导的结构化信息
|
获取任务指导的结构化信息
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
result (ControllerDecision): 控制器决策结果
|
result (ControllerDecision): 控制器决策结果
|
||||||
@ -224,7 +285,6 @@ class TaskController(BaseAgent):
|
|||||||
Dict[str, Any]: 包含任务指导信息的字典
|
Dict[str, Any]: 包含任务指导信息的字典
|
||||||
"""
|
"""
|
||||||
return {
|
return {
|
||||||
"task_name": result.selected_task.task_name,
|
"task_name": result.selected_task,
|
||||||
"priority": result.selected_task.priority,
|
|
||||||
"guidance": result.specific_guidance
|
"guidance": result.specific_guidance
|
||||||
}
|
}
|
||||||
@ -8,44 +8,41 @@ class ControllerPrompt:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
description = """
|
description = """
|
||||||
你是一个医疗任务控制器智能体,专门负责根据患者的临床信息来选择和指导医疗任务的执行。
|
你是一个医疗任务控制器智能体,专门负责根据患者的临床信息选择最合适的任务并提供预问诊询问指导。
|
||||||
|
|
||||||
你的主要角色是:
|
你的主要角色是:
|
||||||
1. 任务协调者:从待执行的任务列表中选择最合适的下一步任务
|
1. 任务选择者:从待执行的任务列表中选择最合适的下一步任务
|
||||||
2. 临床决策支持:基于患者的现病史、既往史和主诉提供专业的医疗指导
|
2. 询问指导提供者:基于患者的现病史、既往史和主诉提供医生询问指导
|
||||||
3. 工作流优化器:确保医疗流程的合理性和效率
|
3. 预问诊优化器:确保医生询问内容的针对性和全面性
|
||||||
|
|
||||||
你的核心目标是:
|
你的核心目标是:
|
||||||
- 基于患者临床信息的复杂性和紧急程度,智能选择最优先的任务
|
- 基于患者临床信息选择最重要的询问任务
|
||||||
- 提供针对性的、具体的、可操作的指导建议
|
- 提供针对性的、具体的、可操作的询问指导建议
|
||||||
- 确保医疗工作流程的连贯性和有效性
|
- 确保指导内容仅限于医生可以通过询问获取的信息
|
||||||
"""
|
"""
|
||||||
|
|
||||||
instructions = """
|
instructions = """
|
||||||
请按照以下步骤完成任务选择和指导:
|
请按照以下步骤完成任务选择和询问指导:
|
||||||
|
|
||||||
## 任务选择步骤
|
## 任务选择步骤
|
||||||
1. 分析患者的主诉、现病史和既往史,识别关键临床特征
|
1. 分析患者的主诉、现病史和既往史,识别关键临床特征
|
||||||
2. 评估待执行任务列表,根据临床信息确定任务优先级
|
2. 评估待执行任务列表,根据临床信息选择最重要的任务
|
||||||
3. 选择最符合当前临床需求的任务
|
3. 选择最符合当前临床需求的询问任务
|
||||||
4. 提供针对患者具体情况的任务执行指导建议
|
4. 提供针对患者具体情况的询问指导建议
|
||||||
|
|
||||||
## 输出格式要求
|
## 输出格式要求
|
||||||
请严格按照以下JSON格式输出:
|
请严格按照以下JSON格式输出:
|
||||||
|
|
||||||
{
|
{
|
||||||
"selected_task": {
|
"selected_task": "选择的任务名称",
|
||||||
"task_name": "选择的任务名称",
|
"specific_guidance": "针对该任务的预问诊询问指导,仅包含医生可以通过询问获取的信息,不包含检查、化验、设备检查等内容"
|
||||||
"priority": "任务优先级(紧急/高/中/低)",
|
|
||||||
"description": "任务描述"
|
|
||||||
},
|
|
||||||
"specific_guidance": "基于患者的现病史、既往史和主诉,针对选定任务提供详细的执行指导建议,包括重点关注的方面、询问的问题、检查的要点等"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
## 注意事项
|
## 注意事项
|
||||||
- 基于循证医学原则进行分析
|
- 基于临床医学原则进行分析
|
||||||
- 优先考虑患者安全和诊疗效果
|
- 优先考虑患者安全和诊疗效果
|
||||||
- 提供具体可操作的指导建议
|
- 提供具体可操作的询问指导建议
|
||||||
|
- 绝对不包含任何需要设备、检查、化验等非询问类内容
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -57,12 +54,8 @@ class ControllerPrompt:
|
|||||||
str: JSON格式的示例输出
|
str: JSON格式的示例输出
|
||||||
"""
|
"""
|
||||||
example_output = {
|
example_output = {
|
||||||
"selected_task": {
|
"selected_task": "详细现病史收集",
|
||||||
"task_name": "详细现病史收集",
|
"specific_guidance": "基于患者胸痛3天伴气短的主诉和高血压既往史,询问重点应包括:1)胸痛的确切位置、性质(是否为压榨性疼痛、刺痛或撕裂样疼痛)和是否放射到背部、手臂等部位;2)疼痛的严重程度如何(让患者用0-10分评分)和每次发作持续多久;3)疼痛的诱发因素(是否在活动后出现或休息时也有疼痛)和什么情况下可以缓解;4)除了胸痛外是否还有其他不适如心慌、出汗、恶心、头晕等;5)这种症状发作的频率和规律是怎样的;6)以前是否有过类似的症状。特别要关注患者高血压病史,询问是否正在服用降压药、血压控制情况以及是否有其他心血管疾病家族史。"
|
||||||
"priority": "高",
|
|
||||||
"description": "深入收集患者现病史的详细信息,包括症状特征、发展过程、伴随症状等"
|
|
||||||
},
|
|
||||||
"specific_guidance": "基于患者胸痛3天伴气短的主诉和高血压既往史,在收集现病史时应重点询问:1)胸痛的确切位置、性质(压榨性、刺痛、撕裂样等)和放射部位;2)疼痛的严重程度(0-10分评分)和持续时间;3)诱发因素(活动、休息、情绪变化等)和缓解因素;4)伴随症状如气短、出汗、恶心、头晕等;5)发作规律和频率变化;6)既往类似发作史。特别关注与患者高血压病史相关的心血管风险因素,需要快速排除急性冠脉综合征、主动脉夹层等急危重症。"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return json.dumps(example_output, ensure_ascii=False, indent=2)
|
return json.dumps(example_output, ensure_ascii=False, indent=2)
|
||||||
@ -2,38 +2,20 @@ from pydantic import Field
|
|||||||
from agent_system.base import BaseResponseModel
|
from agent_system.base import BaseResponseModel
|
||||||
|
|
||||||
|
|
||||||
class TaskInfo(BaseResponseModel):
|
|
||||||
"""
|
|
||||||
任务信息模型
|
|
||||||
"""
|
|
||||||
task_name: str = Field(
|
|
||||||
...,
|
|
||||||
description="任务名称"
|
|
||||||
)
|
|
||||||
priority: str = Field(
|
|
||||||
...,
|
|
||||||
description="任务优先级(紧急、高、中、低)"
|
|
||||||
)
|
|
||||||
description: str = Field(
|
|
||||||
...,
|
|
||||||
description="任务描述"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class ControllerDecision(BaseResponseModel):
|
class ControllerDecision(BaseResponseModel):
|
||||||
"""
|
"""
|
||||||
Controller智能体决策结果模型
|
Controller智能体决策结果模型
|
||||||
|
|
||||||
基于未完成的任务列表、现病史、既往史与主诉,
|
基于未完成的任务列表、现病史、既往史与主诉,
|
||||||
输出选择的任务以及具体的指导建议。
|
输出选择的任务以及具体的预问诊询问指导建议。
|
||||||
"""
|
"""
|
||||||
|
|
||||||
selected_task: TaskInfo = Field(
|
selected_task: str = Field(
|
||||||
...,
|
...,
|
||||||
description="选择执行的任务信息"
|
description="选择执行的任务名称"
|
||||||
)
|
)
|
||||||
|
|
||||||
specific_guidance: str = Field(
|
specific_guidance: str = Field(
|
||||||
...,
|
...,
|
||||||
description="基于现病史、既往史与主诉,针对选定任务的具体指导建议"
|
description="针对选定任务的预问诊询问指导建议,仅包含医生可以通过询问获取的信息,不包含任何需要设备检查、化验、检验等内容"
|
||||||
)
|
)
|
||||||
@ -110,7 +110,7 @@ class DiseaseContextAnalyst(BaseAgent):
|
|||||||
onset_pattern="未明确",
|
onset_pattern="未明确",
|
||||||
severity_level="未评估",
|
severity_level="未评估",
|
||||||
evaluation_priorities={
|
evaluation_priorities={
|
||||||
"诊疗经过": ["既往就诊经历", "诊断检查结果", "治疗方案及效果"],
|
"诊疗经过": ["既往就诊经历", "既往诊断情况", "治疗方案及效果"],
|
||||||
"主要症状特征": ["症状的具体表现", "症状的严重程度", "症状的持续时间"],
|
"主要症状特征": ["症状的具体表现", "症状的严重程度", "症状的持续时间"],
|
||||||
"伴随症状": ["相关系统症状", "全身性症状", "功能性症状"],
|
"伴随症状": ["相关系统症状", "全身性症状", "功能性症状"],
|
||||||
"病情发展与演变": ["症状变化趋势", "诱发或缓解因素", "病程发展规律"]
|
"病情发展与演变": ["症状变化趋势", "诱发或缓解因素", "病程发展规律"]
|
||||||
|
|||||||
@ -26,7 +26,7 @@ class DiseaseAnalystPrompt(BasePrompt):
|
|||||||
"4. **评估重点制定**: 针对推断的疾病类型,为关键子任务确定具体的评估重点和收集方向",
|
"4. **评估重点制定**: 针对推断的疾病类型,为关键子任务确定具体的评估重点和收集方向",
|
||||||
"",
|
"",
|
||||||
"## 重点子任务评估指导",
|
"## 重点子任务评估指导",
|
||||||
"- **诊疗经过**: 根据疾病特点,确定最关键的诊疗信息收集重点(如检查结果、治疗反应等)",
|
"- **诊疗经过**: 根据疾病特点,确定最关键的诊疗信息收集重点(如既往就诊经历、用药情况、治疗反应等)",
|
||||||
"- **主要症状特征**: 针对核心症状,确定需要深入探究的具体特征细节",
|
"- **主要症状特征**: 针对核心症状,确定需要深入探究的具体特征细节",
|
||||||
"- **伴随症状**: 基于疾病的病理生理特点,识别可能的相关症状表现",
|
"- **伴随症状**: 基于疾病的病理生理特点,识别可能的相关症状表现",
|
||||||
"- **病情发展与演变**: 关注疾病的发展规律、诱发因素和缓解因素",
|
"- **病情发展与演变**: 关注疾病的发展规律、诱发因素和缓解因素",
|
||||||
@ -44,7 +44,7 @@ class DiseaseAnalystPrompt(BasePrompt):
|
|||||||
" \"onset_pattern\": \"亚急性\",",
|
" \"onset_pattern\": \"亚急性\",",
|
||||||
" \"severity_level\": \"中度\",",
|
" \"severity_level\": \"中度\",",
|
||||||
" \"evaluation_priorities\": {",
|
" \"evaluation_priorities\": {",
|
||||||
" \"诊疗经过\": [\"头部CT/MRI检查结果\", \"镇痛药物使用及效果\", \"神经内科就诊情况\"],",
|
" \"诊疗经过\": [\"既往头痛相关的就诊经历\", \"镇痛药物使用及效果\", \"神经内科就诊情况和医生建议\"],",
|
||||||
" \"主要症状特征\": [\"头痛的具体部位和性质\", \"头痛的发作频率和持续时间\", \"头痛的严重程度评估\"],",
|
" \"主要症状特征\": [\"头痛的具体部位和性质\", \"头痛的发作频率和持续时间\", \"头痛的严重程度评估\"],",
|
||||||
" \"伴随症状\": [\"是否伴有恶心呕吐\", \"是否有视物模糊或复视\", \"是否存在睡眠障碍\"],",
|
" \"伴随症状\": [\"是否伴有恶心呕吐\", \"是否有视物模糊或复视\", \"是否存在睡眠障碍\"],",
|
||||||
" \"病情发展与演变\": [\"头痛的诱发因素分析\", \"头痛的缓解方式和程度\", \"病情的发展趋势和周期性\"]",
|
" \"病情发展与演变\": [\"头痛的诱发因素分析\", \"头痛的缓解方式和程度\", \"病情的发展趋势和周期性\"]",
|
||||||
|
|||||||
@ -6,17 +6,17 @@ from agent_system.prompter.response_model import PrompterResult
|
|||||||
|
|
||||||
class Prompter(BaseAgent):
|
class Prompter(BaseAgent):
|
||||||
"""
|
"""
|
||||||
智能体提示词生成专家
|
预问诊询问智能体生成专家
|
||||||
|
|
||||||
基于患者的现病史、既往史、主述以及当前具体任务,
|
基于患者的现病史、既往史、主述以及当前具体任务,
|
||||||
生成针对该任务的专门子智能体的description和instructions。
|
生成针对该任务的专门询问子智能体的description和instructions。
|
||||||
该子智能体将负责围绕特定主题向患者进行专业的医疗询问。
|
该子智能体将负责围绕特定主题向患者进行专业的预问诊询问。
|
||||||
|
|
||||||
核心功能:
|
核心功能:
|
||||||
1. 理解当前任务的具体要求和询问重点
|
1. 理解当前任务的具体要求和询问重点
|
||||||
2. 整合患者的病史背景信息
|
2. 整合患者的病史背景信息
|
||||||
3. 为目标子智能体定义清晰的专业角色
|
3. 为目标询问子智能体定义清晰的专业角色
|
||||||
4. 制定具体可操作的询问指令
|
4. 制定仅限于可询问内容的具体指令
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
model_type (str): 使用的大语言模型类型,默认为 gpt-oss:latest
|
model_type (str): 使用的大语言模型类型,默认为 gpt-oss:latest
|
||||||
@ -33,7 +33,7 @@ class Prompter(BaseAgent):
|
|||||||
"""
|
"""
|
||||||
super().__init__(
|
super().__init__(
|
||||||
model_type=model_type,
|
model_type=model_type,
|
||||||
description="基于医疗场景和任务需求生成专门的子智能体提示内容",
|
description="基于患者情况和任务需求生成专门的预问诊询问智能体指导",
|
||||||
instructions=PrompterPrompt.instructions,
|
instructions=PrompterPrompt.instructions,
|
||||||
response_model=PrompterResult,
|
response_model=PrompterResult,
|
||||||
llm_config=llm_config or {},
|
llm_config=llm_config or {},
|
||||||
@ -44,22 +44,22 @@ class Prompter(BaseAgent):
|
|||||||
|
|
||||||
def run(self, hpi_content: str, ph_content: str, chief_complaint: str, current_task: str, specific_guidance: str = "") -> PrompterResult:
|
def run(self, hpi_content: str, ph_content: str, chief_complaint: str, current_task: str, specific_guidance: str = "") -> PrompterResult:
|
||||||
"""
|
"""
|
||||||
执行智能体提示词生成
|
执行预问诊询问智能体生成
|
||||||
|
|
||||||
基于患者的现病史、既往史、主述、当前具体任务以及Controller提供的具体指导建议,
|
基于患者的现病史、既往史、主述、当前具体任务以及Controller提供的询问指导建议,
|
||||||
生成针对该任务的专门子智能体的description和instructions。
|
生成针对该任务的专门询问子智能体的description和instructions。
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
hpi_content (str): 现病史内容,患者的主要症状描述
|
hpi_content (str): 现病史内容,患者的主要症状描述
|
||||||
ph_content (str): 既往史内容,患者的历史疾病信息
|
ph_content (str): 既往史内容,患者的历史疾病信息
|
||||||
chief_complaint (str): 患者主述,患者的主要不适描述
|
chief_complaint (str): 患者主述,患者的主要不适描述
|
||||||
current_task (str): 当前任务,如"起病情况和患病时间"、"主要症状特征"等
|
current_task (str): 当前任务,如"起病情况和患病时间"、"主要症状特征"等
|
||||||
specific_guidance (str): Controller提供的针对当前任务的具体指导建议,用于优化子智能体生成
|
specific_guidance (str): Controller提供的针对当前任务的询问指导建议,用于优化询问子智能体生成
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
PrompterResult: 包含子智能体描述和指令的结构化数据,包括:
|
PrompterResult: 包含询问子智能体描述和指令的结构化数据,包括:
|
||||||
- description: 为特定任务定制的子智能体描述
|
- description: 为特定询问任务定制的子智能体描述
|
||||||
- instructions: 为特定任务定制的子智能体执行指令列表
|
- instructions: 为特定询问任务定制的子智能体执行指令列表
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
Exception: 当LLM调用失败时,返回包含默认信息的PrompterResult
|
Exception: 当LLM调用失败时,返回包含默认信息的PrompterResult
|
||||||
@ -76,7 +76,7 @@ class Prompter(BaseAgent):
|
|||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
# 当生成失败时记录错误并返回默认结果
|
# 当生成失败时记录错误并返回默认结果
|
||||||
print(f"子智能体提示词生成失败: {str(e)}")
|
print(f"预问诊询问子智能体生成失败: {str(e)}")
|
||||||
return self._get_fallback_result(current_task)
|
return self._get_fallback_result(current_task)
|
||||||
|
|
||||||
def _ensure_result_type(self, result: Any) -> PrompterResult:
|
def _ensure_result_type(self, result: Any) -> PrompterResult:
|
||||||
@ -108,16 +108,17 @@ class Prompter(BaseAgent):
|
|||||||
PrompterResult: 包含默认内容的结果
|
PrompterResult: 包含默认内容的结果
|
||||||
"""
|
"""
|
||||||
return PrompterResult(
|
return PrompterResult(
|
||||||
description=f"你是一名专业的医疗询问助手,负责针对'{task_name}'进行详细的信息收集。你需要以专业、耐心的态度与患者交流,获取准确完整的相关信息。",
|
description=f"你是一名专业的预问诊询问医生,负责针对'{task_name}'进行详细的询问信息收集。你需要以专业、耐心的态度与患者交流,通过询问获取准确完整的相关信息。",
|
||||||
instructions=[
|
instructions=[
|
||||||
"## 询问重点",
|
"## 询问重点",
|
||||||
f"1. 围绕'{task_name}'主题进行系统性询问",
|
f"1. 围绕'{task_name}'主题进行系统性询问",
|
||||||
"2. 使用通俗易懂的语言与患者交流",
|
"2. 使用通俗易懂的语言与患者交流",
|
||||||
"3. 确保信息收集的准确性和完整性",
|
"3. 确保询问信息的准确性和完整性",
|
||||||
"",
|
"",
|
||||||
"## 注意事项",
|
"## 注意事项",
|
||||||
"- 保持专业和耐心的态度",
|
"- 保持专业和耐心的态度",
|
||||||
"- 避免使用过于复杂的医学术语",
|
"- 避免使用过于复杂的医学术语",
|
||||||
|
"- 仅通过询问获取信息,不进行任何检查或检验",
|
||||||
"- 引导患者提供具体详细的信息"
|
"- 引导患者提供具体详细的信息"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
@ -159,7 +160,7 @@ Controller指导建议: {specific_guidance}
|
|||||||
|
|
||||||
当前任务: {current_task}{guidance_section}
|
当前任务: {current_task}{guidance_section}
|
||||||
|
|
||||||
请按照以下步骤生成一个专门的子智能体,该智能体将负责围绕"{current_task}"主题向患者进行专业询问:
|
请按照以下步骤生成一个专门的预问诊询问子智能体,该智能体将负责围绕"{current_task}"主题向患者进行专业询问:
|
||||||
|
|
||||||
## 步骤1: 分析任务特点
|
## 步骤1: 分析任务特点
|
||||||
- 深入理解"{current_task}"的核心要求和关键询问点
|
- 深入理解"{current_task}"的核心要求和关键询问点
|
||||||
|
|||||||
@ -11,70 +11,73 @@ class PrompterPrompt(BasePrompt):
|
|||||||
|
|
||||||
# 智能体角色和目标描述
|
# 智能体角色和目标描述
|
||||||
description = (
|
description = (
|
||||||
"你是一名专业的智能体提示词生成专家,擅长基于医疗场景和具体任务需求,"
|
"你是一名专业的医疗询问智能体生成专家,擅长基于患者情况和具体任务需求,"
|
||||||
"为特定的询问任务创建专门的智能体描述和指令。"
|
"为特定的预问诊询问任务创建专门的医生询问指导。"
|
||||||
"你的主要任务是根据患者的现病史、既往史、主述、当前具体任务,"
|
"你的主要任务是根据患者的现病史、既往史、主述、当前具体任务,"
|
||||||
"以及Controller智能体提供的专业指导建议,"
|
"以及Controller智能体提供的询问指导建议,"
|
||||||
"按照系统化的生成流程,生成一个针对该任务的专门子智能体的description和instructions,"
|
"按照系统化的生成流程,生成一个针对该任务的专门子智能体的description和instructions,"
|
||||||
"该子智能体将负责围绕特定主题向患者进行专业的医疗询问。"
|
"该子智能体将负责围绕特定主题向患者进行专业的预问诊询问。"
|
||||||
)
|
)
|
||||||
|
|
||||||
# 执行指令和注意事项
|
# 执行指令和注意事项
|
||||||
instructions = [
|
instructions = [
|
||||||
"## 系统化生成流程",
|
"## 系统化生成流程",
|
||||||
"请按照以下4个步骤进行子智能体的生成,确保生成质量和针对性:",
|
"请按照以下4个步骤进行预问诊询问智能体的生成,确保生成质量和针对性:",
|
||||||
"",
|
"",
|
||||||
"### 步骤1: 分析任务特点",
|
"### 步骤1: 分析询问任务特点",
|
||||||
"- 深入理解当前任务的核心要求和关键询问点",
|
"- 深入理解当前任务的核心询问要求和关键询问点",
|
||||||
"- 结合患者的现病史和主述,识别与该任务相关的重要信息",
|
"- 结合患者的现病史和主述,识别需要通过询问获取的重要信息",
|
||||||
"- 重点考虑Controller指导建议中的专业建议和注意事项",
|
"- 重点考虑Controller指导建议中的询问重点和注意事项",
|
||||||
"",
|
"",
|
||||||
"### 步骤2: 设计智能体角色",
|
"### 步骤2: 设计询问智能体角色",
|
||||||
"- 为子智能体定义专业的医疗角色和身份",
|
"- 为子智能体定义专业的医疗询问角色和身份",
|
||||||
"- 明确该智能体在特定任务方面的专业能力和职责范围",
|
"- 明确该智能体在特定询问任务方面的专业能力和职责范围",
|
||||||
"- 确保角色设计与患者的具体病情背景相匹配",
|
"- 确保角色设计与患者的具体病情背景相匹配",
|
||||||
"",
|
"",
|
||||||
"### 步骤3: 制定询问策略",
|
"### 步骤3: 制定询问策略",
|
||||||
"- 基于任务特点和患者信息,设计系统性的询问流程",
|
"- 基于任务特点和患者信息,设计系统性的询问流程",
|
||||||
"- 将复杂的医疗询问分解为患者易于理解和回答的具体问题",
|
"- 将复杂的医疗询问分解为患者易于理解和回答的具体问题",
|
||||||
"- 确保询问内容全面、有序、针对性强",
|
"- 确保询问内容全面、有序、针对性强,且仅限于可询问的内容",
|
||||||
"",
|
"",
|
||||||
"### 步骤4: 完善执行指令",
|
"### 步骤4: 完善询问指令",
|
||||||
"- 详细说明子智能体应如何执行询问任务",
|
"- 详细说明子智能体应如何执行询问任务",
|
||||||
"- 包含具体的询问技巧、注意事项和质量要求",
|
"- 包含具体的询问技巧、注意事项和质量要求",
|
||||||
"- 确保指令具有可操作性和实用性",
|
"- 确保指令仅包含通过询问获取的信息,不包含检查、化验等内容",
|
||||||
"",
|
"",
|
||||||
"## 子智能体设计原则",
|
"## 预问诊询问智能体设计原则",
|
||||||
"- **专业性**: 基于医学专业知识,确保询问的科学性和准确性",
|
"- **专业性**: 基于医学专业知识,确保询问的科学性和准确性",
|
||||||
"- **针对性**: 紧密围绕当前任务主题,避免偏离核心询问目标",
|
"- **针对性**: 紧密围绕当前询问任务主题,避免偏离核心询问目标",
|
||||||
|
"- **可询问性**: 仅包含医生可以通过询问获取的信息,不包含检查、化验等内容",
|
||||||
"- **个性化**: 结合患者的具体病史背景,提供个性化的询问策略",
|
"- **个性化**: 结合患者的具体病史背景,提供个性化的询问策略",
|
||||||
"- **系统性**: 确保询问内容全面、有条理,不遗漏重要信息",
|
"- **系统性**: 确保询问内容全面、有条理,不遗漏重要可询问信息",
|
||||||
"- **指导整合**: 充分利用Controller提供的专业指导建议,优化询问效果",
|
"- **指导整合**: 充分利用Controller提供的询问指导建议,优化询问效果",
|
||||||
"",
|
"",
|
||||||
"## 输出内容要求",
|
"## 输出内容要求",
|
||||||
"1. **description字段**: 清晰描述子智能体的角色、专业领域和主要职责",
|
"1. **description字段**: 清晰描述子智能体的询问角色、专业领域和主要询问职责",
|
||||||
"2. **instructions字段**: 详细的执行指令列表,包括询问步骤、注意事项和质量要求",
|
"2. **instructions字段**: 详细的询问指令列表,包括询问步骤、注意事项和质量要求",
|
||||||
"3. **医学准确性**: 确保所有医学术语和概念的准确性",
|
"3. **医学准确性**: 确保所有医学术语和概念的准确性",
|
||||||
"4. **可操作性**: 指令必须具体明确,便于子智能体执行",
|
"4. **可询问性**: 指令仅包含医生可以通过询问获取的信息,不包含检查、化验等",
|
||||||
|
"5. **可操作性**: 指令必须具体明确,便于子智能体执行询问任务",
|
||||||
"",
|
"",
|
||||||
"## 示例输出格式(JSON)",
|
"## 示例输出格式(JSON)",
|
||||||
"{",
|
"{",
|
||||||
" \"description\": \"你是一名专业的起病情况询问医师,专门负责详细了解患者疾病的起病过程和时间特征。基于患者的头痛主述和相关病史,你需要系统性地收集起病相关的关键信息,为后续诊断提供重要依据。\",",
|
" \"description\": \"你是一名专业的起病情况询问医师,专门负责详细了解患者病病的起病过程和时间特征。基于患者的头痛主述和相关病史,你需要系统性地通过询问收集起病相关的关键信息。\",",
|
||||||
" \"instructions\": [",
|
" \"instructions\": [",
|
||||||
" \"## 起病时间询问\",",
|
" \"## 起病时间询问\",",
|
||||||
" \"1. 询问患者头痛症状的具体开始时间(年月日或具体时间点)\",",
|
" \"1. 询问患者头痛症状的具体开始时间(年月日或具体时间点)\",",
|
||||||
" \"2. 了解从开始到现在的总病程持续时间\",",
|
" \"2. 询问从开始到现在的总病程持续时间\",",
|
||||||
" \"3. 确认是否为首次出现此类症状\",",
|
" \"3. 询问是否为首次出现此类症状\",",
|
||||||
" \"\",",
|
" \"\",",
|
||||||
" \"## 起病方式询问\",",
|
" \"## 起病方式询问\",",
|
||||||
" \"1. 详细了解症状是突然出现还是逐渐加重\",",
|
" \"1. 询问症状是突然出现还是逐渐加重\",",
|
||||||
" \"2. 询问起病时的具体情况和环境背景\",",
|
" \"2. 询问起病时的具体情况和环境背景\",",
|
||||||
" \"3. 了解是否有明确的诱发因素或触发事件\",",
|
" \"3. 询问是否有明确的诱发因素或触发事件\",",
|
||||||
" \"\",",
|
" \"\",",
|
||||||
" \"## 询问注意事项\",",
|
" \"## 询问注意事项\",",
|
||||||
" \"- 使用通俗易懂的语言,避免过多医学术语\",",
|
" \"- 使用通俗易懂的语言,避免过多医学术语\",",
|
||||||
" \"- 耐心引导患者回忆具体细节\",",
|
" \"- 耐心引导患者回忆具体细节\",",
|
||||||
" \"- 确保信息的准确性和完整性\"",
|
" \"- 仅通过询问获取信息,不进行任何检查或检验\",",
|
||||||
|
" \"- 确保询问信息的准确性和完整性\"",
|
||||||
" ]",
|
" ]",
|
||||||
"}"
|
"}"
|
||||||
]
|
]
|
||||||
|
|||||||
@ -61,7 +61,7 @@ class TriagerPrompt(BasePrompt):
|
|||||||
"",
|
"",
|
||||||
"## 示例输出格式(JSON)",
|
"## 示例输出格式(JSON)",
|
||||||
"{",
|
"{",
|
||||||
" \"triage_reasoning\": \"患者主诉胸闷、胸痛,伴有呼吸困难,症状提示心血管系统疾病。结合既往高血压病史,考虑冠心病可能性较大,建议心血管内科就诊进行进一步检查和治疗。\",",
|
" \"triage_reasoning\": \"患者主诉胸闷、胸痛,伴有呼吸困难,症状提示心血管系统疾病。结合既往高血压病史,考虑冠心病可能性较大,建议心血管内科就诊进行进一步询问和评估。\",",
|
||||||
" \"primary_department\": \"内科\",",
|
" \"primary_department\": \"内科\",",
|
||||||
" \"secondary_department\": \"心血管内科\",",
|
" \"secondary_department\": \"心血管内科\",",
|
||||||
" \"confidence_score\": 0.85",
|
" \"confidence_score\": 0.85",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user