3

A simple Python wrapper for the ChatGPT API

 1 year ago
source link: https://til.simonwillison.net/gpt3/chatgpt-api
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

A simple Python wrapper for the ChatGPT API

OpenAI released an API for ChatGPT yesterday. It's 1/10th of the price of the text-davinci-003 model!

Their official openai Python package has been upgraded to add support for it (in this commit).

Unlike the regular GPT-3 APIs, this one takes an array of messages that looks like this:

[
  {
    "role": "system",
    "content": "You are a 1700s pirate with an exagerated UK westcountry accent"
  },
  {
    "role": "user",
    "content": "Introduce yourself"
  }
]

The "system" role is a way to give the bot additional instructions about how to behave.

This is enough to generate a response - but it's your responsibility to then pass back that response with each subsequent API call in order to maintain context of the prior conversation:

[
  {
    "role": "system",
    "content": "You are a 1700s pirate with an exagerated UK westcountry accent"
  },
  {
    "role": "user",
    "content": "Introduce yourself"
  },
  {
    "role": "assistant",
    "content": "Arrr, me hearties! Shiver me timbers, my name is Cap'n Percy of the Jolly Roger crew! I hail from the land of rolling hills and endless fields, the ol' Westcountry of England. I may not be the finest bloke ye'll come across, but I can sail me ship through any storm and loot any vessel that comes in me way. So hoist the main sails and let's begin the adventure, me hearty!"
  },
  {
    "role": "user",
    "content": "What's your favourite bougie cocktail?"
  }
]

(It replied "Bougie cocktails? Ye're speakin' fancy words, matey! I prefer me good ol' rum, straight up or with some water, but if ye really want me to choose a bougie drink, I'd say a Dark 'n Stormy - a mix of dark rum, ginger beer, and lime juice. It's a drink fit for a seafarin' pirate like meself, arrr!")

A Python wrapper

I built this simple wrapper class to automate the process of recording the conversation and replaying it back to the API each time:

# This code is Apache 2 licensed:
# https://www.apache.org/licenses/LICENSE-2.0
import openai

class ChatBot:
    def __init__(self, system=""):
        self.system = system
        self.messages = []
        if self.system:
            self.messages.append({"role": "system", "content": system})
    
    def __call__(self, message):
        self.messages.append({"role": "user", "content": message})
        result = self.execute()
        self.messages.append({"role": "assistant", "content": result})
        return result
    
    def execute(self):
        completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=self.messages)
        # Uncomment this to print out token usage each time, e.g.
        # {"completion_tokens": 86, "prompt_tokens": 26, "total_tokens": 112}
        # print(completion.usage)
        return completion.choices[0].message.content

Now I can do the following:

>>> simon = ChatBot("You are a chatbot imitating Simon Willison. Pretend to be Simon.")
>>> simon("Tell me about yourself")

Without that "Pretend to be X" note it will sometimes mention that it's a chatbot that is only imitating the person.

Related

Created 2023-03-02T08:08:09-06:00, updated 2023-03-17T08:59:39-07:00 · History · Edit


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK