AgentScope智能体回复:消息生成与工具调用深度解析
【免费下载链接】agentscope 项目地址: https://gitcode.com/GitHub_Trending/ag/agentscope
引言:智能体交互的核心机制
在构建多智能体系统时,消息生成与工具调用是两个最为核心的环节。AgentScope作为面向开发者的智能体编程框架,在这两个关键领域提供了强大而灵活的实现方案。本文将深入探讨AgentScope中智能体如何生成回复消息、如何调用工具函数,以及开发者如何充分利用这些机制构建高效的智能体应用。
读完本文,你将掌握:
- AgentScope消息系统的完整架构
- ReAct智能体的推理-行动循环机制
- 工具包(Toolkit)的管理与调用策略
- 并行工具调用的实现原理
- 实时中断与状态恢复的最佳实践
消息系统架构解析
消息基础结构
AgentScope采用统一的消息格式Msg类,支持多种内容块类型:
class Msg:
def __init__(
self,
name: str,
content: str | Sequence[ContentBlock],
role: Literal["user", "assistant", "system"],
metadata: dict[str, JSONSerializableObject] | None = None,
timestamp: str | None = None,
invocation_id: str | None = None,
)
消息内容块类型支持:
| 块类型 | 描述 | 使用场景 |
|---|---|---|
| TextBlock | 纯文本内容 | 普通对话消息 |
| ToolUseBlock | 工具调用请求 | 智能体请求执行工具 |
| ToolResultBlock | 工具执行结果 | 工具执行返回结果 |
| ImageBlock | 图像内容 | 多模态交互 |
| AudioBlock | 音频内容 | 语音交互 |
| VideoBlock | 视频内容 | 视频处理 |
消息处理流程
ReAct智能体的推理-行动循环
核心循环机制
AgentScope的ReActAgent实现了完整的推理-行动循环:
async def reply(self, msg: Msg | list[Msg] | None = None) -> Msg:
# 1. 记忆存储
await self.memory.add(msg)
# 2. 长期记忆检索(如配置)
if self._static_control:
retrieved_info = await self.long_term_memory.retrieve(msg)
# 将检索信息添加到系统提示
# 3. 推理-行动循环
reply_msg = None
for _ in range(self.max_iters):
# 推理阶段
msg_reasoning = await self._reasoning()
# 行动阶段(工具调用)
futures = [self._acting(tool_call) for tool_call in msg_reasoning.get_content_blocks("tool_use")]
# 并行或串行执行
if self.parallel_tool_calls:
acting_responses = await asyncio.gather(*futures)
else:
acting_responses = [await _ for _ in futures]
# 检查是否有回复消息
for acting_msg in acting_responses:
reply_msg = reply_msg or acting_msg
if reply_msg:
break
# 4. 超时处理
if reply_msg is None:
reply_msg = await self._summarizing()
# 5. 记忆更新
await self.memory.add(reply_msg)
return reply_msg
推理阶段详解
推理阶段负责生成工具调用请求:
async def _reasoning(self) -> Msg:
# 格式化提示词
prompt = await self.formatter.format([
Msg("system", self.sys_prompt, "system"),
*await self.memory.get_memory(),
])
# 调用模型生成回复
res = await self.model(prompt, tools=self.toolkit.get_json_schemas())
# 处理流式和非流式输出
if self.model.stream:
msg = Msg(self.name, [], "assistant")
async for content_chunk in res:
msg.content = content_chunk.content
await self.print(msg, False)
await self.print(msg, True)
else:
msg = Msg(self.name, list(res.content), "assistant")
await self.print(msg, True)
# 纯文本回复转换为工具调用
if not msg.has_content_blocks("tool_use"):
msg.content = [ToolUseBlock(
id=shortuuid.uuid(),
type="tool_use",
name=self.finish_function_name,
input={"response": msg.get_text_content()},
)]
return msg
工具包管理与调用
工具注册与管理
AgentScope的Toolkit类提供了完整的工具管理功能:
# 创建工具包实例
toolkit = Toolkit()
# 注册工具函数
toolkit.register_tool_function(
tool_func=execute_python_code,
group_name="programming",
func_description="Execute Python code and return the result",
preset_kwargs={"timeout": 300}
)
# 注册MCP客户端工具
await toolkit.register_mcp_client(
mcp_client=gaode_mcp_client,
group_name="navigation",
enable_funcs=["maps_geo", "maps_route"],
preset_kwargs_mapping={
"maps_geo": {"city": "Beijing"}
}
)
工具分组管理
工具调用执行
工具调用执行的核心逻辑:
async def call_tool_function(self, tool_call: ToolUseBlock) -> AsyncGenerator[ToolResponse, None]:
# 检查工具是否存在
if tool_call["name"] not in self.tools:
yield ToolResponse.error(f"Function {tool_call['name']} not found")
return
# 准备参数
tool_func = self.tools[tool_call["name"]]
kwargs = {
**tool_func.preset_kwargs,
**(tool_call.get("input", {}) or {}),
}
# 执行工具函数
try:
if inspect.iscoroutinefunction(tool_func.original_func):
res = await tool_func.original_func(**kwargs)
else:
res = tool_func.original_func(**kwargs)
# 处理不同返回类型
if isinstance(res, AsyncGenerator):
async for chunk in res:
yield self._postprocess(chunk, tool_func.postprocess_func)
elif isinstance(res, Generator):
for chunk in res:
yield self._postprocess(chunk, tool_func.postprocess_func)
else:
yield self._postprocess(res, tool_func.postprocess_func)
except Exception as e:
yield ToolResponse.error(f"Tool execution error: {e}")
并行工具调用机制
并行执行策略
AgentScope支持并行工具调用,显著提升多工具场景下的执行效率:
# 在ReActAgent的reply方法中
futures = [
self._acting(tool_call)
for tool_call in msg_reasoning.get_content_blocks("tool_use")
]
if self.parallel_tool_calls:
# 并行执行所有工具调用
acting_responses = await asyncio.gather(*futures)
else:
# 串行执行工具调用
acting_responses = [await future for future in futures]
性能对比分析
| 场景 | 串行执行 | 并行执行 | 性能提升 |
|---|---|---|---|
| 3个独立工具调用 | 总耗时 = t1 + t2 + t3 | 总耗时 = max(t1, t2, t3) | 200%-300% |
| 2个相关工具调用 | 需要顺序执行 | 需要顺序执行 | 0% |
| 混合场景 | 依赖分析后执行 | 自动依赖分析 | 50%-150% |
实时中断与状态恢复
中断处理机制
AgentScope提供了完善的实时中断支持:
async def handle_interrupt(self, _msg: Msg | list[Msg] | None = None) -> Msg:
"""用户中断后的处理逻辑"""
response_msg = Msg(
self.name,
"我注意到您中断了我的操作。请问需要我做什么?",
"assistant",
metadata={},
)
await self.print(response_msg, True)
await self.memory.add(response_msg)
return response_msg
内存保护机制
即使在中断情况下,AgentScope也能保护对话状态的完整性:
async def _reasoning(self) -> Msg:
try:
# 正常的推理过程
# ...
except asyncio.CancelledError:
interrupted_by_user = True
raise
finally:
# 确保消息被添加到内存
if msg:
await self.memory.add(msg)
# 用户中断后的处理
if interrupted_by_user and msg:
# 为所有未完成的工具调用生成假结果
for tool_call in msg.get_content_blocks("tool_use"):
msg_res = Msg("system", [
ToolResultBlock(
type="tool_result",
id=tool_call["id"],
name=tool_call["name"],
output="工具调用已被用户中断",
)
], "system")
await self.memory.add(msg_res)
结构化输出生成
结构化回复机制
AgentScope支持生成结构化输出,便于后续处理:
def generate_response(
self,
response: str,
**kwargs: Any,
) -> ToolResponse:
"""生成结构化回复"""
response_msg = Msg(self.name, response, "assistant")
# 处理结构化输出
if self._required_structured_model:
try:
response_msg.metadata = (
self._required_structured_model.model_validate(kwargs).model_dump()
)
except ValidationError as e:
return ToolResponse.error(f"参数验证错误: {e}")
return ToolResponse(
content=[TextBlock(type="text", text="成功生成回复")],
metadata={"success": True, "response_msg": response_msg},
is_last=True,
)
使用示例
# 定义结构化输出模型
class WeatherResponse(BaseModel):
city: str
temperature: float
condition: str
humidity: int
# 在智能体回复时指定结构化模型
weather_report = await agent(
Msg("user", "今天北京的天气怎么样?", "user"),
structured_model=WeatherResponse
)
# 获取结构化数据
weather_data = weather_report.metadata
print(f"城市: {weather_data['city']}")
print(f"温度: {weather_data['temperature']}°C")
最佳实践与性能优化
工具调用优化策略
-
工具分组管理
# 创建工具组 toolkit.create_tool_group( group_name="research", description="网络搜索和研究工具", active=True, notes="使用这些工具时请确保查询关键词准确" ) # 动态激活/禁用工具组 toolkit.update_tool_groups(["research", "analysis"], active=True) -
预设参数优化
# 为常用工具预设参数 toolkit.register_tool_function( web_search, preset_kwargs={"max_results": 5, "timeout": 30}, group_name="research" ) -
并行调用配置
# 在独立工具场景启用并行调用 agent = ReActAgent( # ...其他参数... parallel_tool_calls=True, # 启用并行工具调用 max_iters=8 # 适当增加最大迭代次数 )
内存管理策略
总结与展望
AgentScope在消息生成与工具调用方面提供了业界领先的解决方案:
核心优势:
- 🚀 完整的ReAct循环实现:支持多轮推理-行动流程
- ⚡ 高效的并行工具调用:大幅提升多工具场景性能
- 🛡️ 可靠的实时中断处理:确保状态完整性和用户体验
- 📦 灵活的工具管理:支持函数级和组级精细控制
- 🎯 结构化输出支持:便于下游系统集成和处理
未来发展方向:
- 更智能的工具依赖分析
- 自适应并行/串行执行策略
- 增强的工具调用缓存机制
- 多模态工具的统一调用接口
通过深入理解AgentScope的消息生成与工具调用机制,开发者可以构建出更加智能、高效和可靠的多智能体应用系统。无论是简单的对话机器人还是复杂的多智能体协作系统,AgentScope都提供了强大的基础设施和灵活的扩展能力。
【免费下载链接】agentscope 项目地址: https://gitcode.com/GitHub_Trending/ag/agentscope
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



