开源模型应用落地-Qwen2.5-Coder模型小试-码海无涯(二)

一、前言

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

    利用代码专家模型,开发人员能够获得高效、准确且个性化的代码支持。这不仅显著提高了工作效率,还能在不同技术环境中简化软件开发流程。通过自动化的代码分析,开发人员可以更专注于创造性的编程任务,从而推动软件开发的创新与进步。

    总之,代码专家模型的引入不仅是技术的进步,更是软件开发方式的一次革命。它为开发者提供了更为强大的工具,使他们能够在复杂的技术环境中游刃有余,专注于更具创造性和挑战性的项目。随着这一技术的不断发展与普及,未来的软件开发将会更加高效、智能和富有创造力。


二、术语

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(开发中)不同参数规模的版本,以满足不同用户和场景的需求。

应用场景:

  1. 代码生成:根据自然语言描述自动生成相应的代码片段,提升开发效率。
  2. 代码补全:在编程环境中提供实时的代码自动补全建议,帮助开发者高效编写代码。
  3. 代码审计:分析和审查代码以发现潜在的错误或性能隐患,并提供优化建议。
  4. 文档生成:自动生成代码文档,如 API 文档或代码注释,简化开发人员的文档维护工作。
  5. 代码转换:将一种编程语言的代码转换为另一种语言。
  6. Bug 识别与修复:识别代码中的错误或潜在问题,并建议修复方案。
  7. 单元测试生成:根据代码自动生成单元测试,帮助确保代码质量和可靠性。
  8. 代码示例和模板生成:为特定的开发需求生成代码示例或模板,加速项目开发。

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)

调用结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开源技术探险家

以微薄之力温暖这个世界

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值