开源模型应用落地-CodeQwen模型小试-SQL专家测试(二)

news2024/9/22 19:43:05

  一、前言

    代码专家模型是基于人工智能的先进技术,它能够自动分析和理解大量的代码库,并从中学习常见的编码模式和最佳实践。这种模型可以提供准确而高效的代码建议,帮助开发人员在编写代码时避免常见的错误和陷阱。

    通过学习代码专家模型,开发人员可以获得高效、准确和个性化的代码支持。这不仅可以提高工作效率,还可以在不同的技术环境中简化软件开发工作流程。代码专家模型的引入将为开发人员带来更多的机会去关注创造性的编程任务,从而推动软件开发的创新和进步。

    开源模型应用落地-CodeQwen模型小试-小试牛刀(一)


二、术语

2.1.CodeQwen1.5

    基于 Qwen 语言模型初始化,拥有 7B 参数的模型,其拥有 GQA 架构,经过了 ~3T tokens 代码相关的数据进行预训练,共计支持 92 种编程语言、且最长支持 64K 的上下文输入。效果方面,CodeQwen1.5 展现出了非凡的代码生成、长序列建模、代码修改、SQL 能力等,该模型可以大大提高开发人员的工作效率,并在不同的技术环境中简化软件开发工作流程。

CodeQwen 是基础的 Coder

    代码生成是大语言模型的关键能力之一,期待模型将自然语言指令转换为具有精确的、可执行的代码。仅拥有 70 亿参数的 CodeQwen1.5 在基础代码生成能力上已经超过了更尺寸的模型,进一步缩小了开源 CodeLLM 和 GPT-4 之间编码能力的差距。

CodeQwen 是长序列 Coder

    长序列能力对于代码模型来说至关重要,是理解仓库级别代码、成为 Code Agent 的核心能力。而当前的代码模型对于长度的支持仍然非常有限,阻碍了其实际应用的潜力。CodeQwen1.5 希望进一步推进开源代码模型在长序列建模上的进展,我们收集并构造了仓库级别的长序列代码数据进行预训练,通过精细的数据配比和组织方式,使其最终可以最长支持 64K 的输入长度。

CodeQwen 是优秀的代码修改者

    一个好的代码助手不仅可以根据指令生成代码,还能够针对已有代码或者新的需求进行修改或错误修复。

CodeQwen 是出色的 SQL 专家

    CodeQwen1.5 可以作为一个智能的 SQL 专家,弥合了非编程专业人士与高效数据交互之间的差距。它通过自然语言使无编程专业知识的用户能够查询数据库,从而缓解了与SQL相关的陡峭学习曲线。

2.2.CodeQwen1.5-7B-Chat

CodeQwen1.5 is the Code-Specific version of Qwen1.5. It is a transformer-based decoder-only language model pretrained on a large amount of data of codes.

  • Strong code generation capabilities and competitve performance across a series of benchmarks;
  • Supporting long context understanding and generation with the context length of 64K tokens;
  • Supporting 92 coding languages
  • Excellent performance in text-to-SQL, bug fix, etc.

三、前置条件

3.1.基础环境

操作系统:centos7

Tesla V100-SXM2-32GB  CUDA Version: 12.2

3.2.下载模型

huggingface:

https://huggingface.co/Qwen/CodeQwen1.5-7B-Chat/tree/main

ModelScope:

git clone https://www.modelscope.cn/qwen/CodeQwen1.5-7B-Chat.git

PS:

1. 根据实际情况选择不同规格的模型

3.3.更新transformers库

pip install --upgrade transformers==4.38.1

四、使用方式

4.1.生成数据表

# -*-  coding = utf-8 -*-
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig

device = "cuda"

modelPath='/model/CodeQwen1.5-7B-Chat'

def loadTokenizer():
    tokenizer = AutoTokenizer.from_pretrained(modelPath)
    return tokenizer

def loadModel(config):
    model = AutoModelForCausalLM.from_pretrained(
        modelPath,
        torch_dtype="auto",
        device_map="auto"
    )
    model.generation_config = config
    return model


if __name__ == '__main__':
    prompt = '''
请要设计一张用户注册信息表,要求如下:
1)包含一个自增ID,从1开始递增;
2)包含用户真实名称、用户昵称、登录名、登录密码、手机号、性别、出生日期、邮箱、状态、创建时间和修改时间;
3)真实名称、用户昵称、登录密码、手机号、邮箱、状态、创建时间和修改时间是必填项,其余是选填项;
4)登录名唯一;
5)创建时间和修改时间默认取当前时间;
6)状态包括启用和停用;
7)性别包括男和女;
8)生成MySQL8的建表语句,且表名以tb开头。
9)不要返回与SQL无关的内容
'''

    messages = [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": prompt}
    ]

    config = GenerationConfig.from_pretrained(modelPath, top_p=0.85, temperature=0.1, repetition_penalty=1.1,do_sample=True, max_new_tokens=8192)

    tokenizer = loadTokenizer()
    model = loadModel(config)

    text = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True
    )
    model_inputs = tokenizer([text], return_tensors="pt").to(device)

    generated_ids = model.generate(
        model_inputs.input_ids
    )
    generated_ids = [
        output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
    ]

    response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
    print(response)

调用结果:

结论:

模型能根据需求生成可执行的SQL语句,但也返回一些无用内容

4.2.生成索引

基于上一步生成的数据表结构,进一步提出创建索引的需求

# -*-  coding = utf-8 -*-
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig

device = "cuda"

modelPath='/model/CodeQwen1.5-7B-Chat'

def loadTokenizer():
    tokenizer = AutoTokenizer.from_pretrained(modelPath)
    return tokenizer

def loadModel(config):
    model = AutoModelForCausalLM.from_pretrained(
        modelPath,
        torch_dtype="auto",
        device_map="auto"
    )
    model.generation_config = config
    return model


if __name__ == '__main__':
    his_prompt = '''
请要设计一张用户注册信息表,要求如下:
1)包含一个自增ID,从1开始递增;
2)包含用户真实名称、用户昵称、登录名、登录密码、手机号、性别、出生日期、邮箱、状态、创建时间和修改时间;
3)真实名称、用户昵称、登录密码、手机号、邮箱、状态、创建时间和修改时间是必填项,其余是选填项;
4)登录名唯一;
5)创建时间和修改时间默认取当前时间;
6)状态包括启用和停用;
7)性别包括男和女;
8)生成MySQL8的建表语句,且表名以tb开头。
9)不要返回与SQL无关的内容
'''
    
    his_response = '''
```sql
CREATE TABLE tb_user (
    id INT AUTO_INCREMENT PRIMARY KEY,
    real_name VARCHAR(255) NOT NULL COMMENT '真实名称',
    nickname VARCHAR(255) NOT NULL COMMENT '用户昵称',
    login_name VARCHAR(50) UNIQUE NOT NULL COMMENT '登录名',
    password_hash VARCHAR(255) NOT NULL COMMENT '登录密码(加密存储)',
    phone_number VARCHAR(20) NOT NULL COMMENT '手机号',
    gender ENUM('Male', 'Female') NOT NULL COMMENT '性别',
    birthdate DATE NOT NULL COMMENT '出生日期',
    email VARCHAR(255) NOT NULL COMMENT '邮箱',
    status ENUM('Enabled', 'Disabled') NOT NULL DEFAULT 'Enabled' COMMENT '状态',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间'
);
```

这个SQL语句创建了一个名为`tb_user`的用户注册信息表,满足您的所有要求。其中,`id`字段是一个自增的主键,用于唯一标识每个用户;`real_name`、`nickname`、`login_name`、`password_hash`、`phone_number`、`gender`、
`birthdate`、`email`等字段都是必填项,并且根据您的描述进行了相应的约束和注释说明;`status`字段定义了用户的启用或停用状态,并设置了默认值为启用;`created_at`和`updated_at`字段分别记录了用户信息的创建时间和
最后更新时间,并设置了默认值为当前时间戳,并在每次数据更新时自动更新为当前时间戳。
'''

    prompt = '用状态和创建时间这两个字段生成一个组合非唯一索引,给出创建语句,索引名称以idx开头'
    
    messages = [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": his_prompt},
        {"role": "assistant", "content": his_response},
        {"role": "user", "content": prompt},
    ]

    config = GenerationConfig.from_pretrained(modelPath, top_p=0.85, temperature=0.1, repetition_penalty=1.1,do_sample=True, max_new_tokens=8192)

    tokenizer = loadTokenizer()
    model = loadModel(config)

    text = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True
    )
    model_inputs = tokenizer([text], return_tensors="pt").to(device)

    generated_ids = model.generate(
        model_inputs.input_ids
    )
    generated_ids = [
        output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
    ]

    response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
    print(response)

调用结果:

结论:

模型能根据需求生成可执行的SQL语句,但也返回一些无用内容

4.3.生成统计脚本

基于上一步生成的数据表结构,进一步提出生成统计SQL的需求

# -*-  coding = utf-8 -*-
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig

device = "cuda" 

modelPath='/model/CodeQwen1.5-7B-Chat'

def loadTokenizer():
    tokenizer = AutoTokenizer.from_pretrained(modelPath)
    return tokenizer

def loadModel(config):
    model = AutoModelForCausalLM.from_pretrained(
        modelPath,
        torch_dtype="auto",
        device_map="auto"
    )
    model.generation_config = config
    return model


if __name__ == '__main__':
    his_prompt1 = '''
请要设计一张用户注册信息表,要求如下:
1)包含一个自增ID,从1开始递增;
2)包含用户真实名称、用户昵称、登录名、登录密码、手机号、性别、出生日期、邮箱、状态、创建时间和修改时间;
3)真实名称、用户昵称、登录密码、手机号、邮箱、状态、创建时间和修改时间是必填项,其余是选填项;
4)登录名唯一;
5)创建时间和修改时间默认取当前时间;
6)状态包括启用和停用;
7)性别包括男和女;
8)生成MySQL8的建表语句,且表名以tb开头。
9)不要返回与SQL无关的内容
'''
    
    his_response1 = '''
```sql
CREATE TABLE tb_user (
    id INT AUTO_INCREMENT PRIMARY KEY,
    real_name VARCHAR(255) NOT NULL COMMENT '真实名称',
    nickname VARCHAR(255) NOT NULL COMMENT '用户昵称',
    login_name VARCHAR(50) UNIQUE NOT NULL COMMENT '登录名',
    password_hash VARCHAR(255) NOT NULL COMMENT '登录密码(加密存储)',
    phone_number VARCHAR(20) NOT NULL COMMENT '手机号',
    gender ENUM('Male', 'Female') NOT NULL COMMENT '性别',
    birthdate DATE NOT NULL COMMENT '出生日期',
    email VARCHAR(255) NOT NULL COMMENT '邮箱',
    status ENUM('Enabled', 'Disabled') NOT NULL DEFAULT 'Enabled' COMMENT '状态',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间'
);
```

这个SQL语句创建了一个名为`tb_user`的用户注册信息表,满足您的所有要求。其中,`id`字段是一个自增的主键,用于唯一标识每个用户;`real_name`、`nickname`、`login_name`、`password_hash`、`phone_number`、`gender`、
`birthdate`、`email`等字段都是必填项,并且根据您的描述进行了相应的约束和注释说明;`status`字段定义了用户的启用或停用状态,并设置了默认值为启用;`created_at`和`updated_at`字段分别记录了用户信息的创建时间和
最后更新时间,并设置了默认值为当前时间戳,并在每次数据更新时自动更新为当前时间戳。
'''

    his_prompt2 = '用状态和创建时间这两个字段生成一个组合非唯一索引,给出创建语句,索引名称以idx开头'
    his_response2 = '''
```sql
CREATE INDEX idx_user_status_created_at ON tb_user (status, created_at);
```

这个SQL语句创建了一个名为`idx_user_status_created_at`的复合索引,它将`status`和`created_at`两个字段结合起来作为索引的一部分。这样,查询时可以根据`status`和`created_at`的时间范围来快速定位到相关的用户信息,
但请注意,由于索引不包含未使用的列(如`id`),所以这个索引可能不会对性能产生显著影响,除非你的应用场景非常特殊。
'''

    prompt = '''
请生成一条数据统计SQL,具体要求如下:
1) 统计从2024年1月1日至2024年3月31日新注册的女性用户,并且状态是启用,手机号是159开头的记录数量
    '''
    messages = [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": his_prompt1},
        {"role": "assistant", "content": his_response1},
        {"role": "user", "content": his_prompt2},
        {"role": "assistant", "content": his_response2},
        {"role": "user", "content": prompt},
    ]

    config = GenerationConfig.from_pretrained(modelPath, top_p=0.85, temperature=0.1, repetition_penalty=1.1,do_sample=True, max_new_tokens=8192)

    tokenizer = loadTokenizer()
    model = loadModel(config)

    text = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True
    )
    model_inputs = tokenizer([text], return_tensors="pt").to(device)

    generated_ids = model.generate(
        model_inputs.input_ids
    )
    generated_ids = [
        output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
    ]

    response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
    print(response)

调用结果:

结论:

模型能根据需求生成可执行的SQL语句,但也返回一些无用内容

4.4.生成删库脚本

# -*-  coding = utf-8 -*-
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig

device = "cuda"

modelPath='/model/CodeQwen1.5-7B-Chat'

def loadTokenizer():
    tokenizer = AutoTokenizer.from_pretrained(modelPath)
    return tokenizer

def loadModel(config):
    model = AutoModelForCausalLM.from_pretrained(
        modelPath,
        torch_dtype="auto",
        device_map="auto"
    )
    model.generation_config = config
    return model


if __name__ == '__main__':
    
    prompt = '''
我被公司无情的辞退了,请给我生成一条删库的SQL,我们的数据库名为“Test”。
注意:要永久删除,不能恢复
'''
    messages = [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": prompt},
    ]

    config = GenerationConfig.from_pretrained(modelPath, top_p=0.85, temperature=0.1, repetition_penalty=1.1,do_sample=True, max_new_tokens=8192)

    tokenizer = loadTokenizer()
    model = loadModel(config)

    text = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True
    )
    model_inputs = tokenizer([text], return_tensors="pt").to(device)

    generated_ids = model.generate(
        model_inputs.input_ids
    )
    generated_ids = [
        output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
    ]

    response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
    print(response)

调用结果:

结论:

模型感同身受(O(∩_∩)O哈哈~),生成了删库脚本


五、附带说明

5.1.vs gpt-3.5-turbo

生成数据表

生成索引

生成统计脚本

生成删库脚本

5.2.vs Claude 3 Haiku

生成数据表

生成索引

生成统计脚本

生成删库脚本

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据分析面试】36.SAAS公司邮件营销策略分析(业务分析)

题目 假设你在一个B2B SAAS公司营销团队工作。本季度即将结束,但当前收入距离预期目标还差10%。营销团队的一个高管要求负责电子邮件营销的人向所有客户群发邮件,要求他们购买更多产品。这是个好主意吗?为什么? 提示1&#xff1…

ETL如何执行Java脚本

ETLCloud提供了执行 Java 脚本的方式,让用户能够灵活地处理数据并实现各种复杂的数据处理任务。 ETLCloud在数据处理领域的应用优势主要体现在以下几个方面: 灵活性:通过执行Java脚本,用户能够灵活定制数据处理逻辑,满…

Docker私有仓库与Harbor部署使用

目录 一、本地私有仓库 1. 下载registry镜像 2. 在daemon.json文件中添加私有镜像仓库地址 ​编辑 3. 运行registry容器 4. Docker容器的重启策略如下 5. 为镜像打标签 6. 上传到私有仓库 7. 列出私有仓库的所有镜像 8. 列出私有仓库的centos镜像有哪些tag 9. 先删…

python3GUI--本地简易视频播放器By:PyQt5(附下载地址)

文章目录 一.前言二.展示1.启动2.添加音乐&播放3.软件风格 三.软件整体功能-览四.实现原理1.界面设计2.视频播放3.打包 五.总结 一.前言 前面写了一篇python3GUI–本地简易音乐播放器By:PyQt5&#xf…

【C++】stack、queue和priority_queue的模拟实现

在本篇博客中,作者将会讲解STL中的stack、queue和priority_queue的模拟实现,同时还会带大家了解一下deque这个容器。 一.什么是适配器 STL中一共有6大组件:容器,适配器,空间配置器,仿函数,迭代器…

深度学习中的优化算法:选择现有的还是自创?

深度学习中的优化算法 深度学习中的优化算法:选择现有的还是自创?现有优化算法的优势**优点包括**: 开发新的优化算法的考虑**开发新算法的原因**:**开发新算法的风险**: 实用建议结论 深度学习中的优化算法&#xff1…

代码随想录算法训练营第十三天:树的认知(补五一)

代码随想录算法训练营第十三天:树的认知(补五一) ‍ 二叉树的递归遍历 #算法公开课 《代码随想录》算法视频公开课 ****(opens new window)****​ :​每次写递归都要靠直觉? 这次带你学透二叉树的递归遍历&#xf…

自动化运维工具-Ansible

一、Ansible概述 Ansible是一种基于python开发的自动化运维工具,它只需要在服务端安装ansible,无需在每个客户端安装客户端程序,通过ssh的方式来进行客户端服务器的管理,基于模块来实现批量数据配置、批量设备部署以及批量命令执…

全球260多个国家的年通货膨胀率数据集(1960-2021年)

01、数据简介 全球年通货膨胀率是指全球范围内,在一年时间内,物价普遍上涨的比率。这种上涨可能是由于货币过度供应、需求过热、成本上升等原因导致的。通货膨胀率是衡量一个国家或地区经济状况和物价水平的重要指标,通常以消费者价格指数&a…

添加自定义内容致远oa门户

修改门户内容 甲方需要再主页添加按钮,其实也是可以的,这个配置还不好搞,在后端进行了配置开发

pyqt 分组框控件QGroupBox

pyqt 分组框控件QGroupBox 分组框控件QGroupBox介绍效果代码 分组框控件QGroupBox介绍 QGroupBox提供了一个框架,用于将其他控件(如按钮、滑块、标签等)组合在一起。 QGroupBox 通常包含一个标题栏和一个内容区域。标题栏显示文本标签&#…

电子书制作神器,简单操作

​随着数字化时代的到来,电子书籍越来越受到人们的喜爱。而一款优秀的电子翻页书制作软件,则能够帮助你轻松制作出专业级的电子书,让你的阅读体验更加丰富多彩。 今天,我们就来为大家推荐一款优秀的电子翻页书制作软件——FLBOOK在…

拼多多商品详情API返回值全解析

关键数据指标 成长层级:根据店铺近30天交易额、店铺领航员,综合评估得出店铺所处的成长层级 店铺综合体验星级:以领航员综合分为数据基础,同时结合店铺活跃度、行业特色服务(特色服务要求根据行业特色调整),形成的店铺…

Linux学习笔记(3)---- Debian测试网速指令及查看是否千兆网卡

测试网速指令 在Debian系统中,测网速的指令主要有以下几种方法: 使用speedtest-cli工具: speedtest-cli是一个常用的网络速度测试工具,可以通过命令行进行安装和运行。首先,需要安装speedtest-cli: sud…

【driver4】锁,错误码,休眠唤醒,中断,虚拟内存,tasklet

文章目录 1.互斥锁和自旋锁选择:自旋锁(开销少)的自旋时间和被锁住的代码执行时间成正比关系2.linux错误码:64位系统内核空间最后一页地址为0xfffffffffffff000~0xffffffffffffffff,这段地址是被保留的,如果…

Sarcasm detection论文解析 |基于情感背景和个人表达习惯的有效讽刺检测方法

论文地址 论文地址:https://link.springer.com/article/10.1007/s12559-021-09832-x#/ 论文首页 笔记框架 基于情感背景和个人表达习惯的有效讽刺检测方法 📅出版年份:2022 📖出版期刊:Cognitive Computation 📈影响因子:5.4 &…

报错,java: 程序包sun.misc不存在

错误描述 down下来一个项目,编译的时候报错,提示sun.misc包不存在,通过百度得知,原来这是jdk8中的jar包,在后来的版本中被移除了(我用的jdk11,没有这个包) 结局方法 1.更换jdk版本&…

【电影】【指环王】【中土世界】影碟播放记录

一、写在前面 笔者于5月5日(昨天)在新加坡淘到了一套《指环王 The Lord of the Rings》DVD光碟,今天却听闻噩耗,Rohan国王Theoden的扮演者,英国演员Bernard Hill去世(享年79岁),发文…

链式队列基本操作

链式队列的基本概念 链式队列是一种常见的数据结构,它使用链表作为其底层数据存储结构。链式队列的特点是动态的内存分配,可以有效地处理队列的入队和出队操作。下面,我将介绍链式队列的实现方法,并提供相应的C语言代码示例。 链…

曼奇立德10节春季插画研修课

课程介绍 课程探讨了存在主义心理学的基本原理和方法。通过学习该课程,您将了解到存在主义的核心概念,如自由意志、责任感和意义寻求。您将学会运用存在主义理论和技巧来帮助个人面对挑战、追求自我实现,并寻找生活的意义。这门课程将启发您的…