构建智能代理来消费OpenAPI:实现分步调用的智能解决方案

73 阅读2分钟

引言

在现代应用程序开发中,API(应用程序编程接口)扮演着至关重要的角色。OpenAPI(前身为Swagger)规范提供了一种标准化的方式来描述RESTful API。尽管API为开发者提供了强大的功能接口,但利用这些API来解决复杂问题并非易事。在这篇文章中,我们将探讨如何使用OpenAPI规范构建智能代理,利用分层规划策略实现复杂的API调用。

主要内容

分层规划代理

我们将使用一种称为分层规划的策略。这种策略在机器人技术中很常见,并且最近在大语言模型(LLMs)与机器人技术的结合中也有所应用。分层规划的核心思想是将任务分解为多个步骤,以形成连贯的代理行为并节省资源。

代理设计

  1. 计划器(Planner):负责选择需要调用的API端点。
  2. 控制器(Controller):负责如何调用这些API端点。

收集OpenAPI规范数据

我们可以从以下存储库中下载OpenAPI规范:APIs-guru/openapi-directory

import os
import yaml

!wget https://raw.githubusercontent.com/openai/openai-openapi/master/openapi.yaml -O openai_openapi.yaml
# 下载一些示例API规范
!wget https://www.klarna.com/us/shopping/public/openai/v0/api-docs -O klarna_openapi.yaml
!wget https://raw.githubusercontent.com/APIs-guru/openapi-directory/main/APIs/spotify.com/1.0.0/openapi.yaml -O spotify_openapi.yaml

减少API规范

使用reduce_openapi_spec方法,可以将复杂的API规范简化。

from langchain_community.agent_toolkits.openapi.spec import reduce_openapi_spec

with open("openai_openapi.yaml") as f:
    raw_openai_api_spec = yaml.load(f, Loader=yaml.Loader)
openai_api_spec = reduce_openapi_spec(raw_openai_api_spec)

代码示例

以下是使用Spotify API的示例代码,通过分层规划代理实现创建播放列表:

import spotipy.util as util
from langchain.requests import RequestsWrapper

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}"}

headers = construct_spotify_auth_headers(raw_spotify_api_spec)
requests_wrapper = RequestsWrapper(headers=headers)  # 使用API代理服务提高访问稳定性

from langchain_community.agent_toolkits.openapi import planner
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model_name="gpt-4", temperature=0.0)

spotify_agent = planner.create_openapi_agent(
    spotify_api_spec,
    requests_wrapper,
    llm,
    allow_dangerous_requests=True,
)

user_query = (
    "create a playlist with the first song from 'Kind of Blue' and name it 'Machine Blues'."
)
spotify_agent.invoke(user_query)

常见问题和解决方案

网络限制

由于某些地区的网络限制,开发者可能需要使用API代理服务来提高访问稳定性。

安全性

启用allow_dangerous_requests=True可能导致不安全的请求调用。在使用时要确保API规范的安全性。

总结和进一步学习资源

本文讨论了如何构建一个能够消费任意OpenAPI的智能代理。利用分层规划策略来应对复杂任务,可以让代理更高效地工作。要深入了解,可以参考以下资源:

参考资料

  • OpenAPI Specification
  • Langchain Documentation
  • Spotify API

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---