修复三个问题:1. 子图执行后的无限循环 2. llm_call没有输出 3. 思考打印两次
- 子图执行后直接进入finalize,避免回到react_reason循环 - llm_call节点检查是否已有final_result,避免重复调用LLM - 直接在react_reason_node中通过adispatch_custom_event发送推理事件,避免通过state传递导致重复
This commit is contained in:
@@ -61,15 +61,34 @@ def wrap_subgraph_for_error_handling(subgraph, name: str):
|
||||
result = subgraph.invoke(state)
|
||||
|
||||
# 更新主图状态
|
||||
subgraph_result = None
|
||||
if name == "contact":
|
||||
state.contact_result = result
|
||||
subgraph_result = result.get("final_result", "")
|
||||
elif name == "dictionary":
|
||||
state.dictionary_result = result
|
||||
subgraph_result = result.get("final_result", "")
|
||||
elif name == "news_analysis":
|
||||
state.news_result = result
|
||||
subgraph_result = result.get("final_result", "")
|
||||
|
||||
# 关键:设置最终结果,这样就不需要再回到 react_reason 了
|
||||
if subgraph_result:
|
||||
state.final_result = subgraph_result
|
||||
else:
|
||||
state.final_result = "子图执行完成"
|
||||
|
||||
# 标记成功
|
||||
state.success = True
|
||||
state.current_phase = "done"
|
||||
# 标记不再需要推理,避免循环
|
||||
state.reasoning_history.append({
|
||||
"step": state.reasoning_step,
|
||||
"action": "subgraph_completed",
|
||||
"confidence": 1.0,
|
||||
"reasoning": f"{name}子图执行完成",
|
||||
"timestamp": datetime.now().isoformat()
|
||||
})
|
||||
return state
|
||||
|
||||
except Exception as e:
|
||||
@@ -189,18 +208,18 @@ def build_react_main_graph(llm=None, tools=None, mem0_client=None) -> StateGraph
|
||||
graph.add_node("finalize", finalize_node)
|
||||
|
||||
# ========== 添加边 ==========
|
||||
|
||||
|
||||
# 第一阶段:记忆检索
|
||||
if retrieve_memory_node:
|
||||
graph.add_edge(START, "retrieve_memory")
|
||||
graph.add_edge("retrieve_memory", "memory_trigger")
|
||||
else:
|
||||
graph.add_edge(START, "memory_trigger")
|
||||
|
||||
|
||||
# 进入第二阶段
|
||||
graph.add_edge("memory_trigger", "init_state")
|
||||
graph.add_edge("init_state", "react_reason")
|
||||
|
||||
|
||||
# 第二阶段:React 循环推理
|
||||
graph.add_conditional_edges(
|
||||
"react_reason",
|
||||
@@ -215,15 +234,17 @@ def build_react_main_graph(llm=None, tools=None, mem0_client=None) -> StateGraph
|
||||
"llm_call": "llm_call"
|
||||
}
|
||||
)
|
||||
|
||||
# 循环边
|
||||
|
||||
# 循环边(rag、web_search、error 回到 reason)
|
||||
graph.add_edge("rag_retrieve", "react_reason")
|
||||
graph.add_edge("web_search", "react_reason")
|
||||
graph.add_edge("contact_subgraph", "react_reason")
|
||||
graph.add_edge("dictionary_subgraph", "react_reason")
|
||||
graph.add_edge("news_analysis_subgraph", "react_reason")
|
||||
graph.add_edge("handle_error", "react_reason")
|
||||
|
||||
# 关键修改:子图执行完后直接去 finalize(避免循环)
|
||||
graph.add_edge("contact_subgraph", "finalize")
|
||||
graph.add_edge("dictionary_subgraph", "finalize")
|
||||
graph.add_edge("news_analysis_subgraph", "finalize")
|
||||
|
||||
# 第三阶段:llm_call 后进入完成处理
|
||||
if llm_node is not None:
|
||||
if summarize_node:
|
||||
|
||||
Reference in New Issue
Block a user