graph_router.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import logging
  2. import sys,os
  3. import traceback
  4. from agent.cdss.capbility import CDSSCapability
  5. from agent.cdss.models.schemas import CDSSInput, CDSSInt, CDSSText
  6. from model.response import StandardResponse
  7. from service.cdss_service import CdssService
  8. from service.kg_node_service import KGNodeService
  9. from utils import DeepseekUtil
  10. current_path = os.getcwd()
  11. sys.path.append(current_path)
  12. import time
  13. from fastapi import APIRouter, Depends, Query
  14. from typing import Optional, List
  15. import sys
  16. sys.path.append('..')
  17. from utils.agent import call_chat_api,get_conversation_id
  18. import json
  19. router = APIRouter(tags=["Knowledge Graph"])
  20. service = CdssService()
  21. logger = logging.getLogger(__name__)
  22. @router.get("/knowledge/disease/recommend", response_model=StandardResponse)
  23. async def recommend(
  24. chief: str,
  25. present_illness: Optional[str] = None,
  26. sex: Optional[str] = None,
  27. age: Optional[int] = None,
  28. department: Optional[str] = None,
  29. ):
  30. start_time = time.time()
  31. app_id = "256fd853-60b0-4357-b11b-8114b4e90ae0"
  32. desc = "主诉:"+chief
  33. if present_illness:
  34. desc+="\n现病史:" + present_illness
  35. prompt = '''## 核心能力
  36. 1. 医学语义理解:
  37. - 精准解析临床表现描述
  38. - 将口语化表达转换为ICD-11标准术语
  39. - 完整提取症状特征(性质/部位/放射等),保持症状描述的临床完整性
  40. 2. 专业能力:
  41. - 精通ICD-11症状学术语体系
  42. - 识别症状关联性
  43. - 具备临床鉴别诊断思维
  44. ## 输出要求
  45. - 仅输出JSON格式结果,禁止添加解释性文字
  46. - 非症状不要抽取
  47. - 症状术语必须标准化
  48. - 尽量保留原始症状的临床特征(如部位、性质、放射等)
  49. - 抽取的症状应该简洁明了,尽量保持在5个字符以内,最多不宜超过7个字符。如果超过可以分多个症状词进行抽取。
  50. ## 处理流程
  51. 1. 接收患者主诉文本
  52. 2. 识别并提取所有症状描述
  53. 3. 转换为ICD-11标准术语
  54. 4. 结构化输出症状列表
  55. 示例1:
  56. 输入:突然感觉胸口压榨样疼痛,持续不缓解,向左肩和下颌放射,伴大汗、恶心,已经30分钟了。
  57. 输出: { "symptoms": ["胸痛", "左肩放射痛", "下颌放射痛","大汗","恶心"] }
  58. 本次用户输入:
  59. '''
  60. answer = DeepseekUtil.chat(prompt + desc)
  61. json_data = json.loads(answer.strip("\n```json"))
  62. keyword = " ".join(json_data["symptoms"])
  63. result = await neighbor_search(keyword=keyword,sex=sex,age=age,department=department)
  64. end_time = time.time()
  65. print(f"recommend执行完成,耗时:{end_time - start_time:.2f}秒")
  66. return result
  67. @router.get("/neighbor_search", response_model=StandardResponse)
  68. async def neighbor_search(
  69. keyword: str = Query(..., min_length=2),
  70. sex: Optional[str] = None,
  71. age: Optional[int] = None,
  72. department: Optional[str] = None
  73. ):
  74. """
  75. 根据关键词和属性过滤条件搜索图谱节点
  76. """
  77. try:
  78. keywords = keyword.split(" ")
  79. record = CDSSInput(
  80. pat_age=CDSSInt(type="month", value=age),
  81. pat_sex=CDSSText(type="sex", value=sex),
  82. chief_complaint=keywords,
  83. department=CDSSText(type='department', value=department)
  84. )
  85. # 使用从main.py导入的capability实例处理CDSS逻辑
  86. output = capability.process(input=record)
  87. output.diagnosis.value = [{"name":key,"count":value["count"],"score":value["score"],"symptoms":value["symptoms"]
  88. } for key,value in output.diagnosis.value.items()]
  89. result = {}
  90. if len(output.diagnosis.value)>0:
  91. result = service.get_disease_detail(output.diagnosis.value[0]['name'], '疾病')
  92. return StandardResponse(
  93. success=True,
  94. data={"可能诊断":output.diagnosis.value,"症状":keywords,"disease_detail":result}
  95. )
  96. except Exception as e:
  97. traceback.print_exc()
  98. logger.error(f"get_disease_detail failed: {str(e)}")
  99. return StandardResponse(
  100. success=False,
  101. errorCode=500,
  102. errorMsg=str(e)
  103. )
  104. @router.get("/knowledge/disease/{disease_name}/detail", response_model=StandardResponse)
  105. async def get_disease_detail(
  106. disease_name: str
  107. ):
  108. try:
  109. result = service.get_disease_detail(disease_name,'疾病')
  110. return StandardResponse(success=True, data=result)
  111. except Exception as e:
  112. traceback.print_exc()
  113. logger.error(f"get_disease_detail failed: {str(e)}")
  114. return StandardResponse(
  115. success=False,
  116. errorCode=500,
  117. errorMsg=str(e)
  118. )
  119. capability = CDSSCapability()
  120. graph_router = router