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