技术背景介绍
在构建复杂的系统时,比如需要与多个API交互的任务,传统的顺序执行API请求方式效率低下且容易出错。近年来,一种称为**分层规划(Hierarchical Planning)的技术被引入到机器人和大语言模型(LLM)的结合场景中。它允许通过分层代理结构来处理复杂任务:"规划器"决定调用哪些API端点,“控制器”**则负责具体的API调用实现。
在本篇文章中,我们将结合OpenAPI标准,探索如何构建一个具备分层规划能力的代理,并通过Spotify API实现创建播放列表的实际应用。
核心原理解析
分层规划代理的核心思想是将任务分解为两部分:
- **规划器(Planner):**负责根据用户输入,在上下文中解析需要调用哪些API端点。
- **控制器(Controller):**负责解析规划器生成的计划并执行具体的API调用。
通过这种分工,我们能够减少上下文中的冗余信息,降低复杂性,并增强响应的连贯性。此外,OpenAPI的规范性提供了一个统一的接口描述语言,使得我们能够基于其文档的描述轻松解析与调用API。
代码实现演示
以下是基于Spotify API实现的分层规划代理。它会根据用户的输入,自动分析使用的API端点,并创建一个包含指定歌曲的播放列表。
准备工作
1. 安装依赖库
pip install langchain spotipy pyyaml openai
2. 实现分层规划代理代码
import yaml
from langchain_community.agent_toolkits.openapi.spec import reduce_openapi_spec
from langchain_community.agent_toolkits.openapi import planner
from langchain.requests import RequestsWrapper
from langchain_openai import ChatOpenAI
# Spotify API OAuth认证辅助函数
import spotipy.util as util
def construct_spotify_auth_headers(raw_spec: dict):
scopes = list(
raw_spec["components"]["securitySchemes"]["oauth_2_0"]["flows"][
"authorizationCode"
]["scopes"].keys()
)
access_token = util.prompt_for_user_token(scope=",".join(scopes))
return {"Authorization": f"Bearer {access_token}"}
# 加载Spotify API的OpenAPI文档
with open("spotify_openapi.yaml") as f:
raw_spotify_api_spec = yaml.load(f, Loader=yaml.Loader)
spotify_api_spec = reduce_openapi_spec(raw_spotify_api_spec)
# 构建认证头
headers = construct_spotify_auth_headers(raw_spotify_api_spec)
requests_wrapper = RequestsWrapper(headers=headers)
# 创建GPT-4 LLM作为规划器和控制器
llm = ChatOpenAI(model_name="gpt-4", temperature=0.0)
# 构建Spotify分层代理
spotify_agent = planner.create_openapi_agent(
spotify_api_spec,
requests_wrapper,
llm,
allow_dangerous_requests=True,
)
# 模拟用户请求
user_query = "创建一个播放列表,包含《Kind of Blue》专辑的第一首歌,命名为'Machine Blues'。"
response = spotify_agent.invoke(user_query)
# 打印结果
print(response)
示例输出
以下是代理对用户请求的响应过程:
- 规划器生成API调用计划。
- 控制器顺序执行具体的API请求。
- 最终返回成功创建包含指定歌曲的播放列表。
> 用户请求:创建一个播放列表,包含《Kind of Blue》专辑的第一首歌,命名为'Machine Blues'。
> 执行计划:依次调用以下API:
- `GET /search` 搜索专辑《Kind of Blue》
- `GET /albums/{id}/tracks` 获取专辑曲目
- `POST /users/{user_id}/playlists` 创建播放列表
- `POST /playlists/{playlist_id}/tracks` 添加歌曲到播放列表
> 最终输出:我已创建一个名为'Machine Blues'的播放列表,包含《Kind of Blue》的第一首歌。
应用场景分析
- 音乐播放平台:在音乐应用中,实现复杂的播放列表管理需求。
- 电商平台:通过整合商品搜索、下单、支付等API,生成完成的电商业务流程。
- 智能助手:为用户规划涉及多步操作的任务,如订酒店+机票+租车。
实践建议
- 安全性:启用
allow_dangerous_requests=True时务必确保OpenAPI文档来源可信。 - 分层职责:尽量将规划与控制模块化,确保逻辑清晰且易于扩展。
- 性能优化:API调用次数多时,注意启用缓存机制减少重复请求。
如果遇到问题欢迎在评论区交流。
—END—
6437

被折叠的 条评论
为什么被折叠?



