API Gateway용 ChatGPT 커스텀 플러그인 구축하기
July 12, 2023
ChatGPT 플러그인은 ChatGPT를 외부 API에 연결하는 다리 역할을 하여 이러한 API의 데이터를 지능적으로 사용할 수 있게 합니다. 이러한 플러그인은 ChatGPT가 스포츠 결과, 주식 시장 데이터, 속보와 같은 최신 정보를 검색하거나, 항공편 예약이나 음식 주문과 같은 작업을 사용자가 수행할 수 있도록 돕는 등 다양한 작업을 수행할 수 있게 합니다. 한편, API Gateway는 개발자가 API를 대규모로 구축, 배포 및 관리할 수 있게 하는 강력한 도구입니다. 이는 ChatGPT와 백엔드 서비스 간의 게이트웨이 역할을 하며, 인증, 속도 제한, 요청/응답 변환과 같은 기능을 제공합니다.
이전 글에서 API Gateway가 ChatGPT 플러그인 개발자에게 어떻게 도움이 될 수 있는지를 탐구했는데, 이 글에서는 API Gateway용 ChatGPT 플러그인을 개발하는 간단하고 직접적인 방법을 단계별로 안내합니다. 추가로, 플러그인을 ChatGPT에 추가하고 시험해 보는 방법도 배울 수 있습니다. 그러니 편안히 앉아 이 여정을 시작해 봅시다!
API Gateway용 ChatGPT 플러그인을 만드는 방법
OpenAI 웹사이트의 시작하기 가이드에 따르면, 새로운 사용자 정의 ChatGPT 플러그인을 구축하려면 일반적으로 다음 3단계를 따라야 합니다:
- OpenAPI 사양을 구현하는 API를 개발하거나 기존 API를 사용합니다.
- OpenAPI YAML 또는 JSON 형식으로 API를 문서화합니다.
- 플러그인에 대한 필수 정보를 포함하는 JSON 플러그인 매니페스트 파일을 생성합니다.
위와 유사한 단계를 따라, 백엔드 API 서비스를 위한 API Gateway 역할을 하는 ChatGPT용 사용자 정의 플러그인을 구축할 것입니다. 예를 들어, ChatGPT 사용자 인터페이스에서 사용자가 기존 Conference API 앞에 API Gateway를 도입하여 발표자의 세션 및 주제에 대한 세부 정보를 얻고자 한다면, 플러그인은 채팅에서 명령을 받은 후 사용자의 요청을 Apache APISIX Admin API로 전달하여 사용자가 지정한 입력 구성으로 Route를 생성합니다. 이는 챗봇을 사용하여 API Gateway 기능을 구성하는 또 다른 접근 방식이 될 수 있습니다. 아래 샘플 출력을 참조하세요:
명령이 성공적으로 실행된 후, APISIX는 경로를 생성하고 Conference 백엔드 API에 대한 Upstream을 등록합니다. 따라서 API Gateway 도메인 및 URL 경로를 통해 Gateway를 통해 응답을 받을 수 있습니다. 예를 들어, http://localhost:9080/speaker/1/sessions 엔드포인트에 대한 GET 요청은 Conference API에서 발표자의 모든 세션을 반환합니다. 또한 ChatGPT에 직접 요청하여 모든 경로 가져오기, ID로 경로 가져오기, 기존 경로 업데이트 또는 플러그인 및 업스트림으로 경로 생성과 같은 기본 작업을 수행할 수도 있습니다.
다양한 구성 요소 간의 데이터 흐름을 이해하려면 제공된 아키텍처 다이어그램을 참조할 수 있습니다:
사전 요구 사항
- 시작하기 전에 APISIX에 대한 기본적인 이해가 있으면 좋습니다. API Gateway 및 routes, upstream, Admin API, plugins, HTTP 프로토콜과 같은 주요 개념에 대한 친숙함도 도움이 됩니다.
- Docker는 컨테이너화된 etcd 및 APISIX를 설치하는 데 사용됩니다.
- 운영 체제와 호환되는 Visual Studio Code를 다운로드하거나 IntelliJ IDEA, PyCharm과 같은 다른 코드 편집기를 사용할 수 있습니다.
- 사용자 정의 ChatGPT 플러그인을 개발하려면 ChatGPT Plus 계정이 필요하며 플러그인 대기 목록에 가입해야 합니다.
전체 API Gateway 플러그인 코드 저장소는 여기에 있습니다. 코드 스니펫, 파일 및 API Gateway 설정, OpenAPI 정의로 API 문서화, 플러그인 매니페스트 파일 생성 방법을 단계별로 살펴보겠습니다.
이 플러그인 개발에 사용된 기술 스택은 다음과 같습니다:
- 기존 공개 Conference API를 사용하여 데모에서 발표자의 세션 및 주제 정보를 검색하는 두 개의 API 엔드포인트를 사용합니다. 브라우저에서 다른 API를 발견할 수 있습니다.
- Apache APISIX API Gateway를 사용하여 Admin API를 노출하고 API 트래픽을 관리합니다.
- Python 스크립트를 사용하여 플러그인을 실행하고, 플러그인 매니페스트, OpenAPI 사양 및 플러그인 로고 파일을 로컬 호스트 URL http://localhost:5000/에서 호스팅합니다.
- 프로젝트는 Docker를 사용하여 APISIX, etcd 및 Python 스크립트를 단일
docker compose up
명령으로 빌드, 배포 및 실행합니다.
플러그인을 생성하기 위해 일련의 단계를 따를 것입니다. 1부에서는 APISIX 설정에 초점을 맞출 것입니다. 2부에서는 ChatGPT 플러그인 자체를 개발할 것이며, 3부에서는 플러그인을 ChatGPT에 연결하고 테스트할 것입니다. 단계를 순차적으로 제시하지만, 주제에 대한 친숙도에 따라 어떤 단계든 건너뛸 수 있습니다.
1부: Apache APISIX 설정
1단계: APISIX 구성 정의
먼저, APISIX 구성 파일을 생성합니다. APISIX 구성은 일반적으로 YAML로 작성된 정적 구성 파일을 포함한 다양한 방법으로 정의할 수 있습니다. apisix.yml 파일에서 예제 구성을 제공했습니다:
deployment:
etcd:
host:
- "http://etcd:2397"
admin:
admin_key_required: false
allow_admin:
- 0.0.0.0/0
위의 apisix.yml 파일이 무엇을 의미하는지 ChatGPT와 상의할 수도 있습니다. 기본적으로 이 구성은 APISIX의 배포 모드를 정의합니다. 여기서는 APISIX가 Admin API에서 구성을 가져올 때 etcd 저장소를 사용하는 간단한 전통적인 옵션을 사용합니다. 또한 데모를 위해 Admin 키 admin_key_required
를 비활성화했습니다.
2단계: Docker Compose에 APISIX 및 etcd 등록
마지막 단계에서 docker-compose.yml 파일을 생성하고 APISIX 및 etcd를 서비스로 등록하여 빌드, 배포 및 실행합니다. APISIX Admin API는 포트: 9180
에서 사용할 수 있으며 Gateway는 포트: 9080
에서 액세스할 수 있습니다.
version: "3"
services:
apisix:
image: apache/apisix:3.3.0-debian
volumes:
- ./apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
restart: always
ports:
- "9080:9080"
- "9180:9180"
depends_on:
- etcd
etcd:
image: bitnami/etcd:3.5.9
environment:
ETCD_ENABLE_V2: "true"
ALLOW_NONE_AUTHENTICATION: "yes"
ETCD_ADVERTISE_CLIENT_URLS: "http://0.0.0.0:2397"
ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2397"
2부: ChatGPT 플러그인 개발
1단계: 플러그인 매니페스트 생성
모든 플러그인은 ai-plugin.json
매니페스트 파일이 필요하며, 이 파일은 플러그인의 이름, 설명, 로고 자산 등 중요한 정보를 제공합니다. 각 매니페스트 파일 필드에 대한 자세한 내용은 여기를 참조하세요. OpenAI는 모델 설명(description_for_model
)을 작성하는 데 대한 몇 가지 모범 사례도 포함하고 있습니다. ChatGPT UI에 플러그인을 설치할 때, 인터페이스는 도메인(http://localhost:5000/.well-known/ai-plugin.json)에서 매니페스트 파일을 찾습니다. 이는 ChatGPT가 플러그인과 상호 작용하는 방법을 이해하는 데 도움이 됩니다.
ai-plugin.json
이라는 새 파일을 생성하고 다음 코드를 붙여넣습니다:
{
"schema_version": "v1",
"name_for_human": "APISIX plugin for ChatGPT",
"name_for_model": "apigatewayplugin",
"description_for_human": "API Gateway plugin to manage your backend APIs.",
"description_for_model": "Create, retrive, manage APISIX routes, upstreams, and plugins",
"auth": {
"type": "none"
},
"api": {
"type": "openapi",
"url": "http://localhost:5000/openapi.yaml"
},
"logo_url": "http://localhost:5000/logo.png",
"contact_email": "support@example.com",
"legal_info_url": "http://www.example.com/legal"
}
파일은 http://localhost:5000/openapi.yaml 파일에 대한 URL도 지정합니다.
사용자가 ChatGPT와 상호 작용할 때, ChatGPT는
openapi.yaml
파일을 참조하여 엔드포인트의 설명을 이해합니다. 이 정보를 기반으로 ChatGPT는 사용자의 프롬프트에 가장 적합한 엔드포인트를 사용할지 결정합니다.
2단계: OpenAPI 사양 생성
OpenAPI 사양은 REST API를 설명하기 위한 표준입니다. 플러그인이 모델과 통신하는 데 사용할 각 API 엔드포인트를 지정하는 데 사용됩니다. 여기서 자세히 읽어보세요. openapi.yaml 파일의 예는 다음과 같습니다:
openapi: 3.1.0
info:
title: APISIX Admin API
description: >-
APISIX Admin API is a RESTful API that allows you to create and manage
APISIX resources.
version: 3.3.0
servers:
- url: http://localhost:5000
description: Dev Environment
tags:
- name: Route
description: |-
A route defines a path to one or more upstream services.
See [Routes](/apisix/key-concepts/routes) for more information.
paths:
/apisix/admin/routes:
get:
operationId: getAllRoutes
summary: Get All Routes
deprecated: false
description: Get all configured routes.
tags:
- Route
...
# GitHub 저장소에서 전체 버전 확인
위의 OpenAPI 사양은 실제 Admin API 스키마에서 추출한 것이며, 필요한 경우 더 많은 API 스키마를 쉽게 추가할 수 있습니다. 우리 플러그인 데모에서는 Route 관련 경로만 사용했습니다.
3단계: 플러그인 정적 파일을 위한 엔드포인트 추가 (로컬 호스트의 경우 선택 사항)
다음으로, Flask 앱을 Python으로 생성하여 플러그인의 로고, 매니페스트, OpenAPI 사양 파일을 로컬 호스트 URL http://localhost:5000/에서 엔드포인트로 노출합니다. ChatGPT는 사용자 정의 플러그인에 필요한 모든 정보를 가져오기 위해 API 엔드포인트를 호출합니다:
import requests
import os
import yaml
from flask import Flask, jsonify, request, send_from_directory
from flask_cors import CORS
app = Flask(__name__)
PORT = 5000
# 참고: ChatGPT가 플러그인에 액세스할 수 있도록 CORS를 chat.openapi.com에 허용해야 함
CORS(app, origins=[f"http://localhost:{PORT}", "https://chat.openai.com"])
api_url = 'http://apisix:9180'
@app.route('/.well-known/ai-plugin.json')
def serve_manifest():
return send_from_directory(os.path.dirname(__file__), 'ai-plugin.json')
@app.route('/openapi.yaml')
def serve_openapi_yaml():
with open(os.path.join(os.path.dirname(__file__), 'openapi.yaml'), 'r') as f:
yaml_data = f.read()
yaml_data = yaml.load(yaml_data, Loader=yaml.FullLoader)
return jsonify(yaml_data)
@app.route('/logo.png')
def serve_openapi_json():
return send_from_directory(os.path.dirname(__file__), 'logo.png')
# ChatGPT에서 API Gateway로 요청을 프록시하기 위해
@app.route('/<path:path>', methods=['GET', 'POST'])
def wrapper(path):
headers = {
'Content-Type': 'application/json',
}
url = f'{api_url}/{path}'
print(f'Forwarding call: {request.method} {path} -> {url}')
if request.method == 'GET':
response = requests.get(url, headers=headers, params=request.args)
elif request.method in ['POST', 'DELETE', 'PATCH', 'PUT']:
print(request.headers)
response = requests.post(url, headers=headers, params=request.args, json=request.json)
else:
raise NotImplementedError(f'Method {request.method} not implemented in wrapper for {path=}')
return response.content
if __name__ == '__main__':
app.run(debug=True,host='0.0.0.0')
스크립트가 실행되면 API 도메인에서 파일에 액세스할 수 있습니다:
ai-plugin.json
은 URI 경로 http://localhost:5000/.well-known/ai-plugin.json에서 사용 가능합니다.openapi.yaml
은 URI 경로 http://localhost:5000/openapi.yaml에서 액세스할 수 있습니다.logo.png
는 URI 경로 http://localhost:5000/logo.png에서 사용 가능합니다.
위 코드에서 CORS를 활성화한 것은 로컬에서 배포된 플러그인을 테스트하기 위해서입니다. 플러그인이 원격 서버에서 실행 중인 경우 프록시 부분이 필요하지 않습니다. 플러그인을 원격으로 실행하는 방법은 OpenAI 문서를 참조하세요.
4단계: Python 앱 도커라이징
Python 앱을 Docker로 자동 실행하기 위해 Dockerfile을 생성하고 docker-compose.yml 파일에 등록합니다. Python 앱을 도커라이징하는 방법은 여기에서 배울 수 있습니다.
FROM python:3.9
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
COPY . .
CMD ["python","main.py"]
최종적으로 docker-compose.yml
파일은 다음과 같습니다:
version: "3"
services:
apisix:
image: apache/apisix:3.3.0-debian
volumes:
- ./apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
restart: always
ports:
- "9080:9080"
- "9180:9180"
depends_on:
- etcd
etcd:
image: bitnami/etcd:3.5.9
environment:
ETCD_ENABLE_V2: "true"
ALLOW_NONE_AUTHENTICATION: "yes"
ETCD_ADVERTISE_CLIENT_URLS: "http://0.0.0.0:2397"
ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2397"
chatgpt-config:
build: chatgpt-plugin-config
ports:
- '5000:5000'
3부: ChatGPT와 사용자 정의 플러그인 통합
1단계: 사용자 정의 플러그인 배포
사용자 정의 플러그인 개발을 완료하면 로컬에서 배포하고 실행할 시간입니다. 프로젝트 루트 디렉토리에서 다음 명령을 실행하여 프로젝트를 시작합니다:
docker compose up
프로젝트를 시작하면 Docker는 실행에 필요한 이미지를 다운로드합니다. APISIX, etcd 및 Python 앱(chatgpt-config
) 서비스가 실행 중임을 확인할 수 있습니다.
2단계: 사용자 정의 플러그인을 ChatGPT 인터페이스에 연결
이제 ChatGPT 플러그인을 배포했고, 플러그인 구성 파일이 API를 통해 액세스 가능하므로 테스트할 준비가 되었습니다. Plus 계정이 있다면, GPT-4에서 플러그인을 활성화해야 합니다. 설정으로 이동하여 베타 옵션을 클릭하고 "플러그인 활성화"를 클릭합니다. 그런 다음 ChatGPT 상단의 플러그인 팝업 바에서 "Plugin Store"로 이동하여 "Develop your own plugin"을 선택합니다. 플러그인에 대한 로컬 호스트 URL(localhost:5000
)을 제공합니다.
"매니페스트 파일 찾기"를 클릭하면, 모든 것이 올바르게 설정되었다면 ChatGPT가 매니페스트 및 OpenAPI 사양 파일을 성공적으로 검증하는 것을 볼 수 있습니다.
3단계: 사용자 정의 플러그인 테스트
이제 플러그인이 ChatGPT 인터페이스에 연결되었으므로 간단한 명령을 작성할 수 있습니다:
APISIX에 경로가 없으므로 새 경로를 생성할 수 있습니다. 여기서는 프롬프트에 사용된 언어에 따라 ChatGPT가 적절한 APISIX 엔드포인트를 호출할지 결정합니다. ChatGPT가 경로를 올바르게 생성할 수 있도록 더 구체적인 세부 정보를 포함하여 명령을 작성해 보세요.
이제 경로가 생성되었으므로 Gateway 엔드포인트에 액세스하여 Conference 세션 세부 정보를 가져올 수 있습니다: http://localhost:9080/speaker/1/sessions. 이 Conference API를 자신의 백엔드 API로 대체할 수도 있습니다.
API Gateway 사용자 정의 플러그인의 다른 사용 사례
이제 질문할 수 있습니다: 이 플러그인으로 단순히 요청을 라우팅하는 것 외에 무엇을 더 할 수 있을까요? APISIX가 Admin API를 통해 제공하는 이 플러그인을 개선하거나 추가 기능을 추가할 수 있는 많은 것들이 있습니다. Conference API 앞에 API Gateway를 배치했기 때문에 API Gateway는 플러그인에서 오는 모든 요청을 먼저 처리하므로 최소한 다음을 달성할 수 있습니다:
- 보안: 이제 Conference API를 보호하려고 한다고 가정해 보겠습니다. API Gateway 없이도 OpenAI의 플러그인 인증 방법을 사용하여 ChatGPT UI와 플러그인 간의 데이터 교환을 보호할 수 있습니다. 그러나 플러그인과 백엔드 서비스 간의 통신은 Python 코드에 일부 횡단 관심사를 구현할 때까지 여전히 보호되지 않습니다. 대신 이 시간을 절약하기 위해:
- API Gateway를 사용하여 인증, 권한 부여 및 속도 제한과 같은 보안 조치를 구현하여 Conference API를 무단 액세스 및 잠재적 공격으로부터 보호할 수 있습니다. ChatGPT는 API Gateway와 자유롭게 통신할 수 있지만 API Gateway와 백엔드 서비스 간의 통신은 절대적으로 안전할 수 있습니다.
- �싱: 유사한 Conference API 응답을 캐시하여 ChatGPT에 데이터를 빠르게 표시할 수 있습니다.
- 버전 관리: Conference API의 두 번째 버전을 생성하여 다운타임 없이 ChatGPT 플러그인 요청을 최신 서비스로 라우팅할 수 있습니다.
- 로드 밸런싱: Conference API의 여러 인스턴스에 들어오는 요청을 분산하여 고가용성과 효율적인 리소스 활용을 보장할 수 있습니다.
- 요청 변환: Conference API에 대한 요청을 수정하여 데이터 변환, 유효성 검사 또는 REST에서 GraphQL로 요청 변환 또는 gRPC 서비스 호출을 가능하게 할 수 있습니다.
- 모니터링 및 분석: API Gateway는 강력한 모니터링 및 분석 플러그인을 제공하여 API 사용, 성능 및 잠재적 문제에 대한 귀중한 통찰력을 수집할 수 있습니다.
Apache APISIX API Gateway를 ChatGPT 사용자 정의 플러그인과 백엔드 API 간의 통신을 위한 프론트 도어로 사용하려면 이 저장소 ChatGPT 사용자 정의 플러그인과 백엔드 API 간의 API Gateway를 확인하세요.
다음 단계
이 글을 통해 API Gateway용 사용자 정의 플러그인을 기본 기능으로 생성하는 방법을 배웠습니다. 이제 샘플 프로젝트를 기반으로 Admin API 사양을 openapi.yaml 파일에 추가하여 다른 플러그인을 사용하고 테스트하고, API 소비자를 추가하는 등 기능을 개선할 수 있습니다. GitHub 프로젝트에 풀 리퀘스트를 올려 기여해 보세요.