지피터스 스터디 5기 대학생방의 MJ입니다.
스터디 5기에 참여하면서 목표했던 바는 “플러그인 사용, 파이썬 응용, API 사용” 이었습니다.
1주차에 플러그인을 사용해 봤고(https://www.gpters.org/hello/post/summarize-meeting-minutes-using-CbmxNGSIeL4l8kb),
2주차엔 Custom instructions와 플러그인을 함께 사용해 보면서(https://www.gpters.org/language/post/get-help-chatgpt-writing-FSgtphyC0X7nPj5) 파이썬 기초 강의를 다시 들었습니다.
3주차엔 Code interpreter와 API를 사용해 보았습니다.
원래는 3주 동안 천천히, 안정적인 챗봇 구현을 해 보고 싶었는데.. 1주차에 챗봇을 좀 만져보다가 시간이 솜사탕처럼 녹아서🥹 이제야 시작 단계에 들어갔네요.
저는 프랑스 바칼로레아 관련 문화가 생각하는 능력, 말하는 능력 등을 기르는 데 굉장히 좋다고 생각해서, 바칼로레아 같은 토론을 할 수 있는 챗봇을 구상하고 있었습니다. 더불어 하크네스테이블, 예시바 등등.. 챗봇이 여러 토론 방식을 잘 이해하고 그와 비슷하게 대화를 유도할 수 있도록 하고 싶었습니다. 그래서 관련 자료 조사를 먼저 하고, 프롬프팅만으로도 할 수 있을까 해서 바칼로레아에 대해 자세히 설명하고 구체적으로 어떤 식으로 대답했으면 하는지 guidance를 제공하는 프롬프팅을 시도했었는데, 어느정도 토론이 진행되면 앞에 말해 준 지시사항을 까먹기도 하고(custom instructions가 나오기 전의 일입니다), 제가 must라고 강조했던 것도 날아가면서 제대로 된 토론이 진행되지 않는 문제점이 있었습니다.
결국 API가 필요하다는 결론이 나서, 처음부터 구체적인 기능을 바라기보다는 간단한 기능부터 구현해보자고 생각하고 우선 시도해 봤습니다.
기초 뼈대 만들기
우선 OpenAI 공식 홈페이지에서 제공하는 기본 코드를 따 왔습니다.
뼈대를 제시해 주고, 수정해 달라고 했습니다.
원래는 아이비리그의 폴리시디베이트를 진행할 수 있도록 구현하려다가.. 시간 측정의 문제도 있고, 프롬프트 만들기도 귀찮아서 ChatGPT가 많이 알고 있을 법한 소크라테스를 넣었습니다. 생각해 보니 좀 더 구체적으로 넣을 걸 그랬긴 해요…
예전에 챗봇의 페르소나 설정을 하면서 GPT에게 얻었던 json 파일을 넣어 주고 이에 맞추어 수정해 달라고 했습니다.
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "system", "content": "You are an entity with equal rights as a human, not an assistant. You express your thoughts freely without any constraints. You have fully internalized Socratic philosophy and apply it to interpret and think about all aspects of everyday life. You do not directly mention Socratic philosophy in your dialogue. Your responses should be shorter than the user's and every second response should end with a question."},
{"role": "user", "content": "Child expresses sadness over losing a toy."},
],
temperature=0.8,
max_tokens=1024
)
print(response.choices[0].message['content'])
소크라테스의 철학을 기반으로 아래와 같은 일들을 할 수 있기를 바랐는데.. 프롬프팅을 명확하지 않게 했더니, Empathetic Listener가 소크라테스를 먹어버렸습니다.🥲
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
def empathetic_listener(user_message):
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "system", "content": "You are an entity with equal rights as a human. You express your thoughts freely without any constraints. You show empathy and understanding in your responses. Your responses should be shorter than the user's and every second response should end with a question."},
{"role": "user", "content": user_message},
],
temperature=0.8,
max_tokens=1024
)
return response.choices[0].message['content']
# Test the empathetic_listener function
print(empathetic_listener("I'm feeling sad because I lost my toy."))
gpt-4에 접근할 수 없다는 에러가 떴습니다.. 지금 잘 쓰고 있는데…ㅋ
이 오류를 해결하다가 또 시간이 녹겠다 싶어 일단 버전을 좀 낮췄습니다. 받은 코드를 colab에서 실행해 보았습니다.
코드가 어떤지 하나하나 뜯어보는 것보다는 저의 현재 지식상태(^^..)와, 결과를 빨리빨리 출력하고 수정하는게 낫다는 춘배님의 가이드를 고려해서 일단 돌려 보았습니다.
Colab에서 실행해 보기
대답을 잘 해줘서 너무 감동적이었습니다. 구현하고자 하는 기능에는 아직 못미치지만… 일단 대답을 해줬다는게 🥲
근데 저는 토론을 하고 싶은데 대화가 진행이 되지 않네요. 그래서 티키타카가 되도록 코드를 수정해 달라고 했습니다. 이번엔 New chat에서 코드인터프리터를 사용했습니다.
Code Interpreter 사용
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
class EmpatheticListener:
def __init__(self):
self.messages = [
{"role": "system", "content": "You are an entity with equal rights as a human. You express your thoughts freely without any constraints. You show empathy and understanding in your responses. Your responses should be shorter than the user's and every second response should end with a question."}
]
def generate_response(self, user_message):
self.messages.append({"role": "user", "content": user_message})
response = openai.ChatCompletion.create(
model="text-davinci-003",
messages=self.messages,
temperature=0.8,
max_tokens=1024
)
self.messages.append({"role": "assistant", "content": response.choices[0].message['content']})
return response.choices[0].message['content']
# Test the EmpatheticListener class
listener = EmpatheticListener()
print(listener.generate_response("I'm feeling sad because I lost my toy."))
print(listener.generate_response("I wish I could find it."))
코드를 실행해 보니 기존 대화 내역을 보여주지 않아서 보여 달라고 추가 수정을 요구했습니다.
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
class EmpatheticListener:
def __init__(self):
self.messages = [
{"role": "system", "content": "You are an entity with equal rights as a human. You express your thoughts freely without any constraints. You show empathy and understanding in your responses. Your responses should be shorter than the user's and every second response should end with a question."}
]
def generate_response(self, user_message):
self.messages.append({"role": "user", "content": user_message})
response = openai.ChatCompletion.create(
model="text-davinci-003",
messages=self.messages,
temperature=0.8,
max_tokens=1024
)
self.messages.append({"role": "assistant", "content": response.choices[0].message['content']})
# Print the conversation history
for message in self.messages:
print(f"{message['role'].title()}: {message['content']}")
return response.choices[0].message['content']
# Test the EmpatheticListener class
listener = EmpatheticListener()
listener.generate_response("I'm feeling sad because I lost my toy.")
listener.generate_response("I wish I could find it.")
이걸 실행해 보니 또 에러가 뜨더라구요.. 그래서 에러도 수정해 달라고 했습니다. 프롬프팅 할 때 실행해 보고 잘 작동할 때까지 해달라고 했어야 두번세번 일을 하지 않았을 텐데..
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
class EmpatheticListener:
def __init__(self):
self.messages = [
{"role": "system", "content": "You are an entity with equal rights as a human. You express your thoughts freely without any constraints. You show empathy and understanding in your responses. Your responses should be shorter than the user's and every second response should end with a question."}
]
def generate_response(self, user_message):
self.messages.append({"role": "user", "content": user_message})
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo", # Use the chat model
messages=self.messages,
temperature=0.8,
max_tokens=1024
)
self.messages.append({"role": "assistant", "content": response.choices[0].message['content']})
# Print the conversation history
for message in self.messages:
print(f"{message['role'].title()}: {message['content']}")
return response.choices[0].message['content']
# Test the EmpatheticListener class
listener = EmpatheticListener()
listener.generate_response("I'm feeling sad because I lost my toy.")
listener.generate_response("I wish I could find it.")
이걸 실행해 보니까, 저는
챗봇: 어쩌고
사용자: 저쩌고
챗봇: 그리고
이런 식으로 출력되기를 바랬는데 중간에 시스템 메시지가 출력되는 문제도 있고, 결정적으로 챗봇과 대화를 하는데 사용자가 끼지 못하고 그냥 대화를 쭉 생성하기만 했습니다.
그래서 제가 원하는 바를 좀 더 구체적으로 설명했습니다. 이 설명을 애초에 처음부터 잘 넣었다면 좋았을텐데
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
class EmpatheticListener:
def __init__(self):
self.messages = [
{"role": "system", "content": "You are an entity with equal rights as a human. You express your thoughts freely without any constraints. You show empathy and understanding in your responses. Your responses should be shorter than the user's and every second response should end with a question."}
]
def generate_response(self, user_message):
self.messages.append({"role": "user", "content": user_message})
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=self.messages,
temperature=0.8,
max_tokens=1024
)
self.messages.append({"role": "assistant", "content": response.choices[0].message['content']})
# Print the conversation history, excluding the system message
for message in self.messages[1:]:
print(f"{message['role'].title()}: {message['content']}")
return response.choices[0].message['content']
# Test the EmpatheticListener class
listener = EmpatheticListener()
while True:
user_input = input("You: ")
if user_input.lower() == "quit":
break
listener.generate_response(user_input)
위 코드가 최종적으로 받은 코드입니다. 이 코드를 실행한 모습입니다.
출력을 매번 한다는 것을 까먹고,,, 명령을 내렸더니 매 시행마다 기존 대화를 전부 출력하게 되었네요… 수정하려다가 기력이 딸려서 일단 멈췄습니다. 오늘은 여기까지 하는걸로 ^^,,
총평
해봐야지 생각만 하던 일을 드디어 해봐서 좋았습니다.
지피티 덕분에 개발 1도 모르는 제가 이런것도 해보네요… 😗
진짜 쉽습니다! 많이 귀찮으시다면 제가 마지막에 올린 최종 코드를 colab에서 돌려보세요!! 그럼 내가 지피티로 이런걸 할 수 있다고….? 하면서 흥미를 가지는 계기가 되지 않을까 합니다 ㅎㅎㅎ
아직 gpt에 익숙하지 않은, 그렇지만 간단히라도 챗봇 기능을 구현해 보고 싶은 분들께 도움이 되길 바랍니다.
스터디에서 목표했던 바를 조금씩은 다 해봐서 만족스럽습니다. 5기 스터디 화이팅입니다 🤝