2026/4/11 22:52:17
网站建设
项目流程
东莞网站建设智搜宝,建筑工程网络进度计划,南海网站设计,app产品网站建设本文介绍使用本地部署的LLM(vLLM/Ollama)替代传统正则表达式#xff0c;从非结构化医疗病历中提取结构化信息。通过Pandas、Pydantic和Instructor工具实现数据读取、字段定义和JSON转换#xff0c;能理解语义而非简单匹配。该方法保证数据安全且零API成本#xff0c;文章提供…本文介绍使用本地部署的LLM(vLLM/Ollama)替代传统正则表达式从非结构化医疗病历中提取结构化信息。通过Pandas、Pydantic和Instructor工具实现数据读取、字段定义和JSON转换能理解语义而非简单匹配。该方法保证数据安全且零API成本文章提供了完整代码实现和推荐模型帮助开发者高效处理医疗文本数据。以前我试图用正则表达式Regex提取信息。但在复杂的病历面前正则就有点力不从心。“病人无过敏史”和“病人对青霉素过敏”关键词都有“过敏”正则很难分辨语义。一旦文本格式稍微变动写好的代码就全废了特别是在跨地域、跨文化等多中心的研究项目背景下。然而80% 的高价值数据都是“非结构化”的。它们躺在 PDF 里、聊天记录里、医生手写的病历里。对于计算机来说这些不是数据只是“噪点”。为了分析它们我们过去只能靠人工——盯着屏幕CtrlCCtrlV直到眼花缭乱。通过LLM等方法提取信息能替代这部分繁琐、重复的工作。大语言模型的出现不是为了陪你聊天而是为了理解。我构建了一个基于本地 vLLM/Ollama 的工具它不像传统程序那样“匹配字符”而是像人类专家一样“阅读文本”。它能读懂“血压偏高”意味着数值异常。它能从几千字的病程记录中精准抓取“阿司匹林”归类为药物抓取“头晕”归类为症状。这不是简单的抓取这是认知重组。通过 vLLM 在本地构建推理服务数据不出内网显卡就在手边。既享受了 AI 的智力又守住了数据的边界。零API成本无限次调用这才是LLM落地应用的正确打开方式。以下是如何进行提取的核心流程本案例基于病历数据其他的数据可以参考我认为方法都是一样的就是需求有所变化Pandas: 读取 Excel 文件其他的文件格式用类似的方法读入即可。Pydantic: 定义你想要提取的病历字段如主诉、诊断、用药。Instructor Local LLM: 强制模型将非结构化文本转换为符合定义的 JSON。Loop: 遍历每一行数据进行处理。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_urlhttp://localhost:11434/v1, api_keyollama ), modeinstructor.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( modelMODEL_NAME, response_modelMedicalRecord, messages[ { role: system, content: 你是一个专业的医疗数据结构化助手。请分析病历文本提取关键医疗实体。保持客观不要推测。 }, { role: user, content: f病历内容\n{text} }, ], max_retries2, # 如果生成的 JSON 格式不对自动重试 2 次 ) return resp.model_dump() # 转为字典格式 except Exception as e: print(fError processing row: {e}) return None def main(): # 1. 读取 Excel (假设没有表头或者第一行是表头) # header0 表示第一行是列名如果是纯数据没有列名用 headerNone 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(), totaldf.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, indexFalse) 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%免费】