Microsoft Agent Framework 智能体调用工具
# Microsoft Agent Framework 智能体调用工具
## 摘要
继续上篇,此篇使用Microsoft Agent Framework 创建了一个简单的智能体,会根据用户的提问去调用相应的工具。
此篇不依赖Azure资源,仍使用可以本地安装和部署的资源。
## 直接上代码
在上一篇代码的基础之上,我们加入了一个普通的python方法,来帮助智能体获取当前时间(是的,再牛的智能体,也需要类似这样的一个方法来获取当前的时间)。然后将其注册给智能体,让智能体根据用户的问题来选择调用哪个工具来辅助回答。
```python
from agent_framework import Agent
from agent_framework_foundry_local import FoundryLocalClient
from datetime import datetime
import asyncio
# 1. 创建模型客户端
client = FoundryLocalClient(
model="qwen3-0.6b"
)
# 2. 定义工具函数
def get_current_time() -> str:
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 3. 创建 Agent
agent = Agent(
name="my-first-agent",
client=client,
tools=[get_current_time]
)
# 4. 主函数
async def main():
response = await agent.run("今天的日期。", options={"max_tokens": 5000})
print("Agent 回复:", response.text)
# 5. 运行程序
asyncio.run(main())
```
## 笔记
### 模型客户端
- **FoundryLocalClient**:本地模型客户端,用于连接本地部署的大模型
- **参数**:
- `model`:指定使用的模型名称,如 "qwen3-0.6b"
同上一篇,这里用的还是本地的Foundry模型。模型是我能找到最小版本的。
需要留意:如果自己下载别的模型尝试,一定要看模型是否支持tool,用命令看model list的话,看同时支持chat和tool的模型。
### 工具函数
- **get_current_time()**:获取当前时间的工具函数
- **返回值**:格式化的当前时间字符串,格式为 "YYYY-MM-DD HH:MM:SS"
跟LangChain的工具函数基本一致。所以可以把大多数的python方法直接作为智能体的工具来调用。
### Agent
- **Agent**:同LangChain的智能体,这是智能体核心类,用于协调模型和工具的交互
- **参数**:
- `name`:Agent 名称,用于标识和管理
- `client`:模型客户端,用于与大模型交互
- `tools`:工具列表,Agent 可以使用的工具函数
除了name这个属性,其它部分跟LangChain的Agent基本一致。
## 运行流程
无论是MAF还是LangChaina,套路都是一样的,基本都遵循以下流程:
1. **初始化**:导入必要的模块和创建模型客户端
2. **工具注册**:定义并注册 `get_current_time()` 工具函数
3. **Agent 创建**:创建 Agent 实例并配置工具
4. **执行**:运行主函数,发送用户问题并获取响应,如果用户的问题,智能体判断需要调用工具,则去调用工具。
5. **输出**:打印 Agent 的回复结果
## 关键技术点
- 使用 `async def` 定义异步函数,配合 `await` 等待异步操作完成,然后使用 `asyncio.run()` 运行异步主函数。
- 工具函数是 Agent 可以调用的外部功能,就是我们常说的,让智能体把手伸出来干活。
- 工具函数需要有明确的返回类型注解。
- Agent 会根据用户问题自动选择合适的工具,但不同模型以及不同模型参数都会有不同的结果。
- 通过 `agent.run()` 方法向模型发送请求,Agent 的 run 方法是异步方法,需要使用 await 关键字来调用。所以main函数需要定义为异步函数。
- 可以通过 `options` 参数配置模型行为,如 `max_tokens` 控制生成文本的最大长度。如果不设置使用默认值的话,此篇的输出会被截断。
## 示例代码的输出参考
当运行代码时,预期输出类似如下。请留意有时代码的输出可能会不一样设置失败。
```
好的,用户问的是今天的日期。首先,我需要确认用户需要的是当前的日期,还是某个特定日期。
接下来,我需要检查可用的工具。用户提供的工具中有一个叫做get_current_time的函数。这个函数的作用就是获取当前的时间,包括日期信息。
所以,用户的问题“今天的日期”可以转化为调用get_current_time函数,获取当前的时间,包括日期信息。因此,正确的做法是调用这个工具函数,然后将返回的日期信息返回给用户。
<tool_call>
{"name": "get_current_time", "arguments": {}}
</tool_call>
好的,用户问的是今天的日期。我需要先确认当前的日期,并返回给用户。
首先,用户可能需要的日期信息,比如今天的日期。如果系统已经知道当前的日期,那么可以直接返回。
但根据用户提供的工具,其中有一个函数叫做get_current_time,其描述为获取当前的时间,包括日期信息。
因此,正确的做法是调用这个函数,然后返回结果,即今天的日期。
因此,用户的问题可以转化为调用这个工具函数,然后将返回的日期信息返回给用户。
综上所述,正确的做法是调用这个工具函数,获取当前的时间,包括日期信息。然后将返回的日期信息返回给用户。
2026-04-21 23:11:46
```
## 总结
总体来说,对比LangChain的工具调用,大部分的套路都是相同的。
但在实际操作中,还是遇到了很多奇怪的问题,原因个人分析可能是模型类型的,也可能是模型参数版本的,受限于资源太少所以想解决有一定的难度,所以本篇只用了一个简单的示例来对比跟LangChain的区别。
后续会看下对于Skills的支持跟LangChain有什么区别,顺便看看是否还有别的坑。
本篇用的是Foundry Local,关于MAF如何调用Foundry Azure上的方法,可以参考Microsoft Learn:https://learn.microsoft.com/zh-cn/agent-framework/get-started/
## 后记
工具的识别不同的模型表现不太一样,我尝试的是qwen3-0.6b以及phi-4-mini。
此篇的代码换成phi-4-mini的话,智能体会识别不到工具的方法。但即使换成qwen3-0.6b,经过几次折腾发现也不是每次都能成功调用到工具,甚至会进入到死亡叨叨叨的状态。另外也尝试加了更多的工具,发现工具的识别率会下降,这个怀疑是参数的问题,毕竟0.6b。但是Foundry Local的模型可选的不是很多,qwen不说没有3.5吧,里面更多的是2.5的版本。
也尝试过走本地ollama去调更多参数的模型,以及走deepseek api,但是都遇到了莫名其妙的问题。
个人分析微软目前的精力应该是都在Azure上,local部署社区的生态已经很成熟而且收益低,还是期盼微软后续继续扩充Froundry Local的相关资源。
---------------------------------------------------------------
aspnetx的BI笔记系列索引:
使用SQL Server Analysis Services数据挖掘的关联规则实现商品推荐功能
一起玩转SQL Server 2012 下的分析服务
使用SQL Server分析服务定位目标用户
---------------------------------------------------------------
来自博客园的aspnetx宋卫东
