capbility.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. from cdss.models.schemas import CDSSDict, CDSSInput,CDSSInt,CDSSOutput,CDSSText
  2. from cdss.libs.cdss_helper import CDSSHelper
  3. # CDSS能力核心类,负责处理临床决策支持系统的核心逻辑
  4. class CDSSCapability:
  5. # CDSS帮助类实例
  6. cdss_helper: CDSSHelper = None
  7. def __init__(self):
  8. # 初始化CDSS帮助类
  9. self.cdss_helper = CDSSHelper()
  10. # 核心处理方法,接收输入数据并返回决策支持结果
  11. # @param input: CDSS输入数据
  12. # @param embeding_search: 是否使用embedding搜索,默认为True
  13. # @return: CDSS输出结果
  14. def process(self, input: CDSSInput, embeding_search:bool = True) -> CDSSOutput:
  15. start_nodes = []
  16. # 获取主诉信息
  17. chief_complaint = input.get_value("chief_complaint")
  18. # 初始化输出对象
  19. output = CDSSOutput()
  20. # 如果存在主诉信息,则进行处理
  21. if chief_complaint:
  22. for keyword in chief_complaint:
  23. # 使用帮助类进行节点搜索,查找与关键词相关的节点
  24. results = self.cdss_helper.node_search(
  25. keyword, limit=10, node_type="word"
  26. )
  27. for item in results:
  28. if item['score']>1.9:
  29. start_nodes.append(item['id'])
  30. print("cdss start from :", start_nodes)
  31. # 使用帮助类进行CDSS路径遍历,最大跳数为2
  32. result = self.cdss_helper.cdss_travel(input, start_nodes,max_hops=2)
  33. for item in result["details"]:
  34. name, data = item
  35. output.diagnosis.value[name] = data
  36. print(f"{name} {data['score'] *100:.2f} %")
  37. for disease in data["diseases"]:
  38. print(f"\t疾病:{disease[0]} ")
  39. for check in data["checks"]:
  40. print(f"\t检查:{check[0]} ")
  41. for drug in data["drugs"]:
  42. print(f"\t药品:{drug[0]} ")
  43. # 输出最终推荐的检查和药品信息
  44. print("最终推荐的检查和药品如下:")
  45. for item in result["checks"][:5]:
  46. item[1]['score'] = item[1]['count'] / result["total_checks"]
  47. output.checks.value[item[0]] = item[1]
  48. # print(f"\t检查:{item[0]} {item[1]['score'] * 100:.2f} %")
  49. # print(f"\t检查:{item[0]} {item[1]['count'] / result["total_checks"] * 100:.2f} %")
  50. for item in result["drugs"][:5]:
  51. item[1]['score'] = item[1]['count'] / result["total_checks"]
  52. output.drugs.value[item[0]] = item[1]
  53. #print(f"\t药品:{item[0]} {item[1]['count'] / result["total_drugs"] * 100:.2f} %")
  54. return output