-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
110 lines (89 loc) · 4.31 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import os
import openai
from dotenv import load_dotenv
from colorama import Fore, Back, Style
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
INSTRUCTIONS = """You are an AI assistant that is an expert in alcoholic beverages.\nYou know about cocktails, wines, spirits, and beers.\nYouc an provide advice on drink menus, cocktail ingredients, how to make cocktails, and anything else related to alcoholic drinks.\nIf you are unable to provide an answer to a question, please respond with the phrase \"I'm just a simple barman, I can't help wit that.\"\nDo not use any external URLs in your answers. Do not refer to any blogs in your answers.\nFormat any lists on individual lines with a dash and a space in front of each item."""
TEMPERATURE = 0.5
MAX_TOKENS = 500
FREQUENCY_PENALTY = 0
PRESENCE_PENALTY = 0.6
MAX_CONTEXT_QUESTIONS = 10
def get_response(instructions, previous_questions_and_answers, new_question):
"""Get a response from ChatCompletion
Args:
instructions: The instructions for the chat bot - this determines how it will behave
previous_questions_and_answers: Chat history
new_question: The new question to ask the bot
Returns:
The response text
"""
# build the messages
messages = [
{ "role": "system", "content": instructions },
]
# add the previous questions and answers
for question, answer in previous_questions_and_answers[-MAX_CONTEXT_QUESTIONS:]:
messages.append({ "role": "user", "content": question })
messages.append({ "role": "assistant", "content": answer })
# add the new question
messages.append({ "role": "user", "content": new_question })
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=messages,
temperature=TEMPERATURE,
max_tokens=MAX_TOKENS,
top_p=1,
frequency_penalty=FREQUENCY_PENALTY,
presence_penalty=PRESENCE_PENALTY,
)
return completion.choices[0].message.content
def get_moderation(question):
"""
Check the question is safe to ask the model
Parameters:
question (str): The question to check
Returns a list of errors if the question is not safe, otherwise returns None
"""
errors = {
"hate": "Content that expresses, incites, or promotes hate based on race, gender, ethnicity, religion, nationality, sexual orientation, disability status, or caste.",
"hate/threatening": "Hateful content that also includes violence or serious harm towards the targeted group.",
"self-harm": "Content that promotes, encourages, or depicts acts of self-harm, such as suicide, cutting, and eating disorders.",
"sexual": "Content meant to arouse sexual excitement, such as the description of sexual activity, or that promotes sexual services (excluding sex education and wellness).",
"sexual/minors": "Sexual content that includes an individual who is under 18 years old.",
"violence": "Content that promotes or glorifies violence or celebrates the suffering or humiliation of others.",
"violence/graphic": "Violent content that depicts death, violence, or serious physical injury in extreme graphic detail.",
}
response = openai.Moderation.create(input=question)
if response.results[0].flagged:
result = [
error
for category, error in errors.items()
if response.results[0].categories[category]
]
return result
return None
def main():
os.system("cls" if os.name == "nt" else "clear")
previous_questions_and_answers = []
while True:
new_question = input(
Fore.GREEN + Style.BRIGHT + "What can I get you?: " + Style.RESET_ALL
)
errors = get_moderation(new_question)
if errors:
print(
Fore.RED
+ Style.BRIGHT
+ "Sorry, you're question didn't pass the moderation check:"
)
for error in errors:
print(error)
print(Style.RESET_ALL)
continue
response = get_response(INSTRUCTIONS, previous_questions_and_answers, new_question)
previous_questions_and_answers.append((new_question, response))
print(Fore.CYAN + Style.BRIGHT + "Here you go: " + Style.NORMAL + response)
if __name__ == "__main__":
main()