开源模型应用落地-CodeQwen模型小试-探索更多使用场景(三)

一、前言

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

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

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

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


二、术语

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, GenerationConfigdevice = "cuda"modelPath='/model/CodeQwen1.5-7B-Chat'def loadTokenizer():# print("loadTokenizer: ", modelPath)tokenizer = AutoTokenizer.from_pretrained(modelPath)return tokenizerdef loadModel(config):# print("loadModel: ",modelPath)model = AutoModelForCausalLM.from_pretrained(modelPath,torch_dtype="auto",device_map="auto")model.generation_config = configreturn modelif __name__ == '__main__':prompt = '需要替换哦'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)

4.2.安全漏洞检测

把基础代码的prompt替换成以下文本

'''
请分析下面代码,是否存在安全漏洞,具体代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class UserLogin {public static void main(String[] args) {String username = "admin";String password = "password";try {// 建立数据库连接Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "password");// 执行查询Statement statement = connection.createStatement();String query = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'";ResultSet resultSet = statement.executeQuery(query);// 处理查询结果if (resultSet.next()) {System.out.println("登录成功");} else {System.out.println("登录失败");}// 关闭连接resultSet.close();statement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}
}
'''

调用结果:

结论:

模型能分析出代码漏洞并给出优化建议

4.3.优化代码性能

把基础代码的prompt替换成以下文本

'''
请优化下面代码,提升运行性能,具体代码如下:
public class StringConcatenation {public static void main(String[] args) {int n = 10000;String result = "";for (int i = 0; i < n; i++) {result += " " + i;}System.out.println(result);}
}
'''

调用结果:

结论:

模型能分析出循环拼接字符串带来的性能问题,并给出更优的实现方式

4.4.代码翻译

把基础代码的prompt替换成以下文本

'''
请用Java语言改写下面代码,并实现一致的功能,具体代码如下:
def bubble_sort(arr):n = len(arr)# 遍历所有数组元素for i in range(n):# Last i elements are already in placefor j in range(0, n-i-1):# 遍历数组从 0 到 n-i-1# 交换如果元素发现大于下一个元素if arr[j] > arr[j+1] :arr[j], arr[j+1] = arr[j+1], arr[j]# 示例
arr = [64, 34, 25, 12, 22, 11, 90]
bubble_sort(arr)
print("排序后的数组为:")
for i in range(len(arr)):print("%d" %arr[i], end=" ")
'''

调用结果:

结论:

模型能理解基于python语言实现的冒泡算法,并转换成Java语言实现类似功能

4.5.生成代码注释

把基础代码的prompt替换成以下文本

'''
请分析下面代码,给出每行的代码注释,具体代码如下:
def train_step(self, batch: Dict, batch_n_steps: int, step: int, loader_start_time: float) -> Tuple[Dict, Dict]:self.callbacks.on_train_step_start(self)# format databatch = self.format_batch(batch)loader_time = time.time() - loader_start_time# conteainers to hold model outputs and losses for each optimizer.outputs_per_optimizer = Noneloss_dict = {}# OPTIMIZATIONif isimplemented(self.model, "optimize"):  # pylint: disable=too-many-nested-blocks# custom optimize for the modelstep_time = time.time()device, dtype = self._get_autocast_args(self.config.mixed_precision, self.config.precision)with torch.autocast(device_type=device, dtype=dtype, enabled=self.config.mixed_precision):outputs, loss_dict_new = self.model.optimize(batch,self,)step_time = time.time() - step_time# If None, skip the stepif outputs is None:return None, None# TODO: find a way to log grad_norm for custom optimizeloss_dict_new = self.detach_loss_dict(loss_dict_new, True, None, None)loss_dict.update(loss_dict_new)else:# gradient accumulation# TODO: grad accumulation for each optimizerstep_optimizer = Trueif ((step + 1) % self.grad_accum_steps != 0) and (step + 1 != batch_n_steps):step_optimizer = Falseif not isinstance(self.optimizer, list):# auto training with a single optimizeroutputs, loss_dict_new, step_time = self.optimize(batch,self.model,self.optimizer,self.scaler,self.criterion,self.scheduler,self.config,step_optimizer=step_optimizer,num_optimizers=1,)loss_dict.update(loss_dict_new)else:# auto training with multiple optimizers (e.g. GAN)outputs_per_optimizer = [None] * len(self.optimizer)total_step_time = 0for idx, optimizer in enumerate(self.optimizer):criterion = self.criterion# scaler = self.scaler[idx] if self.use_amp_scaler else Nonescaler = self.scalerscheduler = Noneif self.scheduler is not None:scheduler = self.scheduler[idx]outputs, loss_dict_new, step_time = self.optimize(batch,self.model,optimizer,scaler,criterion,scheduler,self.config,idx,step_optimizer=step_optimizer,num_optimizers=len(self.optimizer),)# skip the rest if the model returns Nonetotal_step_time += step_timeoutputs_per_optimizer[idx] = outputs# merge loss_dicts from each optimizer# rename duplicates with the optimizer idx# if None, model skipped this optimizerif loss_dict_new is not None:for k, v in loss_dict_new.items():if k in loss_dict:loss_dict[f"{k}-{idx}"] = velse:loss_dict[k] = vstep_time = total_step_timeoutputs = outputs_per_optimizer# clear any pesky gradients after gradient accumulationif step_optimizer:self.model.zero_grad(set_to_none=True)# update avg runtime statskeep_avg_update = {}keep_avg_update["avg_loader_time"] = loader_timekeep_avg_update["avg_step_time"] = step_timeself.keep_avg_train.update_values(keep_avg_update)# update avg loss statsupdate_eval_values = {}for key, value in loss_dict.items():update_eval_values["avg_" + key] = valueself.keep_avg_train.update_values(update_eval_values)# print training progressif self.total_steps_done % self.config.print_step == 0:# log learning rateslrs = {}if isinstance(self.optimizer, list):for idx, optimizer in enumerate(self.optimizer):current_lr = self.optimizer[idx].param_groups[0]["lr"]lrs.update({f"current_lr_{idx}": current_lr})elif isinstance(self.optimizer, dict):for key, optimizer in self.optimizer.items():current_lr = self.optimizer[key].param_groups[0]["lr"]lrs.update({f"current_lr_{key}": current_lr})else:current_lr = self.optimizer.param_groups[0]["lr"]lrs = {"current_lr": current_lr}# log run-time statsloss_dict.update(lrs)loss_dict.update({"step_time": round(step_time, 4),"loader_time": round(loader_time, 4),})self.c_logger.print_train_step(batch_n_steps,step,self.total_steps_done,loss_dict,self.keep_avg_train.avg_values,)if self.args.rank == 0:# Plot Training Iter Stats# reduce TB load and don't log every stepif self.total_steps_done % self.config.plot_step == 0:self.dashboard_logger.train_step_stats(self.total_steps_done, loss_dict)if self.total_steps_done % self.config.save_step == 0 and self.total_steps_done != 0:if self.config.save_checkpoints:# checkpoint the modelself.save_checkpoint()if self.total_steps_done % self.config.log_model_step == 0:# log checkpoint as artifactself.update_training_dashboard_logger(batch=batch, outputs=outputs)self.dashboard_logger.flush()self.total_steps_done += 1self.callbacks.on_train_step_end(self)return outputs, loss_dict
'''

调用结果:

结论:

模型能理解代码逻辑,并给出关键代码的注释


五、附带说明

5.1.代码专家模型适用的使用场景

  1. 代码自动补全和建议:根据输入的代码片段或上下文,提供下一个可能的代码补全或建议,帮助开发人员提高编码效率。

  2. 代码错误检测和修复:分析代码,并根据语法规则和最佳实践检测潜在的错误或问题,并提供修复建议。

  3. 代码重构和优化:分析现有的代码,并提供重构建议,帮助改进代码结构、提高性能或可读性。

  4. 代码文档生成:根据代码片段或函数、方法等的名称和注释生成相应的文档,提供代码的说明和用法示例。

  5. 代码解释和教学:根据代码片段或问题,解释代码的功能和工作原理,并提供相应的教学示例和资源。

  6. 代码安全分析:帮助检测潜在的安全漏洞和弱点,并提供相应的建议和解决方案,以提高代码的安全性。

  7. 代码翻译和跨语言支持:将一种编程语言的代码翻译成另一种编程语言,帮助开发人员在不同的语言之间进行转换和迁移。

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

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

相关文章

使用QT开发ROS可视化界面

Q&#xff1a; undefined reference to non-virtual thunk to MyViz A&#xff1a; 该问题主要由于QT中的MOC File没有正确生成&#xff0c;导致虚函数列表出现问题。另外&#xff0c;需要注意虚函数的virtual关键字需要放在类的声明&#xff0c;不能放在类的定义。 qt5_wrap…

获取Android Native堆栈

文章目录 工具和方法获取当前线程的堆栈信息获取任意线程的堆栈信息GCC生成符号的规律总结 在Android系统中&#xff0c;我们有时需要获取Native层的堆栈信息&#xff0c;例如在进行性能分析、问题定位和调试等场景。本文将介绍如何在Android Native层获取堆栈信息&#xff0c;…

计算机视觉——OpenCV Otsu阈值法原理及实现

算法简介 Otsu阈值法&#xff0c;也被称为大津算法&#xff0c;是一种在图像处理中广泛使用的自动阈值分割技术。这种方法由日本学者大津展之于1979年提出&#xff0c;旨在根据图像的灰度直方图来自动选择最佳全局阈值。Otsu阈值法的核心思想是最小化类内方差或最大化类间方差…

《设计一款蓝牙热敏打印机》

主控芯片用易兆威蓝牙ic&#xff0c;通讯接口&#xff1a;蓝牙、串口、usb 安卓apk用java kotlin编写、上位机用Qt编写。

【微磁学】对于现阶段微磁学仿真发展的思考1-理论篇

系列文章目录 对于现阶段微磁学仿真发展的思考1-理论篇 对于现阶段微磁学仿真发展的思考2-工具篇 文章目录 系列文章目录前言一、微磁学的数学区二、微磁学的物理区三、微磁学仿真现存的一些问题四、微磁学代码区&#xff1a;上手操作&#xff0c;理解更深入栗子1: 能量最小化…

【代码随想录】day50

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、123买卖股票的最佳时机III二、188买卖股票的最佳时机IV 一、123买卖股票的最佳时机III 超时了。。。 class Solution { public:int helper(vector<int>…

lsof 查看进程是被哪个文件占用

要查看进程被哪个文件占用&#xff0c;可以使用lsof命令&#xff08;list open files&#xff09;。可以使用以下命令来查看指定进程的打开文件&#xff1a; lsof -p <PID>其中&#xff0c;<PID>是要查询的进程的进程ID。这将列出指定进程打开的所有文件。如果想查…

WouoUIPagePC端实现

WouoUIPagePC端实现 WouoUIPage是一个与硬件平台无关&#xff0c;纯C语言的UI库&#xff08;目前只能应用于128*64的单色OLED屏幕上&#xff0c;后期会改进&#xff0c;支持更多尺寸&#xff09;。因此&#xff0c;我们可以在PC上实现它&#xff0c;本文就以在PC上使用 VScode…

Java面试题:Spring里面的@RestController和@ResponseBody有什么作用?

ResponseBody ResponseBody一般是加在方法上&#xff0c;将返回的对象解析成xml或者json&#xff0c;返回给请求的调用者。一般是用于服务之间的调用&#xff0c;或者前端请求后端时&#xff0c;使用ajax请求。 如果不加ResponseBody&#xff0c;一般就是返回的url&#xff0c…

研发效能 | Jacoco dump基于k8s的实现

问题描述 总所周知&#xff0c;jacoco的dump操作如果是使用server模式只需要使用以下命令就能获取到 exec 文件。 java -jar jacococli.jar dump --address 192.169.110.1 --port 6300 --destfile ./jacoco-demo.exec 如果是非 k8s 的集群&#xff0c;也只需要遍历执行这条命…

Python实现打砖块游戏

提供学习或者毕业设计使用&#xff0c;功能基本都有&#xff0c;不能和市场上正式游戏相提比论&#xff0c;请理性对待&#xff01; 在本文中&#xff0c;我们将使用 Pygame 和 Tkinter 创建一个简单的打砖块游戏。游戏的目标是通过控制挡板来击碎屏幕上的砖块&#xff0c;同时…

基于 OpenHarmony compress 三方件使用指南~

关于 提供了一个轻量级的图像压缩库。将允许您将大照片压缩成小 尺寸的照片&#xff0c;图像质量损失或可以忽略不计 compress 的依赖添加 为你的应用添加 compress-debug.har。将 compress-debug.har 复制到 entry\libs 目录下即可&#xff08;由于 build.gradle 中已经依赖…

HALPWM配置占空比频率2按键控制思路

title: HALPWM配置占空比频率 tags: STM32ClionHal 控制pwm开关 //启动定时器 HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim);//关闭定时器 HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim);//启动指定通道PWM HAL_StatusTypeDef HAL_TIM_P…

【负载均衡式在线OJ项目day1】项目结构

一.功能 查看题目列表&#xff0c;在线编程&#xff0c;判题功能&#xff0c;即leetcode的部分功能 二.宏观结构 整个项目是BS模式&#xff0c;客户端是浏览器&#xff0c;和用户交互并向服务器发起请求。 服务端从功能上来说分为两个模块&#xff0c;第一个是OJServer&…

小红书餐饮推广怎么合作?纯干货

小红书作为国内领先的生活方式分享平台&#xff0c;其用户群体主要集中在一二线城市&#xff0c;年龄分布在18-35岁之间&#xff0c;其中女性用户占比高达80%。这部分用户具有较高的消费能力、审美追求和品质生活需求&#xff0c;对美食有着极高的兴趣和消费意愿&#xff0c;为…

Mysql 行格式 innodb_default_row_format 可以配置那些值, 有什么区别

在MySQL中&#xff0c;innodb_default_row_format选项指定了InnoDB表创建时的默认行格式。这个设置对于新创建的表非常重要&#xff0c;因为它影响了数据的存储方式、空间利用率和性能。innodb_default_row_format可以配置为以下几个值&#xff0c;每个值代表不同的行格式&…

【计算机网络】计算机网络的性能指标

计算机网络的性能指标被用来从不同方面度量计算机网络的性能。常用的八个计算机网络性能指标&#xff1a;速率、带宽、吞吐量、时延、时延带宽积、往返时间、利用率、丢包率。 一.速率 (1) 数据量 比特&#xff08;bit&#xff0c;记为小写b&#xff09;是计算机中数据量的基…

python使用mongo操作

目前有个需求&#xff0c;就是把所有sql转为mongo管道查询 知识点 在 MongoDB 中&#xff0c;allowDiskUse 选项应该作为聚合命令的一个选项&#xff0c;而不是聚合管道的一个阶段。allowDiskUse 选项用于允许聚合操作使用磁盘空间来临时存储数据&#xff08;当聚合操作的数据…

力扣顺序表思路讲解

本篇文章&#xff0c;我给大家带来的是顺序表题目讲解&#xff0c;希望大家看完有所收获&#xff0c;废话不多说&#xff0c;我们现在开始 审题 大白话&#xff1a;给了一个数组和一个目标值。如果数组里的两个元素相加 目标值&#xff0c;则返回这两个元素的下标。那么大家需…

java编程中,实现分页对象的类型转换

一、背景 当数据库分页查询返回的对象与接口要返回的对象类型不一致时&#xff0c;不可避免需要进行类型转换。 示例&#xff1a;数据库分页查询返回的对象是PageDTO&#xff0c;而接口返回的对象类型是PageVO。 PageDTO Data public class PageDTO<T> {/*** Current…