지난번 파이썬으로 OpenAI API를 사용하여 ai 친구를 만들어보았습니다.
오늘은 지난번 코드에서 조금더 기능을 추가하여 특정 키워드를 입력시 해당 키워드에 맞는 역할을 실행하여 사용자에게 제공해보도록 하겠습니다.
사용자 입력에따른 기능 구현하기
키워드 체크 및 기능 구현 함수
###키워드 체크
def check_weather_keywords(txt):
weather_keywords = ['메모장 열어줘', '메모장 열어'] # 날씨 관련 키워드 리스트
for keyword in weather_keywords:
if keyword in txt:
return True
return False
###기능
def open_notepad():
os.startfile('notepad.exe')
return "확인해봐! 메모장 열었어~"
##키워드 체크
특정 키워드를 입력받으면 기능을 작동시키기 위해서는 키워드 체크함수와 기능함수로 나누어 작성합니다.
키워드 체크함수부분은 호출시 txt인자값을 넘겨받게되며 입력된 텍스트중 [날씨, 기온, 오늘의 날씨] 키워드가 txt에 포함되어있는지 확인후 True or False값을 리턴합니다. (불 자료형을 통하여 나중에 if문 작동)
##기능
기능 부분은 구현하고자하는 코드에 따라서 넘겨받는 인자값을 설정할 수 도있지만 이번에는 단순히 메모장을 실행시키는 기능만 포함하고있어서 별도의 인자값을 넘겨받을 필요없이 함수가 작동되면 메모장을 실행시킨뒤 ai가 응답할 메세지를 return합니다.
로컬 파일실행시 주의사항
open_notepad()함수에서 메모장을 열도록 코드를 작성하였는데 일반적으로 파이썬에서 os.system()를 사용하여도 notepad파일을 열 수 있습니다.
os.system()이나 subprocess.run()이나 startfile()이나 파이썬에서 프로그램을 실행하기위해서는 다양한 함수들이 존재합니다.
os.system()의 경우 프로그램에 핸들을 반환하지않고 가지고있기 때문에 다음 작업이 진행되지 않지만,startfile()를 사용하면 핸들도 반환하고 다음 작업을 이어서 진행할 수 있습니다.(참고 블로그)
API호출함수 수정
수정전
def chat_with_gpt(input, history):
history.append({"role": "user", "content": input})
gpt_response = client.chat.completions.create(
model="gpt-4",
messages=history
)
response = gpt_response.choices[0].message.content
history.append({"role": "assistant", "content": response})
messages = [(history[i]["content"], history[i+1]["content"]) for i in range(1, len(history), 2)]
return messages, history
#https://newstroyblog.tistory.com/447#gpt 대화 부분 함수처리-1 [최류현의 컴퓨터 정보공간:티스토리]
지난번에 작성한 코드중 chat_with_gpt함수 부분을 조금 수정할 예정입니다.
수정후
def chat_with_gpt(input, history):
history.append({"role": "user", "content": input})
if check_notepad_keywords(input):
note_info = open_notepad(input)
history.append({"role": "assistant", "content": note_info})
else:
gpt_response = client.chat.completions.create(
model="gpt-3.5-turbo-16k",
messages=history
)
response = gpt_response.choices[0].message.content
history.append({"role": "assistant", "content": response})
messages = [(history[i]["content"], history[i+1]["content"]) for i in range(1, len(history), 2)]
return messages, history
전체적인 chat_with_gpt함수 부분의 코드입니다. 각 코드를 나누어서 설명해보겠습니다.
history.append({"role": "user", "content": input})
우선 사용자의 입력내용을 history변수에 추가하도록 합니다.
if check_notepad_keywords(input):
note_info = open_notepad(input)
history.append({"role": "assistant", "content": note_info})
if문에서 키워드 체크 함수(check_notepad_keywords)로 키워드가 입력되었는지 확인한뒤 True or False값을 리턴받아 True일경우 기능 구현함수를 싱행합니다.
open_notepad함수의 return 결과값(설정한 메세지)을 note_info 변수에 저장하여 append함수로 ai의 응답(aissistant) 을 대화기록에 추가합니다.
else:
gpt_response = client.chat.completions.create(
model="gpt-3.5-turbo-16k",
messages=history
)
response = gpt_response.choices[0].message.content
history.append({"role": "assistant", "content": response})
else부분에서는 사용자의 입력에서 키워드가 발견되지 않았을경우 기존 코드와 동일하게 api호출후 ai의 응답 메세지를 받아온뒤 history변수에 대화 기록을 추가합니다.
실행결과
ai대화창에서 '메모장'이라는 키워드가 포함된 문장을 입력하니 메모장이 실행된뒤 설정한 응답메세지가 나오게됩니다.
그리고 이미 사용자가 입력한 메세지와 return한 메세지의값은 history에 저장이되었기 때문에 새로 대화를하여 ai에게 메세지를 전송해도(고마워~) ai가 이전 대화기록내용을 바탕으로 메모에 관한 내용을 기억하여 답변을 합니다.
전체코드