浏览代码

代码提交

SGTY 2 天之前
父节点
当前提交
a8e7e31acc
共有 3 个文件被更改,包括 312 次插入63 次删除
  1. 127 59
      src/knowledge/main.py
  2. 6 4
      src/knowledge/service/search_service.py
  3. 179 0
      src/knowledge/utils/MedicalRecordParser.py

+ 127 - 59
src/knowledge/main.py

@@ -82,8 +82,11 @@ import logging
 
 
 from .service.search_service import SearchBusiness
-logger = logging.getLogger(__name__)
+from .utils.MedicalRecordParser import MedicalRecordParser
+from pydantic import BaseModel
+from typing import Optional
 
+logger = logging.getLogger(__name__)
 
 # 1. 疾病与症状相关接口
 class SymptomDiseasesRequest(BaseModel):
@@ -597,6 +600,69 @@ async def get_relations(
         logger.error(f"获取概念关系失败: {str(e)}")
         raise HTTPException(500, detail=StandardResponse.error(str(e)))
 
+# @app.post("/parse_medical_record",
+#     response_model=StandardResponse,
+#     operation_id="parseMedicalRecord",
+#     summary="病历文本结构化",
+#     description="""将病历文本解析为结构化数据。
+#
+# 该接口主要用于医疗病历处理场景,例如:
+# - 将非结构化的病历文本转换为结构化JSON数据
+# - 提取病历中的关键医疗信息
+# - 辅助临床决策支持系统
+#
+# 典型应用场景:
+# 1. 电子病历系统:将医生书写的病历文本结构化存储
+# 2. 临床研究:从病历中提取标准化数据用于分析
+# 3. 医疗AI:为自然语言处理模型提供结构化输入
+#
+# 输入要求:
+# - 病历文本应为中文医疗记录
+# - 包含完整的病历信息(主诉、现病史等)
+#
+# 输出格式:
+# - 返回标准JSON响应
+# - 包含结构化后的病历数据""",
+#     response_description="""返回标准响应格式,包含结构化后的病历数据。
+#
+# 成功响应示例:
+# {
+#     "success": true,
+#     "data": {
+#         "病历基本信息": {
+#             "就诊日期": "2023-05-10",
+#             "就诊科室": "心血管内科",
+#             "门诊类型": "初诊"
+#         },
+#         "患者信息": {
+#             "性别": "男",
+#             "年龄": "45岁"
+#         }
+#     }
+# }
+#
+# 错误响应示例:
+# {
+#     "success": false,
+#     "error": "Invalid medical record text"
+# }"""
+# )
+# async def parse_medical_record(
+#     record_text: str = Query(...,
+#                   description="""病历文本内容。
+#
+# 该参数应为完整的病历文本,包含主诉、现病史等关键部分。
+# 示例值:"患者男性,45岁,主诉胸闷3天...""",
+#                   examples=["患者男性,45岁,主诉胸闷3天,加重1天..."]
+# )):
+#     try:
+#         parser = MedicalRecordParser()
+#         result = parser.parse_medical_record(record_text)
+#         return StandardResponse(success=True, data=result)
+#     except Exception as e:
+#         logger.error(f"病历解析失败: {str(e)}")
+#         raise HTTPException(500, detail=StandardResponse.error(str(e)))
+
 
 @app.post("/get_similar_concepts", 
           response_model=StandardResponse,
@@ -809,66 +875,68 @@ async def suggest_appropriate_department(
 #     validate_type: str
 #
 #
-@app.post("/medical/validate_record", response_model=StandardResponse, operation_id="validateMedicalRecord",
-          summary="验证病历内容的逻辑一致性",
-          description="""根据输入的病历内容,验证其逻辑一致性并返回验证结果。
-
-该接口主要用于医疗病历质控场景,例如:
-- 验证诊断与症状的相关性
-- 检查病历中的逻辑矛盾
-- 确保病历符合医疗规范
-
-典型应用场景:
-1. 病历自动质控:输入病历内容获取验证结果
-2. 临床决策支持:验证诊断与症状的匹配度
-3. 病历完整性检查:确保病历包含必要信息
 
-输入要求:
-- 病历内容应为标准医疗文本
-
-输出格式:
-- 返回标准JSON响应
-- 包含验证结果和错误列表""",
-          response_description="""返回标准响应格式,包含验证结果。
-
-成功响应示例:
-{
-    "success": true,
-    "data": {
-        "errors": [
-            "初步诊断'胆总管结石伴胆管炎'与主诉症状不相关",
-            "初步诊断'胆囊结石并胆囊炎'与主诉症状不相关"
-        ]
-    }
-}
 
-错误响应示例:
-{
-    "success": false,
-    "error": "Invalid medical content"
-}""")
-async def validate_medical_record(
-        medical_content: str = Query(...,
-                                    description="""病历内容文本,应为标准医疗术语。
-
-该参数用于验证病历的逻辑一致性。
-必须使用标准医学术语。
-示例值:"患者主诉头痛3天,初步诊断:高血压病""",
-                                    min_length=10)
-):
-    try:
-        # 调用search_service中的验证方法
-        search = SearchBusiness()
-        results = search.validate_medical_record(medical_content)
-        #只返回errors字段
-        results = results["errors"]
-        return StandardResponse(success=True, data=results)
-    except ValueError as e:
-        logger.warning(f"无效的病历内容: {medical_content}")
-        raise HTTPException(400, detail=StandardResponse.error(str(e)))
-    except Exception as e:
-        logger.error(f"病历验证失败: {str(e)}")
-        raise HTTPException(500, detail=StandardResponse.error(str(e)))
+# @app.post("/medical/validate_record", response_model=StandardResponse, operation_id="validateMedicalRecord",
+#           summary="验证病历内容的逻辑一致性",
+#           description="""根据输入的病历内容,验证其逻辑一致性并返回验证结果。
+#
+# 该接口主要用于医疗病历质控场景,例如:
+# - 验证诊断与症状的相关性
+# - 检查病历中的逻辑矛盾
+# - 确保病历符合医疗规范
+#
+# 典型应用场景:
+# 1. 病历自动质控:输入病历内容获取验证结果
+# 2. 临床决策支持:验证诊断与症状的匹配度
+# 3. 病历完整性检查:确保病历包含必要信息
+#
+# 输入要求:
+# - 病历内容应为标准医疗文本
+#
+# 输出格式:
+# - 返回标准JSON响应
+# - 包含验证结果和错误列表""",
+#           response_description="""返回标准响应格式,包含验证结果。
+#
+# 成功响应示例:
+# {
+#     "success": true,
+#     "data": {
+#         "errors": [
+#             "初步诊断'胆总管结石伴胆管炎'与主诉症状不相关",
+#             "初步诊断'胆囊结石并胆囊炎'与主诉症状不相关"
+#         ]
+#     }
+# }
+#
+# 错误响应示例:
+# {
+#     "success": false,
+#     "error": "Invalid medical content"
+# }""")
+# async def validate_medical_record(
+#         medical_content: str = Query(...,
+#                                     description="""病历内容文本,应为标准医疗术语。
+#
+# 该参数用于验证病历的逻辑一致性。
+# 必须使用标准医学术语。
+# 示例值:"患者主诉头痛3天,初步诊断:高血压病""",
+#                                     min_length=10)
+# ):
+#     try:
+#         # 调用search_service中的验证方法
+#         search = SearchBusiness()
+#         results = search.validate_medical_record(medical_content)
+#         #只返回errors字段
+#         results = results["errors"]
+#         return StandardResponse(success=True, data=results)
+#     except ValueError as e:
+#         logger.warning(f"无效的病历内容: {medical_content}")
+#         raise HTTPException(400, detail=StandardResponse.error(str(e)))
+#     except Exception as e:
+#         logger.error(f"病历验证失败: {str(e)}")
+#         raise HTTPException(500, detail=StandardResponse.error(str(e)))
 
 
 mcp = FastApiMCP(app)

+ 6 - 4
src/knowledge/service/search_service.py

@@ -454,13 +454,15 @@ class SearchBusiness:
 
         if diagnosis_info and diagnosis_info.get("初步诊断"):
             chief_complaint = structured_data.get("主诉", {})
-            if chief_complaint and chief_complaint.get("主要症状"):
-                related_diseases = self.get_symptom_diseases(chief_complaint["主要症状"])
+            if chief_complaint and chief_complaint.get("主要症状"):   
+                chief_complaint_symptoms = chief_complaint["主要症状"]
+ 
+                related_diseases = self.get_symptom_diseases(chief_complaint_symptoms)
                 related_disease_names = [d["disease_name"] for d in related_diseases]
-
+                chief_complaint_symptoms_str = ",".join(chief_complaint_symptoms)
                 for diagnosis in diagnosis_info["初步诊断"]:
                     if diagnosis not in related_disease_names:
-                        errors.append(f"初步诊断'{diagnosis}'与'主诉主要症状'{related_diseases}不相关")
+                        errors.append(f"初步诊断'{diagnosis}'与主诉主要症状'{chief_complaint_symptoms_str}'不相关")
 
         return errors
 

文件差异内容过多而无法显示
+ 179 - 0
src/knowledge/utils/MedicalRecordParser.py