多智能体设计(第二部分):消息传递机制(含考题)
目录一、通信协议的核心价值二、通信协议的结构组成三、通信协议的结构组成四、通信协议设计原则五、上下文切换与隔离的设计要点六、考题题目 1考察 ContextScope 类核心方法​题目 2考察 AgentTask 类的继承与初始化​题目 3考察 AgentTask 的 run 方法执行流程​题目 4考察多线程任务的启动与等待​题目 5考察上下文隔离的核心逻辑​题目 6考察 Message 对象的使用场景​题目 7考察主流程的上下文销毁逻辑​题目 8考察智能体调用的核心逻辑​题目 9考察多线程任务的结果存储​题目 10综合考察代码核心逻辑​一、通信协议的核心价值在多智能体系统中稳定高效的消息传递机制是提升系统响应效率与健壮性的关键它能避免信息丢失与逻辑混乱。通信协议格式不仅定义了消息的基本构成和编码方式更决定了系统在并发、异步、异构模型协同场景下的可扩展性与健壮性。二、通信协议的结构组成智能体间通信协议的核心要素可划分为以下 5 类元信息Metadata包含消息唯一 ID、时间戳、发送方与接收方智能体标识、优先级等级、上下文轮次等。作用保证通信过程中消息的唯一性、追溯性与分发有序性是构建异步任务链与审计机制的基础。消息类型Message Type常见类型指令Command、请求Request、响应Response、异常报告Error、状态更新Update等。作用通过明确的消息类型标记智能体可快速判断当前消息的语义意图与处理分支。载荷内容Payload是协议的主体部分通常包含结构化字段和自然语言内容。示例指令类消息包含待执行函数名与参数响应类消息包含返回结果与执行状态。优势支持 JSON、Protobuf 等格式便于跨系统兼容与解析。上下文引用Context Pointer作用通过上下文引用指针索引共享内存或共享数据库中的历史段、变量或前置任务结果实现上下文共享、跨智能体记忆协同与状态联动。安全与控制字段包含鉴权 Token、消息签名、生命周期控制字段如有效期、回滚要求、是否可重放等。作用确保消息在多模型环境中可控、可验证与可撤销是保障多智能体系统可信执行的重要机制。三、通信协议的结构组成这是一个典型的智能体间指令消息用于任务调度各字段作用如下字段示例值作用timestamp2025-05-03T13:45:27Z时间戳用于追溯和审计fromagent:task_dispatcher发送方智能体任务调度器toagent:data_parser接收方智能体数据解析器typecommand消息类型指令priority2任务优先级context_ref[mem-1001, task-req-879]上下文引用索引共享内存和前置任务payload.functionparse_table待执行的函数名payload.args{file_url: ..., columns: [...]}函数调用参数auth.tokeneyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...鉴权令牌auth.signaturebla927ec3...消息签名防篡改该格式兼具通用性、可验证性与结构清晰性便于在多模型、多智能体、多通道系统中传递与执行。四、通信协议设计原则要构建稳定可扩展的智能体通信协议应遵循以下 5 大原则结构标准化采用 JSON Schema 或 Protobuf 等可校验格式明确字段类型与可选字段避免通信歧义。语义可扩展支持灵活定义新的消息类型与指令结构便于未来引入新功能智能体或嵌套子任务模型。上下文链路透明每条消息明确标识所依赖的上下文来源与调用路径使系统能追踪数据流向增强故障可诊断性。安全可靠支持加密传输与签名验证避免智能体伪造与中间人攻击通过 Token 控制调用权限与调用频次。容错与重试机制协议中支持状态回传与超时标志智能体可基于响应状态判断是否进行重试、回滚或转交。五、上下文切换与隔离的设计要点1.上下文切换机制要求系统能够动态加载、裁剪、暂停、恢复和清除不同任务的上下文环境。确保任务间的数据与状态彼此独立互不干扰。2.上下文隔离设计引入作用域管理策略如任务ID空间、上下文命名空间、线程隔离等。实现每个任务的上下文生命周期管理、可见性限制与访问控制。3.Qwen 3.0的实现方式通过Message对象与对话ID管理实现上下文作用域的分离。结合多智能体注册机制为每个任务线程动态挂载对应上下文。import time import threading from typing import Dict, List from qwen_agent.agent import Agent from qwen_agent.context import Message # 上下文容器类 class ContextScope: def __init__(self): self.contexts: Dict[str, list] {} def create(self, task_id: str): self.contexts[task_id] [] def append(self, task_id: str, message: Message): if task_id in self.contexts: self.contexts[task_id].append(message) def get(self, task_id: str) - list: return self.contexts.get(task_id, []) def destroy(self, task_id: str): if task_id in self.contexts: del self.contexts[task_id] # 多任务智能体任务模拟 class AgentTask(threading.Thread): def __init__(self, task_id: str, user_input: str, scope: ContextScope): super().__init__() self.task_id task_id self.user_input user_input self.scope scope self.result None def run(self): print(f→ 启动任务[{self.task_id}]) self.scope.create(self.task_id) # 模拟输入并追加上下文 self.scope.append( self.task_id, Message(roleuser, contentself.user_input) ) # 构造代理并调用 agent Agent() history self.scope.get(self.task_id) result agent.chat(messageshistory) self.scope.append( self.task_id, Message(roleassistant, contentresult.content) ) self.result result.content print(f→ 任务[{self.task_id}]完成结果{self.result[:50]}...) # 主流程 if __name__ __main__: print( 启动多任务上下文隔离系统 ) context_scope ContextScope() tasks [ AgentTask(task_001, 请简要说明当前中国宏观经济趋势, context_scope), AgentTask(task_002, 总结2023年人工智能的发展方向, context_scope), AgentTask(task_003, 请写一段300字的自然语言处理技术简介, context_scope) ] # 启动所有任务 for task in tasks: task.start() # 等待所有任务完成 for task in tasks: task.join() # 销毁上下文 for task in tasks: context_scope.destroy(task.task_id) # Qwen 3.0汇总所有任务结果 print(\n 任务执行汇总 ) summary_prompt 以下是三个独立任务的执行结果请汇总成一份简洁的报告\n for task in tasks: summary_prompt f\n【{task.task_id}】\n{task.result}\n qwen_agent Agent() summary qwen_agent.chat(messages[ Message(roleuser, contentsummary_prompt) ]) print(汇总报告\n, summary.content)六、考题题目 1考察 ContextScope 类核心方法​关于ContextScope类的方法实现和功能说法正确的有​A. create方法会为指定task_id初始化一个空列表存储该任务的上下文消息​B. append方法仅当task_id已存在于contexts字典中时才会追加Message对象​C. get方法若传入的task_id不存在会返回空列表而非抛出异常​D. destroy方法会删除指定task_id对应的上下文数据释放内存​E. contexts属性是Dict[str, list]类型key 为任务 IDvalue 为该任务的 Message 列表​正确答案ABCDE​解析​A ✔️create方法逻辑self.contexts[task_id] []初始化空列表存储上下文​B ✔️append方法先判断if task_id in self.contexts:仅存在时才追加​C ✔️get方法使用dict.get(task_id, [])不存在则返回默认值空列表​D ✔️destroy方法通过del self.contexts[task_id]删除指定任务的上下文​E ✔️代码中self.contexts: Dict[str, list] {}明确类型定义。​题目 2考察 AgentTask 类的继承与初始化​关于AgentTask类的定义和初始化逻辑说法正确的有​A. AgentTask继承自threading.Thread是一个可独立运行的线程类​B. 初始化参数包含task_id、user_input和scopeContextScope 实例无默认值​C. result属性初始值为None用于存储任务执行后智能体返回的结果​D. run方法是线程的核心执行逻辑启动线程时自动调用​E. 多个AgentTask实例共享同一个scope对象实现上下文隔离​正确答案ABCD​解析​A ✔️类定义class AgentTask(threading.Thread)明确继承线程类​B ✔️__init__参数为task_id: str, user_input: str, scope: ContextScope均无默认值​C ✔️self.result None初始化执行完成后赋值为result.content​D ✔️threading.Thread子类通过重写run方法定义线程执行逻辑start()会触发run()​E ❌多个任务共享同一个scope对象但通过不同task_id存储上下文实现数据隔离而非 “共享 scope 就不隔离”。​题目 3考察 AgentTask 的 run 方法执行流程​关于AgentTask的run方法执行流程排序正确且逻辑无误的有​A. 创建任务上下文 → 追加用户输入消息 → 获取上下文历史 → 调用智能体 → 追加助手回复 → 保存结果​B. 调用智能体 → 创建任务上下文 → 追加用户输入 → 保存结果 → 追加助手回复​C. scope.create(self.task_id)必须在scope.append之前执行否则会因task_id不存在导致追加失败​D. agent.chat(messageshistory)的入参history是当前任务的上下文列表包含用户输入​E. 执行完成后self.result会被赋值为智能体返回结果的content属性​正确答案ACDE​解析​A ✔️完全匹配run方法的执行顺序​B ❌创建上下文是第一步调用智能体在追加用户输入之后顺序错误​C ✔️append方法会校验task_id是否存在未创建则无法追加​D ✔️history self.scope.get(self.task_id)获取的是已追加用户输入的上下文列表​E ✔️代码逻辑self.result result.content保存回复内容。​题目 4考察多线程任务的启动与等待​关于主流程中多线程任务的执行逻辑说法正确的有​A. task.start()会启动线程异步执行run方法不会阻塞主线程​B. task.join()会阻塞主线程等待该线程执行完成后再继续​C. 先调用所有任务的start()再调用join()实现多任务并行执行​D. 若先调用join()再调用start()线程会无法启动并抛出异常​E. 三个AgentTask任务会严格按task_001→task_002→task_003的顺序执行完成​正确答案ABCD​解析​A ✔️start()是线程启动方法触发run()异步执行​B ✔️join()是线程等待方法主线程会等待子线程完成​C ✔️先批量start()启动所有线程并行再批量join()等待所有线程完成是多线程常用写法​D ✔️join()仅对已启动的线程有效未start()的线程调用join()无意义且逻辑上无法执行​E ❌多线程执行是异步的完成顺序由系统调度决定不一定按创建顺序。​题目 5考察上下文隔离的核心逻辑​关于代码中 “上下文隔离” 的实现机制说法正确的有​A. 核心是通过task_id作为唯一标识不同任务的上下文存储在contexts字典的不同 key 下​B. 即使多个任务共享同一个ContextScope实例各自的Message列表也不会互相干扰​C. AgentTask的run方法中scope.get(self.task_id)只会获取当前任务的上下文不会获取其他任务的​D. 任务执行完成后调用context_scope.destroy(task_id)是为了清理该任务的上下文数据​E. 上下文隔离的目的是保证每个智能体任务的对话历史独立避免不同任务的消息混淆​正确答案ABCDE​解析​A ✔️contexts字典以task_id为 key实现不同任务上下文的隔离存储​B ✔️共享scope但 key 不同数据彼此独立​C ✔️get方法传入当前任务的task_id仅获取自身上下文​D ✔️destroy方法删除指定task_id的上下文释放内存​E ✔️上下文隔离是多任务智能体的核心需求避免消息串扰。​题目 6考察 Message 对象的使用场景​关于代码中Message类的使用说法正确的有​A. Message对象包含role和content两个核心属性如 user/assistant​B. 用户输入会被封装为roleuser的 Message 对象追加到任务上下文​C. 智能体的回复会被封装为roleassistant的 Message 对象追加到任务上下文​D. agent.chat(messageshistory)的入参history是多个 Message 对象的列表​E. 汇总阶段summary_prompt拼接的是 Message 对象本身而非其content属性​正确答案ABCD​解析​A ✔️从代码中Message(roleuser, contentself.user_input)可推断role和content是核心属性​B ✔️用户输入封装为roleuser的 Message 并追加​C ✔️智能体回复封装为roleassistant的 Message 并追加​D ✔️history self.scope.get(self.task_id)获取的是 Message 列表作为chat方法入参​E ❌汇总时拼接的是task.result即result.content是字符串而非 Message 对象。​题目 7考察主流程的上下文销毁逻辑​关于主流程中context_scope.destroy(task_id)的调用说法正确的有​A. 销毁操作在所有任务join()完成后执行避免销毁正在使用的上下文​B. 销毁的是每个任务对应的上下文列表不会影响ContextScope实例本身​C. 若提前销毁上下文任务未完成会导致AgentTask的append或get操作失败​D. 销毁上下文是可选操作不销毁也不会影响汇总逻辑但会占用内存​E. 销毁后再次调用scope.get(task_id)会返回空列表​正确答案ABCDE​解析​A ✔️先join()等待所有任务完成再销毁上下文避免数据被占用​B ✔️destroy仅删除contexts字典中的指定 keyscope实例仍存在​C ✔️任务未完成时销毁上下文后续append/get会因task_id不存在导致追加失败append或返回空列表get​D ✔️销毁是为了释放内存不销毁不影响汇总汇总用的是task.result但contexts字典会保留数据​E ✔️销毁后task_id不在contexts中get方法返回默认值空列表。​题目 8考察智能体调用的核心逻辑​关于代码中Agent类的chat方法调用说法正确的有​A. 每个AgentTask线程都会创建独立的Agent实例避免多线程冲突​B. agent.chat(messageshistory)的入参是当前任务的上下文 Message 列表​C. chat方法的返回值包含content属性存储智能体的回复内容​D. 汇总阶段创建的qwen_agent是独立的Agent实例用于汇总所有任务结果​E. chat方法仅能接收单个Message对象无法接收列表​正确答案ABCD​解析​A ✔️每个AgentTask的run方法中都执行agent Agent()创建独立实例​B ✔️history是当前任务的上下文列表作为chat方法入参​C ✔️代码中result.content和summary.content均调用返回值的content属性​D ✔️汇总阶段新建qwen_agent Agent()用于生成汇总报告​E ❌chat方法入参是messages[Message(...)]列表支持多消息上下文。​题目 9考察多线程任务的结果存储​关于AgentTask的result属性和结果传递说法正确的有​A. result属性初始为None线程执行完成后被赋值为智能体回复的content​B. 主线程通过task.result获取子线程的执行结果无需通过ContextScope​C. 即使ContextScope销毁了任务上下文task.result仍保留结果不影响汇总​D. 多个任务的result属性彼此独立不会互相覆盖​E. result属性存储的是完整的Message对象而非字符串​正确答案ABCD​解析​A ✔️self.result None初始化执行后self.result result.content​B ✔️主线程遍历tasks列表通过task.result直接获取结果无需再从scope中读取​C ✔️result是AgentTask的属性与ContextScope的上下文无关销毁上下文不影响​D ✔️每个AgentTask实例有独立的result属性互不干扰​E ❌result存储的是result.content字符串而非Message对象。​题目 10综合考察代码核心逻辑​关于整个代码的执行流程和核心设计说法正确的有​A. 核心设计目标是实现 “多任务智能体调用 上下文隔离 结果汇总”​B. 多线程机制让三个任务可以并行执行提升整体执行效率​C. ContextScope是上下文管理的核心实现不同任务消息的隔离与生命周期管理​D. 汇总阶段通过拼接所有任务的结果调用智能体生成统一报告​E. 代码中所有Agent实例的调用都是同步的多线程仅体现在任务执行层面​正确答案ABCDE​解析​A ✔️代码整体围绕多任务智能体调用、上下文隔离、结果汇总展开​B ✔️多线程并行执行三个任务相比串行执行效率更高​C ✔️ContextScope负责上下文的创建、追加、获取、销毁管理生命周期和隔离​D ✔️汇总阶段拼接task.result生成summary_prompt调用qwen_agent生成报告​E ✔️单个Agent的chat方法是同步调用多线程仅体现在不同AgentTask的并行执行。​总结​本次 10 道考题全面覆盖代码核心逻辑关键总结如下​ContextScope核心是通过task_id实现上下文隔离提供创建 / 追加 / 获取 / 销毁四个核心方法​AgentTask继承threading.Threadrun方法实现 “创建上下文→调用智能体→保存结果” 的核心逻辑​多线程流程start()异步启动线程join()等待线程完成实现多任务并行​上下文隔离通过task_id作为ContextScope字典的 key保证不同任务消息不混淆​结果处理任务结果存储在AgentTask的result属性汇总阶段拼接结果调用智能体生成报告。

相关新闻

人工智能应用- 预测化学反应:03. 扑朔迷离的化学反应

人工智能应用- 预测化学反应:03. 扑朔迷离的化学反应

尽管化学反应无处不在,但许多反应过程极其复杂,科学家想要完全理解并精准控制它们并不容易。例如,氨(NH3)是一种常见的含氮化合物,可以通过氮气(N2)和氢气(H2&#xff09…

2026/7/5 4:53:25 阅读更多 →
【Effective Modern C++】第七章 并发API:35. 优先考虑基于任务的编程而非基于线程的编程

【Effective Modern C++】第七章 并发API:35. 优先考虑基于任务的编程而非基于线程的编程

两种异步执行方式的直观对比 基于线程(thread-based):直接创建 std::thread int doAsyncWork(); std::thread t(doAsyncWork); // 直接创建线程执行函数无直接获取返回值的方式;若函数抛出异常,程序会直接调用std::t…

2026/7/4 19:45:58 阅读更多 →
横评后发现 9个一键生成论文工具:继续教育毕业论文写作必备测评与推荐

横评后发现 9个一键生成论文工具:继续教育毕业论文写作必备测评与推荐

在当前学术写作日益智能化的背景下,越来越多的科研工作者和高校学生开始依赖AI工具提升论文写作效率。然而,面对市场上五花八门的一键生成论文工具,如何选择真正适合自己的产品成为一大难题。为此,笔者基于2026年的实测数据与用户…

2026/7/5 7:35:17 阅读更多 →

最新新闻

从混乱到优雅:SQL Formatter如何让你的数据库查询代码焕然一新

从混乱到优雅:SQL Formatter如何让你的数据库查询代码焕然一新

从混乱到优雅:SQL Formatter如何让你的数据库查询代码焕然一新 【免费下载链接】sql-formatter A whitespace formatter for different query languages 项目地址: https://gitcode.com/gh_mirrors/sql/sql-formatter 你是否曾面对过同事提交的SQL代码&#…

2026/7/5 21:22:34 阅读更多 →
docker-flask-example数据库管理:使用Flask-DB进行迁移与种子数据操作

docker-flask-example数据库管理:使用Flask-DB进行迁移与种子数据操作

docker-flask-example数据库管理:使用Flask-DB进行迁移与种子数据操作 【免费下载链接】docker-flask-example A production ready example Flask app thats using Docker and Docker Compose. 项目地址: https://gitcode.com/gh_mirrors/do/docker-flask-example…

2026/7/5 21:22:34 阅读更多 →
如何在游戏机上安装B站客户端?wiliwili让你的Switch变身全能追番神器

如何在游戏机上安装B站客户端?wiliwili让你的Switch变身全能追番神器

如何在游戏机上安装B站客户端?wiliwili让你的Switch变身全能追番神器 【免费下载链接】wiliwili 第三方B站客户端,目前可以运行在PC全平台、PSVita、PS4 、Xbox 和 Nintendo Switch上 项目地址: https://gitcode.com/GitHub_Trending/wi/wiliwili …

2026/7/5 21:22:34 阅读更多 →
C语言指针:指针类型、void*指针、const修饰及传址调用

C语言指针:指针类型、void*指针、const修饰及传址调用

文章目录一、指针类型的意义1. 指针的解引用2.指针的运算(1) 指针-整数(2) 指针-指针(3) 指针的关系运算二、void*类型的指针三、const修饰的指针1.const修饰变量2.const修饰指针变量四、指针在函数中的使用1.函数的传值调用2.函数的传址调用一、指针类型的意义 ● 既然指针变…

2026/7/5 21:20:34 阅读更多 →
如何用Containerlab快速搭建企业级网络实验室:容器化网络测试的终极指南

如何用Containerlab快速搭建企业级网络实验室:容器化网络测试的终极指南

如何用Containerlab快速搭建企业级网络实验室:容器化网络测试的终极指南 【免费下载链接】containerlab container-based networking labs 项目地址: https://gitcode.com/gh_mirrors/co/containerlab 还在为搭建网络测试环境而头疼吗?传统方式需…

2026/7/5 21:18:33 阅读更多 →
Primer设计系统架构现代化升级策略:从技术债务清理到性能收益的完整迁移路线图

Primer设计系统架构现代化升级策略:从技术债务清理到性能收益的完整迁移路线图

Primer设计系统架构现代化升级策略:从技术债务清理到性能收益的完整迁移路线图 【免费下载链接】design Primer Design Guidelines 项目地址: https://gitcode.com/gh_mirrors/des/design 面对日益复杂的UI组件生态系统,Primer设计系统的版本升级…

2026/7/5 21:18:33 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻