MetaGPT作为一款以“模拟企业协作流程”为核心的多智能体框架,能够将复杂任务拆解为不同角色的子任务,通过智能体间的信息流转和能力互补完成端到端的工作闭环。本文将手把手教你搭建“网页生成Agent团队”,让产品经理Agent、前端Agent、测试Agent各司其职,最终自动输出无语法错误的可运行网页文件,彻底打通“自然语言需求→代码实现→成果交付”的全流程。

一、核心设计思路

1.1 MetaGPT多智能体协作逻辑

MetaGPT的核心是“角色化分工+标准化成果流转”,针对“网页生成”场景,我们将任务拆解为4个核心环节:

graph LR
    A[用户自然语言需求] --> B[产品经理Agent:需求分析]
    B --> C[前端Agent:编写HTML/CSS代码]
    C --> D[测试Agent:语法错误检测]
    D --> E{测试通过?}
    E -- 是 --> F[输出最终网页文件]
    E -- 否 --> G[反馈给前端Agent修正]

1.2 核心技术依赖

  • 基础框架:MetaGPT(Python 3.10+),提供智能体角色定义、任务调度、消息通信能力;
  • 代码生成:基于大模型(OpenAI/Gemini/通义千问)的代码生成能力;
  • 语法检测:BeautifulSoup、lxml(HTML结构校验)、csslint(CSS语法检测);
  • 环境配置:需提前配置大模型API密钥(支持主流商用/开源模型)。

二、环境准备

2.1 安装核心依赖

# 安装MetaGPT核心包
pip install metagpt>=0.8.0

# 安装语法检测依赖
pip install beautifulsoup4 lxml csslint

# 配置工作目录(成果输出路径)
export METAGPT_WORKSPACE="./web_agent_workspace"
mkdir -p $METAGPT_WORKSPACE

2.2 配置大模型密钥

创建config.yaml文件(MetaGPT默认读取路径:~/.metagpt/config.yaml):

llm:
  api_type: "openai"  # 可选:openai/anthropic/qwen(通义千问)
  api_key: "你的API密钥"
  base_url: "https://api.openai.com/v1"  # 国产模型替换为对应地址
  model: "gpt-4o-mini"  # 推荐使用低成本且效果好的模型

三、各Agent角色实现

基于MetaGPT的Role基类,为每个角色定制核心能力,所有代码可直接复制运行。

3.1 产品经理Agent:需求分析

核心职责:将模糊的自然语言需求转化为结构化、可落地的前端开发需求文档,明确页面结构、样式、核心元素等。

from metagpt.roles import Role
from metagpt.schema import Message
from metagpt.const import WORKSPACE_ROOT

class ProductManagerAgent(Role):
    def __init__(self):
        super().__init__(
            name="网页产品经理",
            profile="精通网页产品需求分析,能将自然语言需求转化为结构化的前端开发文档",
            goal="输出清晰、可落地的网页开发需求文档",
            constraints=[
                "需求文档需包含页面标题、核心结构(头部/主体/底部)、样式要求(主色调/字体)、核心元素(按钮/文本/图片)",
                "语言简洁,避免模糊表述,确保前端Agent能直接理解"
            ]
        )

    async def handle(self, msg: Message) -> Message:
        """处理用户需求,生成结构化需求文档"""
        user_requirement = msg.content
        # 调用大模型生成结构化需求文档
        prompt = f"""
        请将以下用户需求转化为网页开发需求文档:
        用户需求:{user_requirement}
        文档格式要求:
        1. 页面标题
        2. 页面结构(头部/主体/底部)
        3. 样式要求(主色调、字体、布局)
        4. 核心元素(必须包含的按钮/文本/图片等)
        """
        # 调用MetaGPT内置的LLM能力
        requirement_doc = await self._aask(prompt)
        
        # 保存需求文档到工作目录
        doc_path = f"{WORKSPACE_ROOT}/需求文档.md"
        with open(doc_path, "w", encoding="utf-8") as f:
            f.write(requirement_doc)
        
        return Message(
            content=f"需求分析完成,文档路径:{doc_path}\n需求摘要:{requirement_doc[:200]}...",
            role=self.name
        )

3.2 前端Agent:编写HTML/CSS代码

核心职责:基于产品经理的需求文档,生成符合W3C标准的HTML/CSS代码,样式内联便于测试,输出可直接运行的.html文件。

class FrontendAgent(Role):
    def __init__(self):
        super().__init__(
            name="前端开发工程师",
            profile="精通HTML/CSS,能根据需求文档编写规范、可运行的静态网页代码",
            goal="输出无基础语法错误的HTML/CSS代码文件",
            constraints=[
                "代码符合W3C标准,标签闭合完整,样式语法规范",
                "样式内联在HTML文件中,无需外部CSS文件",
                "文件名统一为index.html,保存到工作目录"
            ]
        )

    async def handle(self, msg: Message) -> Message:
        """基于需求文档生成HTML/CSS代码"""
        # 读取需求文档
        doc_path = msg.content.split("文档路径:")[1].split("\n")[0]
        with open(doc_path, "r", encoding="utf-8") as f:
            requirement_doc = f.read()
        
        # 调用大模型生成HTML/CSS代码
        prompt = f"""
        请根据以下需求文档编写完整的HTML/CSS代码:
        {requirement_doc}
        代码要求:
        1. 完整的HTML5结构(DOCTYPE、html/head/body标签)
        2. 响应式布局,适配PC和移动端
        3. 样式内联在<style>标签中,主色调符合需求
        4. 包含需求中指定的所有核心元素
        """
        html_code = await self._aask(prompt)
        
        # 提取纯代码(过滤大模型的自然语言说明)
        if "```html" in html_code:
            html_code = html_code.split("```html")[1].split("```")[0]
        
        # 保存代码文件
        code_path = f"{WORKSPACE_ROOT}/index.html"
        with open(code_path, "w", encoding="utf-8") as f:
            f.write(html_code)
        
        return Message(
            content=f"前端代码生成完成,文件路径:{code_path}",
            role=self.name
        )

3.3 测试Agent:语法错误检测

核心职责:校验HTML/CSS代码的语法错误(标签未闭合、属性错误、CSS语法错误等),输出测试报告,验收通过则触发最终文件输出。

import os
from bs4 import BeautifulSoup
import subprocess

class TestAgent(Role):
    def __init__(self):
        super().__init__(
            name="前端测试工程师",
            profile="精通HTML/CSS语法检测,能识别常见的语法错误",
            goal="检测网页代码语法错误,输出测试报告,确认是否可交付最终文件",
            constraints=[
                "重点检测:HTML标签闭合、属性格式、CSS语法规范",
                "若错误数为0,判定为验收通过;否则输出具体错误信息",
                "测试报告保存到工作目录"
            ]
        )

    def check_html_syntax(self, code_path):
        """检测HTML语法错误"""
        errors = []
        try:
            with open(code_path, "r", encoding="utf-8") as f:
                html_content = f.read()
            
            # 检测标签闭合
            soup = BeautifulSoup(html_content, "lxml")
            # 检查是否有未闭合的标签(简化版,可扩展更严格的校验)
            unclosed_tags = []
            for tag in soup.find_all():
                if not tag.find(string=True, recursive=False) and len(tag.contents) == 0 and not tag.name in ["img", "input", "br"]:
                    unclosed_tags.append(tag.name)
            if unclosed_tags:
                errors.append(f"HTML未闭合标签:{','.join(unclosed_tags)}")
            
            # 检测CSS语法(使用csslint)
            css_content = html_content.split("<style>")[1].split("</style>")[0] if "<style>" in html_content else ""
            if css_content:
                # 临时保存CSS内容
                css_path = f"{WORKSPACE_ROOT}/temp.css"
                with open(css_path, "w", encoding="utf-8") as f:
                    f.write(css_content)
                # 调用csslint检测
                result = subprocess.run(
                    ["csslint", css_path],
                    capture_output=True,
                    text=True,
                    encoding="utf-8"
                )
                if result.returncode != 0 and result.stderr:
                    errors.append(f"CSS语法错误:{result.stderr[:200]}...")
                os.remove(css_path)
                
        except Exception as e:
            errors.append(f"文件读取/解析错误:{str(e)}")
        return errors

    async def handle(self, msg: Message) -> Message:
        """执行语法检测,生成测试报告"""
        code_path = msg.content.split("文件路径:")[1]
        errors = self.check_html_syntax(code_path)
        
        # 生成测试报告
        report_path = f"{WORKSPACE_ROOT}/测试报告.md"
        if not errors:
            report_content = f"""
# 网页代码测试报告
- 测试文件:{code_path}
- 测试结果:通过(无语法错误)
- 结论:可输出最终网页文件
            """
            status = "通过"
        else:
            report_content = f"""
# 网页代码测试报告
- 测试文件:{code_path}
- 测试结果:失败
- 错误列表:
  {chr(10).join([f"- {err}" for err in errors])}
- 结论:需修正错误后重新生成
            """
            status = "失败"
        
        # 保存测试报告
        with open(report_path, "w", encoding="utf-8") as f:
            f.write(report_content)
        
        # 验收通过则复制到最终文件目录
        if status == "通过":
            final_dir = f"{WORKSPACE_ROOT}/最终文件"
            os.makedirs(final_dir, exist_ok=True)
            final_path = f"{final_dir}/index.html"
            os.system(f"cp {code_path} {final_path}")
            report_content += f"\n- 最终文件路径:{final_path}"
        
        return Message(
            content=f"测试完成,报告路径:{report_path}\n验收状态:{status}",
            role=self.name
        )

四、启动Agent团队并运行

通过MetaGPT的Team类整合所有Agent,实现任务自动流转和成果输出:

from metagpt.team import Team
import asyncio

async def run_web_agent_team(user_requirement: str):
    """启动网页生成Agent团队"""
    # 1. 创建团队并添加成员
    team = Team()
    team.add_members([
        ProductManagerAgent(),
        FrontendAgent(),
        TestAgent()
    ])

    # 2. 启动团队,传入用户需求
    print("🚀 启动网页生成Agent团队...")
    await team.run(
        project_name="自动生成网页",
        idea=user_requirement,
        send_to="网页产品经理"  # 需求先发送给产品经理Agent
    )

    # 3. 输出最终结果
    final_path = f"{WORKSPACE_ROOT}/最终文件/index.html"
    if os.path.exists(final_path):
        print(f"✅ 任务完成!最终网页文件路径:{final_path}")
    else:
        print("❌ 任务失败!请查看测试报告修正错误。")

# 运行示例:用户需求
if __name__ == "__main__":
    # 自定义用户需求(可替换为任意自然语言描述)
    user_req = "生成一个个人简历网页,包含姓名、工作经历、技能展示区域,主色调为深蓝色,字体为微软雅黑,底部添加联系按钮"
    # 启动团队
    asyncio.run(run_web_agent_team(user_req))

五、实战效果验证

5.1 输入示例

生成一个个人简历网页,包含姓名、工作经历、技能展示区域,主色调为深蓝色,字体为微软雅黑,底部添加联系按钮

5.2 输出成果

  1. 产品经理Agent:生成需求文档.md,明确页面结构、样式、核心元素;
  2. 前端Agent:生成index.html,包含完整的HTML/CSS代码,符合需求;
  3. 测试Agent:检测代码无语法错误,生成测试报告.md,并将文件复制到最终文件目录;
  4. 最终成果:双击最终文件/index.html可直接在浏览器打开,展示完整的个人简历页面。

六、优化与扩展方向

  1. 错误闭环修复:测试Agent发现错误后,自动反馈给前端Agent,触发代码修正,直到验收通过;
  2. 功能扩展:增加后端Agent(编写JavaScript交互逻辑)、设计Agent(优化UI/UX);
  3. 模型优化:替换为本地开源模型(如Llama 3、Qwen2),降低API成本,实现离线运行;
  4. 模板化开发:为前端Agent预设行业模板(博客、商城、简历),提升生成效率;
  5. 可视化管理:集成Web UI,支持可视化配置Agent角色、查看任务进度。

七、总结

基于MetaGPT搭建的“网页生成Agent团队”,核心价值在于将“需求分析-代码开发-测试验收”的人工工作流转化为智能体自动化协作流,不仅降低了网页开发的技术门槛,还能保证成果的规范性和一致性。该方案可适配个人轻量网页开发、企业批量生成静态页面等场景,通过角色扩展和流程优化,还能支撑更复杂的前端开发需求,是AI赋能开发效率提升的典型落地实践。


总结

  1. 核心逻辑:MetaGPT通过“角色化分工+标准化成果流转”实现多Agent协作,产品经理Agent拆解需求、前端Agent生成代码、测试Agent校验语法,最终输出可运行网页;
  2. 实操要点:需提前配置MetaGPT环境和大模型密钥,各Agent基于Role基类实现核心能力,通过Team类完成任务调度;
  3. 扩展方向:可增加错误闭环修复、前端交互开发、本地模型适配等能力,适配更多实际开发场景。

标签: none

添加新评论