开源模型应用落地-Qwen2.5-Coder模型小试-码海无涯(二)
使用Qwen2.5-Coder-7B-Instruct模型,探索更多使用场景
一、前言
代码专家模型是一种基于人工智能的先进技术,旨在自动分析和理解大量代码库,并从中学习常见的编码模式和最佳实践。这种模型通过深度学习和自然语言处理,能够提供准确而高效的代码建议,帮助开发人员在编写代码时有效地避免常见的错误和陷阱。
利用代码专家模型,开发人员能够获得高效、准确且个性化的代码支持。这不仅显著提高了工作效率,还能在不同技术环境中简化软件开发流程。通过自动化的代码分析,开发人员可以更专注于创造性的编程任务,从而推动软件开发的创新与进步。
总之,代码专家模型的引入不仅是技术的进步,更是软件开发方式的一次革命。它为开发者提供了更为强大的工具,使他们能够在复杂的技术环境中游刃有余,专注于更具创造性和挑战性的项目。随着这一技术的不断发展与普及,未来的软件开发将会更加高效、智能和富有创造力。
二、术语
2.1.Qwen2.5-Coder
是通义千问新一代开源模型中用于编程的特定系列大语言模型(前身是 code qwen)。它具有以下特点:
1. 训练数据及规模方面
- 在多达 5.5 万亿 tokens 的编程相关数据上作了训练,涵盖源代码、文本-代码关联数据、合成数据等,为模型提供了丰富的编程知识和模式。
2. 性能提升方面
- 相比 code qwen 1.5,在代码生成、代码推理和代码修复方面有了显著提升,为开发者提供更高效、准确的代码辅助。
3. 应用基础方面
- 为代码相关的实际应用如代码代理等提供了更全面的基础,让模型不仅局限于代码的生成,还能更好地适应各种代码相关任务的实际场景。
4. 上下文处理方面
- 支持长上下文,最长可达 128k tokens,能够处理大规模的代码文本和复杂的编程逻辑。
5. 模型体系方面
- 发布了三个基础语言模型和指令微调语言模型,包括 1.5B、7B 和未来的 32B(开发中)不同参数规模的版本,以满足不同用户和场景的需求。
应用场景:
- 代码生成:根据自然语言描述自动生成相应的代码片段,提升开发效率。
- 代码补全:在编程环境中提供实时的代码自动补全建议,帮助开发者高效编写代码。
- 代码审计:分析和审查代码以发现潜在的错误或性能隐患,并提供优化建议。
- 文档生成:自动生成代码文档,如 API 文档或代码注释,简化开发人员的文档维护工作。
- 代码转换:将一种编程语言的代码转换为另一种语言。
- Bug 识别与修复:识别代码中的错误或潜在问题,并建议修复方案。
- 单元测试生成:根据代码自动生成单元测试,帮助确保代码质量和可靠性。
- 代码示例和模板生成:为特定的开发需求生成代码示例或模板,加速项目开发。
2.2.Qwen2.5-Coder-7B-Instruct
是在 Qwen2.5-Coder 的基础上通过指令微调得到的模型,它在多个任务上性能进一步提升,在多编程语言能力、代码推理、数学能力和基础能力等方面表现突出。
三、前置条件
3.1.基础环境
操作系统:centos7
Tesla V100-SXM2-32GB CUDA Version: 12.2
3.2.下载模型
huggingface:
https://huggingface.co/Qwen/Qwen2.5-Coder-7B-Instruct/tree/main
ModelScope:
git clone https://www.modelscope.cn/qwen/Qwen2.5-Coder-7B-Instruct.git
PS:
1. 根据实际情况选择不同规格的模型
3.3.创建虚拟环境
conda create --name qwen2.5 python=3.10
3.4.安装依赖库
conda activate qwen2.5
pip install transformers torch accelerate
四、使用方式
4.1.自动生成代码
使用场景:
1. 基本功能实现
- 请生成一个用于计算两个数之和的 Python 函数。
- 创建一个 JavaScript 函数,用于验证邮箱地址的格式。
2. 特定框架或库
- 使用 Flask 框架生成一个简单的用户注册 API,包括输入验证和数据库存储。
- 请创建一个 React 组件,用于显示用户信息,并支持编辑功能。
3. 数据结构和算法
- 编写一个 Python 函数,使用快速排序算法对给定的列表进行排序。
- 请生成一个 Java 类实现链表的基本操作,包括插入、删除和查找。
4. 数据库操作
- 生成一个 SQL 查询,用于从用户表中选择所有年龄大于 18 岁的用户。
- 请创建一个 Python 脚本,连接到 MySQL 数据库并插入一条新记录。
5. 错误处理和日志记录
- 编写一个 Node.js 函数,处理文件读取错误并记录错误信息到日志文件。
- 请生成一个 Java 方法,捕获异常并返回友好的错误消息。
6. API 集成
- 创建一个 Python 函数,调用 GitHub API 获取用户信息并返回 JSON 格式的数据。
- 请生成一个 JavaScript 代码片段,使用 Fetch API 从天气服务获取当前天气数据。
7. 用户界面
- 生成一个 HTML 表单,包含姓名、邮箱和密码字段,并添加基本的输入验证。
- 请创建一个 Vue.js 组件,显示一个可搜索的产品列表。
8. 测试用例
- 请为以下 Python 函数生成单元测试def add(a, b): return a + b。
- 生成一个 JavaScript 测试用例,验证 fetchData 函数是否正确处理 API 响应。
9. 文件操作
- 编写一个 Python 脚本,读取一个文本文件并统计每行的单词数。
- 请生成一个 Java 程序,创建一个新的 CSV 文件并写入一些示例数据。
示例代码:
# -*- coding = utf-8 -*-
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig
device = "cuda"
modelPath = '/data/model/qwen2.5-coder-7b-instruct'
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
# 自动生成代码
def auto_generate_code(prompt):
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt}
]
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)
if __name__ == '__main__':
config = GenerationConfig.from_pretrained(modelPath, top_p=0.9, temperature=0.1, repetition_penalty=1.1,
do_sample=True, max_new_tokens=8192)
tokenizer = loadTokenizer()
model = loadModel(config)
prompt = '编写一个Node.js函数,处理文件读取错误并记录错误信息到日志文件。'
auto_generate_code(prompt)
调用结果:
4.2.自动补全代码
使用场景:
示例 1:Python 函数补全
初始代码:
```python
def calculate_area(radius):
import math
area =
```
补全提示:
“请补全代码以计算圆的面积。”
示例 2:JavaScript 函数补全
初始代码:
```javascript
function fetchData(url) {
fetch(url)
.then(response => {
if (response.ok) {
return response.json();
} else {
throw new Error('Network response was not ok');
}
})
.then(data => {
console.log(data);
})
}
```
补全提示:
“请补全代码,以添加错误处理和返回数据的功能。”
示例 3:Java 类补全
初始代码:
```java
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
```
补全提示:
“请补全代码以添加 getter 方法。”
示例 4:HTML 表单补全
初始代码:
```html
<form>
<label for="username">Username:</label>
<input type="text" id="username" name="username">
<label for="password">Password:</label>
<input type="password" id="password" name="password">
</form>
```
补全提示:
“请补全代码以添加提交按钮。”
示例 5:SQL 查询补全
初始代码:
```sql
SELECT name, age FROM users WHERE age >
```
补全提示:
“请补全代码以选择所有年龄大于 18 的用户。”
示例代码:
# -*- coding = utf-8 -*-
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig
device = "cuda"
modelPath = '/data/model/qwen2.5-coder-7b-instruct'
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
# 自动补全代码
def auto_complete_code(prompt):
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt}
]
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)
if __name__ == '__main__':
config = GenerationConfig.from_pretrained(modelPath, top_p=0.9, temperature=0.1, repetition_penalty=1.1,
do_sample=True, max_new_tokens=8192)
tokenizer = loadTokenizer()
model = loadModel(config)
prompt = '''
请补全以下javascript代码,以添加错误处理和返回数据的功能。
```javascript
function fetchData(url) {
fetch(url)
.then(response => {
if (response.ok) {
return response.json();
} else {
throw new Error('Network response was not ok');
}
})
.then(data => {
console.log(data);
})
}
```
'''
auto_complete_code(prompt)
调用结果:
4.3.自动翻译代码
使用场景:
示例 1:Python 到 JavaScript
请用JavaScript语言改写下面Python代码,并实现一致的功能
```python
def greet(name):
return f"Hello, {name}!"
print(greet("Alice"))
```
示例 2:Java 到 Python
请用Python语言改写下面java代码,并实现一致的功能
```java
public class Factorial {
public static int factorial(int n) {
if (n == 0) {
return 1;
} else {
return n * factorial(n - 1);
}
}
public static void main(String[] args) {
System.out.println(factorial(5));
}
}
```
示例 3:C# 到 Ruby
请用Ruby语言改写下面csharp代码,并实现一致的功能
```csharp
using System;
class Program {
static void Main() {
Console.WriteLine("Enter your name:");
string name = Console.ReadLine();
Console.WriteLine($"Hello, {name}!");
}
}
```
示例 4:JavaScript 到 PHP
请用PHP语言改写下面JavaScript代码,并实现一致的功能
```javascript
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(num => num * 2);
console.log(doubled);
```
示例 5:Swift 到 Kotlin
请用Kotlin语言改写下面Swift代码,并实现一致的功能
```swift
func greet(name: String) -> String {
return "Hello, \(name)!"
}
print(greet(name: "Bob"))
```
示例代码:
# -*- coding = utf-8 -*-
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig
device = "cuda"
modelPath = '/data/model/qwen2.5-coder-7b-instruct'
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
# 自动翻译代码
def auto_translation_code(prompt):
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt}
]
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)
if __name__ == '__main__':
config = GenerationConfig.from_pretrained(modelPath, top_p=0.9, temperature=0.1, repetition_penalty=1.1,
do_sample=True, max_new_tokens=8192)
tokenizer = loadTokenizer()
model = loadModel(config)
prompt='''
请用Python语言改写下面java代码,并实现一致的功能,具体代码如下:
```java
public class Factorial {
public static int factorial(int n) {
if (n == 0) {
return 1;
} else {
return n * factorial(n - 1);
}
}
public static void main(String[] args) {
System.out.println(factorial(5));
}
}
```
'''
auto_translation_code(prompt)
调用结果:
更多推荐
所有评论(0)