本篇为spring-ai-alibaba学习系列第三十四篇
前面介绍 planner 节点下一节点是 information 节点
该节点比较简单,没有调用大模型,仅仅是将大模型的返回结果转化为 Plan 类型
使用方法
max_plan_iterations:最大计划迭代次数,控制重新生成计划的次数
auto_accepted_plan:决定下一节点为人工还是研究组
节点产出
current_plan:Plan类型的研究计划
源码跟踪
跟踪:在 DeepResearchConfiguration 中,information 节点是一个 InformationNode 类型的节点,创建时无需参数,内部会创建一个 BeanOutputConverter<Plan> 的转换器 converter
研究:InformationNode 的 apply 方法整体流程如下:
1)获取前一节点 planner 的结果 planner_content
2)尝试将其转化为 Plan 类型,若失败则返回 planner 节点重新生成计划(有最大次数限制,达到限制后直接到 END 节点)
3)转化成功后,将其放入current_plan
4)根据 auto_accepted_plan 判断是否允许自动接受计划,若为 false,则需要人工介入,转入 human_feedback 节点,若为 true,则直接进入 research_team 节点
总结:该节点将大模型的返回结果转化为 Plan 类型并支持在转化失败时重试,然后根据 auto_accepted_plan 取值进入不同节点
附InformationNode 的 apply 方法源码
public Map<String, Object> apply(OverAllState state) {
String result = state.value("planner_content", "");
logger.info("planner_content: {}", result);
assert Strings.isNotBlank(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;
}

被折叠的 条评论
为什么被折叠?



