主要改进: - 更新默认模型:从deepseek-v3改为gpt-oss:latest统一配置 - 优化prompt模板:添加明确的输出指令提升JSON解析成功率 - 统一模型配置:保持与项目整体配置一致性 - 完善文档注释:更新模型类型说明信息 技术细节: - 调整constructor默认参数适配新模型配置 - 在prompt末尾添加"输出内容为:"引导符 - 保持向后兼容性支持自定义模型配置 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
182 lines
7.2 KiB
Python
182 lines
7.2 KiB
Python
from typing import Dict, Any, List
|
||
from agent_system.base import BaseAgent
|
||
from agent_system.disease_analyst.prompt import DiseaseAnalystPrompt
|
||
from agent_system.disease_analyst.response_model import DiseaseAnalysisResult
|
||
|
||
|
||
class DiseaseContextAnalyst(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=DiseaseAnalystPrompt.instructions,
|
||
response_model=DiseaseAnalysisResult,
|
||
llm_config=llm_config or {},
|
||
structured_outputs=True,
|
||
markdown=False,
|
||
use_cache=False
|
||
)
|
||
|
||
def run(self, hpi_content: str, ph_content: str = "") -> DiseaseAnalysisResult:
|
||
"""
|
||
执行疾病上下文分析
|
||
|
||
基于现病史和既往史内容,分析疾病特点,生成初步判断,
|
||
并为后续的现病史收集、既往史收集等子任务确定评估重点。
|
||
|
||
Args:
|
||
hpi_content (str): 现病史内容,患者的主要症状描述
|
||
ph_content (str, optional): 既往史内容,患者的历史疾病信息,默认为空字符串
|
||
|
||
Returns:
|
||
DiseaseAnalysisResult: 包含疾病分析结果的结构化数据,包括:
|
||
- disease_category: 疾病类别(如神经系统疾病等)
|
||
- suspected_conditions: 可能的诊断列表
|
||
- onset_pattern: 起病模式(急性/亚急性/慢性)
|
||
- severity_level: 疾病严重程度(轻度/中度/重度)
|
||
- evaluation_priorities: 各子任务的评估重点
|
||
- medical_reasoning: 医学分析推理过程
|
||
|
||
Raises:
|
||
Exception: 当LLM调用失败时,返回包含默认信息的DiseaseAnalysisResult
|
||
"""
|
||
try:
|
||
# 构建分析提示词
|
||
prompt = self._build_analysis_prompt(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()
|
||
|
||
def _ensure_result_type(self, result: Any) -> DiseaseAnalysisResult:
|
||
"""
|
||
确保返回结果为正确的类型
|
||
|
||
Args:
|
||
result (Any): LLM返回的原始结果
|
||
|
||
Returns:
|
||
DiseaseAnalysisResult: 转换后的结构化结果
|
||
"""
|
||
if isinstance(result, DiseaseAnalysisResult):
|
||
return result
|
||
elif isinstance(result, dict):
|
||
return DiseaseAnalysisResult(**result)
|
||
else:
|
||
# 如果类型不匹配,返回默认结果
|
||
return self._get_fallback_result()
|
||
|
||
def _get_fallback_result(self) -> DiseaseAnalysisResult:
|
||
"""
|
||
生成分析失败时的默认结果
|
||
|
||
Returns:
|
||
DiseaseAnalysisResult: 包含默认评估重点的结果
|
||
"""
|
||
return DiseaseAnalysisResult(
|
||
disease_category="未知疾病类型",
|
||
suspected_conditions=["需进一步分析"],
|
||
onset_pattern="未明确",
|
||
severity_level="未评估",
|
||
evaluation_priorities={
|
||
"诊疗经过": ["既往就诊经历", "诊断检查结果", "治疗方案及效果"],
|
||
"主要症状特征": ["症状的具体表现", "症状的严重程度", "症状的持续时间"],
|
||
"伴随症状": ["相关系统症状", "全身性症状", "功能性症状"],
|
||
"病情发展与演变": ["症状变化趋势", "诱发或缓解因素", "病程发展规律"]
|
||
},
|
||
medical_reasoning="由于分析过程中出现异常,系统提供了通用的评估重点,建议人工进一步分析患者病情。"
|
||
)
|
||
|
||
def _build_analysis_prompt(self, hpi_content: str, ph_content: str) -> str:
|
||
"""
|
||
构建疾病分析的提示词模板
|
||
|
||
根据现病史和既往史内容,构建简洁高效的分析提示词,
|
||
引导LLM进行专业的医学分析和判断。
|
||
|
||
Args:
|
||
hpi_content (str): 现病史内容
|
||
ph_content (str): 既往史内容
|
||
|
||
Returns:
|
||
str: 精简的分析提示词
|
||
"""
|
||
# 确保既往史内容的合理显示
|
||
past_history_display = ph_content.strip() if ph_content.strip() else "暂无既往史信息"
|
||
|
||
# 从prompt类获取示例输出格式
|
||
from agent_system.disease_analyst.prompt import DiseaseAnalystPrompt
|
||
example_output = DiseaseAnalystPrompt.get_example_output()
|
||
|
||
prompt = f"""患者病史信息:
|
||
现病史: {hpi_content}
|
||
既往史: {past_history_display}
|
||
|
||
请分析疾病系统、起病模式、初步诊断,并为关键子任务确定评估重点。
|
||
|
||
输出格式示例:
|
||
{example_output}
|
||
|
||
请严格按照上述JSON格式输出。
|
||
输出内容为:"""
|
||
|
||
return prompt
|
||
|
||
def analyze_patient_chief_complaint(self, chief_complaint: str) -> DiseaseAnalysisResult:
|
||
"""
|
||
基于患者主述进行初步疾病分析的便捷接口
|
||
|
||
这是一个专门针对患者主述(chief complaint)的分析方法,
|
||
适用于初诊时仅有患者主述信息的情况。
|
||
|
||
Args:
|
||
chief_complaint (str): 患者的主要症状主述
|
||
|
||
Returns:
|
||
DiseaseAnalysisResult: 基于主述的初步分析结果
|
||
"""
|
||
return self.run(hpi_content=chief_complaint, ph_content="")
|
||
|
||
def get_evaluation_priorities_for_task(self, result: DiseaseAnalysisResult, task_name: str) -> List[str]:
|
||
"""
|
||
获取特定子任务的评估重点
|
||
|
||
Args:
|
||
result (DiseaseAnalysisResult): 疾病分析结果
|
||
task_name (str): 子任务名称
|
||
|
||
Returns:
|
||
List[str]: 该任务的评估重点列表,如果任务不存在则返回空列表
|
||
"""
|
||
return result.evaluation_priorities.get(task_name, []) |