第5章:结果对象

欢迎回到swarm

在上一章第4章:功能中,我们学习了如何通过定义Python功能赋予智能体技能。我们见证了当AI决策调用时,Swarm框架如何执行这些功能。

当前,我们的功能仅返回简单字符串如"武汉当前为晴天"。Swarm框架会将该字符串结果反馈给AI模型,这在简单场景下运作良好。

但当功能需要实现更复杂的操作时该如何处理?例如:

  • 成功完成任务(如用户登录)后需存储新信息(如用户ID)到上下文变量
  • 完成流程(如机票预订)后对话应由其他智能体接管(如行程规划智能体)

简单的字符串返回值无法向Swarm框架传递此类结构化信息。

这正是**结果对象(Result)**的用武之地!

什么是结果对象?

Result对象是可供智能体功能返回的特殊类型,旨在为功能代码提供结构化方式与Swarm框架通信重要结果及状态变更。

如同乐手(功能)不仅演奏音符(返回字符串),还向指挥(Swarm)传递信号:

“演奏完成,以下是需知附加信息,可能需切换其他乐手接续演奏”

Result对象包含三大要素:

  1. value(字符串):功能主输出,与之前相同。Swarm框架将其格式化为功能调用结果返回AI
  2. context_variables(字典):包含功能需要更新或添加的上下文变量,将被合并至当前上下文状态
  3. agent(智能体对象):可选参数,若提供则触发智能体交接机制(第6章详解)

swarm/types.py中的类定义如下:

# File: swarm/types.pyfrom pydantic import BaseModel
from typing import Optional, dictclass Result(BaseModel):"""封装智能体功能可能的返回值"""value: str = ""agent: Optional[Agent] = Nonecontext_variables: dict = {}

为何使用结果对象?

返回Result对象赋予功能更强的对话流程控制能力:

  • 更新共享状态:可结构化更新重要信息(登录状态、购物车商品、流程完成状态)
  • 影响后续步骤:通过更新上下文动态影响AI后续指令或功能调用
  • 触发智能体交接:标记应由其他智能体接管对话

以登录功能更新上下文为例演示应用场景。

应用示例:登录后更新上下文

假设login_user功能需在成功登录后返回确认信息,并将user_id存入上下文供后续操作使用。

定义返回Result的功能:

# 定义返回结果对象的功能
from swarm import Result, Agent, Swarmdef login_user(username: str, password: str):"""尝试用户登录,成功返回用户ID"""print(f"(正在尝试登录用户:{username})")# 模拟凭证校验if username == "test_user" and password == "password123":user_id = "user_12345"print(f"(登录成功,用户ID:{user_id})")# 返回结果对象!return Result(value="登录成功。",context_variables={"user_id": user_id, "is_logged_in": True} # 更新上下文)else:print("(登录失败)")# 无上下文更新时可返回普通字符串return "登录失败,凭证无效"

创建带此功能的智能体:

# 创建带登录功能的智能体
login_agent = Agent(name="登录智能体",instructions="您是登录助手,帮助用户完成登录流程",functions=[login_user]
)

运行Swarm并触发功能调用:

# 创建Swarm实例
client = Swarm()# 初始化登录请求消息
messages = [{"role": "user", "content": "请帮我登录,用户名为test_user,密码是password123"}]# 初始上下文(空或预置状态)
initial_context = {}# 运行对话
print("启动Swarm...")
response = client.run(agent=login_agent,messages=messages,context_variables=initial_context,debug=True
)# 输出最终结果
print("\nAI最终响应:")
print(response.messages[-1]['content'])print("\n最终上下文变量:")
print(response.context_variables)

执行流程解析:

  1. 调用client.run()启动流程
  2. Swarm携带初始上下文启动login_agent
  3. AI决策调用login_user并提取参数
  4. Swarm执行Python功能,成功时返回包含新上下文的Result对象
  5. Swarm合并context_variables至内部状态
  6. AI生成自然语言响应,最终上下文包含user_idis_logged_in

输出示例显示更新后的上下文变量验证状态变更成功。

运行机制:结果对象处理流程

Swarm内部处理结果对象的核心流程如下:
在这里插入图片描述

关键代码逻辑体现在swarm/core.py

# File: swarm/core.py(简化版)class Swarm:def handle_function_result(self, result, debug) -> Result:# 标准化不同返回类型为结果对象match result:case Result() as result:return resultcase Agent() as agent:return Result(value=json.dumps({"助手": agent.name}), agent=agent)case _:return Result(value=str(result))def handle_tool_calls(...):raw_result = func(**args) # 执行用户功能result = self.handle_function_result(raw_result, debug)# 更新部分响应的上下文及智能体partial_response.context_variables.update(result.context_variables)if result.agent:partial_response.agent = result.agent

小结

结果对象为智能体功能提供了结构化通信机制,使其能够:

  • 通过value 传递基础结果信息
  • 使用context_variables 更新共享状态
  • 借助agent字段触发智能体交接(将在第6章详解)

我们已掌握:

  • 识别需要结构化返回结果的场景
  • 理解结果对象的三元结构
  • 编写更新上下文变量的功能代码
  • 掌握Swarm处理结果对象的内核逻辑

下一章将深入探讨智能体交接机制,开启更复杂的多智能体协作场景!

第6章:智能体交接


第6章:智能体交接

通过前五章的学习,我们掌握了

  • 指挥家(Swarm框架)
  • 专业乐手(智能体)
  • 乐谱共享注释(上下文变量)
  • 演奏技法(功能)
  • 技法反馈机制(结果对象)。

现在让我们探索体现"swarm"核心理念的强大概念:智能体交接

什么是智能体交接?

假设我们与通用客服助手(智能体A)对话时咨询账单问题。该助手识别问题复杂性后,将对话无缝转接至专业账单处理助手(智能体B)。

此后所有交互由具备专业知识的智能体B接管。

swarm中,智能体交接对话控制权从一个智能体转移至另一个的机制

如同指挥家示意不同声部或独奏家接管主旋律,实现任务主题的精准切换。

为何需要智能体交接?

智能体交接对构建复杂AI应用至关重要,其优势包括:

  • 专业化:创建高精度领域专家智能体
  • 模块化:保持智能体定义简洁,便于开发维护
  • 高效性:AI模型聚焦当前任务,避免指令过载
  • 性能提升:专用智能体处理任务更精准可靠

交接机制实现原理

交接机制的核心建立在结果对象的agent字段:

# 摘自swarm/types.py
class Result(BaseModel):value: str = ""  # 反馈AI的结果值agent: Optional[Agent] = None  # <<< 交接关键字段!context_variables: dict = {}  # 上下文更新

当功能返回的Result对象携带新智能体实例时,Swarm框架将激活该智能体作为后续对话的主控者。

基础应用:语言交接场景

我们通过语言切换示例演示交接流程:当英文智能体检测到西班牙语输入时,转接至西语智能体。

系统需要:

  1. 英文智能体:具备西语检测能力
  2. 西语智能体:专精西语交互
  3. 交接功能:触发智能体切换

完整代码实现如下(参照examples/basic/agent_handoff.py):

from swarm import Swarm, Agent, Result# 定义英文智能体
english_agent = Agent(name="英文智能体",instructions="您仅使用英语。检测到西语输入时调用'transfer_to_spanish_agent'工具",# 功能列表将在下方添加
)# 定义西语智能体
spanish_agent = Agent(name="西语智能体",instructions="您仅使用西班牙语。",
)# 定义交接功能
def transfer_to_spanish_agent():"""将用户转接至西语助手"""print("(正在转接至西语智能体...)")  # 调试信息return Result(value="正在转接至西语助手",  # AI反馈信息agent=spanish_agent  # <<< 交接标识)# 为英文智能体添加功能
english_agent.functions.append(transfer_to_spanish_agent)# 创建Swarm实例
client = Swarm()# 初始西语消息
messages = [{"role": "user", "content": "Hola. ¿Como estás?"}]# 启动对话流程
print("启动英文智能体...")
response = client.run(agent=english_agent, messages=messages, debug=True)# 输出结果
print("\n最终AI响应:")
print(response.messages[-1]["content"])
print("\n最终激活智能体:")
print(response.agent.name)

执行流程解析:

  1. 使用english_agent启动对话
  2. AI检测西语输入,调用交接功能
  3. 功能返回携带spanish_agentResult对象
  4. Swarm更新active_agent为西语智能体
  5. 后续交互由西语智能体接管

输出

在这里插入图片描述

内部机制

Swarm框架通过handle_function_result方法处理交接逻辑:
在这里插入图片描述

关键代码逻辑位于swarm/core.py

# 简化版run方法
def run(...):active_agent = agent  # 初始智能体while ...:if partial_response.agent:active_agent = partial_response.agent  # 交接发生点return Response(agent=active_agent)  # 返回最终激活智能体

小结

智能体交接机制使复杂AI应用具备动态角色切换能力,其核心要点包括:

  • 通过Result.agent字段触发智能体切换
  • 交接功能负责识别切换需求并返回目标智能体
  • Swarm框架自动更新激活智能体状态

我们已掌握:

  • 交接机制的应用场景与优势
  • 多智能体的定义与功能绑定
  • 交接功能的实现方式
  • Swarm内部的状态更新逻辑

下一章将深入解析Swarm.run()的输出核心——响应对象!

第7章:响应对象


第7章:Response

经过前六章的学习,我们已经构建了完整的认知体系:

  • Swarm作为交响乐团指挥
  • Agent充当专业乐手
  • Context Variables如同共享乐谱
  • Function类比演奏技法
  • 以及通过Result传递结构化反馈
  • 借助Agent Handoff实现演奏权转移。

当Swarm完成多轮交互(执行函数、更新上下文、可能切换代理)后,需要向开发者提供完整交互回复。

此时我们需要获取的不仅是AI的最终输出,还包括完整的对话历史、当前活跃代理以及上下文变量的最终状态——这正是Response对象的使命!

Response对象是什么?

Response对象视为复杂操作后的详尽报告。

当我们调用client.run()启动流程时,Swarm会协调所有组件完成交互,并将关键产出封装到Response对象中返回。

Swarm.run()返回的Response对象是本次调用的全景视窗,包含三方面核心属性:

  1. messages:本次运行期间产生的完整对话记录,包含初始消息、AI响应、工具调用请求及其执行结果
  2. agent:运行结束时的活跃Agent实例。若无代理交接,与初始代理相同;发生交接则为新代理
  3. context_variables:所有交互完成后Context Variables的最终状态

以下是swarm/types.pyResponse类的定义:

# File: swarm/types.pyfrom pydantic import BaseModel
from typing import List, Optional, dict # 简化导入class Response(BaseModel):"""封装Swarm的运行结果"""messages: List = []      # 本次运行的对话历史agent: Optional[Agent] = None  # 最终活跃代理context_variables: dict = {}   # 最终上下文变量

为何需要Response对象?

仅获取AI的最终文本响应不足以构建动态多轮应用。Response对象提供三大关键价值:

  • 完整历史回溯:延续对话需包含用户输入、AI响应及工具调用痕迹,messages属性为此提供支持
  • 当前代理状态:通过Agent Handoff切换代理后,agent属性确保后续交互正确路由
  • 上下文同步:函数执行产生的关键数据(用户ID、订单状态等)通过context_variables保持状态同步

本质上,Response对象是swarm内部状态与外部应用逻辑的同步枢纽。

Response对象使用实践

通过第1章的简单示例演示如何访问Response对象:

from swarm import Swarm, Agent# 创建基础代理
agent = Agent(name="基础助手")# 初始化Swarm
client = Swarm()# 定义初始消息
messages = [{"role": "user", "content": "你好,最近怎么样?"}]# 运行Swarm交互
print("运行Swarm中...")
response = client.run(agent=agent, messages=messages, debug=True)# 解析Response对象
print("\n--- Response详情 ---")# 1.获取最终消息内容
final_message = response.messages[-1]
print(f"最终消息内容: {final_message.get('content')}")
print(f"消息角色: {final_message.get('role')}")# 2.查看完整对话历史
print("\n本次运行完整消息记录:")
for msg in response.messages:sender = msg.get('sender', msg.get('role', '未知'))content = msg.get('content')if content:print(f"  [{sender}] {content}")elif msg.get('tool_calls'):print(f"  [{sender}] 请求工具调用: {msg['tool_calls']}")# 3.获取当前活跃代理
print(f"\n当前活跃代理: {response.agent.name}")# 4.获取上下文变量
print(f"\n最终上下文变量: {response.context_variables}")

执行结果将展示:

  • AI的最终响应内容
  • 包含初始消息和AI响应的完整对话历史
  • 当前活跃代理名称(若无交接则为"基础助手")
  • 上下文变量状态(未调用函数时为空)

底层实现机制

Response对象在Swarm.run()方法返回前构建,收集运行时产生的三大状态:

在这里插入图片描述
我们可以联想到前文的Eventloop: [muduo_1] docs | 配置教程 | EventLoop | Thread

muduo review

Loop

Loop(循环)是让计算机重复执行同一段代码,直到满足某个条件才停止,就像“重复做某件事直到做完为止”。

  • 场景:自动打印100份文件,不用写100行代码,只需1个循环指令。

EventLoop

EventLoop 就像一家快餐店的取餐流程:顾客点单(任务)被放入队列,厨房(主线程)按顺序处理,遇到需要等待的订单(异步任务)就先放一边继续做后面的,等外卖(异步结果)送到了再回来处理。

事件驱动与非阻塞IO

muduo库的核心设计思想是基于事件驱动非阻塞网络编程,通过Reactor模式高效处理高并发连接,避免线程频繁创建销毁的开销。

  • Reactor模式通过单线程或多线程事件循环监听I/O事件,结合非阻塞调用回调机制,实现高并发连接处理,避免为每个连接创建线程的开销。

  • 采用线程池复用固定数量的工作线程,配合事件驱动机制,将连接生命周期管理与业务逻辑解耦,减少线程频繁创建销毁带来的性能损耗。

多线程与对象生命周期管理

采用**one loop per thread**架构,每个线程独立运行事件循环结合智能指针自动管理资源,保证线程安全与对象生命周期的可控性。

接口

仅依赖Linux原生系统调用(如epoll),避免过度抽象,提供回调机制让开发者聚焦业务逻辑,降低复杂度。

在这里插入图片描述

我们再回过头来看swarm

swarm/core.py中的核心代码片段:

# File: swarm/core.py (简化版run方法)def run(self, agent: Agent, messages: List, context_variables: dict = {}) -> Response:active_agent = agentcontext_variables = copy.deepcopy(context_variables)history = copy.deepcopy(messages)init_len = len(messages)while ...:  # 交互循环# 处理AI响应和工具调用# 更新history/context_variables/active_agent# 构建Response对象return Response(messages=history[init_len:],agent=active_agent,context_variables=context_variables)

总结

Response对象作为Swarm.run()的核心输出,提供交互会话的完整摘要。

理解其结构和用法是构建多轮AI应用的关键。至此,我们已经掌握swarm的核心概念体系,包括:

  • 中央控制器Swarm
  • 专业化代理Agent
  • 共享上下文变量
  • 可调用函数
  • 结构化Result
  • 代理交接机制
  • 状态汇总Response

这些知识将帮助我们构建复杂的AI应用系统

END ★,°:.☆( ̄▽ ̄) :.°★

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/87919.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87919.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/87919.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[2-02-02].第04节:环境搭建 - Linux搭建ES集群环境

ElasticSearch学习大纲 一、ES集群规划&#xff1a; 关系型数据库&#xff08;比如Mysql&#xff09;非关系型数据库&#xff08;Elasticsearch&#xff09;非关系型数据库&#xff08;Elasticsearch&#xff09;centos7hadoop103192.168.148.3centos7hadoop104192.168.148.4c…

部署并运行Spike-Driven-Transformer或QKFormer

部署并运行Spike-Driven-Transformer或QKFormer 我将指导你如何部署和运行Spike-Driven-Transformer或QKFormer代码,并在CIFAR-10、CIFAR-100和ImageNet-1K数据集上进行训练和测试。 1. 环境准备 首先需要设置Python环境并安装必要的依赖项: # 创建conda环境(推荐) con…

爬虫-request处理POST

1.概念很少在URL写参数&#xff0c;都在form data里面POST 的主要作用是将客户端的数据提交给服务器。这些数据可以是表单输入、文件内容、JSON 数据、XML 数据等等POST 请求携带的数据放在 HTTP 消息的请求体中。这与 GET 请求形成鲜明对比&#xff1a;GET 请求的数据通常附加…

免U盘一键重装系统

免U盘一键重装系统 简单介绍 详细的看GitHub项目首页 GitHub地址 # 下载脚本 curl -O https://cnb.cool/bin456789/reinstall/-/git/raw/main/reinstall.sh || wget -O reinstall.sh $_ # 重装系统 bash reinstall.sh ubuntu # 重启 rebootPS: 重启过程中, 可能需要手动选择r…

自动化一次通过率

自动化测试中的“一次通过率”&#xff08;First-pass Pass Rate&#xff09;​​ 是指自动化测试脚本在首次执行&#xff08;无人工干预、无重试&#xff09;​时&#xff0c;​成功通过的测试用例数占总执行用例数的百分比。​核心概念解析​​​“一次”的含义​​首次运行​…

111111事件

1.抽取 minio 当做文件对象存储服务器&#xff0c;在上面封装一层api&#xff0c;方便操作。 &#xff08;文件上传&#xff0c;指定路径上传&#xff0c;随机命名上传&#xff0c;前端获取token直接传&#xff0c;适合大对象&#xff0c;图片压缩&#xff09; 2.规范整个java项…

Qt的ui文件的编译和使用

Qt中的ui文件编译的类 要么继承 &#xff0c;要么实例化一个变量个人觉得还是继承好点&#xff0c;这样每次调用控件时&#xff0c;不用都要在控件前加上 ui.1 上面使用的是继承的关系&#xff0c;这样就可以直接使用控件.属性&#xff0c;而不用 ui.控件.树形2 QT中UI文件…

数据结构之树,二叉树,二叉搜索树

一.树1.形状2. 相关概念节点的度&#xff1a;一个节点含有的子树的个数称为该节点的度&#xff1b; 如上图&#xff1a;A的为6叶节点或终端节点&#xff1a;度为0的节点称为叶节点&#xff1b; 如上图&#xff1a;B、C、H、I...等节点为叶节点非终端节点或分支节点&#xff1a;…

LLM微调随记录

【如何把领域文献批量转换为可供模型微调的数据集&#xff1f;】 https://www.bilibili.com/video/BV1y8QpYGE57/?share_sourcecopy_web&vd_source8f9078186b93d9eee26026fd26e8a6ed 几个问题 首先要先搞清楚这几个问题 LLM 训练方法如何选择合适的训练方式如何判断是否…

高效处理大体积Excel文件的Java技术方案解析

高效处理大体积Excel文件的Java技术方案解析 引言 在数据密集型应用中&#xff0c;处理数百MB甚至GB级的Excel文件已成为业务刚需。传统基于DOM模型的Excel解析方式&#xff08;如Apache POI的XSSF&#xff09;在处理大规模数据时存在严重的内存瓶颈。本文将深入探讨Java生态中…

JVM垃圾回收机制深度解析

&#x1f5d1;️ JVM垃圾回收机制深度解析 文章目录&#x1f5d1;️ JVM垃圾回收机制深度解析&#x1f50d; 垃圾判定算法&#x1f522; 引用计数法&#x1f310; 可达性分析算法&#x1f504; 垃圾回收算法&#x1f3f7;️ 标记-清除算法&#x1f4cb; 复制算法&#x1f527; …

Docker:容器化技术的基石与实践指南

在现代软件开发和部署中&#xff0c;Docker 作为一种领先的容器化平台&#xff0c;已经成为了开发人员和运维工程师不可或缺的工具。它不仅简化了应用的部署过程&#xff0c;还提高了应用的可移植性和可扩展性。本文将深入探讨 Docker 的核心概念、基本操作以及如何在实际项目中…

java web7(黑马)

Filter简介概念: Filter 表示过滤器&#xff0c;是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能。过滤器一般完成一些通用的操作&#xff0c;比如:权限控制、统一编码处理、敏感字符处理等等.快速入…

React-forwardRef-useImperativeHandle

forwardRef 暴露dom节点作用&#xff1a;使用ref暴露DOM节点给父组件案例例如在父组件中想要获取子组件input的输入值&#xff0c;和让input获取焦点父组件import { Button } from antd-mobile import Son from "./components/son"; import { useState,useRef } fro…

Unity 用AI自动开发游戏----Cursor研究(实现一套利用Cursor生成模板快速实现原型的框架)

Unity 快速原型开发框架&#xff08;基于 Cursor AI&#xff09; &#x1f9e9; 框架简介 本框架结合了 AI 编程助手 Cursor 的代码生成能力&#xff0c;构建出一套适用于 Unity 项目的模块化原型开发架构。它旨在极大提升开发效率、降低试错成本&#xff0c;特别适用于快速搭…

D触发器实现2分频verilog及电路

使用D触发器完成2分频电路即通过时钟的上升沿或下降沿到来时进行翻转得到&#xff0c;信号的两个状态所占时间长度相同&#xff0c;因此它的输出时钟的占空比为50%。 D触发器实现2分频的电路图如下所示&#xff1a;通过将D触发器2分频电路级联&#xff0c;可实现输入时钟的2N倍…

UniApp完美对接RuoYi框架开发企业级应用

UniApp完美对接RuoYi框架的完整方案及可开发系统类型&#xff0c;结合企业级实践与开源项目经验整理而成&#xff0c;涵盖技术对接、系统设计及实战案例。 &#x1f527; 一、UniApp与RuoYi对接全流程 1. 后端配置&#xff08;RuoYi-Vue/RuoYi-Cloud&#xff09; 跨域支持 在网…

【通识】深度学习理论基础

1. 深度学习导论 导论和简介的基础知识和路径。 深度学习的各项涵盖范围&#xff1a;深度学习MLPs&#xff0c;然后是机器学习、逻辑回归&#xff0c;知识基础等等 1&#xff09;连结神经网络等等&#xff1a;Cybernetics控制论&#xff0c;Connectionism连结主义&#xff0…

sql-labs(11-12)-万能密码登录

sql-labs(11-12)万能密码登录 第十一关&#xff1a; 这关是一个登陆口&#xff0c;也是一个sql注入的漏洞&#xff0c;也就是常说的万能密码。 在输入框账号密码种分别输入 1’ 和1’ 页面会报错。后台使用的单引符号进行的拼接。账号输入1’ or ‘1’‘1 密码输入 1’ or …

MsSql 其他(2)

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨Mysql中的MVCC 一、MVCC 的核心目标与设计背景 MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并发控制&#xff09; 是 InnoDB 存储引擎为实现高并发事务处理而设计的核心机制。其核心目标是&#xff1a;在不牺牲事务隔…