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

embedded/2024/12/23 6:30:23/

一、前言

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

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

    开源模型应用落地-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.ppmy.cn/embedded/37293.html

相关文章

二叉树遍历

一、树的引入 在对数据进行管理时&#xff0c;数据的查找是一个非常常见的基本操作&#xff0c;它是根据某个给定的关键字 K K K&#xff0c;从集合 R R R中找到关键字与 K K K相同的记录。根据集合中的记录是否发生动态变化&#xff0c;查找分为动态查找和静态查找。静态查找…

重庆大足某厂不锈钢管件酸洗钝化-智渍洁

简报&#xff1a;重庆大足某厂不锈钢管件酸洗钝化 重庆大足某厂不锈钢管件酸洗钝化 - 重庆智渍洁环保科技有限公司简报&#xff1a;重庆大足某厂不锈钢管件酸洗钝化https://www.zhizijie.com/hl/zixun/gongsi/237.html

芸众商城电商专业版400+插件源码+搭建教程

介绍&#xff1a; 芸众商城社交电商系统SAAS平台前端基于vue开发&#xff0c;后端基于研发积分商城系统源码 php&#xff0c;本文安装芸众商城全插件&#xff08;400多个&#xff09;商业版平台源码&#xff0c;可同时支持多端口部署运行&#xff1b;使用宝塔面板一键部署的形…

我的256天之创作纪念日

目录 时光 数据的一些变化 开心的事 憧憬 时光 自上次CSDN的消息推送&#xff0c;又一个128天过去了&#xff0c;整天的工作和生活都在忙忙碌碌中度过&#xff0c;每到能静下来片刻&#xff0c;都倍感珍惜。因为一些原因&#xff0c;能够陪伴家人的时间越来越少&#xff…

Python 爬虫:Spring Boot 反爬虫的成功案例

前言 在当今数字化时代&#xff0c;网络数据成为了信息获取和分析的重要来源之一。然而&#xff0c;随着网络数据的广泛应用&#xff0c;爬虫技术也逐渐成为了互联网行业的热门话题。爬虫技术的应用不仅可以帮助企业获取有价值的信息&#xff0c;还可以用于数据分析、市场研究…

Hive Views 视图

Hive Views 视图 在Hive中&#xff0c;视图&#xff08;Views&#xff09;是虚拟表&#xff0c;它只包含查询定义&#xff0c;而不包含实际的数据。视图可以简化复杂查询&#xff0c;隐藏数据结构&#xff0c;提供安全性&#xff0c;以及促进数据访问和重用。 创建视图的语法如…

在视频中使用时间卷积和半监督训练进行三维人体姿态估计

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;在视频中使用时间卷积和半监督训练进行三维人体姿态估计1、文献摘要2、提出方法2.1、时间扩张卷积模型2.2、半监督方法2.3、与传统…

【notepad++】使用

1 notepad 下载路径 https://notepad-plus.en.softonic.com/download 2 设置护眼模式 . 设置——语言格式设置——前景色——黑色 . 背景色——RGB &#xff1a;199 237 204 . 勾选“使用全局背景色”、“使用全局前景色” . 保存并关闭