전체코드
import openai
from openai import OpenAI
client = OpenAI()
system_message= {
"role":"system", "content":"너는 의사야. 의료상담을 해 줘. 주의사항은 말하지마."
}
messages=[system_message]
while True:
user_input= input("사용자 전달: ")
if user_input=="exit":
print("대답: 즐거운 대화였습니다! 감사합니다!")
break
messages.append({"role":"user", "content": user_input})
completion = client.chat.completions.create(
model="gpt-4o",
messages=messages
)
reply=completion.choices[0].message.content
print("대답: "+reply)
messages.append({"role":"assistant", "content":reply})
client = OpenAI()
clinet를 생성하는 코드
클라이언트란 api서버와 연결해 요청을 보내고 응답을 받아오는 프로그램이다.
system_message = {
"role": "system", "content": "너는 의사야. 의료상담을 해 줘. 주의사항은 말하지마."
}
system_message라는 변수에 챗봇의 초기설정을 담고있다.
chat API는 고정된 형식의 JSON(JavaScript Object Notation)을 인식하도록 되어있으며, 데이터는 딕셔너리 형태로 key와 value 쌍을 이룬다.
고정된 형식? role, content가 key로 들어가는 형식,
그러니까 마음대로 "gender":"female", "content":"다정한 십년지기 친구" 라고 해봤자 인식하지 않음
role의 구분?
"role":"system" ->시스템 초기설정, 지침, 역할
"role":"user" ->사용자가 보낸 메시지
"role":"assistant" ->챗봇이 생성한 답변
즉 위의 코드는 챗봇한테 의사로서 상담하라는 지침을 주는 코드이다.
참고)주의사항을 말하지 마
chat api를 만들때 의료, 법률자문 등 전문분야는 전문가와 상담해야 한다는 주의문구가 나오도록 되어있기 때문에 그 부분을 회피하기 위해 넣었음
messages = [system_message]
대화기록을 저장하기 위한 리스트
이후 코드를 통해 system message뿐 아니라 사용자와 챗봇이 주고받은 대화도 모두 저장할 것이다.
while True:
user_input = input("사용자 전달: ")
if user_input == "exit":
print("대답: 즐거운 대화였습니다! 감사합니다!")
break
while True 는 이전에 number game 만들면서도 봤던 무한반복문이다.
원래 user_input에 사용자로부터 입력값을 받는 기능만 있어도 되는데 (input 함수)
while True:
user_input = input("사용자 전달: ")
대화를 끝내고 싶을 수 있으니 if 문을 사용해 대화를 끝내는 코드까지 넣어주었다.
if user_input == "exit":
print("대답: 즐거운 대화였습니다! 감사합니다!")
break
messages.append({"role": "user", "content": user_input})
messages = [system_message] 이 리스트에 append()로 추가
추가할것은 "role": "user", "content": user_input -> 사용자가 보낸 메시지, 내용은 user_input
여기서 user_input은 user_input = input("사용자 전달: ") 이 코드를 통해 입력받은 내용을 의미한다.
completion = client.chat.completions.create(
model="gpt-4o",
messages=messages
)
client.chat.completions.create() 는 대답을 생성하는 함수이다.
완성된 응답을 생성한다는 뜻이고 사용할 모델과 대화기록(message)을 전달하고 있다.
AI는 전달받은 대화기록을 바탕으로 문맥에 맞는 답변을 생성하고, 그것을 completion이라는 변수에 저장했다.
reply=completion.choices[0].message.content
위에서 completion에 저장된 내용은 예를 들면 다음과 같다.
completion = {
"choices": [
{ "message": { "role": "assistant", "content": "안녕하세요! 무엇을 도와드릴까요?" }, "finish_reason": "stop", "index": 0 }
],
"model": "gpt-4", "usage": { "prompt_tokens": 12, "completion_tokens": 10, "total_tokens": 22 }
}
completion.choices[0]은 choice리스트의 첫번째 항목이라는 뜻이고,
그 안에서도 message의 content를 가져와서 " 안녕하세요! 무엇을 도와드릴까요? " 라는 응답만을 reply에 저장하고 있다.
객체의 각 속성에 .속성명 의 방식으로 접근했다.
print("대답: "+reply)
+는 문자열을 단순 연결해주는 역할로 대답: 뒤에 reply에 저정된 응답을 붙여서 프린트해준다.
messages.append({"role":"assistant", "content":reply})
마지막으로 messages=[system_message] 이 리스트에 챗봇의 응답을 더해줘서 계속 이전 대화내용을 업데이트하며 대화를 이어나갈 수 있다.
결과!
만약 위와 동일한 코드에서 내가 누군지 알아? 라고 물어보면
이렇게 모르겠다는 대답이 온다. 하지만
이렇게 messages에 수동으로 사용자의 정보를 업데이트 해주면 messages의 내용을 바탕으로 대화를 이어간다.
참고로 {"role":"user", "content":"나진상, 65세"} 이렇게 써두면 이름이나 나이를 물어봐도 모르겠다고 대답하니 전달하는 정보가 무엇인지를 확실하게 써두어야 한다.
아니면 이렇게 대화내용 자체로 전달하면 나진상, 65 로만 입력해도 문맥속에서 이름과 나이에 대한 정보임을 알고 잘 대화할 수 있다.
노화에 따른 당연한 현상이기도 하고, 간혹 참전용사분들 중에 청력문제를 호소하는 경우도 많으니 목소리가 큰 것을 너무 나쁘게 생각하지는 말도록 하자.. 또한 지금처럼 다양한 형태의 가족이 존재하는 사회에서는 나이만 보고 임의로 아버님 어머님 하면 안되는 것도 맞다
나중에 fastapi랑 uvicorn이랑 쓰면 웹페이지에서 구현가능
'머신러닝' 카테고리의 다른 글
style transfer model-2 (0) | 2024.11.06 |
---|---|
style transfer model (0) | 2024.11.05 |
Sentiment Analysis with LSTM (2) | 2024.11.01 |
sentence generator with GPT-2 (0) | 2024.10.31 |
skin cancer HAM10000(2) (0) | 2024.10.30 |