返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

【阿里AgentScope框架】简明教程:如何在AgentScope中使用自定义工具?附完整代码(可直接运行)

[复制链接]
链载Ai 显示全部楼层 发表于 昨天 10:25 |阅读模式 打印 上一主题 下一主题

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif; letter-spacing: 0.1em; color: rgb(63, 63, 63);">本文我们来学习下如何在AgentScope中使用自定义的工具。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif; font-size: 1.2em; display: table; margin: 2em auto 1em; padding-right: 1em; padding-left: 1em; border-bottom: 2px solid rgb(15, 76, 129); color: rgb(63, 63, 63);">0. 开篇

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif; letter-spacing: 0.1em; color: rgb(63, 63, 63);">在AgentScope中,自定义工具和内置工具的使用似乎没那么明显,但确实也提供了这个框架。它其实是通过一个叫 ServiceToolkit 来封装的工具。至于工具的使用,可以通过 ReActAgent 来实现。但这样使用在我看来有点问题。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif; letter-spacing: 0.1em; color: rgb(63, 63, 63);">先来看下具体怎么使用。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif; font-size: 1.2em; display: table; margin: 2em auto 1em; padding-right: 1em; padding-left: 1em; border-bottom: 2px solid rgb(15, 76, 129); color: rgb(63, 63, 63);">1. 在 AgentScope 中使用自定义工具

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif; font-size: 1.2em; display: table; margin: 4em auto 2em; padding-right: 0.2em; padding-left: 0.2em; background: rgb(15, 76, 129); color: rgb(255, 255, 255);">1.1 创建自定义工具

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif; letter-spacing: 0.1em; color: rgb(63, 63, 63);">创建自定义工具,本质上是创建一个自定义函数。与LangChain和MetaGPT会通过类似 @tools 装饰器来将函数封装成框架内可用的工具不同,在 AgentScope 中,你只将函数的返回值封装成 ServiceResponse 对象即可。ServiceResponse 接收一个运行状态和一个content内容。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif; border-left: none; padding: 1em; border-radius: 8px; color: rgba(0, 0, 0, 0.5); background: rgb(247, 247, 247); margin: 2em 8px;">

当然,记得要写该函数的docstring。还没细看源码,但猜测 AgentScope 内部应该是通过 docstring 来当作该工具的Prompt,并明确工具的参数和返回值。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif; overflow-x: auto;">defsum_num(a:int,b:int)->int:
"""计算两个数的和

Args:
a(int):参数1
b(int):参数2

Returns:
int:结果
"""
output=a+b
status=ServiceExecStatus.SUCCESS
returnServiceResponse(status,output)

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif; font-size: 1.2em; display: table; margin: 4em auto 2em; padding-right: 0.2em; padding-left: 0.2em; background: rgb(15, 76, 129); color: rgb(255, 255, 255);">1.2 使用自定义工具

(1)首先,你需要将该工具添加到 ServiceToolkit 中。

service_toolkit=ServiceToolkit()
service_toolkit.add(sum_num)

(2)实例化一个 ReActAgent,通过 service_toolkit 参数来将自定义工具添加进去。

self.agent=ReActAgent(
name="assistant",
model_config_name="openai_cfg",
verbose=True,
service_toolkit=service_toolkit,
max_iters=1,
)

(3)使用该 agent 即可

msg=Msg("user",query,role="user")
returnself.agent(msg)

2. 完整代码与运行结果

完整代码如下:

fromagentscope.agents.react_agentimportReActAgent

importagentscope
fromagentscope.messageimportMsg
importos

fromagentscope.serviceimport(
ServiceToolkit,
ServiceResponse,
ServiceExecStatus,
)

openai_api_key=os.getenv('OPENAI_API_KEY')

#此Agent的模型配置,按需修改
OPENAI_CFG_DICT={
"config_name":"openai_cfg",#此配置的名称,必须保证唯一
"model_type":"openai",#模型类型
"model_name":"gpt-3.5-turbo",#模型名称
"api_key"penai_api_key,#OpenAIAPIkey.如果没有设置,将使用环境变量中的OPENAI_API_KEY
}

defsum_num(a:int,b:int)->int:
"""计算两个数的和

Args:
a(int):参数1
b(int):参数2

Returns:
int:结果
"""
output=a+b
status=ServiceExecStatus.SUCCESS
returnServiceResponse(status,output)


classToolDemo:
def__init__(self):
#Preparethetoolsfortheagent
service_toolkit=ServiceToolkit()
service_toolkit.add(sum_num)

agentscope.init(model_configs=[OPENAI_CFG_DICT])

self.agent=ReActAgent(
name="assistant",
model_config_name="openai_cfg",
verbose=True,
service_toolkit=service_toolkit,
max_iters=1,
)

definvoke(self,query):
msg=Msg("user",query,role="user")
returnself.agent(msg)

if__name__=='__main__':
tool_demo=ToolDemo()
response=tool_demo.invoke("你是谁?")
print(response)

运行结果:

可以看到它成功识别并使用了 sum_num 这个工具。

3. 存在的问题 - 一些思考,仅供参考

文章开始,我提到了通过 ReActAgent 来实现使用工具在我看来有点问题。

首先,ReActAgent 是实现的ReAct思想,即思考+行动。大模型先思考下一步该干什么,然后执行。这对于只想判断是否应该使用工具的场景来说,有点浪费。细心的同学可能发现了,在ReActAgent初始化的过程中,有个 max_iters 参数。这是最大的迭代步数,也就是思考多少次。判断一个工具的使用,其实只需要一次思考即可。(个人意见,欢迎讨论)。

其次,ReActAgent 最终的返回,是最终的结论,中间过程外部不可见。如果想要获取中间过程,需要自己实现,不能用 ReActAgent 了。目前还没看到 AgentScope 中有类似 LangChain 那样直接 bind_tools 或 bind_functions 这样的接口封装,让用户在执行之后可以获取是否需要调用工具的判断。

当识别到工具时,返回的结果是类似下图这样:

没有识别到工具时,返回的结果是类似下图这样:

难道可以通过这个返回值中有无 function 参数来判断是否使用过工具?感觉不太靠谱啊... 可能还是得自己写一个吧。欢迎熟悉的大佬指教!感谢!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ