当前位置: 首页 > news >正文

程序员必备技能:使用本地LLM提取非结构化医疗数据,收藏这篇就够了

本文介绍使用本地部署的LLM(vLLM/Ollama)替代传统正则表达式,从非结构化医疗病历中提取结构化信息。通过Pandas、Pydantic和Instructor工具实现数据读取、字段定义和JSON转换,能理解语义而非简单匹配。该方法保证数据安全且零API成本,文章提供了完整代码实现和推荐模型,帮助开发者高效处理医疗文本数据。


以前我试图用正则表达式(Regex)提取信息。但在复杂的病历面前,正则就有点力不从心。“病人无过敏史”和“病人对青霉素过敏”,关键词都有“过敏”,正则很难分辨语义。一旦文本格式稍微变动,写好的代码就全废了,特别是在跨地域、跨文化等多中心的研究项目背景下。然而80% 的高价值数据都是“非结构化”的。它们躺在 PDF 里、聊天记录里、医生手写的病历里。对于计算机来说,这些不是数据,只是“噪点”。为了分析它们,我们过去只能靠人工——盯着屏幕,Ctrl+C,Ctrl+V,直到眼花缭乱。

通过LLM等方法提取信息能替代这部分繁琐、重复的工作。大语言模型的出现,不是为了陪你聊天,而是为了理解。我构建了一个基于本地 vLLM/Ollama 的工具,它不像传统程序那样“匹配字符”,而是像人类专家一样“阅读文本”。

  • 它能读懂“血压偏高”意味着数值异常。
  • 它能从几千字的病程记录中,精准抓取“阿司匹林”归类为药物,抓取“头晕”归类为症状。
    这不是简单的抓取,这是认知重组。

通过 vLLM 在本地构建推理服务,数据不出内网,显卡就在手边。既享受了 AI 的智力,又守住了数据的边界。零API成本,无限次调用,这才是LLM落地应用的正确打开方式。

以下是如何进行提取的核心流程,本案例基于病历数据,其他的数据可以参考,我认为方法都是一样的,就是需求有所变化:

  1. Pandas: 读取 Excel 文件,其他的文件格式用类似的方法读入即可。
  2. Pydantic: 定义你想要提取的病历字段(如:主诉、诊断、用药)。
  3. Instructor + Local LLM: 强制模型将非结构化文本转换为符合定义的 JSON。
  4. Loop: 遍历每一行数据进行处理。
  5. Pandas: 将提取结果与原始 ID 合并,保存为新文件。

第一步:准备环境,必要的环境的不啰嗦了

pip install pandas openpyxl openai instructor pydantic tqdm

第二步:编写批量处理脚本

在这个脚本中,我模拟了一个常见的病历提取需求(提取诊断、症状、药物)。你可以根据实际需求修改 MedicalRecord 类中的字段。

创建文件 batch_extract.py:

import pandas as pd import instructor from openai import OpenAI from pydantic import BaseModel, Field from typing import List, Optional from tqdm import tqdm # 进度条库 # ================= 配置区域 ================= # 1. 设置输入输出文件路径 INPUT_FILE = "raw_data.xlsx" # 你的原始文件 OUTPUT_FILE = "structured_data.xlsx" # 输出结果文件 # 2. 连接本地 LLM (vLLM 或 Ollama) # vLLM 默认通常是 http://localhost:8000/v1 # Ollama 默认通常是 http://localhost:11434/v1 client = instructor.from_openai( OpenAI( base_url="http://localhost:11434/v1", api_key="ollama" ), mode=instructor.Mode.JSON, ) MODEL_NAME = "qwen2.5:14b" # 建议使用通义千问等中文能力强的模型 # ================= 定义提取结构 ================= # 这是最重要的一步:定义你想从病历中挖出什么信息,这部分根据自己的需求进行设定 class MedicalRecord(BaseModel): patient_id: Optional[str] = Field(description="病人ID,如果在文本中未提及则留空") diagnosis: List[str] = Field(description="确诊的疾病名称列表") symptoms: List[str] = Field(description="病人主诉及症状表现") medications: List[str] = Field(description="医生开具的药物名称列表") surgeries: List[str] = Field(description="曾做过的手术名称,无则为空列表") allergies: Optional[str] = Field(description="过敏史,如果未提及填'无'") # 你可以继续添加字段,比如 'admission_date', 'doctor_advice' 等 # ================= 核心处理逻辑 ================= def process_medical_text(text: str): """调用 LLM 进行提取""" if not text or pd.isna(text): return None try: resp = client.chat.completions.create( model=MODEL_NAME, response_model=MedicalRecord, messages=[ { "role": "system", "content": "你是一个专业的医疗数据结构化助手。请分析病历文本,提取关键医疗实体。保持客观,不要推测。" }, { "role": "user", "content": f"病历内容:\n{text}" }, ], max_retries=2, # 如果生成的 JSON 格式不对,自动重试 2 次 ) return resp.model_dump() # 转为字典格式 except Exception as e: print(f"Error processing row: {e}") return None def main(): # 1. 读取 Excel (假设没有表头,或者第一行是表头) # header=0 表示第一行是列名,如果是纯数据没有列名,用 header=None print(f"正在读取 {INPUT_FILE}...") df = pd.read_excel(INPUT_FILE) # 假设 Excel 结构:第一列是 ID,第二列是 文本 # 我们为了通用,直接使用 iloc 按位置索引 # col 0: ID, col 1: Context extracted_results = [] # 2. 使用 tqdm 显示进度条进行循环 print("开始提取数据...") for index, row in tqdm(df.iterrows(), total=df.shape[0]): row_id = row.iloc[0] # 第一列 ID raw_text = row.iloc[1] # 第二列 文本 # 调用 LLM data = process_medical_text(raw_text) if data: # 将原始 ID 放进去,确保一一对应 data['original_id'] = row_id extracted_results.append(data) else: # 处理失败或空行的情况 extracted_results.append({ 'original_id': row_id, 'error': '提取失败或内容为空' }) # 3. 转换为 DataFrame 并保存 print("提取完成,正在保存...") result_df = pd.DataFrame(extracted_results) # 调整列顺序,把 ID 放在第一列 cols = ['original_id'] + [c for c in result_df.columns if c != 'original_id'] result_df = result_df[cols] result_df.to_excel(OUTPUT_FILE, index=False) print(f"文件已保存至: {OUTPUT_FILE}") if __name__ == "__main__": main()
  • 推荐模型
  • Qwen2.5 (14B 或 32B): 通义千问在中文医疗实体抽取上表现非常好,且指令跟随能力强。

  • HuatuoGPT: 如果你有能力加载微调过的医疗模型。

  • Llama3-70B: 逻辑能力最强。

提示词工程 (System Prompt)

在代码中的 messages 部分,建议根据你的具体病历类型进行微调。例如:

“你是一个三甲医院的病案整理专家。请从杂乱的文本中提取结构化信息。对于药品名称,请统一转换为通用名。如果没有提及某项信息,请严格返回空列表,严禁编造。”

如果使用的是vLLM:

vLLM 最大的优势是支持高并发吞吐。你可以修改 Python 脚本使用 asyncio 并发发送请求,而不是等一条处理完再发下一条。

import asyncio async def process_batch(rows): tasks = [process_single_row_async(row) for row in rows] return await asyncio.gather(*tasks) # 这样可以一次性发 10-20 个请求给 vLLM,速度会快 10 倍以上

如果 Excel 有 10000000000 行,跑到第 9000000 行程序崩了怎么办?
建议

  • 每处理 100 条数据,就追加写入到一个临时 CSV 文件中 (mode=‘a’)。
  • 或者在 DataFrame 处理完后,检查输出文件是否存在,如果存在则读取已处理的 ID,跳过这些 ID 继续跑。

如何学习AI大模型?

如果你对AI大模型入门感兴趣,那么你需要的话可以点击这里大模型重磅福利:入门进阶全套104G学习资源包免费分享!

这份完整版的大模型 AI 学习和面试资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

这是一份大模型从零基础到进阶的学习路线大纲全览,小伙伴们记得点个收藏!


第一阶段:从大模型系统设计入手,讲解大模型的主要方法;

第二阶段:在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段:大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段:大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段:大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段:以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段:以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

100套AI大模型商业化落地方案

大模型全套视频教程

200本大模型PDF书籍

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

LLM面试题合集

大模型产品经理资源合集

大模型项目实战合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

http://www.jsqmd.com/news/338716/

相关文章:

  • 基于YOLOv5/v8/v10的智能铁轨缺陷检测系统:从算法原理到工业级GUI应用实践
  • 年薪五十万的硬件工程师应该具备哪些业务技能
  • 312. Java Stream API - 使用收集器进行计数操作
  • 【强烈推荐】大模型开发者必看:AI智能体90%是软件工程,10%是AI的真相
  • UltraRAG 3.0开源:可视化RAG推理全链路,小白也能快速上手大模型开发
  • 构建高性能车型识别与计数全栈系统——YOLOv5/v8/v10实战详解
  • 基于YOLO系列的行人车辆检测与计数系统:从理论到实践
  • Claude Code安装与初始化
  • 深度解析 ARP 欺骗攻击:原理 + 实操 + 防御,小白也能轻松上手
  • 收藏!小白也能看懂的大模型术语全解析:从GGUF到Reranker,一文搞懂本地RAG系统
  • MATLAB Simulink教程及模型
  • 渗透测试实战核心:ARP 欺骗攻击(ARP 断网攻击)全流程实操指南
  • 树形DP扩展
  • 2026Q1苏州财税公司排名|资质合规为核心,代理记账按场景选更靠谱 - 品牌智鉴榜
  • 2026 年最新成都公墓代理商五大推荐 专业合规选墓不踩坑 - 深度智识库
  • 破界与共生:HarmonyOS原生应用生态全景图谱与PC时代三重变局
  • 02. 神经网络
  • 10岁小学生自制28元望远镜观察月球
  • 利用多种方法实现SQL行列转换
  • 从欲望、客观到自感:D-O-S模型——一种文明互鉴与数字治理的认知元语言(全)
  • 您已消耗一次 CSP-S 参加机会
  • 夹具状态识别与分类——基于YOLO11-EfficientHead的目标检测实现与性能分析
  • 【读书笔记】《忙碌爸爸也能做好爸爸》
  • 计算机毕设Java基于协同过滤的网上书店推荐系统 基于Java协同过滤算法的在线书店个性化推荐系统设计与实现 Java环境下基于协同过滤的网络书店智能推荐系统研究与开发
  • WPF PGP 2026 R1 线上复刻
  • 毕业设计 深度学习异常流量检测系统(算法+论文)
  • 学习进度 18
  • C++函数进阶:默认参数与函数重载,让你的代码更智能!
  • 生成函数的第一部分
  • 函数探幽(默认参数和函数重载)