mirror of
https://github.com/FoundationAgents/MetaGPT.git
synced 2026-06-29 15:59:42 +02:00
update: 软件公司重构
This commit is contained in:
parent
3f0227a25a
commit
f9b0262c55
5 changed files with 281 additions and 42 deletions
|
|
@ -209,7 +209,7 @@ class SearchEnhancedQA(Action):
|
|||
list[str]: Summaries of relevant web content.
|
||||
"""
|
||||
|
||||
relevant_urls = await self._collect_relevant_links(query)
|
||||
relevant_urls = await self.collect_relevant_links(query)
|
||||
await self._reporter.async_report({"type": "search", "stage": "searching", "urls": relevant_urls})
|
||||
if not relevant_urls:
|
||||
logger.warning(f"No relevant URLs found for query: {query}")
|
||||
|
|
@ -226,7 +226,7 @@ class SearchEnhancedQA(Action):
|
|||
|
||||
return citations
|
||||
|
||||
async def _collect_relevant_links(self, query: str) -> list[str]:
|
||||
async def collect_relevant_links(self, query: str) -> list[str]:
|
||||
"""Search and rank URLs relevant to the query.
|
||||
|
||||
Args:
|
||||
|
|
|
|||
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: Default to native HTML if unspecified
|
||||
- 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.
|
||||
- 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.collect_relevant_links) 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,16 +4,14 @@
|
|||
@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.utils.common import any_to_name, any_to_str, tool2name
|
||||
from metagpt.utils.git_repository import GitRepository
|
||||
from metagpt.tools.libs.browser import Browser
|
||||
from metagpt.tools.libs.editor import Editor
|
||||
from metagpt.utils.common import tool2name
|
||||
|
||||
|
||||
class ProductManager(RoleZero):
|
||||
|
|
@ -29,38 +27,18 @@ 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 = """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__]
|
||||
instruction: str = PRODUCT_MANAGER_INSTRUCTION
|
||||
max_react_loop: int = 50
|
||||
tools: list[str] = ["RoleZero", Browser.__name__, Editor.__name__, SearchEnhancedQA.__name__]
|
||||
|
||||
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._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"""
|
||||
if not self.use_fixed_sop:
|
||||
return await super()._think()
|
||||
|
||||
if GitRepository.is_git_dir(self.config.project_path) and not self.config.git_reinit:
|
||||
self._set_state(1)
|
||||
else:
|
||||
self._set_state(0)
|
||||
self.config.git_reinit = False
|
||||
self.todo_action = any_to_name(WritePRD)
|
||||
return bool(self.rc.todo)
|
||||
se_qa = SearchEnhancedQA()
|
||||
self.tool_execution_map.update(
|
||||
tool2name(SearchEnhancedQA, ["collect_relevant_links"], se_qa.collect_relevant_links)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -685,7 +685,17 @@ 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.
|
||||
Args:
|
||||
task_id (str): The task id to be appended to the existing task sequence
|
||||
dependent_task_ids (list[str]): The task ids that the new task depends on
|
||||
instruction (str): The instruction of the new task
|
||||
assignee (str): The assignee of the new task
|
||||
task_type (str): The type of the new task, default is empty string
|
||||
"""
|
||||
new_task = Task(
|
||||
task_id=task_id,
|
||||
dependent_task_ids=dependent_task_ids,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue