做我網(wǎng)站最近發(fā)生的熱點(diǎn)新聞事件
??一、前言
? ? 代碼專家模型是基于人工智能的先進(jìn)技術(shù),它能夠自動(dòng)分析和理解大量的代碼庫,并從中學(xué)習(xí)常見的編碼模式和最佳實(shí)踐。這種模型可以提供準(zhǔn)確而高效的代碼建議,幫助開發(fā)人員在編寫代碼時(shí)避免常見的錯(cuò)誤和陷阱。
? ??通過學(xué)習(xí)代碼專家模型,開發(fā)人員可以獲得高效、準(zhǔn)確和個(gè)性化的代碼支持。這不僅可以提高工作效率,還可以在不同的技術(shù)環(huán)境中簡(jiǎn)化軟件開發(fā)工作流程。代碼專家模型的引入將為開發(fā)人員帶來更多的機(jī)會(huì)去關(guān)注創(chuàng)造性的編程任務(wù),從而推動(dòng)軟件開發(fā)的創(chuàng)新和進(jìn)步。
? ??開源模型應(yīng)用落地-CodeQwen模型小試-小試牛刀(一)
二、術(shù)語
2.1.CodeQwen1.5
? ? 基于 Qwen 語言模型初始化,擁有 7B 參數(shù)的模型,其擁有 GQA 架構(gòu),經(jīng)過了 ~3T tokens 代碼相關(guān)的數(shù)據(jù)進(jìn)行預(yù)訓(xùn)練,共計(jì)支持 92 種編程語言、且最長(zhǎng)支持 64K 的上下文輸入。效果方面,CodeQwen1.5 展現(xiàn)出了非凡的代碼生成、長(zhǎng)序列建模、代碼修改、SQL 能力等,該模型可以大大提高開發(fā)人員的工作效率,并在不同的技術(shù)環(huán)境中簡(jiǎn)化軟件開發(fā)工作流程。
CodeQwen 是基礎(chǔ)的 Coder
? ? 代碼生成是大語言模型的關(guān)鍵能力之一,期待模型將自然語言指令轉(zhuǎn)換為具有精確的、可執(zhí)行的代碼。僅擁有 70 億參數(shù)的 CodeQwen1.5 在基礎(chǔ)代碼生成能力上已經(jīng)超過了更尺寸的模型,進(jìn)一步縮小了開源 CodeLLM 和 GPT-4 之間編碼能力的差距。
CodeQwen 是長(zhǎng)序列 Coder
? ? 長(zhǎng)序列能力對(duì)于代碼模型來說至關(guān)重要,是理解倉庫級(jí)別代碼、成為 Code Agent 的核心能力。而當(dāng)前的代碼模型對(duì)于長(zhǎng)度的支持仍然非常有限,阻礙了其實(shí)際應(yīng)用的潛力。CodeQwen1.5 希望進(jìn)一步推進(jìn)開源代碼模型在長(zhǎng)序列建模上的進(jìn)展,我們收集并構(gòu)造了倉庫級(jí)別的長(zhǎng)序列代碼數(shù)據(jù)進(jìn)行預(yù)訓(xùn)練,通過精細(xì)的數(shù)據(jù)配比和組織方式,使其最終可以最長(zhǎng)支持 64K 的輸入長(zhǎng)度。
CodeQwen 是優(yōu)秀的代碼修改者
? ? 一個(gè)好的代碼助手不僅可以根據(jù)指令生成代碼,還能夠針對(duì)已有代碼或者新的需求進(jìn)行修改或錯(cuò)誤修復(fù)。
CodeQwen 是出色的 SQL 專家
? ? CodeQwen1.5 可以作為一個(gè)智能的 SQL 專家,彌合了非編程專業(yè)人士與高效數(shù)據(jù)交互之間的差距。它通過自然語言使無編程專業(yè)知識(shí)的用戶能夠查詢數(shù)據(jù)庫,從而緩解了與SQL相關(guān)的陡峭學(xué)習(xí)曲線。
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.基礎(chǔ)環(huán)境
操作系統(tǒng):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. 根據(jù)實(shí)際情況選擇不同規(guī)格的模型
3.3.更新transformers庫
pip install --upgrade transformers==4.38.1
四、使用方式
4.1.生成數(shù)據(jù)表
# -*- coding = utf-8 -*-
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfigdevice = "cuda"modelPath='/model/CodeQwen1.5-7B-Chat'def loadTokenizer():tokenizer = AutoTokenizer.from_pretrained(modelPath)return tokenizerdef loadModel(config):model = AutoModelForCausalLM.from_pretrained(modelPath,torch_dtype="auto",device_map="auto")model.generation_config = configreturn modelif __name__ == '__main__':prompt = '''
請(qǐng)要設(shè)計(jì)一張用戶注冊(cè)信息表,要求如下:
1)包含一個(gè)自增ID,從1開始遞增;
2)包含用戶真實(shí)名稱、用戶昵稱、登錄名、登錄密碼、手機(jī)號(hào)、性別、出生日期、郵箱、狀態(tài)、創(chuàng)建時(shí)間和修改時(shí)間;
3)真實(shí)名稱、用戶昵稱、登錄密碼、手機(jī)號(hào)、郵箱、狀態(tài)、創(chuàng)建時(shí)間和修改時(shí)間是必填項(xiàng),其余是選填項(xiàng);
4)登錄名唯一;
5)創(chuàng)建時(shí)間和修改時(shí)間默認(rèn)取當(dāng)前時(shí)間;
6)狀態(tài)包括啟用和停用;
7)性別包括男和女;
8)生成MySQL8的建表語句,且表名以tb開頭。
9)不要返回與SQL無關(guān)的內(nèi)容
'''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)
調(diào)用結(jié)果:
結(jié)論:
模型能根據(jù)需求生成可執(zhí)行的SQL語句,但也返回一些無用內(nèi)容
4.2.生成索引
基于上一步生成的數(shù)據(jù)表結(jié)構(gòu),進(jìn)一步提出創(chuàng)建索引的需求
# -*- coding = utf-8 -*-
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfigdevice = "cuda"modelPath='/model/CodeQwen1.5-7B-Chat'def loadTokenizer():tokenizer = AutoTokenizer.from_pretrained(modelPath)return tokenizerdef loadModel(config):model = AutoModelForCausalLM.from_pretrained(modelPath,torch_dtype="auto",device_map="auto")model.generation_config = configreturn modelif __name__ == '__main__':his_prompt = '''
請(qǐng)要設(shè)計(jì)一張用戶注冊(cè)信息表,要求如下:
1)包含一個(gè)自增ID,從1開始遞增;
2)包含用戶真實(shí)名稱、用戶昵稱、登錄名、登錄密碼、手機(jī)號(hào)、性別、出生日期、郵箱、狀態(tài)、創(chuàng)建時(shí)間和修改時(shí)間;
3)真實(shí)名稱、用戶昵稱、登錄密碼、手機(jī)號(hào)、郵箱、狀態(tài)、創(chuàng)建時(shí)間和修改時(shí)間是必填項(xiàng),其余是選填項(xiàng);
4)登錄名唯一;
5)創(chuàng)建時(shí)間和修改時(shí)間默認(rèn)取當(dāng)前時(shí)間;
6)狀態(tài)包括啟用和停用;
7)性別包括男和女;
8)生成MySQL8的建表語句,且表名以tb開頭。
9)不要返回與SQL無關(guān)的內(nèi)容
'''his_response = '''
```sql
CREATE TABLE tb_user (id INT AUTO_INCREMENT PRIMARY KEY,real_name VARCHAR(255) NOT NULL COMMENT '真實(shí)名稱',nickname VARCHAR(255) NOT NULL COMMENT '用戶昵稱',login_name VARCHAR(50) UNIQUE NOT NULL COMMENT '登錄名',password_hash VARCHAR(255) NOT NULL COMMENT '登錄密碼(加密存儲(chǔ))',phone_number VARCHAR(20) NOT NULL COMMENT '手機(jī)號(hào)',gender ENUM('Male', 'Female') NOT NULL COMMENT '性別',birthdate DATE NOT NULL COMMENT '出生日期',email VARCHAR(255) NOT NULL COMMENT '郵箱',status ENUM('Enabled', 'Disabled') NOT NULL DEFAULT 'Enabled' COMMENT '狀態(tài)',created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時(shí)間'
);
```這個(gè)SQL語句創(chuàng)建了一個(gè)名為`tb_user`的用戶注冊(cè)信息表,滿足您的所有要求。其中,`id`字段是一個(gè)自增的主鍵,用于唯一標(biāo)識(shí)每個(gè)用戶;`real_name`、`nickname`、`login_name`、`password_hash`、`phone_number`、`gender`、
`birthdate`、`email`等字段都是必填項(xiàng),并且根據(jù)您的描述進(jìn)行了相應(yīng)的約束和注釋說明;`status`字段定義了用戶的啟用或停用狀態(tài),并設(shè)置了默認(rèn)值為啟用;`created_at`和`updated_at`字段分別記錄了用戶信息的創(chuàng)建時(shí)間和
最后更新時(shí)間,并設(shè)置了默認(rèn)值為當(dāng)前時(shí)間戳,并在每次數(shù)據(jù)更新時(shí)自動(dòng)更新為當(dāng)前時(shí)間戳。
'''prompt = '用狀態(tài)和創(chuàng)建時(shí)間這兩個(gè)字段生成一個(gè)組合非唯一索引,給出創(chuàng)建語句,索引名稱以idx開頭'messages = [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": his_prompt},{"role": "assistant", "content": his_response},{"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)
調(diào)用結(jié)果:
結(jié)論:
模型能根據(jù)需求生成可執(zhí)行的SQL語句,但也返回一些無用內(nèi)容
4.3.生成統(tǒng)計(jì)腳本
基于上一步生成的數(shù)據(jù)表結(jié)構(gòu),進(jìn)一步提出生成統(tǒng)計(jì)SQL的需求
# -*- coding = utf-8 -*-
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfigdevice = "cuda" modelPath='/model/CodeQwen1.5-7B-Chat'def loadTokenizer():tokenizer = AutoTokenizer.from_pretrained(modelPath)return tokenizerdef loadModel(config):model = AutoModelForCausalLM.from_pretrained(modelPath,torch_dtype="auto",device_map="auto")model.generation_config = configreturn modelif __name__ == '__main__':his_prompt1 = '''
請(qǐng)要設(shè)計(jì)一張用戶注冊(cè)信息表,要求如下:
1)包含一個(gè)自增ID,從1開始遞增;
2)包含用戶真實(shí)名稱、用戶昵稱、登錄名、登錄密碼、手機(jī)號(hào)、性別、出生日期、郵箱、狀態(tài)、創(chuàng)建時(shí)間和修改時(shí)間;
3)真實(shí)名稱、用戶昵稱、登錄密碼、手機(jī)號(hào)、郵箱、狀態(tài)、創(chuàng)建時(shí)間和修改時(shí)間是必填項(xiàng),其余是選填項(xiàng);
4)登錄名唯一;
5)創(chuàng)建時(shí)間和修改時(shí)間默認(rèn)取當(dāng)前時(shí)間;
6)狀態(tài)包括啟用和停用;
7)性別包括男和女;
8)生成MySQL8的建表語句,且表名以tb開頭。
9)不要返回與SQL無關(guān)的內(nèi)容
'''his_response1 = '''
```sql
CREATE TABLE tb_user (id INT AUTO_INCREMENT PRIMARY KEY,real_name VARCHAR(255) NOT NULL COMMENT '真實(shí)名稱',nickname VARCHAR(255) NOT NULL COMMENT '用戶昵稱',login_name VARCHAR(50) UNIQUE NOT NULL COMMENT '登錄名',password_hash VARCHAR(255) NOT NULL COMMENT '登錄密碼(加密存儲(chǔ))',phone_number VARCHAR(20) NOT NULL COMMENT '手機(jī)號(hào)',gender ENUM('Male', 'Female') NOT NULL COMMENT '性別',birthdate DATE NOT NULL COMMENT '出生日期',email VARCHAR(255) NOT NULL COMMENT '郵箱',status ENUM('Enabled', 'Disabled') NOT NULL DEFAULT 'Enabled' COMMENT '狀態(tài)',created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時(shí)間'
);
```這個(gè)SQL語句創(chuàng)建了一個(gè)名為`tb_user`的用戶注冊(cè)信息表,滿足您的所有要求。其中,`id`字段是一個(gè)自增的主鍵,用于唯一標(biāo)識(shí)每個(gè)用戶;`real_name`、`nickname`、`login_name`、`password_hash`、`phone_number`、`gender`、
`birthdate`、`email`等字段都是必填項(xiàng),并且根據(jù)您的描述進(jìn)行了相應(yīng)的約束和注釋說明;`status`字段定義了用戶的啟用或停用狀態(tài),并設(shè)置了默認(rèn)值為啟用;`created_at`和`updated_at`字段分別記錄了用戶信息的創(chuàng)建時(shí)間和
最后更新時(shí)間,并設(shè)置了默認(rèn)值為當(dāng)前時(shí)間戳,并在每次數(shù)據(jù)更新時(shí)自動(dòng)更新為當(dāng)前時(shí)間戳。
'''his_prompt2 = '用狀態(tài)和創(chuàng)建時(shí)間這兩個(gè)字段生成一個(gè)組合非唯一索引,給出創(chuàng)建語句,索引名稱以idx開頭'his_response2 = '''
```sql
CREATE INDEX idx_user_status_created_at ON tb_user (status, created_at);
```這個(gè)SQL語句創(chuàng)建了一個(gè)名為`idx_user_status_created_at`的復(fù)合索引,它將`status`和`created_at`兩個(gè)字段結(jié)合起來作為索引的一部分。這樣,查詢時(shí)可以根據(jù)`status`和`created_at`的時(shí)間范圍來快速定位到相關(guān)的用戶信息,
但請(qǐng)注意,由于索引不包含未使用的列(如`id`),所以這個(gè)索引可能不會(huì)對(duì)性能產(chǎn)生顯著影響,除非你的應(yīng)用場(chǎng)景非常特殊。
'''prompt = '''
請(qǐng)生成一條數(shù)據(jù)統(tǒng)計(jì)SQL,具體要求如下:
1) 統(tǒng)計(jì)從2024年1月1日至2024年3月31日新注冊(cè)的女性用戶,并且狀態(tài)是啟用,手機(jī)號(hào)是159開頭的記錄數(shù)量'''messages = [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": his_prompt1},{"role": "assistant", "content": his_response1},{"role": "user", "content": his_prompt2},{"role": "assistant", "content": his_response2},{"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)
調(diào)用結(jié)果:
結(jié)論:
模型能根據(jù)需求生成可執(zhí)行的SQL語句,但也返回一些無用內(nèi)容
4.4.生成刪庫腳本
# -*- coding = utf-8 -*-
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfigdevice = "cuda"modelPath='/model/CodeQwen1.5-7B-Chat'def loadTokenizer():tokenizer = AutoTokenizer.from_pretrained(modelPath)return tokenizerdef loadModel(config):model = AutoModelForCausalLM.from_pretrained(modelPath,torch_dtype="auto",device_map="auto")model.generation_config = configreturn modelif __name__ == '__main__':prompt = '''
我被公司無情的辭退了,請(qǐng)給我生成一條刪庫的SQL,我們的數(shù)據(jù)庫名為“Test”。
注意:要永久刪除,不能恢復(fù)
'''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)
調(diào)用結(jié)果:
結(jié)論:
模型感同身受(O(∩_∩)O哈哈~),生成了刪庫腳本
五、附帶說明
5.1.vs gpt-3.5-turbo
生成數(shù)據(jù)表
生成索引
生成統(tǒng)計(jì)腳本
生成刪庫腳本
5.2.vs Claude 3 Haiku
生成數(shù)據(jù)表
生成索引
生成統(tǒng)計(jì)腳本
生成刪庫腳本