基于Qwen2实现大模型中药方剂智能化筛选与优化

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
视觉智能开放平台,视频资源包5000点
简介: 本文介绍了利用大语言模型微调技术在中药方剂智能化筛选与优化中的应用。项目涵盖微调环境搭建、数据预处理、智能体构建及效果评估等环节,展示了模型在生成新中药方剂上的创新能力和实用性。

目录

  1. 引言
  2. 微调模型
    • 微调环境
    • 微调脚本与超参数
    • 微调过程与结果
  3. 数据预处理
    • 数据来源
    • 数据筛选
    • 大模型筛选与整理
  4. 智能体构建
    • 工具注册
    • API 构建
    • Agent的构建
    • 对话界面实现
  5. 效果对比
    • 原模型输出示例
    • 微调后模型输出示例
  6. 结论与展望

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 微调过程与结果

在微调过程中,模型针对风湿病、脚气等场景生成新的中药方剂,训练过程中的显存占用、损失值变化和梯度更新情况如下图所示:
train_loss.png
train_acc.png
train_grad_norm.png

微调时间大约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. 结论与展望

本项目通过对大模型微调、智能体设计及系统集成,实现了新型中药方剂的智能化筛选与优化。未来的研究方向包括:

  1. 优化数据预处理与模型推理效率。
  2. 引入更多药效验证机制,确保生成方剂的实用性。
  3. 提升交互界面的用户体验。

相关文章
|
人工智能 自然语言处理 监控
AI模型评估的指标
模型评估的指标
529 0
|
机器学习/深度学习 人工智能 算法
一文让你了解AI产品的测试 评价人工智能算法模型的几个重要指标
一文让你了解AI产品的测试 评价人工智能算法模型的几个重要指标
1088 0
一文让你了解AI产品的测试 评价人工智能算法模型的几个重要指标
|
12天前
|
数据采集 自然语言处理 搜索推荐
基于qwen2.5的长文本解析、数据预测与趋势分析、代码生成能力赋能esg报告分析
Qwen2.5是一款强大的生成式预训练语言模型,擅长自然语言理解和生成,支持长文本解析、数据预测、代码生成等复杂任务。Qwen-Long作为其变体,专为长上下文场景优化,适用于大型文档处理、知识图谱构建等。Qwen2.5在ESG报告解析、多Agent协作、数学模型生成等方面表现出色,提供灵活且高效的解决方案。
101 49
|
1天前
|
机器学习/深度学习 数据采集 供应链
使用Python实现智能食品消费趋势预测的深度学习模型
使用Python实现智能食品消费趋势预测的深度学习模型
24 11
|
3月前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现深度学习模型:智能药物研发与筛选
使用Python实现深度学习模型:智能药物研发与筛选
119 15
|
3月前
Meta浙大校友让评估模型自学成才,数据全合成无需人工标注,训练Llama 3 70B超过405B
【9月更文挑战第21天】近日,一篇名为《Self-Taught Evaluators》的论文引起了广泛关注。该论文由Meta与浙江大学校友合作完成,提出一种创新的模型评估方法,通过让评估模型自学习训练,无需依赖昂贵且易过时的人工标注数据。此方法利用合成数据,通过迭代生成对比模型输出并训练基于大型语言模型的评估器,从而实现自我迭代改进。研究结果显示,在不使用任何标注偏好数据的情况下,这种方法显著提升了评估模型的性能,甚至超越了一些现有模型。尽管如此,该方法在实际应用中仍需进一步验证。论文地址:https://arxiv.org/abs/2408.02666
73 4
|
4月前
|
数据采集 人工智能 物联网
我们给大模型去掉了“AI味”-大模型微调全链路实战
本文档旨在概述使用ModelScope生态进行LLM训练的全链路最佳实践,涵盖数据下载、数据预处理、模型训练、模型评估完整流程。
|
4月前
|
机器学习/深度学习 数据采集 数据可视化
使用Python实现深度学习模型:智能城市交通管控与优化
【8月更文挑战第17天】 使用Python实现深度学习模型:智能城市交通管控与优化
189 0
|
4月前
|
数据采集 人工智能 数据挖掘
2021 第五届“达观杯” 基于大规模预训练模型的风险事件标签识别】3 Bert和Nezha方案
2021第五届“达观杯”基于大规模预训练模型的风险事件标签识别比赛中使用的NEZHA和Bert方案,包括预训练、微调、模型融合、TTA测试集数据增强以及总结和反思。
44 0
|
4月前
|
数据采集 机器学习/深度学习 人工智能
【2021 第五届“达观杯” 基于大规模预训练模型的风险事件标签识别】1 初赛Rank12的总结与分析
关于2021年第五届“达观杯”基于大规模预训练模型的风险事件标签识别竞赛的初赛Rank12团队的总结与分析,详细介绍了赛题分析、传统深度学习方案、预训练方案、提分技巧、加速训练方法以及团队的总结和反思。
47 0