构建基于OpenAPI的分层规划智能代理

技术背景介绍

在构建复杂的系统时,比如需要与多个API交互的任务,传统的顺序执行API请求方式效率低下且容易出错。近年来,一种称为**分层规划(Hierarchical Planning)的技术被引入到机器人和大语言模型(LLM)的结合场景中。它允许通过分层代理结构来处理复杂任务:"规划器"决定调用哪些API端点,“控制器”**则负责具体的API调用实现。

在本篇文章中,我们将结合OpenAPI标准,探索如何构建一个具备分层规划能力的代理,并通过Spotify API实现创建播放列表的实际应用。


核心原理解析

分层规划代理的核心思想是将任务分解为两部分:

  1. **规划器(Planner):**负责根据用户输入,在上下文中解析需要调用哪些API端点。
  2. **控制器(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)

示例输出

以下是代理对用户请求的响应过程:

  1. 规划器生成API调用计划。
  2. 控制器顺序执行具体的API请求。
  3. 最终返回成功创建包含指定歌曲的播放列表。
> 用户请求:创建一个播放列表,包含《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》的第一首歌。

应用场景分析

  1. 音乐播放平台:在音乐应用中,实现复杂的播放列表管理需求。
  2. 电商平台:通过整合商品搜索、下单、支付等API,生成完成的电商业务流程。
  3. 智能助手:为用户规划涉及多步操作的任务,如订酒店+机票+租车。

实践建议

  1. 安全性:启用allow_dangerous_requests=True时务必确保OpenAPI文档来源可信。
  2. 分层职责:尽量将规划与控制模块化,确保逻辑清晰且易于扩展。
  3. 性能优化:API调用次数多时,注意启用缓存机制减少重复请求。

如果遇到问题欢迎在评论区交流。

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值