pop_dialog_state(state: State)弹出对话栈并返回到主助手,让整个对话流程图可以明确追踪对话流,并将控制权委派给特定的子对话图。

示例代码:

python 复制代码
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")

详细解释

  1. 函数定义与文档字符串

    python 复制代码
    def pop_dialog_state(state: State) -> dict:
        """弹出对话栈并返回到主助手。
    
        这让整个对话流程图可以明确追踪对话流,并将控制权委派给特定的子对话图。
        """
    • 作用 :定义了一个名为 pop_dialog_state 的函数,该函数接收一个 state 对象,并返回一个字典。
    • 目的:当对话过程中需要结束当前子对话或技能,并返回主助手接管对话时,就会调用这个函数。
    • 解释:所谓"弹出对话栈"就是结束当前技能的状态,恢复到上一级(主助手)的控制状态。
    • 举例:如果用户正在使用某个子技能(如航班查询),而后决定结束该技能,系统就会调用这个函数返回到主助手。
  2. 初始化消息列表

    python 复制代码
    messages = []
    • 作用:创建一个空列表,用于存储后续生成的消息。
    • 解释:在返回的字典中,这个列表会包含需要发送给用户的工具消息。
  3. 判断是否存在工具调用

    python 复制代码
    if state["messages"][-1].tool_calls:
    • 作用 :检查 state 对象中最后一条消息是否包含工具调用(tool_calls)。
    • 解释:只有当最后一条消息中有工具调用信息时,才需要生成一条恢复对话的消息。
  4. 生成工具消息

    python 复制代码
    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"
  5. 返回新的对话状态和消息

    python 复制代码
    return {
        "dialog_state": "pop",
        "messages": messages,
    }
    • 作用 :构造一个字典,包含两个键:
      • "dialog_state" 设置为 "pop",表示当前对话状态已经弹出,返回到上一级对话。
      • "messages" 包含前面生成的工具消息列表。
    • 解释:这一步将更新系统的对话状态,同时传递消息,指示主助手接管对话。
  6. 将节点和边添加到对话图中

    python 复制代码
    self.builder.add_node("leave_skill", pop_dialog_state)
    self.builder.add_edge("leave_skill", "primary_assistant")
    • 作用
      • add_nodepop_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",表示回退到上一层或主对话状态。
  • 发送恢复消息:生成一条工具消息,提示系统回到主助手,并提醒主助手查看历史对话以便继续辅助用户。
  • 连接对话图节点:通过添加节点和边,将此状态变化集成到整个对话流程图中,使系统能自动将对话权交还给主助手。

例如,当用户在使用航班查询技能后决定退出并交回主助手时,系统会通过该方法将状态弹出,并将对话控制权切换给主助手,从而确保整个对话流程能够顺畅进行。

相关推荐
郭庆汝24 分钟前
pytorch、torchvision与python版本对应关系
人工智能·pytorch·python
思则变3 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
漫谈网络4 小时前
WebSocket 在前后端的完整使用流程
javascript·python·websocket
try2find5 小时前
安装llama-cpp-python踩坑记
开发语言·python·llama
博观而约取6 小时前
Django ORM 1. 创建模型(Model)
数据库·python·django
精灵vector8 小时前
构建专家级SQL Agent交互
python·aigc·ai编程
Zonda要好好学习8 小时前
Python入门Day2
开发语言·python
Vertira8 小时前
pdf 合并 python实现(已解决)
前端·python·pdf
太凉8 小时前
Python之 sorted() 函数的基本语法
python
项目題供诗8 小时前
黑马python(二十四)
开发语言·python