update: 软件公司重构

This commit is contained in:
liushaojie 2024-10-25 10:04:04 +08:00 committed by seeker-jie
parent 3f0227a25a
commit f9b0262c55
5 changed files with 281 additions and 42 deletions

View file

@ -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:

View 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()

View file

@ -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)
)

View file

@ -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,