【AIGC】通义千问生成问答数据集

好久没有更新跟实际应用相关的内容了(主要是因为公司知识产权问题未能立即公开,目前只能挑选一些脱敏内容与各位分享),如标题所示本期将跟大家讲一下如何通过通义千问生成问答数据集的。

在之前使用 Autokeras 的 RNN 训练时提到,数据是人工智能训练的生命线。数据质量和数据体量决定了人工智能模型的好与坏,因此如何大批量获取高质量数据是一件非常头痛的事情。

虽然可以通过一些数据平台获取训练数据,但对于一些小众领域数据量依然不够。面对这种情况我能想到的就只有“用魔法打败魔法”一条路了。思路如下:


如上图所示,第 1 步“找标准化数据”是比较简单的。难就难在第 2 步,除了要对第 1 步产生的数据进行 ETL 处理外,还要思考如何建立相关的数据图谱。这里将会涉及到一些专业领域的内容,由于中药材它是一个非标品,因此不是简单地用字符特征进行提取关联就可以的。

就举一个最简单的例子,同一个药材品种,道地药材和非道地药材在药效、用法、用量上都存在差异,因此需要专家的介入提供专业意见。

然而以上这些都不是今天的重点,就像前面 Autokeras 训练时所说的,我们的目标是要做一个人工智能问答小助手,因此需要大量的问答数据作为训练支撑,现在我们只有标准化的数据,接下来需要通过大模型对标准化数据进行二次构建,生成“问答”数据,也就是上面的第 3 步内容。

但是,目前几乎所有的大模型都需要“买 token”来使用,没钱怎么办(叹气)?就在一筹莫展的时候发现阿里家的通义千问居然有限时免费!!

WechatIMG598.png
PS:现在通义千问也要收费的了,这个图是之前它还免费的时候截的。如果要免费使用,建议还是本地部署一个 Qwen 1.5 72B 开源版本来用吧(至于如何在本地应用 Qwen1.5 开源模型这个放在之后的一篇文章中分享)

(回归正题)赶紧申请 key,写个 python 马上做个信息转换,如下图:

import requests
import time
import json

import os
project_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
import sys
sys.path.append(project_dir)
import mysql_util as mu

# 设置递归深度
sys.setrecursionlimit(1000000)

# 每个批次生成 20 条记录
gen_batch_size = 20

# 循环 40 次
loop_batch = 40

# 停顿 5 秒
wait_sec = 5

# 通义千问配置信息
qwen_url = 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation'
qwen_id = 'sk-xxxxxxxxxxxxxxxxxxxx'
qwen_assist = '这里要以英文方式提供前置提示'
qwen_type = 'qwen-max'

"""
通过 MySQL 查询标准数据集并通过循环遍历生成样例问题向 Qwen 进行提问,并将结果保存到数据库
"""


def query_integration_info():
    # 查询获取数据图谱数据集
    result_set = query_standard_dataset()
    # 可以根据自己需要的数据总量定义需要执行的循环次数
    for i in range(1, loop_batch):
        # 遍历数据集(这里只是例子,为了方便理解只提取了部分字段)
        for chinese_name, meridians_chinese, class_chinese in result_set:
            # 记录开始时间和执行批次
            print("Now the "+str(i)+" batch is being processed. The processing variety is:" +
                  chinese_name+", and start at:" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
            # 在正式请求前需要先暂停,避免频繁请求
            time.sleep(wait_sec)
            # 根据字段组装提问信息
            medical_ask = '请生成'+str(gen_batch_size)+'条关于中药材“'+chinese_name+'”问答且统一按照“问题:xxx \n 答案:xxx”格式返回。信息如下:【品名】' + \
                chinese_name + \
                check_variable('【归经】', meridians_chinese) + \
                check_variable('【药物分类】', class_chinese)
            medical_ask = medical_ask.replace("\n", "").replace("\u3000", "")
            # 调用通义千问接口进行数据生成并保存
            call_qwen_message(medical_ask, chinese_name, i)


"""
一个调用带有医疗信息、中文名称和索引的Qwen消息的函数。
此函数将RESTful请求发送到具有给定数据和标头的指定URL,然后解析响应以提取答案。
然后,如果提取的答案满足某些标准,则对其进行处理并将其插入数据库表中。

Parameters:
      medical_info (str): 请求中要包含的医疗信息。
      chinese_name (str): 与数据关联的中文名称。
      i (int): 索引参数

Returns:
      None
"""


def call_qwen_message(medical_info, chinese_name, i):
    # 记录开始时间
    start_time = time.time()
    # 初始化返回内容变量
    resp_text = ''
    # 整理请求格式和 header
    datas = {
        "model": qwen_type,
        "input": {
            "messages": [
                {"role": "system", "content": qwen_assist},
                {"role": "user", "content": medical_info}
            ]
        },
        "parameters": {}
    }
    headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer '+qwen_id
    }
    try:
        # 进行 restful 请求(注意,由于 qwen-max 大模型面对大量 tokens 输入的时候响应速度较慢,因此最好设定好 timeout 参数)
        response = requests.post(url=qwen_url, data=json.dumps(
            datas), headers=headers, timeout=120)
        # 有正常返回的时候就直接解析返回的 json 就可以提取到答案了
        if response.status_code == 200:
            json_data = json.loads(response.text)
            resp_text = json_data["output"]["text"]
            if resp_text != '':
                batch_data = []
                # 整理数据文本对“\n\n”进行切割
                each_qa_str = resp_text.split('\n\n')
                # 遍历切割后的数据集再进行问题(question)和答案(answer)的整理
                for qa_arr in each_qa_str:
                    qaa_arr = qa_arr[1].split('\n')
                    question = qaa_arr[0]
                    answer = ''.join(qaa_arr[1:])
                    # 将数据整理成数据数组
                    batch_data.append((
                        question.split(".")[-1].replace(" ","").replace("问题:", ""),
                        answer.replace(" ", "").replace("答案:", "").replace("-", ""),
                        chinese_name,
                        i))
                # 如果数组数据大于 0 的时候就可以进行批量插入了
                if len(batch_data) > 0:
                    batch_save_data(batch_data)
            else:
                print("Herb "+chinese_name +" request error,please try again later...")
    except Exception as e:
        print(f"Call the Qwen API falise, please try again later... {e}")
    finally:
        # 获取结束时间并打印整个方法的耗时输出
        execution_time = time.time() - start_time
        print(f"Qwen generate execution time: {execution_time} seconds")


"""
批量保存函数

Parameters:
      batch_data (list): 包含要插入数据库的数据的元组列表。

Returns:
      int: 受插入操作影响的行数。
"""


def batch_save_data(batch_data):
    counter = 0
    insert_sql = "INSERT INTO model_transfor_data (QUESTION,ANSWER,TAG,BATCH_NUM) VALUES (%s, %s, %s, %s)"
    conn = mu.get_connection()
    cursor = conn.cursor()
    try:
        counter = cursor.executemany(insert_sql, batch_data)
        conn.commit()
    except Exception as e:
        conn.rollback()
        print(f"Error: {e}")
    finally:
        cursor.close()
        conn.close()
    return counter


"""
从data_graph表中查询标准数据集的函数。
此函数连接到数据库,检索按chinese_name排序的所有行,
并将结果集作为元组列表返回。
"""


def query_standard_dataset():
    result_set = ''
    conn = mu.get_connection()
    cursor = conn.cursor()
    try:
        cursor.execute("SELECT * FROM data_graph ORDER BY chinese_name ASC")
        result_set = cursor.fetchall()
    except Exception as e:
        print(f"Error: {e}")
    finally:
        cursor.close()
        conn.close()
    return result_set


"""
一个函数,用于检查变量,如果变量不是None或空字符串,则将其与静态变量连接。

Parameters:
      static_var(any):要连接的静态变量。
      var(any):要检查和连接的变量。

Returns:
      str:static_var和var的串联字符串,如果var为None或空字符串,则为空字符串。
"""


def check_variable(static_var, var):
    if var is None or len(str(var)) == 0:
        return ''
    else:
        return static_var+var


if __name__ == '__main__':
    query_integration_info()

具体实现如上所示,代码只是单线程执行,若需要以多线程执行可以 import threading 包实现,其实都非常方便。通过大模型生成的问答数据其实也难免会出现“胡说八道”的情况(幻觉),这个时候就需要做数据审核了。数据审核分两种,一种是自动化数据审核,一种是人工审核。具体实现目前我还不能明说,等有机会再跟大家分享如何做自动化审核的内容吧。

以上就是我这个穷逼想到的成本几乎为 0 的数据补充大法,希望也能够帮助到正在阅读的你吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/526125.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

flex:1是干嘛的

直接上图: flex:1实际代表的是三个属性的简写,如上图所示。 其中flex-grow是用来增大盒子的,比如,当子盒子的宽度小于父盒子的宽度,父盒子的剩余空间可以 利用flex-grow来设置子盒子增大的占比; flex-shri…

如何利用软文吸引用户下单?媒介盒子告诉你

数字技术的进步改变了用户的购物行为,他们期望能够在最短的时间内找到并购买自己需要的产品或服务。软文凭借对用户心理的深入洞察以及柔性的表现形式,成为企业吸引用户的关键因素,今天媒介盒子就来和大家聊聊:如何利用软文吸引用…

Unity2023使用sdkmanager命令行工具安装Android SDK

1,下载cmdline-tools,官网地址:https://developer.android.com/studio或者https://dl.google.com/android/repository/文件名 文件名对应版本名。例如文件名为commandlinetools-win-9862592_latest.zip 引用Android cmdline-tools 版本与其…

Linux:五种IO模型的基本认识

文章目录 IO的本质五种IO模型异步和同步 阻塞IO非阻塞IO信号驱动IO IO的本质 在之前的内容中已经结束了对于网络和操作系统的学习,那么回过来再继续看IO,什么是IO呢? 对于网络的学习当中,实际上也是一种IO,数据从计算…

Android Studio导入第三方so库和jar包——Android Studio

导入so库 方式一(libs文件夹) 将项目以【Project】的结构显示,将目标架构对应的so文件夹(如下图中 的arm64-v8a)复制粘贴到app文件下的lib文件夹中(如下图的步骤1 2 3) 在build.gradle&…

【Java EE】Spring请求如何传递参数详解

文章目录 🎍传递单个参数🌴传递多个参数🍀传递对象🎄后端参数重命名(后端参数映射)🌲传递数组🎍传递集合🌴传递JSON数据🌸JSON概念🌸JSON的语法&a…

Python学习,记录不熟悉知识点

目录 Set(集合) 集合内置方法完整列表 根据字符串的表达式计算结果 ​编辑 条件控制: if – elif – else match...case 循环语句: while循环 for循环 在同一行中有多个赋值操作(先计算,再赋值&…

ThinkPhp8 框架使用 mysql find_in_set 函数

前言: 使用mysql 存储一些标签时 会使用逗号拼接的存储方法 比如 1,2,3,11 一般情况下 查询 1 可能会用到 like %1% 但这样查询的不够准确 因为11也会被查询到 如果每次都多一个逗号 1,2,3,11, 查询时 like %1,% 这样存储有点不太符合程序设计 解决方案 ----------- 官网…

Google Play上架:恶意软件、移动垃圾软件和行为透明度拒审解析(关于对SDK 要求,第三方插件需自查清理混淆)

近期发现很多开发者在上架过程中遇到了 《关于恶意软件、移动垃圾软件和行为透明度》相关的拒审邮件,今天来聊一下关于sdk的政策要求,希望能提供一个自查方向。如有疑问,可以关注博主后私聊进行讨论和咨询。 SDK要求要求如下用户数据政策“敏感信息访问权限和 API”政策“恶…

YOLOv8的多分类模型如何计算准确率(Accuracy)、精确率(Precision)、召回率(recall)和F1-Score模型评估参数

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

mysql 连接查询和子查询

学习了mysql基本查询, 接着学习连接查询和子查询。 4,连接查询 连接是关系数据库模型的主要特点。连接查询是关系数据库中最主要的查询,主要包括内连接、外连接等。通过连接运算符可以实现多个表查询。在关系数据库管理系统中,表建…

rsync实时同步(上行同步)

目录 一、实现实时同步 1. 定期同步的不足 2. 实时同步的优点 3. Linux内核的inotify机制 4. 发起端配置rsyncinotify 4.1 修改rsync源服务器配置文件 4.2 调整inotify内核参数 4.3 安装inotify-tools 4.4 在另一个终端编写触发式同步脚本 4.5 验证 二、使用rsync实现…

直播美颜SDK:AI视觉技术在直播平台中的创新与实践

在直播平台里,主播们通过各种形式的内容吸引着观众,而其中一项重要的技术创新便是直播美颜SDK的应用。本文将探讨这一技术在直播平台中的创新与实践。 一、直播美颜SDK的背景 随着社交媒体的兴起,人们对于自己的形象越来越注重,尤…

【php开发支付宝web支付】

首先介绍下 我用的框架ci 在吐槽下百度的其他人的写的都很垃圾,还不如自己看支付宝的开发手册了 1、composer安装支付宝的sdk composer require alipay/alipay-sdk-php安装完毕 不多哔哔 代码展示 先点地址登录支付宝以后再上我这重点下 支付宝沙箱地址 $ord…

C/C++中局部变量static用法实例

1. 普通局部变量存储于进程栈空间,使用完毕会立即释放,静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0,并且静态局部变量存储于进程的全局数据区,即使函数返回&#xff0…

企业3D数字化网络展馆成为企业文化传承与发扬的圣地

在河北这片古老而富饶的土地上,文明的火种薪火相传,燕赵之风历久弥新。河北企业也多年持续稳居我国第五的宝座,企业文化展馆不仅是企业形象的展示窗口,更是企业文化传承与发扬的圣地。 与短暂的行业展会不同,企业展馆是…

Mac下载的软件显示文件已损坏,如何解决文件已损坏问题

当在Mac上下载的软件显示文件已损坏时,这可能是因为多种原因导致的,包括网络问题、下载中断、软件未完整下载、文件传输错误等。解决这个问题需要采取一些步骤来排除可能的原因,并尝试修复文件。下面将详细介绍一些常见的解决方法&#xff1a…

让WIN7运行WIN10软件的插件

GitHub - vxiiduu/VxKex: Windows 7 API Extensions 安装包才5.23M。 程序 - 属性 - VxKex:勾选 Enable Qt6版的Raptor登录后报错Device offline OpenSCAD的WIN10版

交易要想成功澳福总结几点

100%使用基本面分析的投资者能保证每次交易都能成功吗?100%使用技术分析的投资者能保证每次交易都能成功吗?在fpmarkets澳福看来无论是基本面分析还是技术分析都不能保证100%交易成功。 投资者不能只依赖一种分析进行投资交易。在fpmarkets澳福看来成功的…

vue3中项目优化(Web Worker的使用)

1.Web Worker的作用 本人的理解:js是单线程执行代码,也就是代码需要从上往下执行,而使用Web Worker后相当于分了一条线程出来执行代码,那么两条线程肯定是比一条线程执行的快。 2.新建Web Worker文件 在public文件夹下新建work…