从零开始:Python+LangChain实现医疗报告自动生成

云信安装大师
90
AI 质量分
4 5 月, 2025
2 分钟阅读
0 阅读

从零开始:Python+LangChain实现医疗报告自动生成

引言

在医疗行业,医生每天需要处理大量的病历记录和报告撰写工作。借助AI技术,我们可以实现医疗报告的自动生成,显著提高工作效率。本文将带你从零开始,使用Python和LangChain框架构建一个简单的医疗报告自动生成系统。

准备工作

环境要求

  • Python 3.8+
  • pip包管理工具
  • OpenAI API密钥(或其他LLM服务API密钥)

安装必要库

代码片段
pip install langchain openai python-dotenv

项目结构

代码片段
medical-report-generator/
├── .env            # 存储API密钥等敏感信息
├── main.py         # 主程序文件
└── requirements.txt # 依赖文件

完整实现步骤

1. 配置环境变量

创建.env文件存储你的OpenAI API密钥:

代码片段
OPENAI_API_KEY=your-api-key-here

2. 基础代码实现

以下是完整的main.py代码:

代码片段
import os
from dotenv import load_dotenv
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.chains import LLMChain

# 加载环境变量
load_dotenv()

# 初始化模型 - 使用gpt-3.5-turbo以降低成本,实际应用中可考虑gpt-4提高质量
llm = ChatOpenAI(
    model_name="gpt-3.5-turbo",
    temperature=0.7,  # 控制创造性,医疗报告需要准确性,不宜过高
    openai_api_key=os.getenv("OPENAI_API_KEY")
)

# 定义报告生成模板 - 结构化提示词对结果质量至关重要
report_template = """
你是一位专业的{specialty}医生。请根据以下患者信息生成一份详细的医疗报告:

患者基本信息:
- 姓名: {name}
- 年龄: {age}
- 性别: {gender}
- 主诉: {complaint}

检查结果:
{exam_results}

请按照以下结构生成报告:
1. **临床诊断**: 
2. **诊断依据**: 
3. **治疗建议**: 
4. **注意事项**: 

使用专业但易懂的语言,避免过于晦涩的医学术语。
"""

prompt = ChatPromptTemplate.from_template(report_template)

# 创建处理链
report_chain = LLMChain(llm=llm, prompt=prompt)

def generate_medical_report(specialty, name, age, gender, complaint, exam_results):
    """生成医疗报告的封装函数"""
    return report_chain.run({
        "specialty": specialty,
        "name": name,
        "age": age,
        "gender": gender,
        "complaint": complaint,
        "exam_results": exam_results
    })

if __name__ == "__main__":
    # 示例使用 - 心血管科病例
    specialty = "心血管内科"
    patient_info = {
        "name": "张伟",
        "age": "58岁",
        "gender": "男",
        "complaint": "反复胸痛3个月,加重1周",
        "exam_results": """心电图显示ST段压低;超声心动图示左心室肥厚;
                        血脂检查:总胆固醇6.8mmol/L,LDL-C4.5mmol/L"""
    }

    print("正在生成医疗报告...\n")
    report = generate_medical_report(specialty, **patient_info)
    print(report)

3. 代码解析与注意事项

a) LangChain核心组件

  1. ChatOpenAI:封装了与OpenAI API的交互,temperature参数控制输出的随机性:

    • 0.0:最确定性输出(适合事实性内容)
    • 1.0:最大创造性(适合创意写作)
    • 医疗建议设为0.5-0.7:平衡准确性和可读性
  2. ChatPromptTemplate:结构化提示词模板的关键优势:

    • 确保每次请求的格式一致性
    • 方便参数化输入内容
    • 重要:模板中的指令越明确,输出质量越高

b) Prompt设计要点

医疗报告模板特别注意:
角色设定:”你是一位专业的{specialty}医生”
结构化输入:明确分隔患者信息、检查结果等部分
输出格式要求:指定报告必须包含的章节
语言风格指导:”使用专业但易懂的语言”

c) API调用优化建议

  1. 错误处理增强版
代码片段
from tenacity import retry, stop_after_attempt, wait_exponential

@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
def safe_generate_report(params):
    try:
        return report_chain.run(params)
    except Exception as e:
        print(f"生成失败: {str(e)}")
        raise

# usage: report = safe_generate_report({...})
  1. 缓存机制(避免重复处理相同输入):
代码片段
from langchain.cache import InMemoryCache
from langchain.globals import set_llm_cache

set_llm_cache(InMemoryCache())

4.进阶功能扩展

a)多步骤诊断流程

代码片段
from langchain.chains import SequentialChain

# Step1:初步诊断链 
diagnosis_template = """根据以下症状给出可能的诊断:{symptoms}"""
diagnosis_prompt = ChatPromptTemplate.from_template(diagnosis_template)
diagnosis_chain = LLMChain(llm=llm, prompt=diagnosis_prompt, output_key="diagnosis")

# Step2:详细报告链(使用上一步输出)
full_chain = SequentialChain(
    chains=[diagnosis_chain, report_chain],
    input_variables=["specialty", "name", "age", ...],
    output_variables=["text"]
)

b)支持PDF输出(需要安装reportlab)

代码片段
pip install reportlab

PDF生成代码片段:

代码片段
from reportlab.lib.pagesizes import letter  
from reportlab.pdfgen import canvas  

def save_as_pdf(text, filename):
    c = canvas.Canvas(filename, pagesize=letter)
    width, height = letter

    # PDF样式设置(字号、行距等)
    textobject = c.beginText(40, height-40)
    textobject.setFont("Helvetica",12)

    for line in text.split('\n'):
        textobject.textLine(line.strip())

    c.drawText(textobject)
    c.save()

# usage: save_as_pdf(report_text,"medical_report.pdf")

实际运行示例

执行程序后,你将获得类似这样的输出:

代码片段
正在生成医疗报告...

1.**临床诊断**: 
冠状动脉粥样硬化性心脏病 (冠心病) 
稳定性心绞痛 

2.**诊断依据**: 
-58岁男性患者,具有典型的心绞痛症状(反复胸痛3个月)  
-心电图显示ST段压低提示心肌缺血  
-超声心动图显示左心室肥厚  
-血脂异常(总胆固醇和LDL-C明显升高)

3.**治疗建议**: 
...
[完整输出省略]

关键注意事项

1.数据隐私
-生产环境中必须确保符合HIPAA/GDPR等法规

原创 高质量