純Python代碼從零構(gòu)建一個(gè)AI多智能體系統(tǒng)
單個(gè) AI 能做的事有限,三個(gè) AI 分工協(xié)作能做的事遠(yuǎn)超你想象。本文用純 Python 從零實(shí)現(xiàn)一個(gè)多智能體系統(tǒng),完整代碼可直接運(yùn)行。

一、什么是多智能體系統(tǒng)(Multi-Agent System)?
簡單說:多個(gè) AI Agent 各司其職,協(xié)作完成一個(gè)復(fù)雜任務(wù)。
類比現(xiàn)實(shí)團(tuán)隊(duì):
- 產(chǎn)品經(jīng)理負(fù)責(zé)分析需求
- 程序員負(fù)責(zé)寫代碼
- 測試工程師負(fù)責(zé)檢查質(zhì)量
每個(gè) Agent 有自己的職責(zé)、工具和思考方式,它們之間通過消息傳遞來協(xié)作。

二、為什么不用現(xiàn)成框架?
LangGraph、CrewAI、AutoGen 都很好,但先理解原理再選框架,才是正確的學(xué)習(xí)路徑。

本文先用純 Python 實(shí)現(xiàn)核心邏輯,再對比框架選型。
三、系統(tǒng)架構(gòu)設(shè)計(jì)
我們要構(gòu)建的系統(tǒng):AI 研發(fā)小隊(duì)
用戶輸入需求 → 協(xié)調(diào)者拆分任務(wù) → 三位 Agent 各司其職 → 匯總交付
| 角色 | 職責(zé) | 工具 |
|---|---|---|
| Coordinator(協(xié)調(diào)者) | 分析需求、分配任務(wù)、匯總結(jié)果 | 任務(wù)拆解、結(jié)果整合 |
| Researcher(研究員) | 搜集技術(shù)方案、查找最佳實(shí)踐 | 知識檢索、方案分析 |
| Coder(程序員) | 編寫代碼實(shí)現(xiàn) | 代碼生成、文件操作 |
| Reviewer(審查員) | 檢查代碼質(zhì)量和安全性 | 代碼審查、漏洞掃描 |
四、代碼實(shí)現(xiàn)
4.1 基礎(chǔ)類:定義 Agent
# agent.py
import json
import ollama
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class Message:
role: str # "user" | "agent" | "system"
sender: str # 發(fā)送者名稱
content: str
@dataclass
class Agent:
name: str
role: str
system_prompt: str
model: str = "qwen3:8b"
history: list = field(default_factory=list)
def think(self, messages: list[Message]) -> str:
"""思考并回復(fù)"""
# 構(gòu)建完整的消息列表
full_messages = [
{"role": "system", "content": self.system_prompt}
]
for msg in messages:
full_messages.append({
"role": "user" if msg.sender != self.name else "assistant",
"content": f"[來自 {msg.sender}] {msg.content}"
})
# 調(diào)用模型
response = ollama.chat(
model=self.model,
messages=full_messages
)
return response["message"]["content"]
4.2 定義三個(gè)專業(yè) Agent
# agents.py
from agent import Agent
# 研究員 Agent:負(fù)責(zé)技術(shù)調(diào)研
researcher = Agent(
name="Researcher",
role="技術(shù)研究員",
system_prompt="""你是一個(gè)技術(shù)研究員。你的任務(wù)是:
1. 分析用戶需求中涉及的技術(shù)點(diǎn)
2. 給出最佳實(shí)踐和技術(shù)方案建議
3. 列出關(guān)鍵注意事項(xiàng)和潛在風(fēng)險(xiǎn)
輸出格式:
## 技術(shù)分析
(分析內(nèi)容)
## 推薦方案
(方案詳情)
## 注意事項(xiàng)
(風(fēng)險(xiǎn)和注意點(diǎn))"""
)
# 程序員 Agent:負(fù)責(zé)寫代碼
coder = Agent(
name="Coder",
role="高級程序員",
system_prompt="""你是一個(gè)高級 Python 程序員。你的任務(wù)是:
1. 根據(jù)需求和調(diào)研結(jié)果編寫高質(zhì)量的 Python 代碼
2. 代碼必須包含完整的類型注解和 docstring
3. 包含錯(cuò)誤處理和日志記錄
4. 輸出可直接運(yùn)行的完整代碼
輸出格式:
## 實(shí)現(xiàn)思路
(簡述思路)
## 完整代碼
```python
(代碼)
```"""
)
# 審查員 Agent:負(fù)責(zé)代碼審查
reviewer = Agent(
name="Reviewer",
role="代碼審查專家",
system_prompt="""你是一個(gè)嚴(yán)格的代碼審查專家。你的任務(wù)是:
1. 審查代碼的正確性、安全性和性能
2. 檢查是否遵循最佳實(shí)踐
3. 給出修改建議
評分標(biāo)準(zhǔn)(滿分 10 分):
- 正確性:代碼邏輯是否正確
- 安全性:是否存在安全漏洞
- 可讀性:命名、注釋、代碼結(jié)構(gòu)
- 性能:是否有明顯的性能問題
輸出格式:
## 評分:X/10
## 優(yōu)點(diǎn)
(列出優(yōu)點(diǎn))
## 問題
(列出問題)
## 修改建議
(具體建議)"""
)
4.3 協(xié)調(diào)者:任務(wù)調(diào)度中心
# coordinator.py
from agent import Agent, Message
class Coordinator:
"""協(xié)調(diào)者:負(fù)責(zé)調(diào)度多個(gè) Agent 協(xié)作"""
def __init__(self, researcher, coder, reviewer):
self.researcher = researcher
self.coder = coder
self.reviewer = reviewer
self.log = []
def _log(self, phase: str, content: str):
"""記錄執(zhí)行日志"""
self.log.append({"phase": phase, "content": content})
print(f"\n{'='*60}")
print(f"?? [{phase}]")
print(f"{'='*60}")
print(content[:500] + "..." if len(content) > 500 else content)
def run(self, task: str, max_revisions: int = 2) -> dict:
"""
執(zhí)行完整的多智能體協(xié)作流程
Args:
task: 用戶需求描述
max_revisions: 最大修改輪數(shù)
Returns:
包含所有階段輸出的字典
"""
results = {"task": task, "phases": []}
# ========== 第一階段:需求分析 + 技術(shù)調(diào)研 ==========
print("\n?? 第一階段:技術(shù)調(diào)研")
research_msg = Message(
role="user", sender="Coordinator",
content=f"請分析以下需求的技術(shù)方案:\n{task}"
)
research_result = self.researcher.think([research_msg])
self._log("技術(shù)調(diào)研", research_result)
results["phases"].append({
"phase": "research", "output": research_result
})
# ========== 第二階段:代碼生成 ==========
print("\n?? 第二階段:代碼生成")
code_msg = Message(
role="user", sender="Coordinator",
content=f"""請根據(jù)以下需求和調(diào)研結(jié)果編寫代碼:
## 需求
{task}
## 技術(shù)調(diào)研結(jié)果
{research_result}
請直接輸出完整可運(yùn)行的 Python 代碼。"""
)
code_result = self.coder.think([code_msg])
self._log("代碼生成", code_result)
results["phases"].append({
"phase": "code", "output": code_result
})
# ========== 第三階段:代碼審查(可循環(huán)) ==========
current_code = code_result
revision = 0
while revision <= max_revisions:
print(f"\n?? 第三階段:代碼審查(第 {revision + 1} 次)")
review_msg = Message(
role="user", sender="Coordinator",
content=f"請審查以下代碼:\n{current_code}"
)
review_result = self.reviewer.think([review_msg])
self._log(f"代碼審查(第{revision+1}次)", review_result)
# 檢查評分(簡單解析)
score = self._extract_score(review_result)
print(f"\n?? 當(dāng)前評分:{score}/10")
if score >= 8 or revision == max_revisions:
results["phases"].append({
"phase": "review",
"output": review_result,
"score": score
})
break
# 分?jǐn)?shù)不夠,讓程序員修改
print(f"\n?? 評分不足,進(jìn)入修改...")
fix_msg = Message(
role="user", sender="Coordinator",
content=f"""請根據(jù)審查意見修改代碼:
## 審查意見
{review_result}
## 原始代碼
{current_code}
請輸出修改后的完整代碼。"""
)
current_code = self.coder.think([fix_msg])
self._log(f"代碼修改(第{revision+1}次)", current_code)
revision += 1
results["final_code"] = current_code
results["revisions"] = revision + 1
return results
def _extract_score(self, review_text: str) -> int:
"""從審查結(jié)果中提取評分"""
for line in review_text.split("\n"):
if "評分" in line and "/" in line:
try:
score = int(line.split(":")[-1].strip().split("/")[0])
return score
except (ValueError, IndexError):
pass
return 5 # 默認(rèn)評分
4.4 主程序:啟動(dòng)你的 AI 團(tuán)隊(duì)
# main.py
from agents import researcher, coder, reviewer
from coordinator import Coordinator
import json
def main():
print("?? AI 研發(fā)小隊(duì)已就緒!")
print("=" * 60)
# 初始化協(xié)調(diào)者
coordinator = Coordinator(researcher, coder, reviewer)
# 示例任務(wù)
task = "用 Python 寫一個(gè)文件批量重命名工具,支持按日期、序號、正則匹配重命名,需要命令行參數(shù)解析和日志記錄"
# 執(zhí)行任務(wù)
results = coordinator.run(task, max_revisions=2)
# 輸出最終結(jié)果
print("\n" + "=" * 60)
print("? 任務(wù)完成!")
print("=" * 60)
print(f"\n?? 總修改輪數(shù):{results['revisions']}")
print(f"\n?? 最終代碼:\n{results['final_code']}")
# 保存結(jié)果
with open("output.json", "w", encoding="utf-8") as f:
json.dump(results, f, ensure_ascii=False, indent=2)
print("\n?? 完整結(jié)果已保存到 output.json")
if __name__ == "__main__":
main()
五、執(zhí)行流程詳解

六、擴(kuò)展:加入工具能力
讓 Agent 不只是"說話",還能"做事":
# tools.py
import os
import subprocess
def write_file(path: str, content: str) -> str:
"""寫入文件"""
os.makedirs(os.path.dirname(path) or ".", exist_ok=True)
with open(path, "w", encoding="utf-8") as f:
f.write(content)
return f"文件已寫入: {path}"
def run_python(filepath: str) -> str:
"""運(yùn)行 Python 文件并返回結(jié)果"""
try:
result = subprocess.run(
["python", filepath],
capture_output=True, text=True, timeout=30
)
output = result.stdout
if result.returncode != 0:
output += f"\n? 錯(cuò)誤:\n{result.stderr}"
return output
except subprocess.TimeoutExpired:
return "執(zhí)行超時(shí)(30秒)"
# 將工具注冊到 Agent
AVAILABLE_TOOLS = {
"write_file": {
"func": write_file,
"description": "將內(nèi)容寫入指定文件",
"params": ["path", "content"]
},
"run_python": {
"func": run_python,
"description": "運(yùn)行 Python 文件",
"params": ["filepath"]
}
}
七、性能對比
在我的測試環(huán)境(i7-13700K + 32GB 內(nèi)存,純 CPU 模式)下的表現(xiàn):

| 任務(wù)復(fù)雜度 | Agent 數(shù)量 | 平均耗時(shí) | 修改輪數(shù) |
|---|---|---|---|
| 簡單(單文件腳本) | 3 | ~2 分鐘 | 1 輪 |
| 中等(帶參數(shù)的工具) | 3 | ~5 分鐘 | 1-2 輪 |
| 復(fù)雜(多文件項(xiàng)目) | 4-5 | ~10 分鐘 | 2-3 輪 |
如有 GPU,速度可提升 3-5 倍。
八、注意事項(xiàng)
- Prompt 是靈魂:每個(gè) Agent 的 System Prompt 決定了它的輸出質(zhì)量,值得反復(fù)打磨
- 防止死循環(huán):設(shè)置
max_revisions上限,避免審查員和程序員無限互相"踢皮球" - 上下文窗口:長對話會消耗大量 token,注意定期截?cái)鄽v史
- 錯(cuò)誤處理:模型偶爾會輸出格式不符的內(nèi)容,需要做容錯(cuò)解析
- 本地模型局限:8B 模型的多步推理能力有限,復(fù)雜任務(wù)建議用 GPT-5 或 Claude
總結(jié)

多智能體系統(tǒng)的核心理念:不是讓一個(gè) AI 做所有事,而是讓多個(gè)專精 AI 各司其職、互相補(bǔ)位。
就像真正的團(tuán)隊(duì)一樣——沒有人是全能的,但一個(gè)好的團(tuán)隊(duì)可以。
以上就是純Python代碼從零構(gòu)建一個(gè)AI多智能體系統(tǒng)的詳細(xì)內(nèi)容,更多關(guān)于Python構(gòu)建AI多智能體系統(tǒng)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)剪貼板中轉(zhuǎn)換C語言代碼為printf語句
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)剪貼板中轉(zhuǎn)換C語言代碼為printf語句,可以用于運(yùn)行代碼的追蹤,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2026-02-02
python os.listdir按文件存取時(shí)間順序列出目錄的實(shí)例
今天小編就為大家分享一篇python os.listdir按文件存取時(shí)間順序列出目錄的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10
python使用django調(diào)用deepseek api搭建ai網(wǎng)站
DeepSeek是一家人工智能公司,致力于通過創(chuàng)新的技術(shù)和算法,推動(dòng)人工智能領(lǐng)域的發(fā)展,本文給大家介紹了python使用django調(diào)用deepseek api搭建ai網(wǎng)站,文中有相關(guān)的代碼示例供大家參考,感興趣的小伙伴跟著小編一起來看看吧2025-02-02
python wxpython 實(shí)現(xiàn)界面跳轉(zhuǎn)功能
wxpython沒提供界面跳轉(zhuǎn)的方式,所以就需要借助threading模塊,本文給大家分享python wxpython 實(shí)現(xiàn)界面跳轉(zhuǎn)功能,感興趣的朋友跟隨小編一起看看吧2019-12-12
python操作docx寫入內(nèi)容,并控制文本的字體顏色
今天小編就為大家分享一篇python操作docx寫入內(nèi)容,并控制文本的字體顏色,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
Python實(shí)現(xiàn)exe小工具的詳細(xì)代碼
Python exe工具是一種將Python代碼打包成可執(zhí)行文件的工具,它可以將Python程序轉(zhuǎn)換為獨(dú)立的可執(zhí)行文件,使得在沒有安裝Python解釋器的環(huán)境中也能夠運(yùn)行Python程序,本文給大家介紹了Python實(shí)現(xiàn)exe小工具的詳細(xì)代碼,需要的朋友可以參考下2024-04-04
Django多數(shù)據(jù)庫配置及逆向生成model教程
這篇文章主要介紹了Django多數(shù)據(jù)庫配置及逆向生成model教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03

