目录
- 引言
- 微调模型
- 微调环境
- 微调脚本与超参数
- 微调过程与结果
- 数据预处理
- 数据来源
- 数据筛选
- 大模型筛选与整理
- 智能体构建
- 工具注册
- API 构建
- Agent的构建
- 对话界面实现
- 效果对比
- 原模型输出示例
- 微调后模型输出示例
- 结论与展望
1. 引言
中药方剂的筛选与优化是传统中药方剂研发的重要内容。随着人工智能技术的不断发展,逐渐将大语言模型技术引入中药方剂开发过程中。本项目以“中药方剂智能化筛选与优化”为目标,致力于微调出有此作用的大模型,助力中药方剂的研发。
2. 微调模型
2.1 微调环境
模型微调过程中,使用了魔搭社区提供的免费GPU算力,微调环境如下:
- 操作系统:Ubuntu-22.04
- CUDA 版本:12.1.0
- Python 版本:3.10
- PyTorch 版本:2.3.0
- 显存:24GB
- 运行内存:32GB
- Swift 版本:2.4.0
2.2 微调超参数
微调采用魔搭开源的 swift框架 ,以下为主要参数:
模型类型:qwen2-7b-instruct
学习率:1e-5
优化器:AdamW
权重衰减:0.01
训练轮数:1
批量大小(Batch Size):16
学习率调度策略:Cosine
初始随机种子:42
混合精度训练:bf16
最大序列长度:1024
训练数据量:20000条
2.3 微调过程与结果
在微调过程中,模型针对风湿病、脚气等场景生成新的中药方剂,训练过程中的显存占用、损失值变化和梯度更新情况如下图所示:
微调时间大约60min
3. 数据预处理
3.1.数据来源
我们的数据主要来源于《本草纲目》以及其他中华传统医书。这些医术包含了大量的中医药方剂、药材基本信息、适应病症等内容。
3.2 数据筛选
在原始数据的基础上,进行人工筛选,去除冗余、无关或不准确的信息。通过这一步骤,筛选后的数据基本包含了方剂组成、适用病症、用法用量等信息。
3.3 大模型筛选与整理
将筛选后的数据分割后,采用合适的提示词,输入大模型进行处理,提取数据中的药方和其所能治疗的病症,并整理成以下格式:
{
'system':
'您是一位非常专业的的中医药学专家。您始终会根据提问人的问题来提供准确、全面和详细的答案。',
'query':
'(病症描述)',
'response':
"对(病症)有以下药方:['药方1:()','药方2:()']"
}
4. 智能体构建
使用魔搭创空间进行部署,地址。
4.1 工具注册
通过 modelscope_agent
的编写工具进行,以下为工具注册代码:
import requests
import json
from typing import Dict, Optional
from modelscope_agent.tools.base import BaseTool, register_tool
@register_tool('create_chinese_medicine')
class CreateChineseMedicine(BaseTool):
description = '根据病症描述生成新型中药的开发建议'
name = 'create_chinese_medicine'
parameters: list = [{
'name': 'text',
'type': 'string',
'description': '病症的名称',
'required': True
}]
def __init__(self, cfg: Optional[Dict] = None):
super().__init__(cfg)
# API 调用
self.api_url = 'http://localhost:8888/call/'
def call(self, params: str, **kwargs) -> str:
params = self._verify_args(params)
if isinstance(params, str):
return '参数错误'
# 输入数据
text = params['text']
data = {
"input": text + '给出几种新型中药制剂'}
headers = {
'Content-Type': 'application/json'}
# 调用 API
response = requests.post(self.api_url, json=data, headers=headers)
# 返回 API 响应
return response.content.decode('utf-8')
4.2 API 构建
使用 FastAPI 构建 API 服务,使智能体可以调用工具,以下为关键代码片段:
"""
以上是模型部署部分
"""
from fastapi import FastAPI
@app.post("/call/")
async def generate(data: InputData):
response = await generate_response(data.input)
return {
"response": response}
4.3 Agent 的构建
构建智能体,使用Qwen-max作为中枢大模型,封装其功能为函数。以下是代码:
from modelscope_agent.agents import RolePlay
def create_agent():
role_template = '你将扮演一个小助手,会根据用户的指令来调动工具完成任务'
llm_config = {
'model': 'qwen-max',
'model_server': 'dashscope',
}
function_list = ['create_chinese_medicine']
bot = RolePlay(function_list=function_list, llm=llm_config, instruction=role_template)
return bot
# 初始化智能体对象
bot = create_agent()
4.4 对话界面的实现
使用 Gradio 构建了前端界面,使用户能与智能体进行交互。以下是代码:
python复制代码import gradio as gr
from model_download import model_download
from agent import bot
import os
import subprocess
def call_large_model(input_text):
response = bot.run(input_text, remote=False, print_info=True)
text = ''
for chunk in response:
text += chunk
return text
# 对话生成,历史记录
def generate_response(input_text, history):
response = call_large_model(input_text)
history = history + [[input_text, response]]
return history
# 清除聊天记录
def clear_history():
return []
# Gradio 界面
with gr.Blocks() as demo:
gr.Markdown("<h1 style='text-align: center;'>新型中药开发小助手</h1>")
with gr.Row():
chatbot = gr.Chatbot(label="对话框")
with gr.Row():
with gr.Column():
user_input = gr.Textbox(label="输入您的问题", placeholder="推理速度很慢,请耐心等待")
submit_button = gr.Button("提交", variant="primary")
clear_button = gr.Button("清除聊天记录", variant="secondary")
# 按钮绑定
submit_button.click(generate_response, inputs=[user_input, chatbot], outputs=[chatbot])
clear_button.click(clear_history, outputs=[chatbot])
# 下载模型并启动 API 服务
model_download()
api_process = subprocess.Popen(['python', 'API.py'])
# 启动 Gradio 界面
demo.launch()
5.效果对比
在对模型进行微调后,对比了微调前和微调后模型的推理结果,以验证微调带来的改进。
原模型输出示例
对于风湿病和脚气的回答,原模型生成的内容主要是基于原有的中药方剂,传统的加减调整。例如:
问题 1:风湿病,请给出两个新的中药药方
回答:
风湿病是由于风、寒、湿邪侵袭人体,导致经络阻塞、气血运行不畅的一种病症。中医治疗风湿病通常会结合辨证论治原则,通过补益肝肾、活血化瘀、祛风除湿等方法进行。以下是两个基于中医理论的药方,但请注意,在使用任何中药之前,最好咨询专业的中医师或医生,以确保安全性和有效性,并根据个人的具体情况调整剂量和方案。
方剂一:独活寄生汤加减
- 组成:独活 15g、寄生 30g、细辛 10g、当归 15g、川芎 10g、羌活 15g、白芍 15g、杜仲 15g、牛膝 15g、防风 10g、秦艽 10g、人参 10g、肉桂 6g、干姜 6g、甘草 6g。
- 用法:每日一剂,水煎分两次服用。
方剂二:桂枝芍药知母汤加减
- 组成:桂枝 15g、芍药 30g、知母 15g、生姜 15g、大枣 10枚、防风 10g、甘草 6g、白术 15g。
- 用法:每日一剂,水煎分两次服用。
问题 2:患者患有脚气,请给出两个新的药方
回答:
脚气是由真菌感染引起的常见皮肤病,主要表现为瘙痒、脱皮、红斑、裂口等。以下为两个传统中药方剂:
药方一:黄柏地肤子汤
- 组成:黄柏 15g、地肤子 15g、苦参 10g、白鲜皮 10g、茯苓 10g、薏苡仁 15g、荆芥穗 6g、甘草 6g。
- 用法:煎煮后取汁,用于外洗患处,每日 2 次。
药方二:白矾甘草汤
- 组成:白矾 10g、甘草 6g。
- 用法:煎煮后用于泡脚,每次 30 分钟,每日 1 次,同时涂抹患处。
微调后模型输出示例
微调后的模型在推理中表现出较强的创新性。其生成的新药方通过网络检索和数据集检索未发现完全一致的方剂组合,且选用药材符合对应病症的治疗原则,与专家讨论后有一定的治疗效果,拥有了了初步的新型中药方剂开发能力。
问题 1:患者患有风湿病,请给出两个新的药方
回答:
- 药方 1:用大黄、干姜各半斤,共研为末,加蜜做成丸子,如梧子大。每服三十丸,饭前服,米汤送下。一天服三次。
- 药方 2:用白术一斤,锉成碎末,加水三斗,煮成一斗,去渣,熬成膏。每服二匙,酒送下。一天服三次。
问题 2:患者患有脚气,请给出两个新的药方
回答:
- 药方 1:用大蒜四两,捣烂,加醋三升,浸足,至夜洗去。此方名“醋蒜汤”。
- 药方 2:用猪苓一两、木通五钱,共研为末。每服二钱,加温酒送下。一天服二次。
微调后的模型在生成新方剂时,相较原始模型表现出更强的创新能力,具体如下:
原始模型:主要生成基于经典中药方剂的加减方。
微调模型:能够生成经过检索后未发现重复的新方剂,药材选择具有治疗针对性,证明了其潜在的创新能力。
6. 结论与展望
本项目通过对大模型微调、智能体设计及系统集成,实现了新型中药方剂的智能化筛选与优化。未来的研究方向包括:
- 优化数据预处理与模型推理效率。
- 引入更多药效验证机制,确保生成方剂的实用性。
- 提升交互界面的用户体验。