文件名 Metagpt-prd生成.md

Metagpt-prd生成

本文目录

正文

GitHub - FoundationAgents/MetaGPT: 🌟 The Multi-Agent Framework: First AI Software Company, Towards Natural Language Programming

这是一个默认集成软件公司的多智能体框架,每个智能体负责一个软件开发过程中的角色:前端开发、项目经理、后端开发等等。

1. 项目概述

MetaGPT 是一个默认集成了软件公司多智能体框架的工具,每个智能体负责一个软件开发过程中的角色,如前端开发、项目经理、后端开发等。

安装方法

  • 使用命令:pip install metagpt
  • 配置文件:在 config/config2.yaml 中添加 LLM 配置。

最小化使用方法

metagpt "写一个贪吃蛇游戏"

2. MetaGPT 与 PRD 生成

MetaGPT 默认集成了一个 PRD 生成智能体,可以根据传入的 项目概述.txt 生成标题大纲。每个标题会生成对应的 instructionexample,这些信息会作为上下文填入生成内容的 prompt 中。

2.1 重复标题处理

  • 同名标题只会生成一次内容。如果多个标题下存在相同的子标题(例如 概述),系统只会生成一次内容,后续会重复使用已经生成的内容。

2.2 节点分级解析

  • MetaGPT 支持节点分级解析。可以通过调整策略,传入当前节点的所有子节点上下文。
  • 默认策略是一次性生成全部节点,但当节点较多时,容易遇到长度不足的问题,导致程序异常结束。

2.3 生成、质量检查与内容修正逻辑

  • 生成:生成内容
  • 质量检查:检查生成内容的质量
  • 内容修正:根据检查结果进行修正
  • 默认输出格式是 JSON,支持输出 Markdown 和 XML 格式,但 XML 和 Markdown 文档的结构性比 JSON 更强。

3. 核心代码

3.1 节点填充与内容生成

await node.simple_fill(
    schema="markdown",  # 输出格式:markdown/json/raw
    mode="auto"         # 填充模式:auto/single/children
)

schema 参数:

  • markdown: 输出为 Markdown 格式
  • json: 输出为 JSON 结构化格式
  • raw: 输出为原始文本

mode 参数:

  • auto: 自动选择填充策略
  • single: 仅填充当前节点
  • children: 填充当前节点及其所有子节点

3.2 内容审核与修正

审核(Review):

review_comments = await node.review(
    review_mode=ReviewMode.AUTO,  # AUTO/HUMAN
    schema="json"
)

内容修正(Revise):

await node.revise(
    revise_mode=ReviseMode.AUTO,  # AUTO/HUMAN  
    schema="markdown"
)

ReviewMode 参数:

  • AUTO: 自动 LLM 评审
  • HUMAN: 人工评审(需要用户输入)

ReviseMode 参数:

  • AUTO: 自动修正
  • HUMAN: 人工修正

3.3 父子节点关系构建

parent_node = ActionNode(key="父节点", ...)
child_node = ActionNode(key="子节点", ...)
parent_node.add_child(child_node)
await node.simple_fill(
    schema="xml",  # xml解析
    mode="auto"
)

4. 策略选择

根据不同的节点类型和需求,MetaGPT 提供了不同的生成策略:

4.1 策略指南

| 策略 | 适用场景 | 优点 | 缺点 | | — | — | — | — | | simple | 单个小节点 | 快速、成本低 | 易截断、无层级 | | complex | 多层级文档 | 质量高、不截断 | 成本高、无上下文共享、只能单个节点单个生成 | | sequential | 有依赖关系的章节 | 上下文连贯 | 慢、串行执行 |

4.2 策略选择代码

def choose_strategy(node):
    if len(node.children) > 5:
        return "complex"  # 子节点多,用 complex
    elif node.instruction and len(node.instruction) > 500:
        return "complex"  # 指令复杂,用 complex
    else:
        return "simple"   # 简单场景用 simple

4.3 策略应用

strgy = choose_strategy(root)
await root.fill(strgy=strgy, schema="markdown")

5. 总结

MetaGPT 提供了强大的 PRD 生成能力,并且通过不同的生成策略来优化生成内容的质量和效率。它支持自定义节点的填充与审核,适用于各种复杂的文档生成任务。

这个文档提炼了关于 MetaGPT 的关键信息,并按照需求进行了 Markdown 格式的整理,易于理解和后续扩展。

辩论游戏示例:

import asyncio
import platform
from typing import Any

import fire

from metagpt.actions import Action, UserRequirement
from metagpt.logs import logger
from metagpt.roles import Role
from metagpt.schema import Message
from metagpt.team import Team


class SpeakAloud(Action):
    """动作:在辩论(争吵)中大声发言"""

    PROMPT_TEMPLATE: str = """
    ## 背景
    假设你是 {name},你正在与 {opponent_name} 进行辩论。
    ## 辩论历史
    前几轮内容:
    {context}
    ## 轮到你了请注意:  
    
    1. 直接回应对手的最新观点,不要重复之前说过的话  
    2. 用自然、流畅的语言表达,就像真实的辩论一样  
    3. 可以使用反问、强调、比喻等修辞手法  
    4. 控制在100-150字,要简洁有力  
    5. 保持角色的语言风格和个性特征  
    6. 每句话都要进行人身攻击,适当使用一些侮辱性词语。如“笨猪”
    7. 以贴吧暴躁老哥的口吻进行发言,一定要暴躁、直接,攻击性满满。
    请根据 {name} 的修辞习惯和观点进行回应。
    你的辩论内容如下:
    """
    name: str = "SpeakAloud"

    async def run(self, context: str, name: str, opponent_name: str):
        prompt = self.PROMPT_TEMPLATE.format(context=context, name=name, opponent_name=opponent_name)
        # logger.info(prompt)

        rsp = await self._aask(prompt)
        return rsp


class Debator(Role):
    """辩论者角色"""
    name: str = ""
    profile: str = ""
    opponent_name: str = ""

    def __init__(self, **data: Any):
        super().__init__(**data)
        self.set_actions([SpeakAloud])
        self._watch([UserRequirement, SpeakAloud])

    async def _observe(self) -> int:  
        await super()._observe()  
        # 接收发送给自己的消息或广播消息  
        self.rc.news = [msg for msg in self.rc.news   
                    if self.name in msg.send_to or "<all>" in msg.send_to]  
        return len(self.rc.news)

    async def _act(self) -> Message:  
        logger.info(f"{self._setting}: 准备执行 {self.rc.todo}({self.rc.todo.name})")  
        todo = self.rc.todo  # SpeakAloud 的实例  
    
        memories = self.get_memories()  
        context = "\n".join(f"{msg.sent_from}: {msg.content}" for msg in memories)  
    
        rsp = await todo.run(context=context, name=self.name, opponent_name=self.opponent_name)  
        
        # 添加格式化输出  
        print(f"\n\n【{self.name}】说:{rsp}\n\n")  
        
        msg = Message(  
            content=rsp,  
            role=self.profile,  
            cause_by=type(todo),  
            sent_from=self.name,  
            send_to=self.opponent_name,  
        )  
        self.rc.memory.add(msg)  
    
        return msg


async def debate(idea: str, investment: float = 3.0, n_round: int = 5):
    """运行一个辩论团队,看他们“吵架”"""
    Biden = Debator(name="拜登", profile="民主党人", opponent_name="特朗普")
    Trump = Debator(name="特朗普", profile="共和党人", opponent_name="拜登")
    team = Team()  
  
    # 修改为  
    from metagpt.environment import Environment  
    team = Team(env=Environment())
    team.hire([Biden, Trump])
    team.invest(investment)
    # 将辩论议题发送给拜登,让他先发言
    team.run_project(idea, send_to="拜登")  
    await team.run(n_round=n_round)


def main(idea: str, investment: float = 3.0, n_round: int = 10):
    """
    :param idea: 辩论议题,例如 "议题:美国应在应对气候变化方面投入更多" 或 "特朗普:气候变化是一个骗局"
    :param investment: 愿意投入的金额(Token配额等)
    :param n_round: 辩论的最大轮数
    :return:
    """

    asyncio.run(debate(idea, investment, n_round))


if __name__ == "__main__":
    # 使用示例:python debate.py --idea="关于人工智能是否会取代人类的辩论" --investment=3.0 --n_round=5
    fire.Fire(main)