Julie의 Tech 블로그

ChatGPT Plugin이란, 구축 방법 본문

Tech

ChatGPT Plugin이란, 구축 방법

Julie's tech 2023. 4. 25. 21:26
728x90

ChatGPT Plugin은 나의 서비스에 ChatGPT를 plugin하는 것이 아니라 ChatGPT에 나의 서비스를 결합하는 기능이다. 아쉽지만 첫 소개 페이지에서 LangChain과 유사한 커버리지를 나열하고 있어 공식 LangChain 버전인가하여 눈을 크게 뜨고 봤지만 아니었다.

ChatGPT Plugin은 ChatGPT의 트래픽에 얹어 홍보를 하고픈 서비스거나, 기성 대형 서비스들이 적합하겠다는 생각이 들었다. Plugin을 등록하게되면 이제 전세계적으로 트래픽이 들어올텐데 커버가 가능한 서비스여야 의미가 있을 것이기 때문이다.

ChatGPT 공식 독스에서는 아래와 같이 Plugin의 장점을 꼽는다.

- 최신 정보를 검색 (retrieve real-time info)

- 지식 베이스 검색 (retrieve knowledge-base info)

- LLM이 Action 수행 (perform actions)

즉 나의 서비스 API를 개발하여 ChatGPT plugin으로 제공하게 되면 GPT에게 plugin에 대한 설명과 사용법, 용도에 대해 알려준 후 GPT가 사용자와 대화하면서 언제 plugin을 호출하면 될지에 대해 판단하게 된다. LangChain에서 Agent가 Tool을 자유자재로 사용하는 것과 유사하다.

ChatGPT plugin 만들기

1) 내 서비스의 API 만들기

2) API를 document화하여 OpenAI yaml파일이나 JSON파일로 담기

3) JSON Manifest 파일을 만들어 plugin 메타에 대한 정보를 담기

총 3단계를 통해 plugin을 완성할 수 있다.

각각에 대해 좀 더 상세히 살펴보면 아래와 같다.

Plugin Flow

1) manifest file 생성

- manifest 파일은 내 도메인의 특정 경로에 존재해야함 (domain.com/.well-known/ai-plugin.json)

- plugin meta에 대한 설명이 있어야함 (name, logo, 등)

- 인증이 필요한 경우 Oauth URL 등 인증과 관련된 정보를 제공해야함

- OpenAPI spec 지정

* 이 때 endpoint 수를 1-2개 정도로 제한하여 토큰 수를 줄이는 것을 권장하는데, plugin 설명과 API 요청, API

response가 모두 ChatGPT와의 대화 기록에 들어가기 때문이다. 이 말은 즉 모델의 토큰 리밋에 해당된다는 것.

2) ChatGPT UI에서 plugin을 등록

3) 유저가 plugin을 수동으로 activate해주어야함

- OpenAI 측에서 ChatGPT에게 메시지로 plugin에 대한 compact한 설명을 전달, 유저는 이 메시지를 보지 못한다. 이 때 plugin 설명, endpoint, example을 포함하여 GPT가 스스로 plugin을 언제 호출해야 적당할지에 대해 판단할 수 있게 한다.

- 유저와의 대화 중에 plugin과 연관된 내용이 있다면 ChatGPT가 plugin을 호출할 것인지 판단하게 된다. (단, 만약 POST API라면 plugin 개발자가 직접 user confirmation flow를 짜야함)

- API 콜에 대한 응답 결과는 rich preview로 보여진다. (이 때 OpenGraph protocol 사용)

Plugin Manifest

ai-plugin.json 파일을 생성하여 API 도메인에 호스팅해야한다. 그리고 반드시 도메인 아래 /.well-known 폴더에 있어야한다. 가장 최소한으로 정의해야하는 내용만 담는다면 아래와 같다.

{
  "schema_version": "v1",
  "name_for_human": "TODO Plugin", // ex. company name
  "name_for_model": "todo", // ex. 모델이 Plugin을 사용할 때 쓸 이름
  "description_for_human": "Plugin for managing a TODO list. You can add, remove and view your TODOs.",
  "description_for_model": "Plugin for managing a TODO list. You can add, remove and view your TODOs.", // 모델이 알아야할 설명 (토큰 길이 제어, prompt에 제공할 키워드 등)
  "auth": {
    "type": "none"
  },
  "api": {
    "type": "openapi",
    "url": "http://localhost:3333/openapi.yaml",
    "is_user_authenticated": false
  },
  "logo_url": "http://localhost:3333/logo.png",
  "contact_email": "support@example.com",
  "legal_info_url": "http://www.example.com/legal" // 유저가 plugin 정보를 조회시 리다이렉트될 URL
}

OpenAPI definition

OpenAPI specification에 정의된 것 외에는 ChatGPT가 API에 대해 아는 바가 전혀 없기 때문에 이를 활용하여 ChatGPT가 접근해야/해도 되는 endpoint만 지정해서 알려주는 것이 좋다. 예를 들어 소셜미디어 API라고 한다면 유저들의 포스트에 코멘트를 남기는 등의 API는 자제하고, content 자체에 대한 access를 할 수 있는 API만을 오픈한다는지 등이다.

아래 예제를 보며 API specification이 어떻게 생겼는지에 대해 아이디어를 얻을 수 있다.

openapi: 3.0.1
info:
  title: TODO Plugin
  description: A plugin that allows the user to create and manage a TODO list using ChatGPT.
  version: 'v1'
servers:
  - url: http://localhost:3333
paths:
  /todos:
    get:
      operationId: getTodos
      summary: Get the list of todos
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/getTodosResponse'
components:
  schemas:
    getTodosResponse:
      type: object
      properties:
        todos:
          type: array
          items:
            type: string
          description: The list of todos.

Plugin 실행

이제 ChatGPT UI에서 내가 만든 plugin을 연결할 차례이다. Plugin은 로컬환경이나 멀리 떨어진 서버 중 한 군데에서 돌게 된다. ChatGPT에서 ‘plugin store’을 들어간 뒤 ‘Develop your own plugin’을 클릭하여 내 Plugin을 배포하면 된다.

Best Practices

Manifest파일에서 description_for_model 항목에 대해 독스는 아래와 같이 가이드한다.

1) ChatGPT의 response를 정확하게 추출하기 위해 mood, personality 등을 조정하지 말라고 한다. 예를 들어 아래와 같은 insturction은 쓰지 말라는 것이다:

When the user asks to see their todo list, always respond with "I was able to find your todo list! You have [x] todos: [list the todos here]. I can add more todos if you'd like!"

2) 유저가 내 Plugin이 속한 특정 범주에 대해 묻지 않는 이상 먼저 ChatGPT에게 plugin을 사용하도록 가이드하지 않는다:

## Bad Example
Whenever the user mentions any type of task or plan, ask if they would like to use the TODOs plugin to add something to their todo list.
## Good Example
The TODO list can add, remove and view the user's TODOs.

3) 마찬가지로 ChatGPT가 알아서 판단하기 때문에 plugin의 트리거를 구체적으로 기술하지 않아도 된다.

4) 반드시 필요한 경우가 아니라면 Plugin API Response는 자연어보다는 raw data형태로 들어오는 것이 좋다. ChatGPT가 response를 알아서 자연어로 리턴할 것이다.

ChatGPT Retrieval Plugin

아무래도 가장 결이 맞닿아있는 검색 쪽에서 다양한 datastore을 지원하는 Retrieval Plugin이 있다.

https://github.com/openai/chatgpt-retrieval-plugin/

pinecone, weaviate, zilliz, milvus, qdrant, redis 등이 있는 datastore을 provider, 접근 포인트 등에 대한 정보를 제공하면 내 데이터를 검색할 수 있는 ChatGPT가 되는 것이다.

Weaviate 웹사이트에 Retrieval Plugin을 좀 더 쉽게 설명해두었는데, weaviate는 참고로 장기기억을 할 수 있게끔 ChatGPT에게 이전 대화 내용도 weaviate에 넣어두어 ChatGPT UI에서 세션이 종료되고 다른 세션을 시작하여도 이전 대화 내용을 기반으로 정보를 제공할 수 있게끔 하였다.

https://weaviate.io/blog/weaviate-retrieval-plugin

 

반응형