示例代码:
def pop_dialog_state(state: State) -> dict:"""弹出对话栈并返回到主助手。这让整个对话流程图可以明确追踪对话流,并将控制权委派给特定的子对话图。"""messages = []if state["messages"][-1].tool_calls:# 注意:目前没有处理 llm 并行调用工具的边缘情况messages.append(ToolMessage(content="恢复与主助手的对话。请回顾过去的对话内容,并根据需要协助用户。",tool_call_id=state["messages"][-1].tool_calls[0]["id"],))return {"dialog_state": "pop","messages": messages,}self.builder.add_node("leave_skill", pop_dialog_state)
self.builder.add_edge("leave_skill", "primary_assistant")
详细解释
-
函数定义与文档字符串
def pop_dialog_state(state: State) -> dict:"""弹出对话栈并返回到主助手。这让整个对话流程图可以明确追踪对话流,并将控制权委派给特定的子对话图。"""
- 作用:定义了一个名为
pop_dialog_state
的函数,该函数接收一个state
对象,并返回一个字典。 - 目的:当对话过程中需要结束当前子对话或技能,并返回主助手接管对话时,就会调用这个函数。
- 解释:所谓“弹出对话栈”就是结束当前技能的状态,恢复到上一级(主助手)的控制状态。
- 举例:如果用户正在使用某个子技能(如航班查询),而后决定结束该技能,系统就会调用这个函数返回到主助手。
- 作用:定义了一个名为
-
初始化消息列表
messages = []
- 作用:创建一个空列表,用于存储后续生成的消息。
- 解释:在返回的字典中,这个列表会包含需要发送给用户的工具消息。
-
判断是否存在工具调用
if state["messages"][-1].tool_calls:
- 作用:检查
state
对象中最后一条消息是否包含工具调用(tool_calls
)。 - 解释:只有当最后一条消息中有工具调用信息时,才需要生成一条恢复对话的消息。
- 作用:检查
-
生成工具消息
messages.append(ToolMessage(content="恢复与主助手的对话。请回顾过去的对话内容,并根据需要协助用户。",tool_call_id=state["messages"][-1].tool_calls[0]["id"],) )
- 作用:创建一个
ToolMessage
对象,并将其添加到messages
列表中。 - ToolMessage 内容说明:
- “恢复与主助手的对话”:说明当前对话将回到主助手,由主助手接管。
- “请回顾过去的对话内容,并根据需要协助用户”:提示主助手参考之前的对话记录,继续协助用户解决问题。
- 工具调用 ID:
- 从
state["messages"][-1].tool_calls[0]["id"]
中提取 ID,用于标识此次工具调用的关联信息。
- 从
- 举例:假设
state["messages"][-1].tool_calls[0]["id"]
的值为"abc123"
,那么生成的 ToolMessage 会带有tool_call_id="abc123"
。
- 作用:创建一个
-
返回新的对话状态和消息
return {"dialog_state": "pop","messages": messages, }
- 作用:构造一个字典,包含两个键:
"dialog_state"
设置为"pop"
,表示当前对话状态已经弹出,返回到上一级对话。"messages"
包含前面生成的工具消息列表。
- 解释:这一步将更新系统的对话状态,同时传递消息,指示主助手接管对话。
- 作用:构造一个字典,包含两个键:
-
将节点和边添加到对话图中
self.builder.add_node("leave_skill", pop_dialog_state) self.builder.add_edge("leave_skill", "primary_assistant")
- 作用:
add_node
将pop_dialog_state
函数作为一个节点,命名为"leave_skill"
。add_edge
将"leave_skill"
节点与"primary_assistant"
节点连接起来。
- 解释:
- 当对话流程经过
"leave_skill"
节点时,就会执行pop_dialog_state
函数,更新对话状态。 - 之后,对话流会继续沿着边转移到
"primary_assistant"
,即让主助手重新控制对话。
- 当对话流程经过
- 举例:假如用户结束了当前技能的使用,系统会调用
"leave_skill"
节点,执行pop_dialog_state
,然后自动转到主助手处理后续对话。
- 作用:
总结
这段代码的主要目的是在对话系统中实现“退出当前技能/子对话”的功能。通过调用 pop_dialog_state
函数:
- 更新对话状态:将当前状态设置为
"pop"
,表示回退到上一层或主对话状态。 - 发送恢复消息:生成一条工具消息,提示系统回到主助手,并提醒主助手查看历史对话以便继续辅助用户。
- 连接对话图节点:通过添加节点和边,将此状态变化集成到整个对话流程图中,使系统能自动将对话权交还给主助手。
例如,当用户在使用航班查询技能后决定退出并交回主助手时,系统会通过该方法将状态弹出,并将对话控制权切换给主助手,从而确保整个对话流程能够顺畅进行。