상세 컨텐츠

본문 제목

Openai api의 chat completions의 Request body의 예제

카테고리 없음

by citykim 2023. 3. 29. 18:15

본문

Openai api🔍

 

 

Request body

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

 

OpenAI API

An API for accessing new AI models developed by OpenAI

platform.openai.com

 

 

 


model

모델의 리스트는 다음을 참고하면된다

https://platform.openai.com/docs/models/overview

 

OpenAI API

An API for accessing new AI models developed by OpenAI

platform.openai.com

간단한 내용이라면 text-davinci-003 모델을 사용해도되고 가격도 저렴하다
하지만 낮은버전의 모델은 chat을 지원하지 않기 때문에 이 포스팅에서는 gpt-3.5만 다루고있다
gpt-4.0은 별도로 신청하고 대기해야되므로 역시 다루지않았다

 

 

 

 

 

 


messages

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

 

ChatGPT API Transition Guide | OpenAI Help Center

How to get started

help.openai.com

 

 

개인적인 의견으로는 Fine-tuning은 파이썬에서만 지원하는데 system을 활용하면 어느정도 해소를 할 수도 있지 않을까 생각한다

하지만 openai와 대다수 서비스를 구성한 개발자들은 assistant가 항상 system 메시지를 고려하지는 않는다는 의견이다
https://platform.openai.com/docs/guides/fine-tuning/fine-tuning

 

OpenAI API

An API for accessing new AI models developed by OpenAI

platform.openai.com

 

 

playground에서 체험할 수 있는데 다음과같은 예제이다 (temperature를 0으로 제한하였다)

 

 

system에 내용대로 학습에 중점을 둔 반면

활용할 수 있는 내용이나 비교군을 가져와서 대답하는 것을 확인할 수 있다

 

 

 

 

 


temperature

샘플링에대한 값이다 0부터 1까지 소숫점자리로 조정할 수 있고 1에 가까울수록 대답의 무작위성이 증가한다

Stable diffusion을 써봤다면 쉽게 감을 잡을 수 있을 것이다

잘 모르겠거나 안 써봤다면 다음 예제로 확인해보자

temperature = 1

 

temperature = 0

확연하게 대화내용이 차이가 있는 것을 볼 수 있다

만약 GPT로 학습을 시킨뒤 챗봇을 구현한다면 temperature 값을 매우낮춰 다른 대답을 하는 것을 방지할 수 있을 것이다

 

 

 

 

 

 


 

top_p

top_p는 temperature와 연관이 깊은데 언어모델은 답변을 토큰으로 생성한다

이때 샘플링이라는 과정을 거치는데 한가지 질문을 하였고 언어모델이 한가지 답변을 한 것으로 보이지만 실제로는 샘플링이라는 과정을 거치기 때문에 n개의 답변에 대한 샘플링을 한뒤 주어진 결과값을 반환하는 것이다

top_p는 이 과정에서 주어진 숫자로 상위 몇%의 답변을 할지 정하도록 유도하는 것 이다

예제로 확인해보자

top_p = 0

 

top_p = 0.5

 

top_p = 1

 

 

 

 

 


n

답변을 몇개 받을지 정하는것이다

{"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로 한다면 위와같이 전달받을 수 있다

 

 

 

 

 


stream

위 예제에서는 request를 보내고 시간이 지나면 response를 한번에 받을 수 있는데, stream을 true로 하면 chatGPT처럼 문장을 끊어서 수신받을 수 있다

하지만 아직 openai 패키지에서 정식 지원을 안하기 때문에 직접 stream을 받고 소켓통신등으로 구현해야된다
https://github.com/openai/openai-node/issues/18

 

How to use stream: true? · Issue #18 · openai/openai-node

I'm a bit lost as to how to actually use stream: true in this library. Example incorrect syntax: const res = await openai.createCompletion({ model: "text-davinci-002", prompt: "Say this is a test",...

github.com

 

 

 

 

 


stop

stop은 특정 상황을 string으로 전달하여 해당 상황에 답변을 멈추도록 하는 기능이다

string 또는 array<string>으로 전달할 수 있는데 complate의 stop sequences를 3으로 넣었을때 예제이다

3은 없다

 

이번에는 예제를 무료로 넣어보자

6번에서 멈춤

 

 

활용 가이드 링크는 다음과같다

https://help.openai.com/en/articles/5072263-how-do-i-use-stop-sequences

 

How do I use Stop Sequences? | OpenAI Help Center

 

help.openai.com

 

 

 

 

 


max_tokens

토큰은 단어조각으로 생각할 수 있는데 언어모델에 프롬프트를 입력할때, 반환할때 사용되는 값이다

https://platform.openai.com/tokenizer

 

OpenAI API

An API for accessing new AI models developed by OpenAI

platform.openai.com

예상되는 토큰은 토크나이저로 확인할 수 있고

 

토큰은 받는 것만 측정하는 것이 아닌 공유하는 개념이기 때문에
1025로 제한했을때 발송에 500토큰을 사용하면 525토큰으로 반환받는 형식이다
https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them

 

What are tokens and how to count them? | OpenAI Help Center

 

help.openai.com

 

 

 

 

 


presence_penalty

모델이 새로운 값을 반환할 확률을 정의한다

-2.0 ~ 2.0까지 값이 있는데 예제로 확인해보자

Temperature = 1, Top P = 1, Presence penalty = 2로 설정하였다

이악물고 말 만들어냄

 

 

 

 

 


frequency_penalty

이번에는 반대로 모델이 똑같은 대답을 반환할 확률을 높인다

-2.0 ~ 2.0까지 값이 있는데 예제로 확인해보자

Temperature = 1, Top P = 1, Frequency penalty = 2로 설정하였다

당연한 결과

 

1.0으로 맞추고 반복적인 질문을 던진다면

맥락은 비슷하다

앞서 Temperature의 예제와는 다르게 새로운 정보는 크게 주지않는 한도내에서 비슷한 답변을 반복하는 것을 확인할 수 있다

 

 

 

 

 


logit_bias

logit_bias는 특정 토큰 아이디를 -100 ~ 100으로 부여할 수 있는데 그러면 항상 답변에 해당 토큰이 항상 포함되거나 제거되도록 할 수 있다

logit_bias: {
  37495: -100, // javascript의 토큰아이디
  29412: 100, // python의 토큰아이디
}

하지만 아직 제대로 활용하기는 힘들 것 같다

 

너무 괴롭힌듯

위는 -1, 1의 값을 줬는데 javascript가 빠지지 않아서 아래는 -50, 50의 값을 줬다

미쳐날뛰었다🙄

 

 

 

 

 


user

user는 user_id를 부여하여 openai api가 남용 또는 정책위반을 감지하였을때 알려주는 용도로 사용된다
api를 사용함으로써 보안을 강화한다고 생각하면 된다 그에따른 내용은 아래와같다
https://platform.openai.com/docs/guides/safety-best-practices/end-user-ids

 

OpenAI API

An API for accessing new AI models developed by OpenAI

platform.openai.com

 

 

댓글 영역