AutoGen Function Call 函数调用解析(一)

2024-09-08 15:12

本文主要是介绍AutoGen Function Call 函数调用解析(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、AutoGen Function Call

1.1 register_for_llm 注册调用

1.2 register_for_execution 注册执行

1.3 三种注册方法

1.3.1 函数定义和注册分开

1.3.2 定义函数时注册

1.3.3  register_function 函数注册

二、实例


本文主要对 AutoGen Function Call 进行解析,并通过实例进行介绍。

一、AutoGen Function Call

AutoGen 支持 Function Call 功能,代理会根据 system_message 和函数描述进行调用。一个函数(工具)必须向至少两个代理注册,才能在对话中使用,一个负责调用,一个负责执行

1.1 register_for_llm 注册调用

负责调用的代理通过 register_for_llm 注册函数。

def register_for_llm(*,name: Optional[str] = None,description: Optional[str] = None,api_style: Literal["function", "tool"] = "tool") -> Callable[[F], F]

常用的参数是 name(函数名称) 和 description(函数描述)。

1.2 register_for_execution 注册执行

负责执行的代理通过 register_for_execution 注册函数。

def register_for_execution(name: Optional[str] = None) -> Callable[[F], F]

 

1.3 三种注册方法

AutoGen 支持代理三种方法注册调用和执行函数。

1.3.1 函数定义和注册分开

在定义函数后,代理分别注册函数。

from typing import Annotated, LiteralOperator = Literal["+", "-", "*", "/"]# 执行计算的函数
def calculator(a: int, b: int, operator: Annotated[Operator, "operator"]) -> int:if operator == "+":return a + belif operator == "-":return a - belif operator == "*":return a * belif operator == "/":return int(a / b)else:raise ValueError("Invalid operator")# 注册方法一
# assistant 注册函数调用
assistant.register_for_llm(name="calculator", description="A simple calculator")(calculator)# user_proxy 注册执行
user_proxy.register_for_execution(name="calculator")(calculator)

1.3.2 定义函数时注册

在定义函数时,代理注册函数。

from typing import Annotated, LiteralOperator = Literal["+", "-", "*", "/"]# 注册方法二
@user_proxy.register_for_execution()
@assistant.register_for_llm(name="calculator", description="A simple calculator")
def calculator(a: int, b: int, operator: Annotated[Operator, "operator"]) -> int:if operator == "+":return a + belif operator == "-":return a - belif operator == "*":return a * belif operator == "/":return int(a / b)else:raise ValueError("Invalid operator")

1.3.3  register_function 函数注册

通过 register_function 函数一起注册。

from typing import Annotated, LiteralOperator = Literal["+", "-", "*", "/"]def calculator(a: int, b: int, operator: Annotated[Operator, "operator"]) -> int:if operator == "+":return a + belif operator == "-":return a - belif operator == "*":return a * belif operator == "/":return int(a / b)else:raise ValueError("Invalid operator")register_function(calculator,caller=assistant,  # The assistant agent can suggest calls to the calculator.executor=user_proxy,  # The user proxy agent can execute the calculator calls.name="calculator",  # By default, the function name is used as the tool name.description="A simple calculator",  # A description of the tool.
)

二、实例

下面通过一个算数运算的实例进行说明。

from typing import Annotated, LiteralOperator = Literal["+", "-", "*", "/"]# 执行计算的函数
def calculator(a: int, b: int, operator: Annotated[Operator, "operator"]) -> int:if operator == "+":return a + belif operator == "-":return a - belif operator == "*":return a * belif operator == "/":return int(a / b)else:raise ValueError("Invalid operator")import osfrom autogen import ConversableAgent, config_list_from_json# 配置LLM
config_list = config_list_from_json(env_or_file="OAI_CONFIG_LIST",
)# 负责调用的代理
assistant = ConversableAgent(name="Assistant",system_message="You are a helpful AI assistant. ""You can help with simple calculations. ""Return 'TERMINATE' when the task is done.",llm_config={"config_list": config_list},
)# 负责执行的代理
user_proxy = ConversableAgent(name="User",llm_config=False,is_termination_msg=lambda msg: msg.get("content") is not None and "TERMINATE" in msg["content"],human_input_mode="NEVER",
)# 注册方法一
# assistant 注册函数调用
assistant.register_for_llm(name="calculator", description="A simple calculator")(calculator)# user_proxy 注册执行
user_proxy.register_for_execution(name="calculator")(calculator)'''
# 注册方法二
# register_function 支持两个代理同时注册
from autogen import register_function# Register the calculator function to the two agents.
register_function(calculator,caller=assistant,  # The assistant agent can suggest calls to the calculator.executor=user_proxy,  # The user proxy agent can execute the calculator calls.name="calculator",  # By default, the function name is used as the tool name.description="A simple calculator",  # A description of the tool.
)# 注册方法三
# 定义函数的时候注册
```
@user_proxy.register_for_execution()
@assistant.register_for_llm(name="my_function", description="This is a very useful function")
def my_function(a: Annotated[str, "description of a parameter"] = "a", b: int, c=3.14) -> str:return a + str(b * c)
```'''chat_result = user_proxy.initiate_chat(assistant, message="What is (44232 + 13312 / (232 - 32)) * 5?")

输出如下所示。

(base) D:\code\autogenstudio_images\example>python function_call.py
D:\Software\anaconda3\Lib\site-packages\paramiko\transport.py:219: CryptographyDeprecationWarning: Blowfish has been deprecated"class": algorithms.Blowfish,
User (to Assistant):What is (44232 + 13312 / (232 - 32)) * 5?-------------------------------------------------------------------------------->>>>>>>> USING AUTO REPLY...
[autogen.oai.client: 09-03 21:02:49] {329} WARNING - Model meta/llama-3.1-405b-instruct is not found. The cost will be 0. In your config_list, add field {"price" : [prompt_price_per_1k, completion_token_price_per_1k]} for customized pricing.
Assistant (to User):***** Suggested tool call (chatcmpl-tool-affd8cb937d74e0585e71a80f8b36082): calculator *****
Arguments:
{"a": 232, "b": 32, "operator": "-"}
********************************************************************************************-------------------------------------------------------------------------------->>>>>>>> EXECUTING FUNCTION calculator...
User (to Assistant):User (to Assistant):***** Response from calling tool (chatcmpl-tool-affd8cb937d74e0585e71a80f8b36082) *****
200
***************************************************************************************-------------------------------------------------------------------------------->>>>>>>> USING AUTO REPLY...
[autogen.oai.client: 09-03 21:03:11] {329} WARNING - Model meta/llama-3.1-405b-instruct is not found. The cost will be 0. In your config_list, add field {"price" : [prompt_price_per_1k, completion_token_price_per_1k]} for customized pricing.
Assistant (to User):***** Suggested tool call (chatcmpl-tool-b79bd1065ee94d228176dbc06c2a3981): calculator *****
Arguments:
{"a": 13312, "b": 200, "operator": "/"}
********************************************************************************************-------------------------------------------------------------------------------->>>>>>>> EXECUTING FUNCTION calculator...
User (to Assistant):User (to Assistant):***** Response from calling tool (chatcmpl-tool-b79bd1065ee94d228176dbc06c2a3981) *****
66
***************************************************************************************-------------------------------------------------------------------------------->>>>>>>> USING AUTO REPLY...
[autogen.oai.client: 09-03 21:06:13] {329} WARNING - Model moonshot-v1-8k is not found. The cost will be 0. In your config_list, add field {"price" : [prompt_price_per_1k, completion_token_price_per_1k]} for customized pricing.
Assistant (to User):***** Suggested tool call (calculator:0): calculator *****
Arguments:
{"a": 44232,"b": 66,"operator": "+"
}
**********************************************************-------------------------------------------------------------------------------->>>>>>>> EXECUTING FUNCTION calculator...
User (to Assistant):User (to Assistant):***** Response from calling tool (calculator:0) *****
44298
*****************************************************-------------------------------------------------------------------------------->>>>>>>> USING AUTO REPLY...
[autogen.oai.client: 09-03 21:06:17] {329} WARNING - Model meta/llama-3.1-405b-instruct is not found. The cost will be 0. In your config_list, add field {"price" : [prompt_price_per_1k, completion_token_price_per_1k]} for customized pricing.
Assistant (to User):***** Suggested tool call (chatcmpl-tool-a13b42b8e844488793527ab64b55d0ea): calculator *****
Arguments:
{"a": 44298, "b": 5, "operator": "*"}
********************************************************************************************-------------------------------------------------------------------------------->>>>>>>> EXECUTING FUNCTION calculator...
User (to Assistant):User (to Assistant):***** Response from calling tool (chatcmpl-tool-a13b42b8e844488793527ab64b55d0ea) *****
221490
***************************************************************************************-------------------------------------------------------------------------------->>>>>>>> USING AUTO REPLY...
[autogen.oai.client: 09-03 21:06:21] {329} WARNING - Model meta/llama-3.1-405b-instruct is not found. The cost will be 0. In your config_list, add field {"price" : [prompt_price_per_1k, completion_token_price_per_1k]} for customized pricing.
Assistant (to User):The answer is 221490. TERMINATE.--------------------------------------------------------------------------------

参考链接:

[1] Tool Use | AutoGen

[2] agentchat.conversable_agent | AutoGen

这篇关于AutoGen Function Call 函数调用解析(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1148460

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java JDK Validation 注解解析与使用方法验证

《JavaJDKValidation注解解析与使用方法验证》JakartaValidation提供了一种声明式、标准化的方式来验证Java对象,与框架无关,可以方便地集成到各种Java应用中,... 目录核心概念1. 主要注解基本约束注解其他常用注解2. 核心接口使用方法1. 基本使用添加依赖 (Maven

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二