Files
yiliao/backend/services/report_integrator.py

107 lines
5.6 KiB
Python
Raw Permalink Normal View History

from typing import List, Dict, Any
import json
class ReportIntegrator:
"""医疗报告整合分析器"""
def __init__(self, llm_service):
self.llm_service = llm_service
def integrate_reports(self, reports: List[Dict[str, Any]]) -> Dict[str, Any]:
"""整合多份医疗报告"""
if len(reports) == 1:
return self._single_report_summary(reports[0])
# 构建整合分析的提示词
prompt = self._build_integration_prompt(reports)
# 调用LLM进行整合分析
if self.llm_service.llm_type == "openai":
result = self._call_openai_integration(prompt)
elif self.llm_service.llm_type == "ollama":
result = self._call_ollama_integration(prompt)
else:
result = self._mock_integration(reports)
# 添加报告列表
result["reports_included"] = [
{"filename": report["filename"], "summary": report["analysis"].get("summary", "无摘要")}
for report in reports
]
return result
def _build_integration_prompt(self, reports: List[Dict[str, Any]]) -> str:
"""构建整合分析提示词"""
report_details = []
for i, report in enumerate(reports, 1):
analysis = report["analysis"]
report_details.append(f"【报告{i}: {report['filename']}\n摘要: {analysis.get('summary', '')}")
prompt = f"""你是专业医疗分析专家。整合以下{len(reports)}份报告,提供综合评估。
{chr(10).join(report_details)}
请以JSON格式返回
{{"overall_summary": "整体摘要", "health_trends": ["趋势"], "priority_concerns": [{{"concern": "关注点", "severity": "低/中/高", "description": "描述"}}], "comprehensive_assessment": "综合评估", "integrated_recommendations": ["建议"], "follow_up_suggestions": ["后续建议"]}}"""
return prompt
def _call_openai_integration(self, prompt: str) -> Dict[str, Any]:
"""调用OpenAI进行整合分析"""
try:
response = self.llm_service.client.chat.completions.create(
model=self.llm_service.model,
messages=[{"role": "system", "content": "你是医疗分析专家。"}, {"role": "user", "content": prompt}],
temperature=0.7, max_tokens=3000
)
content = response.choices[0].message.content
return self.llm_service._parse_llm_response(content)
except Exception as e:
return self._create_error_result(f"OpenAI分析失败: {str(e)}")
def _call_ollama_integration(self, prompt: str) -> Dict[str, Any]:
"""调用Ollama进行整合分析"""
try:
import requests
response = requests.post(f"{self.llm_service.ollama_host}/api/generate",
json={"model": self.llm_service.model, "prompt": prompt, "stream": False}, timeout=90)
if response.status_code == 200:
return self.llm_service._parse_llm_response(response.json().get("response", ""))
raise Exception(f"Ollama错误: {response.status_code}")
except Exception as e:
return self._create_error_result(f"Ollama分析失败: {str(e)}")
def _mock_integration(self, reports: List[Dict[str, Any]]) -> Dict[str, Any]:
"""模拟整合分析结果"""
total_abnormal = sum(len(report["analysis"].get("abnormal_items", [])) for report in reports)
return {
"overall_summary": f"综合分析了{len(reports)}份报告,发现{total_abnormal}项异常指标。整体健康状况良好。",
"health_trends": ["各项指标整体稳定", "未发现明显恶化趋势", "建议持续监测"],
"priority_concerns": [{"concern": "定期体检", "severity": "", "description": "建议保持定期体检"}] if total_abnormal == 0 else [{"concern": "异常指标", "severity": "", "description": f"发现{total_abnormal}项异常"}],
"comprehensive_assessment": "整体健康状况可控,建议关注生活方式、定期复查。",
"integrated_recommendations": ["保持均衡饮食", "坚持适量运动", "保证充足睡眠", "定期体检"],
"follow_up_suggestions": ["3-6个月后复查关键指标", "如有不适及时就医", "保持健康记录"],
"note": "这是模拟结果。实际使用请配置OpenAI或Ollama。"
}
def _single_report_summary(self, report: Dict[str, Any]) -> Dict[str, Any]:
"""单个报告摘要"""
analysis = report["analysis"]
return {
"overall_summary": f"单份报告分析:{analysis.get('summary', '无摘要')}",
"reports_included": [{"filename": report["filename"], "summary": analysis.get("summary", "")}],
"health_trends": analysis.get("key_findings", []),
"priority_concerns": [{"concern": item, "severity": "", "description": "需关注"} for item in analysis.get("abnormal_items", [])[:3]],
"comprehensive_assessment": analysis.get("risk_assessment", "请查看详细分析"),
"integrated_recommendations": analysis.get("recommendations", []),
"follow_up_suggestions": ["定期复查", "咨询医生"]
}
def _create_error_result(self, error_msg: str) -> Dict[str, Any]:
"""创建错误结果"""
return {
"error": error_msg, "overall_summary": "分析失败", "health_trends": [],
"priority_concerns": [], "comprehensive_assessment": "无法完成分析",
"integrated_recommendations": [], "follow_up_suggestions": []
}