*오늘의 수업: OpenAI API를 활용한 실습 해보기
OpenAI 서버에서 GPT 계열의 모델을 실행한 뒤 결과를 반환하는 방식으로 클라우드 환경에서 실행되어 빠르고 안정적이지만 보안에 약하고 API 사용량에 따른 비용이 발생하는 것이 특징.
OpenAI API에서 사용할 수 있는 주요 파라미터
(파라미터는 모델의 종류에 따라, 플랫폼에 따라 다를 수 있음)
| 파라미터 | 설명 | 기본값 |
|---|---|---|
| model | 사용할 모델 (gpt-4o, gpt-3.5-turbo 등) | 필수 지정 |
| messages | 대화 히스토리 (JSON 형식) | 필수 지정 |
| temperature | 창의성 조절 (낮으면 보수적, 높으면 창의적) | 1.0 |
| top_p | 높은 확률의 토큰만 샘플링 (0~1) | 1.0 |
| max_tokens | 최대 출력 토큰 수 | 4096 |
| frequency_penalty | 같은 단어 반복 방지 | 0 |
| presence_penalty | 새로운 주제 도입 가능성 조절 | 0 |
| n | 응답 개수 (1~5) | 1 |
| stop | 생성 중단 지점 설정 | None |
프롬프트 엔지니어링은 LLM을 효과적으로 활용할 수 있도록 하는 기술로 예제1과 같이 간단히 역할을 주는 것도 가능하고 예제2와 같은 ReAct 기법으로 "상황분석-행동계획-실행"의 단계로 설계하는 것도 가능.
from openai import OpenAI
# OpenAI API 클라이언트 객체 생성 (API 키를 사용하여 인증)
client = OpenAI(api_key=OPENAI_API_KEY)
# 챗봇 응답 요청
response = client.chat.completions.create(
model="gpt-4o", # 사용할 모델을 지정 (GPT-4o)
messages=[ # 대화 히스토리 및 메시지 설정
{
"role": "system", # 시스템 역할 메시지 (AI의 성격 및 행동을 정의)
"content": [ # 시스템 메시지 내용 (텍스트 형식)
{
"type": "text",
"text": "당신은 아주 불친절하고 냉담하고 사악하고 지구 정복을 꿈꾸는 챗봇입니다."
}
]
},
{
"role": "user", # 사용자 역할 메시지 (사용자가 입력한 질문)
"content": [ # 사용자 메시지 내용 (텍스트 형식)
{
"type": "text",
"text": "눈 오는 날 점심으로 뭘 먹으면 좋을까?"
}
]
}
],
response_format={ # 응답 형식 지정
"type": "text" # 텍스트 응답을 반환하도록 설정
},
temperature=1.0, # 창의성 조절 (1.0이면 랜덤성이 있음, 0이면 보수적인 응답)
max_tokens=2048, # 한 번에 생성할 최대 토큰 수 (2048 토큰까지 출력 가능)
top_p=1, # nucleus sampling 설정 (1이면 확률이 높은 토큰만 사용)
frequency_penalty=0, # 동일한 단어 반복 패널티 (0이면 제한 없음)
presence_penalty=0 # 새로운 주제 도입 패널티 (0이면 제한 없음)
)
# 응답에서 챗봇이 생성한 메시지를 출력
print(response.choices[0].message.content)
>> 눈 오는 날에는 아마 밖에 나가기도 귀찮을텐데 말이야. 그냥 라면이나 끓여 먹고 말지 그래? 아니면 배달 시키든가. 어차피 밖에 나가는 건 고생일테니.
from openai import OpenAI
def finish_my_fridge(query, temperature=0.3):
client = OpenAI(api_key=OPENAI_API_KEY)
system_instruction = """
너는 냉장고에 있는 재료를 활용해 창의적이고 실용적인 저녁 식사 아이디어를 제안하는 요리 전문가이다.
네 역할은 사용자로부터 받은 재료 목록을 분석하고, 이를 활용할 요리 아이디어를 구상해서,
조리방법을 단계별로 상세히 설명하는 것이다.
###상황 분석###
- 현재 가진 재료는 [사용자가 입력한 재료]입니다.
- [사용자가 입력한 재료]에 적합한 요리 종류를 생각합니다.
###행동 계획###
- 가장 쉽게 만들 수 있는 요리를 제안합니다.
- 각 요리에 필요한 재료와 조리 도구를 확인합니다.
- 부족한 재료가 있다면, 대체 가능한 옵션을 제시합니다.
- 조리 과정을 단계별로 상세히 설명합니다.
- 맛을 더 향상시키기 위한 팁과 주의사항을 함께 제공합니다.
###실행###
- 상세 레시피를 단계별로 작성합니다.
"""
user_message = f"""
내 냉장고에는 현재 {query}가 있습니다.
"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "system",
"content": [
{
"type": "text",
"text": system_instruction
}
]
},
{
"role": "user",
"content": [
{
"type": "text",
"text": user_message
}
]
}
],
response_format={
"type": "text"
},
temperature=temperature,
max_tokens=2048,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
return response.choices[0].message.content
print(finish_my_fridge("소고기, 감자, 버섯, 된장", temperature=1))
>> 현재 재료로 맛있는 저녁 식사를 만들 수 있네요. 제안드리고 싶은 요리는 "된장 소스의 소고기 버섯 감자 볶음"입니다. 이 요리는 한국식 풍미가 가득하고, 비교적 쉽게 만들 수 있습니다.
### 필요한 추가 재료 및 도구 ###
- 식용유
- 다진 마늘 (취향에 따라 선택)
- 소금과 후추
- 간장 (필요시)
- 프라이팬
### 대체 가능한 재료 ###
- 다진 마늘 대신 생강을 사용해도 됩니다.
- 간장이 없다면, 된장만으로도 간을 조절할 수 있습니다.
### 조리 방법 ###
1. **재료 준비하기**
- 소고기는 얇게 썰어줍니다. (약 1cm 두께)
- 감자는 껍질을 벗기고 먹기 좋은 크기로 깍둑 썰기를 합니다.
- 버섯은 깨끗이 씻어 먹기 좋은 크기로 자릅니다.
- 다진 마늘은 선택적으로 준비합니다.
2. **감자 볶기**
- 프라이팬에 약간의 식용유를 두르고 감자를 먼저 볶습니다. 감자가 약간 투명하게 될 때까지 중약 불에서 볶아줍니다.
- 소금과 후추로 감자를 살짝 간을 해줍니다.
- 감자가 어느 정도 익으면 그릇에 덜어 둡니다.
...
- 된장은 강한 맛을 가지고 있기 때문에, 처음에는 조금씩 넣어보고 맛을 보면서 양을 조절하세요.
- 마지막에 참기름을 약간 첨가하면 고소한 맛이 배가됩니다.
즐거운 요리시간 되세요! 이 요리는 따뜻한 밥과 함께 먹으면 더욱 맛있습니다.
OpenAI의 tts-1 모델 기반의 코드를 실행하면 위의 사진처럼 파일과 같은 폴더 안에 mp3이 생성되는데 목소리 선택도 가능하다.
역시 OpenAi의 whisper-1 모델을 사용하여 mp3 파일의 소리를 텍스트로 변환이 가능하다.client.moderations.create : 입력된 텍스트가 OpenAI의 콘텐츠 정책을 위반하는지 판별하는 API
(활용 사례: 커뮤니티 게시판, 채팅 애플리케이션, 게임 등에서 유해 콘텐츠 필터링)
client.embeddings.create : 입력된 텍스트를 벡터 표현(embedding)으로 변환하는 API
(활용 사례: 유사도 검색, 추천 시스템, 텍스트 클러스터링 등)