设计代理选择策略

已完成

语义内核代理框架的一个关键功能是支持智能多代理交互。 可以使用 AgentGroupChat 来实现代理合作,它包含一些关键组件,这些组件在单一代理或非代理语义内核应用中并不需要考虑。

以下单元讨论了一个示例多代理解决方案,其中我们在编写者-审阅者方案中有两个代理:

  • 撰写在线内容的撰稿代理,称为 CopywriterAgent
  • 仅对提案进行审查的创意总监,称为 ReviewingDirectorAgent

代理选择

请务必选择最适合响应用户查询的代理,尤其是在代理专用于不同域的多代理系统中。

例如,如果你与代理聊天,要求为新款刷子提供宣传口号,则不应调用 ReviewingDirectorAgent 来进行响应,因为它们不知道如何撰写宣传口号。 相反,让 CopywriterAgent 响应为用户提供准确的响应。

为什么代理选择很重要?

  • 准确性:将查询路由到最相关的代理可确保精确的响应。
  • 效率:它通过使用专业代理的专业知识来缩短处理时间。
  • 可伸缩性:适当的选择允许框架处理各种查询,而无需压倒性单个代理,并在聊天中的代理数量增长时为用户提供最佳响应。

框架如何选择代理?

单轮会话

  • 意向识别:框架分析用户的查询,以识别意向并将其与最相关的代理匹配。
  • 预定义规则:开发人员可以将路由规则配置为将特定查询定向到其应用程序中的指定代理。

多轮对话

  • 上下文跟踪:框架维护会话历史记录的记录,以了解用户的意图并选择相应的代理。
  • 动态切换:如果主题发生转变,框架会在对话过程中动态切换到专门处理新域的代理。

代理选择策略

对于多轮代理,代理选择是由选择策略决定的。 选择策略是在框架中定义的,方法是使用预定义的选择策略或通过扩展 SelectionStrategy 类来定义自定义选择行为。 可以在创建 AgentGroupChat 对象时定义选择策略。

SequentialSelectionStrategy

  • SequentialSelectionStrategy 类提供了预定义的选择策略,其中代理的轮次顺序基于将代理添加到聊天的顺序。 还可以选择指定初始代理。

KernelFunctionSelectionStrategy

  • 借助 KernelFunctionSelectionStrategy 类,可以通过从提示创建内核函数来定义选择策略。 在我们的编写者和审阅者示例中,你的选择策略提示可能是:

    prompt=f"""
        Determine which participant takes the next turn in a conversation based on the most recent participant.
        State only the name of the participant to take the next turn.
        No participant should take more than one turn in a row.
    
        Choose only from these participants:
        - ReviewingDirectorAgent
        - CopywriterAgent
    
        Always follow these rules when selecting the next participant:
        - After user input, it is CopywriterAgent's turn.
        - After CopywriterAgent replies, it is ReviewingDirectorAgent's turn.
        - After ReviewingDirectorAgent provides feedback, it is CopywriterAgent's turn.
    
        History:
        {{$history}}
    """
    

    如果首选交互应始终先有特定的代理响应,则可以在选择策略中指定,如上述提示所示。

SelectionStrategy 基类

  • SelectionStrategy基类包含一个可以重写的select_agent方法,您可以在其中定义用于选择下一个代理的自定义逻辑。 返回值必须是群聊中出现的代理。

确定选择策略后,可以将其 selection_strategy 分配给对象的参数 AgentGroupChat

截断聊天历史记录

由于选择策略通常依赖于聊天中的最后一条消息来确定下一个代理,因此可以截断聊天历史记录以减少令牌使用情况并帮助提高性能。 KernelFunctionSelectionStrategy接受一个history_reducer参数,您可以指定为:

history_reducer = ChatHistoryTruncationReducer(target_count=1)