LLM 配置
在 AutoGen 中,代理使用 LLMs 作为关键组件来理解和反应。
要配置代理对 LLMs 的访问,你可以在其构造函数中指定一个 llm_config
参数。例如,以下代码片段展示了一个
使用 gpt-4
的配置:
import os
llm_config = {
"config_list": [{"model": "gpt-4", "api_key": os.environ["OPENAI_API_KEY"]}],
}
重要的是永远不要在代码中提交秘密,因此我们从环境变量中读取OpenAI API密钥。
这个 llm_config
随后可以传递给代理的构造函数,以使其能够使用LLM。
import autogen
assistant = autogen.AssistantAgent(name="assistant", llm_config=llm_config)
config_list
简介
不同的任务可能需要不同的模型,config_list
允许指定要使用的不同端点和配置。它是一个字典列表,每个字典根据所使用的端点类型包含以下键:
- OpenAI
- Azure OpenAI
- 其他与OpenAI兼容的工具
model
(str, 必需): 要使用的模型的标识符,例如 'gpt-4', 'gpt-3.5-turbo'。api_key
(str, optional): 用于认证对模型API端点的请求所需的API密钥。api_rate_limit
(float, 可选): 指定每秒允许的最大API请求数。base_url
(str, 可选): API 终端的基本 URL。这是 API 调用指向的根地址。tags
(List[str], optional): 可用于过滤的标签。
示例:
[
{
"model": "gpt-4",
"api_key": os.environ['OPENAI_API_KEY']
"api_rate_limit": 60.0, // Set to allow up to 60 API requests per second.
}
]
model
(str, 必须): 要使用的部署。模型对应于Azure OpenAI上的部署名称。api_key
(str, optional): 用于认证对模型API端点的请求所需的API密钥。api_type
:azure
api_rate_limit
(float, 可选): 指定每秒允许的最大API请求数。base_url
(str, 可选): API 终端的基本 URL。这是 API 调用指向的根地址。api_version
(str, 可选): 您希望使用的 Azure API 版本。tags
(List[str], optional): 可用于过滤的标签。
示例:
[
{
"model": "my-gpt-4-deployment",
"api_type": "azure",
"api_key": os.environ['AZURE_OPENAI_API_KEY'],
"base_url": "https://ENDPOINT.openai.azure.com/",
"api_version": "2024-02-01"
}
]
model
(str, 必需): 要使用的模型的标识符,例如 'llama-7B'。api_key
(str, optional): 用于认证对模型API端点的请求所需的API密钥。api_rate_limit
(float, 可选): 指定每秒允许的最大API请求数。base_url
(str, 可选): API 终端的基本 URL。这是 API 调用指向的根地址。tags
(List[str], optional): 可用于过滤的标签。
示例:
[
{
"model": "llama-7B",
"base_url": "http://localhost:1234"
}
]
默认情况下,这将创建一个模型客户端,该客户端假定使用OpenAI API(或兼容)端点。要使用自定义模型客户端,请参阅此处。
OAI_CONFIG_LIST
模式
一个常见的、有用的模式是通过JSON来定义这个config_list
(可以指定为一个文件或设置为JSON格式字符串的环境变量),然后使用config_list_from_json
辅助函数来加载它:
config_list = autogen.config_list_from_json(
env_or_file="OAI_CONFIG_LIST",
)
# Then, create the assistant agent with the config list
assistant = autogen.AssistantAgent(name="assistant", llm_config={"config_list": config_list})
这可能会很有帮助,因为它将所有配置集中在一个地方,适用于不同的项目或笔记本。
该函数对env_or_file
参数的解释如下:
- If
env_or_file
is an environment variable then:- 它将首先尝试从环境变量指定的路径加载文件。
- 如果文件不存在,它将尝试将环境变量解释为JSON字符串。
- 否则,它将尝试打开由
env_or_file
指定的路径下的文件。
为什么是一个列表?
作为一个列表,允许您定义可以被代理使用的多个模型。这有几个原因是有用的:
- 如果某个模型超时或失败,agent 可以尝试另一个模型。
- 拥有一个全局的模型列表,并基于某些键(例如名称、标签)进行过滤,以便将选定的模型传递给某个代理(例如,为处理较简单任务的代理使用更便宜的GPT 3.5)
- 虽然核心代理(例如可对话或助手)在选择配置时没有特殊逻辑,但一些专门化的代理可能会根据当前任务选择最佳模型。
代理如何从列表中选择模型?
代理使用“config_list”中可用的第一个模型,并针对该模型进行LLM调用。如果模型失败(例如API限流),代理将尝试针对第二个模型进行请求,依此类推,直到收到提示完成(或者如果没有任何模型成功完成请求,则抛出错误)。一般来说,代理内部没有用于选择“最适合任务的模型”的隐式/隐藏逻辑。然而,一些专门的代理可能会尝试选择“最适合任务的模型”。选择正确的模型并与代理一起使用是开发者的责任。
配置列表过滤
如上所述,列表可以根据某些标准进行过滤。 这被定义为一个字典,其中键用于过滤,值用于过滤。 例如,如果您有一个配置列表,并且您想要选择 模型为“gpt-3.5-turbo”的配置,您可以使用以下过滤器:
filter_dict = {"model": ["gpt-3.5-turbo"]}
然后可以将其应用于通过
filter_config
加载的配置列表:
config_list = autogen.filter_config(config_list, filter_dict)
或者,直接在使用config_list_from_json
加载配置列表时:
config_list = autogen.config_list_from_json(env_or_file="OAI_CONFIG_LIST", filter_dict=filter_dict)
标签
模型名称在OpenAI和Azure OpenAI之间可能有所不同,因此标签提供了一种简单的方法来平滑这种不一致。标签是config_list
中的字符串列表,例如以下config_list
:
config_list = [
{"model": "my-gpt-4-deployment", "api_key": "", "tags": ["gpt4", "openai"]},
{"model": "llama-7B", "base_url": "http://127.0.0.1:8080", "tags": ["llama", "local"]},
]
然后在过滤config_list
时,您可以指定所需的标签。
如果一个配置具有过滤器中指定的至少一个标签,则该配置会被选中。例如,要仅获取llama
模型,您可以使用以下过滤器:
filter_dict = {"tags": ["llama", "another_tag"]}
config_list = autogen.filter_config(config_list, filter_dict)
assert len(config_list) == 1
在llm_config中添加http客户端以支持代理
在Autogen中,对llm_config使用深拷贝以确保用户传递的llm_config在内部不会被修改。如果llm_config包含不支持深拷贝的类的对象,您可能会遇到错误。要解决这个问题,您需要为该类实现一个__deepcopy__
方法。
以下示例展示了如何为http客户端实现__deepcopy__
方法并添加代理。
#!pip install httpx
import httpx
class MyHttpClient(httpx.Client):
def __deepcopy__(self, memo):
return self
config_list = [
{
"model": "my-gpt-4-deployment",
"api_key": "",
"http_client": MyHttpClient(proxy="http://localhost:8030"),
}
]
llm_config = {
"config_list": config_list,
}
使用Azure Active Directory (AAD) 进行认证
Azure Active Directory (AAD) 提供对资源和应用程序的安全访问。请按照以下步骤为Autogen配置AAD身份验证。
先决条件
- 一个Azure订阅 - 免费创建一个.
- 已授予访问所需 Azure 订阅中的 Azure OpenAI 服务。
- 在AAD中注册应用程序的适当权限。
- 需要自定义子域名以启用诸如Microsoft Entra ID进行身份验证等功能。
- Azure CLI - 安装指南.
有关更详细和最新的说明,请参阅官方的Azure OpenAI 文档。
第一步:在AAD中注册应用程序
- 导航到 Azure portal.
- 前往
Azure Active Directory
>App registrations
. - 点击
New registration
。 - 为您的应用程序输入一个名称。
- 设置
Redirect URI
(可选)。 - 点击
Register
。
有关详细说明,请参阅官方Azure AD 快速入门文档。
步骤2:配置API权限
- 注册后,前往
API permissions
。 - 点击
Add a permission
. - 选择
Microsoft Graph
,然后选择Delegated permissions
。 - 添加必要的权限(例如,
User.Read
)。
更多详情,请参见Microsoft Graph中的API权限
第3步:获取客户端ID和租户ID
- 转到你注册应用程序的
概述
。 - 记下
Application (client) ID
和Directory (tenant) ID
。
更多详情,请访问在微软身份平台上注册应用程序
步骤 4: 配置您的应用程序
在您的应用程序配置中使用获得的Client ID
和Tenant ID
。以下是在配置文件中如何执行此操作的示例:
aad_config = {
"client_id": "YOUR_CLIENT_ID",
"tenant_id": "YOUR_TENANT_ID",
"authority": "https://login.microsoftonline.com/YOUR_TENANT_ID",
"scope": ["https://graph.microsoft.com/.default"],
}
第5步:验证并获取令牌
使用以下代码进行身份验证并获取令牌:
from msal import ConfidentialClientApplication
app = ConfidentialClientApplication(
client_id=aad_config["client_id"],
client_credential="YOUR_CLIENT_SECRET",
authority=aad_config["authority"]
)
result = app.acquire_token_for_client(scopes=aad_config["scope"])
if "access_token" in result:
print("Token acquired")
else:
print("Error acquiring token:", result.get("error"))
有关更多详细信息,请参阅 在 Azure OpenAI 服务中进行身份验证和授权 以及 如何使用 Microsoft Entra ID 身份验证配置 Azure OpenAI 服务。
步骤6:在AutoGen中配置使用AAD认证的Azure OpenAI
要在AutoGen中使用Azure OpenAI的AAD认证,请使用必要的参数配置llm_config
。
以下是一个配置示例:
llm_config = {
"config_list": [
{
"model": "gpt-4",
"base_url": "YOUR_BASE_URL",
"api_type": "azure",
"api_version": "2024-02-01",
"max_tokens": 1000,
"azure_ad_token_provider": "DEFAULT"
}
]
}
有关更多详细信息,请参阅 在 Azure OpenAI 服务中进行身份验证和授权 以及 如何使用 Microsoft Entra ID 身份验证配置 Azure OpenAI 服务。
在此配置中:- model
: Azure OpenAI 的部署名称。-
base_url
: Azure OpenAI 端点的基本URL。- api_type
:
应设置为“azure”。- api_version
: 使用的API版本。-
azure_ad_token_provider
: 设置为“DEFAULT”以使用默认的令牌
提供者。
使用AAD身份验证初始化辅助代理的示例
import autogen
# Initialize the assistant agent with the AAD authenticated config
assistant = autogen.AssistantAgent(name="assistant", llm_config=llm_config)
故障排除
如果遇到问题,请检查以下内容:- 确保您的 Client ID
和 Tenant ID
是正确的。- 验证授予您的应用程序的权限。- 检查网络连接和 Azure 服务状态。
本文档提供了在AutoGen中配置和使用Azure OpenAI的AAD身份验证的完整指南。
其他配置参数
除了config_list
之外,还有其他可以用于配置LLM的参数。这些参数分为专门由Autogen使用的参数和传递给模型客户端的参数。
AutoGen特定参数
cache_seed
- 这是一个遗留参数,除非使用它的目的是禁用默认缓存行为,否则不建议使用。要禁用默认缓存,请将其设置为None
。否则,默认情况下或如果传入一个整数,将使用DiskCache。对于新的缓存使用方式,请将一个Cache对象传入initiate_chat
。
额外的模型客户端参数
也可以将参数直接传递给 OpenAI 客户端。与 OpenAI
客户端 或 OpenAI
completions create API 相对应的参数都可以提供。
这通常用于像temperature
或timeout
这样的东西。
示例
llm_config = {
"config_list": [
{
"model": "my-gpt-4-deployment",
"api_key": os.environ.get("AZURE_OPENAI_API_KEY"),
"api_type": "azure",
"base_url": os.environ.get("AZURE_OPENAI_API_BASE"),
"api_version": "2024-02-01",
},
{
"model": "llama-7B",
"base_url": "http://127.0.0.1:8080",
"api_type": "openai",
},
],
"temperature": 0.9,
"timeout": 300,
}
用于加载配置列表的其他助手
get_config_list
: 生成用于API调用的配置,主要从提供的API密钥中生成。config_list_openai_aoai
: 构建一个使用Azure OpenAI和OpenAI端点的配置列表,从环境变量或本地文件中获取API密钥。config_list_from_models
: 基于提供的模型列表创建配置,适用于在不需要手动指定每个配置的情况下针对特定模型。config_list_from_dotenv
: 从.env
文件构建配置列表,提供了一种统一的方式来从单个文件管理多个API配置和密钥。
查看这个笔记本获取使用上述函数的示例。