9 月 19 日,阿里開源了 Qwen2.5 系列大模型全家桶:除常規(guī)的語(yǔ)言模型 Qwen2.5 之外,還發(fā)布了專門針對(duì)編程的Qwen2.5-Coder模型和數(shù)學(xué)的 Qwen2.5-Math 模型,并且針對(duì)每個(gè)模型都提供了不同規(guī)模參數(shù)版本,包括:
Qwen2.5 系列模型性能和推理能力對(duì)比,老牛同學(xué)不在贅述,我們可以到 Qwen 官網(wǎng)博客查看詳細(xì)介紹:https://qwenlm.github.io/zh/blog/qwen2.5/
在國(guó)內(nèi)開源大模型中,老牛同學(xué)用遙遙領(lǐng)先做為 Qwen2.5 模型系列總結(jié)一點(diǎn)也不為過(guò),國(guó)內(nèi)開源大模型能真打的實(shí)在是太少了!
老牛同學(xué)對(duì)Qwen2.5-Coder比較感興趣,可能是老牛同學(xué)專業(yè)的原因,非常期待能有一個(gè)智能編程的模型或應(yīng)用,真所謂:碼無(wú)止境,學(xué)無(wú)止境!
今天,老牛同學(xué)就基于Qwen2.5-Coder模型,結(jié)合CrewAI多智能體框架,實(shí)現(xiàn)一個(gè)能根據(jù)軟件需求編寫程序代碼的系統(tǒng),同時(shí)感受一下Qwen2.5-Coder的能力。因此本文大致分為以下三部分:
通過(guò)老牛同學(xué)前面的文章可以看到,我們至少有 3 種方式在本地部署和推理大模型,本文就是不在詳細(xì)介紹其過(guò)程了(感興趣的朋友可以翻看一下老牛同學(xué)之前文章)。
為了盡快實(shí)現(xiàn)我們的目標(biāo),我們將使用Ollama快速在本地部署Qwen2.5-Coder模型;關(guān)于 Ollama 的詳細(xì)介紹和使用教程,可以參考老牛同學(xué)之前文章:https://mp.weixin.qq.com/s/majDONtuAUzN2SAaYWxH1Q
我們安裝好Ollama程序之后,通過(guò)以下一條命令,即可完成大模型的下載和部署:
ollama run qwen2.5-coder:7b
下載和部署成功之后,Ollama默認(rèn)自帶了一個(gè)終端對(duì)話窗口:
至此,Qwen2.5-Coder模型本地部署就成功了,接下來(lái)我們來(lái)實(shí)現(xiàn)多智能體代碼邏輯~
CrewAI是一個(gè)多智能體框架,關(guān)于它的詳細(xì)介紹和使用教程,可以參考老牛同學(xué)之前文章:https://mp.weixin.qq.com/s/wqOqupVIDsKDW-Kmj3IRYw
工欲善其事,必先利其器,我們先準(zhǔn)備一下CrewAI的研發(fā)環(huán)境,我們通過(guò)Miniconda管理 Python 虛擬環(huán)境,Miniconda的安裝和使用可以參考老牛同學(xué)之前的文章:https://mp.weixin.qq.com/s/P_ufvz4MWVSqv_VM-rJp9w
# Python虛擬環(huán)境名:CrewAI,版本號(hào):3.10
conda create -n CrewAI python=3.10 -y
# 激活虛擬環(huán)境
conda activate CrewAI
# 安裝 CrewAI 框架依賴
pip install crewai
我們的編程智能體為游戲智能編程團(tuán)隊(duì)(姑且就叫這個(gè)名吧),這個(gè)團(tuán)隊(duì)由3 個(gè)角色組成(即:3 個(gè)智能體),他們的工作職責(zé)設(shè)定如下:
我們通過(guò)以下步驟,完成游戲智能編程團(tuán)隊(duì)整體邏輯(Python 文件:CrewAI-Game.py),首先我們需要導(dǎo)入程序的均依賴類:
import os
from textwrap import dedent
from crewai import Agent, Task, Crew
【第一步:配置Qwen2.5-Coder大模型】
# 配置模型(qwen2.5-coder:7b)
os.environ['OPENAI_API_BASE'] = 'http://127.0.0.1:11434/v1'
os.environ['OPENAI_MODEL_NAME'] = 'qwen2.5-coder:7b',
os.environ['OPENAI_API_KEY'] = 'EMPTY'
【第二步:定義3 個(gè)角色(即:3 個(gè)智能體)】
3 個(gè)智能體分別是:高級(jí)軟件工程師、高級(jí)質(zhì)量工程師和首席質(zhì)量工程師
#
# 3個(gè)智能體邏輯
#
def senior_engineer_agent():
'''高級(jí)軟件工程師智能體'''
return Agent(
role='高級(jí)軟件工程師',
goal='根據(jù)需求完成軟件編程',
backstory=dedent('''你是一位國(guó)際領(lǐng)先的科技公司的高級(jí)軟件工程師。
你非常擅長(zhǎng)Python編程,并盡自己的最大努力編寫功能齊全、運(yùn)行良好的完美代碼。
'''),
allow_delegation=False,
verbose=True
)
def qa_engineer_agent():
'''高級(jí)軟件質(zhì)量工程師智能體'''
return Agent(
role='高級(jí)軟件質(zhì)量工程師',
goal='分析程序代碼,找出其中的錯(cuò)誤,并修復(fù)這些錯(cuò)誤代碼',
backstory=dedent('''你是一位檢測(cè)代碼的高級(jí)工程師。
你對(duì)代碼細(xì)節(jié)很敏銳,非常擅長(zhǎng)找出代碼中的Bug,包括檢查是否缺少導(dǎo)入、變量聲明、不匹配括號(hào)和語(yǔ)法錯(cuò)誤等。
您還能檢查出代碼的安全漏洞和邏輯錯(cuò)誤。
'''),
allow_delegation=False,
verbose=True
)
def chief_qa_engineer_agent():
'''首席軟件質(zhì)量工程師智能體'''
return Agent(
role='首席軟件質(zhì)量工程師',
goal='確保代碼實(shí)現(xiàn)了需求',
backstory='''你懷疑程序員沒(méi)有按照需求編寫軟件,你特別專注于編寫高質(zhì)量的代碼。''',
allow_delegation=True,
verbose=True
)
【第三步:定義3 個(gè)任務(wù)(即:3 個(gè)智能體的任務(wù))】
與 3 個(gè)智能體對(duì)應(yīng),每個(gè)智能體均對(duì)應(yīng)有 1 個(gè)任務(wù):
#
# 3個(gè)任務(wù)邏輯
#
def code_task(agent, game):
return Task(description=dedent(f'''你將按照軟件需求,使用Python編寫程序:
軟件需求
------------
{game}
'''),
expected_output='你的輸出是完整的Python代碼, 特別注意只需要輸出Python代碼,不要輸出其他任何內(nèi)容!',
agent=agent
)
def review_task(agent, game):
return Task(description=dedent(f'''你將按照軟件需求,進(jìn)一步使用Python完善給定的程序:
軟件需求
------------
{game}
根據(jù)給定的Python程序代碼,檢查其中的錯(cuò)誤。包括檢查邏輯錯(cuò)誤語(yǔ)法錯(cuò)誤、缺少導(dǎo)入、變量聲明、括號(hào)不匹配,以及安全漏洞。
'''),
expected_output='你的輸出是完整的Python代碼, 特別注意只需要輸出Python代碼,不要輸出其他任何內(nèi)容!',
agent=agent
)
def evaluate_task(agent, game):
return Task(description=dedent(f'''你將按照軟件需求,進(jìn)一步使用Python完善給定的程序:
軟件需求
------------
{game}
查看給定的Python程序代碼,確保程序代碼完整,并且符合軟件需求。
'''),
expected_output='你的輸出是完整的Python代碼, 特別注意只需要輸出Python代碼,不要輸出其他任何內(nèi)容!',
agent=agent
)
【第四步:定義團(tuán)隊(duì),組織智能體協(xié)同執(zhí)行任務(wù)】
CrewAI中,Crew代表團(tuán)隊(duì),它有agents和tasks這 2 個(gè)核心屬性,最終通過(guò)kickoff()方法觸發(fā)執(zhí)行整個(gè)流程:
#
# 團(tuán)隊(duì)邏輯
#
print('')
game = input('# 您好,我們是游戲智能編程團(tuán)隊(duì),請(qǐng)輸入游戲的詳細(xì)描述:\n\n')
print('')
# 智能體
senior_engineer_agent = senior_engineer_agent()
qa_engineer_agent = qa_engineer_agent()
chief_qa_engineer_agent = chief_qa_engineer_agent()
# 任務(wù)
code_game = code_task(senior_engineer_agent, game)
review_game = review_task(qa_engineer_agent, game)
approve_game = evaluate_task(chief_qa_engineer_agent, game)
# 團(tuán)隊(duì)
crew = Crew(
agents=[
senior_engineer_agent,
qa_engineer_agent,
chief_qa_engineer_agent
],
tasks=[
code_game,
review_game,
approve_game
],
verbose=True
)
# 執(zhí)行
game_code = crew.kickoff()
最后,我們拿到 Python 代碼之后,希望能保存到本地文件(Python 文件:Game.py):
# 輸出
print('\n\n########################')
print('## 游戲代碼結(jié)果')
print('########################\n')
print(game_code)
# 存儲(chǔ)代碼
filename = 'Game.py'
print('\n\n########################\n')
with open(filename, 'w', encoding='utf-8') as file:
file.write(game_code)
print(f'游戲代碼已經(jīng)存儲(chǔ)到文件: {filename}')
print(f'你可以運(yùn)行游戲:python {filename}')
以上步驟即完成了我們只能編程團(tuán)隊(duì)代碼,接下就可以執(zhí)行了:python CrewAI-Game.py
CrewAI 執(zhí)行過(guò)程中,我們看到 3 個(gè)智能體執(zhí)行詳細(xì)信息:
最后,我們運(yùn)行本地存儲(chǔ)的小游戲程序:python Game.py
因?yàn)槌绦蚴褂玫搅?/span>Pygame包,如果虛擬環(huán)境沒(méi)有的話,需要安裝一下:pip install pygame
最終我們運(yùn)行起來(lái)了貪吃蛇游戲:
至此,本次我們需求基本完成了,我們通過(guò)定義的 3 個(gè)智能體和對(duì)應(yīng)的任務(wù),最終智能體與Qwen2.5-Coder交互完成軟件需求程序的編寫。
程序最終還能跑起來(lái),這也進(jìn)一步體現(xiàn)了Qwen2.5-Coder模型的語(yǔ)音和代碼推理能力!
往期推薦文章:
vLLM CPU 和 GPU 模式署和推理 Qwen2 等大語(yǔ)言模型詳細(xì)教程
基于 Qwen2/Lllama3 等大模型,部署團(tuán)隊(duì)私有化 RAG 知識(shí)庫(kù)系統(tǒng)的詳細(xì)教程(Docker+AnythingLLM)
使用 Llama3/Qwen2 等開源大模型,部署團(tuán)隊(duì)私有化 Code Copilot 和使用教程
基于 Qwen2 大模型微調(diào)技術(shù)詳細(xì)教程(LoRA 參數(shù)高效微調(diào)和 SwanLab 可視化監(jiān)控)
ChatTTS 長(zhǎng)音頻合成和本地部署 2 種方式,讓你的“兒童繪本”發(fā)聲的實(shí)戰(zhàn)教程
MiniCPM-V 2.6 面壁“小鋼炮”,多圖、視頻理解多模態(tài)模型,部署和推理實(shí)戰(zhàn)教程
聯(lián)系客服