开源模型应用落地-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://xiahunao.cn/news/3016145.html

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

相关文章

vivado Zynq UltraScale+ MPSoC 比特流设置

Zynq UltraScale MPSoC 比特流设置 下表所示 Zynq UltraScale MPSoC 器件的器件配置设置可搭配 set_property <Setting> <Value> [current_design] Vivado 工具 Tcl 命令一起使用。

KDTree空间搜索算法学习

目录 KDTree&#xff08;K-Dimensional Tree&#xff09;原理步骤空间索引建立例子[^1]回溯搜索例子[^2] 相关包案例[^3]数据KDTree 识别轨道衔接出行轨道衔接单车骑行范围分析结果保存 KDTree&#xff08;K-Dimensional Tree&#xff09;原理 将需要匹配的 K 维空间点建立 K …

java10基础(this super关键字 重写 final关键字 多态 抽象类)

目录 一. this和super关键字 1. this关键字 2. super关键字 二. 重写 三. final关键字 四. 多态 五. 抽象类 1. 抽象方法 2. 抽象类 3. 面向抽象设计 一. this和super关键字 1. this关键字 this 当前对象的引用 this.属性 this.方法名() this() -- 调用构造函数 …

VALSE 2024 Workshop报告分享┆Open-Sora Plan视频生成开源计划——进展与不足

2024年视觉与学习青年学者研讨会&#xff08;VALSE 2024&#xff09;于5月5日到7日在重庆悦来国际会议中心举行。本公众号将全方位地对会议的热点进行报道&#xff0c;方便广大读者跟踪和了解人工智能的前沿理论和技术。欢迎广大读者对文章进行关注、阅读和转发。文章是对报告人…

页面嵌套,界面套娃,除了用iframe,还有其他方式吗?

UIOTOS可以了解下&#xff0c;uiotos.net&#xff0c;通过连线来代替脚本逻辑开发&#xff0c;复杂的交互界面&#xff0c;通过页面嵌套轻松解决&#xff0c;是个很新颖的思路&#xff0c;前端零代码&#xff01; 蓝图连线尤其是独创的页面嵌套和属性继承技术&#xff0c;好家…

为什么现在散户在加密市场赚不到钱了?

为什么总有人说这个周期已经结束了&#xff1f;为什么每个人都感到痛苦&#xff1f;我们可以将所有问题归结为&#xff1a;在当前的市场结构下&#xff0c;散户再也赚不到真正的钱了。 关于回归本源、摆脱当前周期的一些杂谈 为什么本轮行情中没有散户的身影&#xff0c;答案…

2024智能电网与能源系统国际学术会议(ICSGES2024)

2024智能电网与能源系统国际学术会议&#xff08;ICSGES2024) 会议简介 我们诚挚邀请您参加将在南京隆重举行的2024年智能电网与能源系统国际学术会议&#xff08;ICSGES2024&#xff09;。南京&#xff0c;一座历史与现代交织的城市&#xff0c;将为这场盛会提供独特的学术…

Java IO类之FilterOutputStream的研究与应用

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

Ansible自动化工具模块调用与playbook编写

目录 一、Ansible工作机制与特点 &#xff08;一&#xff09;Ansible工作机制 1. 初始化与配置 2. 编写Playbook 3. 调用模块 4. 加密敏感数据 5. 执行Playbook 6. 收集执行结果 7. 错误处理与回滚 8. 反馈与报告 &#xff08;二&#xff09;Ansible 的主要特点包括…

文献速递:深度学习医学影像心脏疾病检测与诊断--CT中的深度学习用于自动钙评分:使用多个心脏CT和胸部CT协议的验证

Title 题目 Deep Learning for Automatic Calcium Scoring in CT: Validation Using Multiple Cardiac CT and Chest CT Protocols CT中的深度学习用于自动钙评分&#xff1a;使用多个心脏CT和胸部CT协议的验证 Background 背景 Although several deep learning (DL) calc…

智能实训-wheeltec小车-抓取(源代码)

语言 :C 源代码&#xff1a; #include <ros/ros.h> #include <image_transport/image_transport.h> #include <cv_bridge/cv_bridge.h> #include <sensor_msgs/image_encodings.h> #include <sensor_msgs/JointState.h> #include <geometry…

yolo-world:”目标检测届大模型“

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

全新拼团模式 你一定没见过 白拿产品还有收益!

在七星拼团模式中&#xff0c;奖励制度是其核心吸引力之一。今天&#xff0c;我们将深入探讨这一模式的三种奖励&#xff1a;直推奖、滑落奖和出局奖&#xff0c;以及它们背后的互助机制。 奖励规则概述 首先&#xff0c;让我们了解一下奖励的具体规则。假设商品售价为499元&a…

Python面向对象编程思想的深入学习

魔术方法的使用 案例体验 class Student:def __init__(self, name, age):self.name nameself.age age# __str__魔术方法, 如果不去写这个方法&#xff0c;那么print输出的则是信息存储的内存地址。def __str__(self):return fStudent类对象&#xff0c;name:{self.name}, ag…

【Java 刷题记录】前缀和

前缀和 25. 一维前缀和 示例1&#xff1a; 输入&#xff1a; 3 2 1 2 4 1 2 2 3输出&#xff1a; 3 6import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(S…

基于FPGA的数字锁控制电路VHDL代码Quartus仿真

名称&#xff1a;基于FPGA的数字锁控制电路VHDL代码Quartus仿真&#xff08;文末获取) 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a; 任务及要求 硬件描述语言VHDL是一种用形式化方法描述数字电路和系统的语言。利用这种语 ,数字电路系统的设计可…

揭秘前端开发的“薪”机遇

众所周知&#xff0c;华为开发者大会2023&#xff0c;宣布不再兼容安卓&#xff0c;同时宣布了“鸿飞计划”&#xff0c;欲与iOS、安卓在市场三分天下&#xff0c;这对中国国产操作系统而言&#xff0c;具有划时代的意义。 最近有不少前端的开发者来咨询鸿蒙开发&#xff0c;今…

通过 Java 操作 redis -- 连接 redis

如果我们想在本地主机上访问 Linux 服务器上的 redis &#xff0c;我们就需要通过 ssh 进行端口转发&#xff0c;推荐看 本地主机访问服务器的Redis -- 配置 ssh 端口转发 通过 Java 操作 redis 已经有大佬创建了很多第三方库&#xff0c;这里我们使用 jedis &#xff0c;因为它…

28-代码随想录18四数之和

18. 四数之和 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff…

618挑选家用洗地机,需要注意哪些事项?有哪些家用洗地机值得买?

近年来&#xff0c;智能清洁家电越来越受到消费者的欢迎&#xff0c;洗地机作为清洁家电的新宠&#xff0c;凭借其集扫地、拖地、杀菌清洗于一体的强大功能&#xff0c;成为市场上的热销产品。那么&#xff0c;这类洗地机真的好用吗&#xff1f;怎么挑选到好用的家用的洗地机呢…