reqeust body에는 각각 다음과같은 항목이 포함될 수 있다
model: 'gpt-3.5-turbo', // 사용할 모델
messages: messages, // 사용될 메시지
temperature: 1, // 샘플링값
top_p: 1, // 샘플링시 상위값을 가져올 확률
n: 1, // 답변을 몇개 가져올지
stream: false, // 스트림형식으로 response를 전달할지 여부
stop: undefined, // api가 답변을 중지할 시점 string 또는 배열
max_tokens: 300, // 토큰 최대량
presence_penalty: 0, // 모델이 기존 텍스트를 참고하여 새로운 대답을 하는 빈도수
frequency_penalty: 0, // 모델이 기존 텍스트를 참고하여 똑같은 대답을 하는 빈도수
logit_bias: null, // 모델이 특정 토큰을 답변에 포함할지 말지 여부 객체로 전달된다
user: undefined, // api 요청시 사용자 아이디
각 항목에 대해서는 직접 post해보거나 playground에서 체험해볼 수 있다
https://platform.openai.com/playground?mode=chat
모델의 리스트는 다음을 참고하면된다
https://platform.openai.com/docs/models/overview
간단한 내용이라면 text-davinci-003 모델을 사용해도되고 가격도 저렴하다
하지만 낮은버전의 모델은 chat을 지원하지 않기 때문에 이 포스팅에서는 gpt-3.5만 다루고있다
gpt-4.0은 별도로 신청하고 대기해야되므로 역시 다루지않았다
openai api에게 message를 전달할때 role이라는 항목이 있는데 다음과같다
user : 언어모델 사용대상자, 즉 질문하는 우리들
assistant : 언어모델의 response.content, ChatGPT를 사용했을때 언어모델의 대답 결과물
system : 언어모델에 좀 더 상세한 명령을 내리는 용도
user와 assistant는 request, response이고, system은 parameter 정도라고 생각하면 쉽게 이해할 수 있다
즉 chat을 보낼때 system에 명령을 같이 전달하면 대답을 참고해서 해주는 용도이다
https://help.openai.com/en/articles/7042661-chatgpt-api-transition-guide
개인적인 의견으로는 Fine-tuning은 파이썬에서만 지원하는데 system을 활용하면 어느정도 해소를 할 수도 있지 않을까 생각한다
하지만 openai와 대다수 서비스를 구성한 개발자들은 assistant가 항상 system 메시지를 고려하지는 않는다는 의견이다
https://platform.openai.com/docs/guides/fine-tuning/fine-tuning
playground에서 체험할 수 있는데 다음과같은 예제이다 (temperature를 0으로 제한하였다)
system에 내용대로 학습에 중점을 둔 반면
활용할 수 있는 내용이나 비교군을 가져와서 대답하는 것을 확인할 수 있다
샘플링에대한 값이다 0부터 1까지 소숫점자리로 조정할 수 있고 1에 가까울수록 대답의 무작위성이 증가한다
Stable diffusion을 써봤다면 쉽게 감을 잡을 수 있을 것이다
잘 모르겠거나 안 써봤다면 다음 예제로 확인해보자
확연하게 대화내용이 차이가 있는 것을 볼 수 있다
만약 GPT로 학습을 시킨뒤 챗봇을 구현한다면 temperature 값을 매우낮춰 다른 대답을 하는 것을 방지할 수 있을 것이다
top_p는 temperature와 연관이 깊은데 언어모델은 답변을 토큰으로 생성한다
이때 샘플링이라는 과정을 거치는데 한가지 질문을 하였고 언어모델이 한가지 답변을 한 것으로 보이지만 실제로는 샘플링이라는 과정을 거치기 때문에 n개의 답변에 대한 샘플링을 한뒤 주어진 결과값을 반환하는 것이다
top_p는 이 과정에서 주어진 숫자로 상위 몇%의 답변을 할지 정하도록 유도하는 것 이다
예제로 확인해보자
답변을 몇개 받을지 정하는것이다
{"message":{"role":"assistant","content":"안녕하세요! 무엇을 도와드릴까요?"},"finish_reason":"stop","index":0},
{"message":{"role":"assistant","content":"안녕하세요! 저는 AI 어시스턴트입니다. 무엇을 도와드릴까요?"},"finish_reason":"stop","index":1},
{"message":{"role":"assistant","content":"안녕하세요! 저는 AI 어시스턴트입니다. 무엇을 도와드릴까요? :)"},"finish_reason":"stop","index":2},
{"message":{"role":"assistant","content":"안녕하세요! 저는 OpenAI의 인공지능 어시스턴트입니다. 무엇을 도와드릴까요?"},"finish_reason":"stop","index":3},
{"message":{"role":"assistant","content":"안녕하세요! 저는 인공지능 챗봇 입니다. 무엇을 도와드릴까요? :)"},"finish_reason":"stop","index":4}
n을 5로 한다면 위와같이 전달받을 수 있다
위 예제에서는 request를 보내고 시간이 지나면 response를 한번에 받을 수 있는데, stream을 true로 하면 chatGPT처럼 문장을 끊어서 수신받을 수 있다
하지만 아직 openai 패키지에서 정식 지원을 안하기 때문에 직접 stream을 받고 소켓통신등으로 구현해야된다
https://github.com/openai/openai-node/issues/18
stop은 특정 상황을 string으로 전달하여 해당 상황에 답변을 멈추도록 하는 기능이다
string 또는 array<string>으로 전달할 수 있는데 complate의 stop sequences를 3으로 넣었을때 예제이다
이번에는 예제를 무료로 넣어보자
활용 가이드 링크는 다음과같다
https://help.openai.com/en/articles/5072263-how-do-i-use-stop-sequences
토큰은 단어조각으로 생각할 수 있는데 언어모델에 프롬프트를 입력할때, 반환할때 사용되는 값이다
https://platform.openai.com/tokenizer
예상되는 토큰은 토크나이저로 확인할 수 있고
토큰은 받는 것만 측정하는 것이 아닌 공유하는 개념이기 때문에
1025로 제한했을때 발송에 500토큰을 사용하면 525토큰으로 반환받는 형식이다
https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them
모델이 새로운 값을 반환할 확률을 정의한다
-2.0 ~ 2.0까지 값이 있는데 예제로 확인해보자
Temperature = 1, Top P = 1, Presence penalty = 2로 설정하였다
이번에는 반대로 모델이 똑같은 대답을 반환할 확률을 높인다
-2.0 ~ 2.0까지 값이 있는데 예제로 확인해보자
Temperature = 1, Top P = 1, Frequency penalty = 2로 설정하였다
1.0으로 맞추고 반복적인 질문을 던진다면
앞서 Temperature의 예제와는 다르게 새로운 정보는 크게 주지않는 한도내에서 비슷한 답변을 반복하는 것을 확인할 수 있다
logit_bias는 특정 토큰 아이디를 -100 ~ 100으로 부여할 수 있는데 그러면 항상 답변에 해당 토큰이 항상 포함되거나 제거되도록 할 수 있다
logit_bias: {
37495: -100, // javascript의 토큰아이디
29412: 100, // python의 토큰아이디
}
하지만 아직 제대로 활용하기는 힘들 것 같다
위는 -1, 1의 값을 줬는데 javascript가 빠지지 않아서 아래는 -50, 50의 값을 줬다
미쳐날뛰었다🙄
user는 user_id를 부여하여 openai api가 남용 또는 정책위반을 감지하였을때 알려주는 용도로 사용된다
api를 사용함으로써 보안을 강화한다고 생각하면 된다 그에따른 내용은 아래와같다
https://platform.openai.com/docs/guides/safety-best-practices/end-user-ids
댓글 영역