修复Supervisor无法触发的情况
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import random
|
||||
from typing import Literal
|
||||
from langchain_core.messages import AIMessage
|
||||
from langchain_core.runnables import RunnableConfig
|
||||
@@ -29,49 +30,47 @@ llm_supervisor = ChatQwen(
|
||||
|
||||
|
||||
def supervisor_node(state: AgentState, config: RunnableConfig):
|
||||
use_report = config["configurable"].get("use_report", False)
|
||||
configurable = config["configurable"]
|
||||
use_report = configurable.get("use_report", False)
|
||||
suggest_frequency = configurable.get("require_suggestion", 0.6) # 0.0~1.0
|
||||
|
||||
messages = state["messages"]
|
||||
if not messages:
|
||||
return {"next": "Suggester"}
|
||||
|
||||
last_message = messages[-1]
|
||||
|
||||
# --- 拦截逻辑修改 ---
|
||||
# 如果专家已经回复完了(AIMessage 且无工具调用),则交给 Suggester 生成按钮
|
||||
if isinstance(last_message, AIMessage) and not last_message.tool_calls:
|
||||
should_go_to_suggester = state.get("require_suggestion", False)
|
||||
|
||||
# 如果符合建议条件
|
||||
if should_go_to_suggester:
|
||||
return {"next": "Suggester"}
|
||||
else:
|
||||
return {"next": "FINISH"}
|
||||
|
||||
# ── system prompt 保持不变 ──
|
||||
system_prompt = f"""你是家具设计主管,负责分配任务。
|
||||
当前设定:
|
||||
- 是否需要市场研究报告:{'是' if use_report else '否'}
|
||||
|
||||
严格遵守以下规则:
|
||||
- 如果 **不需要** 市场研究报告(use_report = False),**绝对不能** 选择 Researcher
|
||||
- 只有在 **明确需要** 市场报告、竞争分析、材质趋势、价格区间等外部资讯时,才选择 Researcher,且 **必须** use_report = True
|
||||
- 常见分配:
|
||||
- 纯设计、风格、尺寸、材质建议 → Designer
|
||||
- 需要生成图片、渲染 → Visualizer
|
||||
- 需要产生建议按钮 → Suggester
|
||||
- 需要市场报告 → Researcher(但只有 use_report=True 时才允许)
|
||||
- 对话已完整、无需继续 → FINISH
|
||||
|
||||
用户最后说了什么?请根据实际需求决定下一步。
|
||||
"""
|
||||
当前设定:
|
||||
- 是否需要市场研究报告:{'是' if use_report else '否'}
|
||||
|
||||
严格遵守以下规则:
|
||||
- 如果 **不需要** 市场研究报告(use_report = False),**绝对不能** 选择 Researcher
|
||||
- 只有在 **明确需要** 市场报告、竞争分析、材质趋势、价格区间等外部资讯时,才选择 Researcher,且 **必须** use_report = True
|
||||
- 常见分配:
|
||||
- 纯设计、风格、尺寸、材质建议 → Designer
|
||||
- 需要生成图片、渲染 → Visualizer
|
||||
- 需要产生建议按钮 → Suggester
|
||||
- 需要市场报告 → Researcher(但只有 use_report=True 时才允许)
|
||||
- 对话已完整、无需继续 → FINISH
|
||||
|
||||
用户最后说了什么?请根据实际需求决定下一步。
|
||||
"""
|
||||
|
||||
chain = llm_supervisor.with_structured_output(RouteResponse)
|
||||
decision = chain.invoke([{"role": "system", "content": system_prompt}] + messages)
|
||||
next_node = decision.next
|
||||
next_node = decision.next # 防空默认 FINISH
|
||||
|
||||
# 安全阀:禁止非法选择 Researcher
|
||||
if next_node == "Researcher" and not use_report:
|
||||
print("警告:LLM 違規選擇 Researcher,已強制改為 FINISH 或 Suggester")
|
||||
print("警告:LLM 违规选择了 Researcher,已强制改为 Suggester 或 FINISH")
|
||||
next_node = "Suggester" if state.get("require_suggestion", False) else "FINISH"
|
||||
|
||||
# 核心改动:只有 LLM 决定 FINISH 时,才掷骰子看是否插入 Suggester
|
||||
if next_node == "FINISH":
|
||||
# 满足概率条件 → 插入 Suggester
|
||||
if suggest_frequency > 0 and random.random() < suggest_frequency:
|
||||
next_node = "Suggester"
|
||||
|
||||
return {"next": next_node}
|
||||
|
||||
|
||||
@@ -82,7 +81,7 @@ workflow.add_node("Supervisor", supervisor_node)
|
||||
workflow.add_node("Designer", designer_node)
|
||||
workflow.add_node("Researcher", researcher_node)
|
||||
workflow.add_node("Visualizer", visualizer_node)
|
||||
workflow.add_node("Suggester", suggester_node) # 新增节点
|
||||
workflow.add_node("Suggester", suggester_node)
|
||||
workflow.add_edge(START, "Supervisor")
|
||||
|
||||
# 修改条件边映射
|
||||
|
||||
Reference in New Issue
Block a user