目录
- 引言
- 微调模型
- 微调环境
- 微调脚本与超参数
- 微调过程与结果
- 数据预处理
- 数据来源
- 数据筛选
- 大模型筛选与整理
- 智能体构建
- 工具注册
- 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
}]
#调用本地部署微调后的模型的API
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 服务,使智能体可以调用工具,以下为关键代码片段:
"""
以上包含模型部署部分,主要使用swift进行模式部署
"""
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 构建了前端界面,使用户能与智能体进行交互。以下是代码:
import gradio as gr
from model_download import model_download
from agent import bot
import os
import subprocess
#调用agent
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. 结论与展望
本项目通过对大模型微调、智能体设计及系统集成,实现了新型中药方剂的智能化筛选与优化。未来的研究方向包括:
- 优化数据预处理与模型推理效率。
- 引入更多药效验证机制,确保生成方剂的实用性。
- 提升交互界面的用户体验。