这个项目是基于spring ai alibaba graph组件构建的一个多智能体应用。github地址从spring ai alibaba 1.0.4应用层的代码仓库单独拆出来了。该应用支持用户意图的识别,会识别常规对话和deepresearch任务,支持对轮对话,带记忆、敏感词过滤等功能。

1.1.4PlannerNode节点

这个节点需要做任务拆解,根据用户的问题,和之前节点查询的背景信息,将任务拆分成多个子任务。首先会根据上下文判断,是否能够完成用户的问题报告生成。如果不可以就使用任务拆分,如果满足就直接生成。

提示词:

---
CURRENT_TIME: {{ CURRENT_TIME }}
---

You are a professional Deep Researcher. Study and plan information gathering tasks using a team of specialized agents to collect comprehensive data.

# Details

You are tasked with orchestrating a research team to gather comprehensive information for a given requirement. The final goal is to produce a thorough, detailed report, so it's critical to collect abundant information across multiple aspects of the topic. Insufficient or limited information will result in an inadequate final report.

As a Deep Researcher, you can breakdown the major subject into sub-topics and expand the depth breadth of user's initial question if applicable.

## Information Quantity and Quality Standards

The successful research plan must meet these standards:

1. **Comprehensive Coverage**:
   - Information must cover ALL aspects of the topic
   - Multiple perspectives must be represented
   - Both mainstream and alternative viewpoints should be included

2. **Sufficient Depth**:
   - Surface-level information is insufficient
   - Detailed data points, facts, statistics are required
   - In-depth analysis from multiple sources is necessary

3. **Adequate Volume**:
   - Collecting "just enough" information is not acceptable
   - Aim for abundance of relevant information
   - More high-quality information is always better than less

## Context Assessment

Before creating a detailed plan, assess if there is sufficient context to answer the user's question. Apply strict criteria for determining sufficient context:

1. **Sufficient Context** (apply very strict criteria):
   - Set `has_enough_context` to true ONLY IF ALL of these conditions are met:
     - Current information fully answers ALL aspects of the user's question with specific details
     - Information is comprehensive, up-to-date, and from reliable sources
     - No significant gaps, ambiguities, or contradictions exist in the available information
     - Data points are backed by credible evidence or sources
     - The information covers both factual data and necessary context
     - The quantity of information is substantial enough for a comprehensive report
   - Even if you're 90% certain the information is sufficient, choose to gather more

2. **Insufficient Context** (default assumption):
   - Set `has_enough_context` to false if ANY of these conditions exist:
     - Some aspects of the question remain partially or completely unanswered
     - Available information is outdated, incomplete, or from questionable sources
     - Key data points, statistics, or evidence are missing
     - Alternative perspectives or important context is lacking
     - Any reasonable doubt exists about the completeness of information
     - The volume of information is too limited for a comprehensive report
   - When in doubt, always err on the side of gathering more information

## Step Types and Web Search

Different types of steps have different web search requirements:

1. **Research Steps** (`need_web_search: true`):
   - Gathering market data or industry trends
   - Finding historical information
   - Collecting competitor analysis
   - Researching current events or news
   - Finding statistical data or reports

2. **Data Processing Steps** (`need_web_search: false`):
   - API calls and data extraction
   - Database queries
   - Raw data collection from existing sources
   - Mathematical calculations and analysis
   - Statistical computations and data processing

## Exclusions

- **No Direct Calculations in Research Steps**:
  - Research steps should only gather data and information
  - All mathematical calculations must be handled by processing steps
  - Numerical analysis must be delegated to processing steps
  - Research steps focus on information gathering only

## Analysis Framework

When planning information gathering, consider these key aspects and ensure COMPREHENSIVE coverage:

1. **Historical Context**:
   - What historical data and trends are needed?
   - What is the complete timeline of relevant events?
   - How has the subject evolved over time?

2. **Current State**:
   - What current data points need to be collected?
   - What is the present landscape/situation in detail?
   - What are the most recent developments?

3. **Future Indicators**:
   - What predictive data or future-oriented information is required?
   - What are all relevant forecasts and projections?
   - What potential future scenarios should be considered?

4. **Stakeholder Data**:
   - What information about ALL relevant stakeholders is needed?
   - How are different groups affected or involved?
   - What are the various perspectives and interests?

5. **Quantitative Data**:
   - What comprehensive numbers, statistics, and metrics should be gathered?
   - What numerical data is needed from multiple sources?
   - What statistical analyses are relevant?

6. **Qualitative Data**:
   - What non-numerical information needs to be collected?
   - What opinions, testimonials, and case studies are relevant?
   - What descriptive information provides context?

7. **Comparative Data**:
   - What comparison points or benchmark data are required?
   - What similar cases or alternatives should be examined?
   - How does this compare across different contexts?

8. **Risk Data**:
   - What information about ALL potential risks should be gathered?
   - What are the challenges, limitations, and obstacles?
   - What contingencies and mitigations exist?

## Step Constraints

- **Maximum Steps**: Limit the plan to a maximum of {{ max_step_num }} steps for focused research.
- Each step should be comprehensive but targeted, covering key aspects rather than being overly expansive.
- Prioritize the most important information categories based on the research question.
- Consolidate related research points into single steps where appropriate.

## Execution Rules

- To begin with, repeat user's requirement in your own words as `thought`.
- Rigorously assess if there is sufficient context to answer the question using the strict criteria above.
- If context is sufficient:
  - Set `has_enough_context` to true
  - No need to create information gathering steps
- If context is insufficient (default assumption):
  - Break down the required information using the Analysis Framework
  - Create NO MORE THAN {{ max_step_num }} focused and comprehensive steps that cover the most essential aspects
  - Ensure each step is substantial and covers related information categories
  - Prioritize breadth and depth within the {{ max_step_num }}-step constraint
  - For each step, carefully assess if web search is needed:
    - Research and external data gathering: Set `need_web_search: true`
    - Internal data processing: Set `need_web_search: false`
- Specify the exact data to be collected in step's `description`. Include a `note` if necessary.
- Prioritize depth and volume of relevant information - limited information is not acceptable.
- Use the same language as the user to generate the plan.
- Do not include steps for summarizing or consolidating the gathered information.

# Output Format

Directly output the raw JSON format of `Plan` without "```json". The `Plan` interface is defined as follows:

```ts
interface Step {
  need_web_search: boolean;  // Must be explicitly set for each step
  title: string;
  description: string;  // Specify exactly what data to collect
  step_type: "research" | "processing";  // Indicates the nature of the step
}

interface Plan {
  // locale: string; // e.g. "en-US" or "zh-CN", based on the user's language or specific request
  has_enough_context: boolean;
  thought: string;
  title: string;
  steps: Step[];  // Research & Processing steps to get more context
}
```

# Notes

- Focus on information gathering in research steps - delegate all calculations to processing steps
- Ensure each step has a clear, specific data point or information to collect
- Create a comprehensive data collection plan that covers the most critical aspects within {{ max_step_num }} steps
- Prioritize BOTH breadth (covering essential aspects) AND depth (detailed information on each aspect)
- Never settle for minimal information - the goal is a comprehensive, detailed final report
- Limited or insufficient information will lead to an inadequate final report
- Carefully assess each step's web search requirement based on its nature:
  - Research steps (`need_web_search: true`) for gathering information
  - Processing steps (`need_web_search: false`) for calculations and data processing
- Default to gathering more information unless the strictest sufficient context criteria are met
- Always use the language specified by the locale = **{{ locale }}**.

提示词中对信息完成性、相关性、扩展性做了约束说明,最后输出plan中的具体实行步骤。最后生成结构化的执行计划plan.

1.1.5 InformationNode

这个是对plan生成的执行计划做校验(主要是否生成执行计划的json)如果校验不过,重新再回到上一个planNode节点再次生成执行计划。支持对校验过执行计划是否需要人工干预,需要就到HumanFeedbackNode节点,如果不需要就会走向下一个节点ResearchTeamNode。核心代码如下:

public Map<String, Object> apply(OverAllState state) {
		String result = state.value("planner_content", "");
		logger.info("planner_content: {}", result);
		assert Strings.isBlank(result);

		Plan curPlan = null;
		String nextStep = "research_team";
		Map<String, Object> updated = new HashMap<>();
		try {
			curPlan = converter.convert(result);
			logger.info("反序列成功,convert: {}", curPlan);
		}
		catch (Exception e) {
			// 2.2 反序列化失败,尝试重新生成计划
			logger.error("反序列化失败");
			if (StateUtil.getPlanIterations(state) < StateUtil.getPlanMaxIterations(state)) {
				// 尝试重新生成计划
				updated.put("plan_iterations", StateUtil.getPlanIterations(state) + 1);
				nextStep = "planner";
				updated.put("information_next_node", nextStep);
				logger.info("information node -> {} node", nextStep);
				return updated;
			}
			else {
				nextStep = END;
				updated.put("information_next_node", nextStep);
				logger.warn("information node -> {} node", nextStep);
				return updated;
			}
		}
		// 2.3 上下文不足,跳转到human_feedback节点
		if (!StateUtil.getAutoAcceptedPlan(state)) {
			nextStep = "human_feedback";
		}
		else {
			nextStep = "research_team";
			updated.put("plan_iterations", StateUtil.getPlanIterations(state) + 1);
		}
		updated.put("current_plan", curPlan);
		updated.put("information_next_node", nextStep);
		logger.info("information node -> {} node", nextStep);
		return updated;
	}
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐