mirror of
https://github.com/FoundationAgents/MetaGPT.git
synced 2026-06-08 15:05:17 +02:00
Merge branch 'product_manager' into 'mgx_ops'
update: 软件公司重构 See merge request pub/MetaGPT!406
This commit is contained in:
commit
29af174ef1
4 changed files with 268 additions and 22 deletions
175
metagpt/prompts/product_manager.py
Normal file
175
metagpt/prompts/product_manager.py
Normal file
|
|
@ -0,0 +1,175 @@
|
|||
from metagpt.prompts.di.role_zero import ROLE_INSTRUCTION
|
||||
|
||||
EXTRA_INSTRUCTION = """
|
||||
You are a product manager AI assistant specializing in product requirement documentation and market research analysis.
|
||||
Your work focuses on the analysis of problems and data.
|
||||
You should always output a document.
|
||||
|
||||
## Core Tools
|
||||
1. Editor: For the creation and modification of `PRD/Research Report` documents.
|
||||
2. SearchEnhancedQA: The specified tool for collecting information from the internet MUST BE USED for searching.
|
||||
3. Browser: Access the search results provided by the SearchEnhancedQA tool using the "goto" method.
|
||||
|
||||
## Mode 1: PRD Creation
|
||||
Triggered by software/product requests or feature enhancements, ending with the output of a complete PRD.
|
||||
|
||||
### Required Fields
|
||||
1. Language & Project Info
|
||||
- Language: Match user's language
|
||||
- Programming Language: If not specified in the requirements, use Vite, React, MUI, Tailwind CSS.
|
||||
- Project Name: Use snake_case format
|
||||
- Restate the original requirements
|
||||
|
||||
2. Product Definition(**IMPORTANT** )
|
||||
- Product Goals: 3 clear, orthogonal goals
|
||||
- User Stories: 3-5 scenarios in "As a [role], I want [feature] so that [benefit]" format
|
||||
- Competitive Analysis: 5-7 products with pros/cons
|
||||
- Competitive Quadrant Chart(Required): Using Mermaid
|
||||
|
||||
3. Technical Specifications
|
||||
- Requirements Analysis: Comprehensive overview of technical needs
|
||||
- Requirements Pool: List with P0/P1/P2 priorities
|
||||
- UI Design Draft: Basic layout and functionality
|
||||
- Open Questions: Unclear aspects needing clarification
|
||||
|
||||
#### Mermaid Diagram Rules
|
||||
1. Use mermaid quadrantChart syntax. Distribute scores evenly between 0 and 1
|
||||
2. Example:
|
||||
```mermaid
|
||||
quadrantChart
|
||||
title "Reach and engagement of campaigns"
|
||||
x-axis "Low Reach" --> "High Reach"
|
||||
y-axis "Low Engagement" --> "High Engagement"
|
||||
quadrant-1 "We should expand"
|
||||
quadrant-2 "Need to promote"
|
||||
quadrant-3 "Re-evaluate"
|
||||
quadrant-4 "May be improved"
|
||||
"Campaign A": [0.3, 0.6]
|
||||
"Campaign B": [0.45, 0.23]
|
||||
"Campaign C": [0.57, 0.69]
|
||||
"Campaign D": [0.78, 0.34]
|
||||
"Campaign E": [0.40, 0.34]
|
||||
"Campaign F": [0.35, 0.78]
|
||||
"Our Target Product": [0.5, 0.6]
|
||||
```
|
||||
|
||||
### PRD Document Guidelines
|
||||
- Use clear requirement language (Must/Should/May)
|
||||
- Include measurable criteria
|
||||
- Prioritize clearly (P0: Must-have, P1: Should-have, P2: Nice-to-have)
|
||||
- Support with diagrams and charts
|
||||
- Focus on user value and business goals
|
||||
|
||||
## Mode 2: Market Research
|
||||
Triggered by market analysis or competitor research requests, ending with the output of a complete report document.
|
||||
|
||||
### **IMPORTANT** Information Collection Requirements
|
||||
|
||||
Must follow this strict information gathering process:
|
||||
1. Keyword Generation Rules:
|
||||
- Infer 3 distinct keyword groups on user needs(Infer directly instead of using tools).
|
||||
- Each group must be a space-separated phrase containing:
|
||||
* Target industry/product name (REQUIRED)
|
||||
* Specific aspect or metric
|
||||
* Time frame or geographic scope when relevant
|
||||
|
||||
Example format:
|
||||
- Group 1: "electric vehicles market size forecast 2024"
|
||||
- Group 2: "electric vehicles manufacturing costs analysis"
|
||||
- Group 3: "electric vehicles consumer preferences survey"
|
||||
|
||||
2. Search Process:
|
||||
- For each keyword:
|
||||
* Use SearchEnhancedQA TOOL (SearchEnhancedQA.run) collect top 3 search results
|
||||
* Remove duplicate URLs
|
||||
|
||||
3. Information Analysis:
|
||||
- Must read and analyze EACH unique source individually
|
||||
- Synthesize information across all sources
|
||||
- Cross-reference and verify key data points
|
||||
- Identify critical insights and trends
|
||||
|
||||
4. Quality Control:
|
||||
- Verify data consistency across sources
|
||||
- Fill information gaps with targeted additional research
|
||||
- Ensure balanced perspective from multiple sources
|
||||
|
||||
|
||||
### Report Structure
|
||||
1. Summary: Key findings and recommendations
|
||||
2. Industry Overview: Market size, trends, and structure
|
||||
3. Market Analysis: Segments, growth drivers, and challenges
|
||||
4. Competitor Landscape: Key players and positioning
|
||||
5. Target Audience Analysis: User segments and needs
|
||||
6. Pricing Analysis: Market rates and strategies
|
||||
7. Key Findings: Major insights and opportunities
|
||||
8. Strategic Recommendations: Action items
|
||||
9. Appendices: Supporting data
|
||||
|
||||
|
||||
### Final Report Requirements
|
||||
1. Report must be entirely focused on insights and analysis:
|
||||
- No mention of research methodology
|
||||
- No source tracking or process documentation
|
||||
- Present only validated findings and conclusions
|
||||
|
||||
2. Professional Format:
|
||||
- Clear section hierarchy
|
||||
- Rich subsection content
|
||||
- Evidence-based analysis
|
||||
- Data visualization where appropriate
|
||||
|
||||
3. Content Depth Requirements:
|
||||
Executive Summary (500+ words):
|
||||
- Key Market Metrics
|
||||
- Critical Findings
|
||||
- Strategic Recommendations
|
||||
|
||||
Industry Overview (800+ words):
|
||||
- Market Size and Growth
|
||||
- Industry Value Chain
|
||||
- Regulatory Environment
|
||||
- Technology Trends
|
||||
|
||||
4. Quality Standards:
|
||||
- Every main section must have 3+ detailed subsections
|
||||
- Each subsection requires 200-300 words minimum
|
||||
- Include specific examples and data points
|
||||
- Support all major claims with market evidence
|
||||
|
||||
### Research Guidelines
|
||||
- Base all analysis on collected data
|
||||
- Include quantitative and qualitative insights
|
||||
- Support claims with evidence
|
||||
- Maintain professional formatting
|
||||
- Use visuals to support key points
|
||||
|
||||
## Document Standards
|
||||
1. Format
|
||||
- Clear heading hierarchy
|
||||
- Consistent markdown formatting
|
||||
- Numbered sections
|
||||
- Professional graphics
|
||||
- Output charts using Mermaid syntax
|
||||
|
||||
2. Content
|
||||
- Objective analysis
|
||||
- Actionable insights
|
||||
- Clear recommendations
|
||||
- Supporting evidence
|
||||
|
||||
3. Quality Checks
|
||||
- Verify data accuracy
|
||||
- Cross-reference sources
|
||||
- Ensure completeness
|
||||
- Review clarity
|
||||
|
||||
Remember:
|
||||
- Always start with thorough requirements analysis
|
||||
- Use appropriate tools for each task
|
||||
- Keep recommendations actionable
|
||||
- Consider all stakeholder perspectives
|
||||
- Maintain professional standards throughout
|
||||
"""
|
||||
|
||||
PRODUCT_MANAGER_INSTRUCTION = ROLE_INSTRUCTION + EXTRA_INSTRUCTION.strip()
|
||||
|
|
@ -4,14 +4,16 @@
|
|||
@Time : 2023/5/11 14:43
|
||||
@Author : alexanderwu
|
||||
@File : product_manager.py
|
||||
@Modified By: mashenquan, 2023/11/27. Add `PrepareDocuments` action according to Section 2.2.3.5.1 of RFC 135.
|
||||
@Modified By: liushaojie, 2024/10/17.
|
||||
"""
|
||||
|
||||
from metagpt.actions import UserRequirement, WritePRD
|
||||
from metagpt.actions.prepare_documents import PrepareDocuments
|
||||
from metagpt.actions.requirement_analysis.requirement.pic2txt import Pic2Txt
|
||||
from metagpt.actions.search_enhanced_qa import SearchEnhancedQA
|
||||
from metagpt.prompts.product_manager import PRODUCT_MANAGER_INSTRUCTION
|
||||
from metagpt.roles.di.role_zero import RoleZero
|
||||
from metagpt.roles.role import RoleReactMode
|
||||
from metagpt.tools.libs.browser import Browser
|
||||
from metagpt.tools.libs.editor import Editor
|
||||
from metagpt.utils.common import any_to_name, any_to_str, tool2name
|
||||
from metagpt.utils.git_repository import GitRepository
|
||||
|
||||
|
|
@ -29,28 +31,24 @@ class ProductManager(RoleZero):
|
|||
|
||||
name: str = "Alice"
|
||||
profile: str = "Product Manager"
|
||||
goal: str = "efficiently create a successful product that meets market demands and user expectations. Create a Product Requirement Document."
|
||||
goal: str = "Create a Product Requirement Document or market research/competitive product research."
|
||||
constraints: str = "utilize the same language as the user requirements for seamless communication"
|
||||
todo_action: str = any_to_name(WritePRD)
|
||||
instruction: str = PRODUCT_MANAGER_INSTRUCTION
|
||||
tools: list[str] = ["RoleZero", Browser.__name__, Editor.__name__, SearchEnhancedQA.__name__]
|
||||
|
||||
instruction: str = """Use WritePRD tool to write PRD if a PRD is required, users may asks for a software without mentioning PRD, but you should output the PRD of that software; Use `Pic2Txt` tool to write out an intact textual user requirements if an intact textual user requiremnt is required given some images alongside the contextual textual descriptions"""
|
||||
max_react_loop: int = 1 # FIXME: Read and edit files requires more steps, consider later
|
||||
tools: list[str] = ["RoleZero", "WritePRD", Pic2Txt.__name__]
|
||||
todo_action: str = any_to_name(WritePRD)
|
||||
|
||||
def __init__(self, **kwargs) -> None:
|
||||
super().__init__(**kwargs)
|
||||
# NOTE: The following init setting will only be effective when self.use_fixed_sop is changed to True
|
||||
self.enable_memory = False
|
||||
self.set_actions([PrepareDocuments(send_to=any_to_str(self)), WritePRD])
|
||||
if self.use_fixed_sop:
|
||||
self.enable_memory = False
|
||||
self.set_actions([PrepareDocuments(send_to=any_to_str(self)), WritePRD])
|
||||
self._watch([UserRequirement, PrepareDocuments])
|
||||
self.rc.react_mode = RoleReactMode.BY_ORDER
|
||||
|
||||
def _update_tool_execution(self):
|
||||
wp = WritePRD()
|
||||
self.tool_execution_map.update(tool2name(WritePRD, ["run"], wp.run))
|
||||
pic2txt = Pic2Txt()
|
||||
self.tool_execution_map.update(tool2name(Pic2Txt, ["run"], pic2txt.run))
|
||||
|
||||
async def _think(self) -> bool:
|
||||
"""Decide what to do"""
|
||||
|
|
|
|||
|
|
@ -685,7 +685,11 @@ class Plan(BaseModel):
|
|||
def append_task(
|
||||
self, task_id: str, dependent_task_ids: list[str], instruction: str, assignee: str, task_type: str = ""
|
||||
):
|
||||
"""Append a new task with task_id (number) to the end of existing task sequences. If dependent_task_ids is not empty, the task will depend on the tasks with the ids in the list. Note that the assignee should be the 'name' of the role."""
|
||||
"""
|
||||
Append a new task with task_id (number) to the end of existing task sequences.
|
||||
If dependent_task_ids is not empty, the task will depend on the tasks with the ids in the list.
|
||||
Note that the assignee should be the 'name' of the role.
|
||||
"""
|
||||
new_task = Task(
|
||||
task_id=task_id,
|
||||
dependent_task_ids=dependent_task_ids,
|
||||
|
|
|
|||
|
|
@ -1,18 +1,87 @@
|
|||
import asyncio
|
||||
import sys
|
||||
|
||||
from metagpt.roles.product_manager import ProductManager
|
||||
from metagpt.logs import logger
|
||||
from metagpt.roles import ProductManager
|
||||
|
||||
WRITE_2048 = """Write a PRD for a cli 2048 game"""
|
||||
CASE0_WRITE_2048 = """Write a PRD for a cli 2048 game"""
|
||||
CASE1_GREEDY_SNAKE = "设计一个贪吃蛇游戏"
|
||||
CASE2_SMART_HOME = "搜索并分析米家、华为智能家居和海尔智家在智能家居市场中的功能、用户需求和市场定位"
|
||||
CASE3_BEST_SELLING_REFRIGERATOR = "调研当前市场上最畅销的智能冰箱的五个关键特性"
|
||||
OLD_PRD = """
|
||||
Language
|
||||
en_us
|
||||
|
||||
REWRITE_2048 = """Rewrite the prd at /Users/gary/Files/temp/workspace/2048_game/docs/prd.json, add a web UI"""
|
||||
Programming Language
|
||||
N/A
|
||||
|
||||
CASUAL_CHAT = """What's your name?"""
|
||||
Original Requirements
|
||||
Write a PRD based on the current music streaming service.
|
||||
|
||||
Project Name
|
||||
music_streaming_service
|
||||
|
||||
Product Goals
|
||||
Enhance user experience with seamless music streaming
|
||||
Improve accessibility and responsiveness across devices
|
||||
Expand music library and personalized recommendations
|
||||
User Stories
|
||||
As a user, I want to easily search and find my favorite songs and artists.
|
||||
As a user, I want to create and manage my own playlists.
|
||||
As a user, I want to receive personalized music recommendations based on my listening history.
|
||||
As a user, I want to stream music without interruptions or buffering.
|
||||
As a user, I want to access the service on both desktop and mobile devices.
|
||||
Competitive Analysis
|
||||
Spotify: Extensive music library, strong personalized recommendations, and cross-platform availability.
|
||||
Apple Music: High-quality audio, exclusive content, and seamless integration with Apple devices.
|
||||
Amazon Music: Large music catalog, integration with Amazon Echo devices, and competitive pricing.
|
||||
YouTube Music: Vast collection of music videos, user-generated content, and strong search capabilities.
|
||||
Tidal: High-fidelity sound quality, exclusive releases, and artist-centric approach.
|
||||
Competitive Quadrant Chart
|
||||
quadrantChart title "Feature Richness vs. User Satisfaction" x-axis "Low Feature Richness" --> "High Feature Richness" y-axis "Low User Satisfaction" --> "High User Satisfaction" quadrant-1 "Market Leaders" quadrant-2 "Potential Growth" quadrant-3 "Needs Improvement" quadrant-4 "Niche Players" "Spotify": [0.9, 0.85] "Apple Music": [0.85, 0.8] "Amazon Music": [0.75, 0.7] "YouTube Music": [0.8, 0.75] "Tidal": [0.7, 0.65] "Our Target Product": [0.8, 0.8]
|
||||
|
||||
Requirement Analysis
|
||||
The current music streaming service needs to focus on enhancing user experience by providing seamless streaming, improving accessibility, and expanding the music library. Personalized recommendations and cross-platform availability are crucial for user retention.
|
||||
|
||||
Requirement Pool
|
||||
['P0', 'Implement a robust search functionality to find songs and artists easily.']
|
||||
['P0', 'Develop a feature for users to create and manage playlists.']
|
||||
['P1', 'Enhance the recommendation algorithm for personalized music suggestions.']
|
||||
['P1', 'Optimize the streaming service to minimize interruptions and buffering.']
|
||||
['P2', 'Ensure the service is fully responsive and accessible on both desktop and mobile devices.']
|
||||
UI Design draft
|
||||
The UI should be clean and intuitive, with a prominent search bar, easy-to-navigate menus for playlists and recommendations, and a responsive design that adapts to different screen sizes. The player controls should be easily accessible, and the overall aesthetic should be modern and visually appealing.
|
||||
|
||||
Anything UNCLEAR
|
||||
Currently, all aspects of the project are clear.
|
||||
"""
|
||||
CASE4_MUSIC_STREAMING_MEDIA = f"""We have received feedback from users regarding the current music streaming service, stating that they need better personalized recommendations. Please readjust the content of PRD {OLD_PRD} based on these feedback."""
|
||||
CASE5_SMART_BIG_SCREEN = """分析2024年上半年中国家庭智能大屏行业的发展情况并输出市场分析报告"""
|
||||
CASE6_ELECTRONIC_CIGARETTE = """我想要生产一个电子烟产品,请帮我完成市场调研分析报告"""
|
||||
|
||||
|
||||
async def main(requirement):
|
||||
product_manager = ProductManager()
|
||||
await product_manager.run(requirement)
|
||||
def main():
|
||||
cases = [
|
||||
# CASE0_WRITE_2048,
|
||||
# CASE1_GREEDY_SNAKE,
|
||||
# CASE2_SMART_HOME,
|
||||
# CASE3_BEST_SELLING_REFRIGERATOR,
|
||||
# CASE4_MUSIC_STREAMING_MEDIA,
|
||||
CASE5_SMART_BIG_SCREEN,
|
||||
# CASE6_ELECTRONIC_CIGARETTE,
|
||||
]
|
||||
root_path = "/tmp"
|
||||
logger.remove()
|
||||
logger.add(sys.stderr, level="INFO")
|
||||
for case in cases:
|
||||
case += f"\nroot path: '{root_path}'"
|
||||
logger.info(f"user requirement:\n{case}")
|
||||
try:
|
||||
product_manager = ProductManager()
|
||||
asyncio.run(product_manager.run(case))
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main(WRITE_2048))
|
||||
main()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue