본문 바로가기
LLM

OpenAI Key를 활용한 Chat Completions 호출

by hyeeein 2024. 8. 8.

먼저, OpenAI에서 Key를 발급받아서 호출한다. (~~에 자신의 키를 입력한다)

%env OPENAI_API_KEY=~~

 

Chat Complietions (대화, 채팅모델)

  • 텍스트와 이미지를 입력으로 받아 텍스트로 결과를 도출
  • 각 메시지는 메시지 객체. 각 객체는 system, user, assistant의 role을 가지고 content가 있음
  • 일반적인 포맷
    1. 대화는 먼저 system 메시지로 포맷 후, user와 assistant 메시지를 번갈아 표시 (주로 user는 사용자 입력, assistant는 사용자 입력에 대한 openai의 출력)
    2. system 메시지 : 전체 대화에서 openai의 응답 설정에 도움을 주는 것. 예를 들어, 너는 훌륭한 어시스턴트야user 메시지 : 사용자의 질문이나 설명assistant 메시지: 이전 assistant 메시지를 저장하지만, 사용자가 원하는 동작의 예시를 제공하기 위해 작성 가능
    3. openai로 요청을 보낼 때 대화 기록 포함이 굉장히 중요

 

import os
import wandb
from openai import OpenAI

# client는 OpenAI 모듈로 생성된 인스턴스
client = OpenAI()

# 사용자가 원하는 동작의 예시를 제공하기 위해 작성
gpt_assistant_prompt = input ("프롬프트 설정해 주세요:")

# 사용자의 질문이나 설명
gpt_user_prompt = input ("질문을 해주세요:")

# 프롬프트 결합
gpt_prompt = gpt_assistant_prompt, gpt_user_prompt
print(gpt_prompt)

message=[{"role": "user", "content": gpt_assistant_prompt},
         {"role": "user", "content": gpt_user_prompt}]
temperature=0.2
max_tokens=1024
frequency_penalty=0.0

response = client.chat.completions.create(
    model="gpt-4-1106-preview", #4.0-Turbo
    messages = message,
    temperature=temperature,
    max_tokens=max_tokens,
    frequency_penalty=frequency_penalty,
)

 

response 안에 있는 파라미터들에 대한 설명은 다음과 같다.

  • messages : 지금까지의 대화를 구성하는 메시지 목록
  • model: 사용할 모델 ID
  • frequency_penalty : 동일한 단어의 빈도, -2.0에서 2.0 사이의 숫자. 양수 값은 지금까지 텍스트에 나타난 기존 빈도에 따라 새로운 토큰에 불이익을 주어 모델이 같은 줄을 그대로 반복할 가능성을 낮춤.
  • max_tokens : 생성할 수 있는 최대 토큰 수 (입력된 토큰과 생성된 토큰의 총 길이는 모델의 컨텍스트 길이에 의해 제한)
  • temperature : 응답의 다양성, 0에서 2 사이에서 사용할 샘플링 온도. 높으면 출력이 무작위, 더 다양하고 / 낮으면 더 집중적이고 결정론적임
  • presence_penalty : -2.0에서 2.0 사이의 숫자. 양수면 지금까지 텍스트에 나타났는지 여부에 따라 새 토큰에 패널티를 부여하여 모델이 새 주제에 대해 이야기 하도록 함
  • 이외의 파라미터들은 OpenAI 가이드 2번째 링크 참고

 

최종적으로 response 응답 예시를 살펴본다.

'''
response 전체 응답 예시

ChatCompletion(id='chatcmpl-9nlJZOECtRDK6qJLd2UV2gd0cPCOh', choices=[Choice(finish_reason='stop', index=0, 
logprobs=None, message=ChatCompletionMessage(content='"펑션 콜(Function Call)"이란 프로그래밍에서 함수를 실행하도록 
명령하는 것을 말합니다. 함수는 특정 작업을 수행하는 코드의 묶음으로, 프로그램 내에서 한 번 정의되면 여러 번 호출되어 사용될
수 있습니다.\n\n함수를 호출할 때는 함수의 이름과 함께 괄호를 사용하며, 필요에 따라 괄호 안에 인자(파라미터)를 전달할 수 있
습니다. 인자는 함수가 작업을 수행하는 데 필요한 데이터나 값을 제공합니다.\n\n예를 들어, 프로그래밍 언어인 파이썬(Python)에
서 함수를 호출하는 방법은 다음과 같습니다:\n\n```python\ndef greet(name):\n    print("Hello, " + name + "!")\n\ngreet
("Alice")  # 이 부분이 함수 호출입니다.\n```\n\n위 예제에서 `greet` 함수는 `name`이라는 인자를 받아 "Hello, Alice!"라는 
메시지를 출력합니다. `greet("Alice")` 부분이 바로 함수 호출이며, 이 때 "Alice"라는 인자가 `greet` 함수에 전달됩니다.\n\n함
수 호출은 프로그램의 흐름을 조직하고, 코드의 재사용성을 높이며, 복잡성을 관리하는 데 중요한 역할을 합니다.', role='assistant', 
function_call=None, tool_calls=None))], created=1721646977, model='gpt-4-1106-preview', object='chat.completion', 
service_tier=None, system_fingerprint=None, usage=CompletionUsage(completion_tokens=369, prompt_tokens=27, total_tokens=396))
'''

# print(response)
print(response.choices[0].message.content)


'''
print 결과

"RAG"와 "펑션콜(Function Call)"은 컴퓨터 프로그래밍과 관련된 용어입니다. 하지만 "RAG"는 일반적인 프로그래밍 
용어가 아니며, 특정한 맥락이나 약어에 따라 다른 의미를 가질 수 있습니다. 여기서는 "펑션콜"에 대해 먼저 설명하
고, "RAG"가 일반적인 프로그래밍 용어가 아닌 경우에 대해 설명하겠습니다.

펑션콜(Function Call):
프로그래밍에서 함수(function)는 특정 작업을 수행하는 코드의 묶음입니다. 함수를 호출(function call)한다는 것
은 그 함수에 정의된 작업을 실행하라는 명령을 의미합니다. 함수는 입력값(인자 또는 파라미터)을 받아서 처리하고, 
결과값을 반환할 수 있습니다.

예를 들어, Python에서 간단한 함수 호출을 살펴보겠습니다:

```python
# 함수 정의
def greet(name):
    return "Hello, " + name + "!"

# 함수 호출
message = greet("Alice")
print(message)  # 출력: Hello, Alice!
```

위 예제에서 `greet` 함수는 `name`이라는 파라미터를 받아서 인사말을 만들고 반환합니다. `greet("Alice")`는 
`greet` 함수를 "Alice"라는 인자로 호출하는 것이며, 반환된 문자열을 `message` 변수에 저장한 후 출력합니다.

RAG:
"RAG"는 프로그래밍에서 널리 알려진 약어가 아닙니다. 그러나 다양한 분야에서 다른 의미를 가질 수 있습니다. 예를 
들어, "RAG"는 "Red Amber Green"의 약어로 사용되어 프로젝트 상태를 나타내는 데 사용될 수 있습니다. 또는 특정 
기술, 라이브러리, 프레임워크에서 특별한 의미를 가질 수 있습니다. 프로그래밍 맥락에서 "RAG"의 정확한 의미를 알
기 위해서는 추가적인 맥락이나 설명이 필요합니다.

만약 "RAG"가 특정 프로그래밍 기술이나 도메인에서 사용되는 용어라면, 그 분야에 대한 구체적인 설명이 필요할 것
입니다.
'''

 

'LLM' 카테고리의 다른 글

OpenAI Key를 활용한 STT, TTS 호출  (0) 2024.08.08