Generative AI/Prompt Engineering

OpenAI GPT 출력 형식 설정으로 JSON 파싱과 프롬프트 엔지니어링 #2

eco7T 2025. 4. 25. 10:42
반응형

이번 글에서는 지난번에 시작했던, 프롬프트 엔지니어링을 이용해서 GPT에게 원하는 답을 얻는 방법 중 GPT에게 명확하게 구체적으로 잘 묻는 방법에 이어서 GPT의 응답을 명확하게 하도록 요구하는 방법에 대해 이야기해 보겠습니다.

반응형

 

OpenAI GPT 출력 형식 설정으로 JSON 파싱과 프롬프트 엔지니어링

  GPT에게 잘 묻는 방법

지난 글에서는 구분자를 이용해서 지시/요청/질문하는 형식을 말했어요. 오늘은 GPT에게 지시(instruction) 하기 위해 프롬프트를 작성할 때, 응답형식을 정의하는 방법에 대해 이야기해 볼게요. [일단 지난 글과 비슷하게 get_completion 함수를 다음과 같이 구성했고요.

def get_completion(prompt):
    response = openai.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": prompt}],
        temperature=0
    )
    return response.choices[0].message.content

 

프롬프트는 다음과 같이 GPT의 completion 형식을 JSON으로 요구하는 구성을 해 보죠.

prompt = f"""
3개의 가상 영화 제목과 감독, 장르를 목록으로 생성하세요.
JSON 형식으로 제공하되, 다음 키를 포함해야 합니다:
movie_id, title, director, genre.
"""
response = get_completion(prompt)
print(response)

 

 

위 코드를 실행하면 다음과 같이 GPT가 응답(completion)합니다.

JSON 파싱과 프롬프트 엔지니어링-01
JSON 파싱과 프롬프트 엔지니어링-01

 

응답을 보면, 일단 '내가 지시한대로 응답을 잘했구나!' 생각할 수 있습니다.

하지만, JSON 형식으로 요청한 목적이 뭔가 코드를 추가해서 다른 작업과 연계하려는 목적이었다면 JSON 형식을 Python 타입으로 변경해야 할 거예요. 물론, 응답 내용 Type은 json의 문자열(str)입니다만, python type으로 변환이 쉬워야 작업이 간단할 텐데, 위와 같은 응답 형식에서는 변환을 위해 여러 줄의 코드가 추가되어야만 할 거예요. JSON과 관련된 문자열을 제거하고 JSON의 시작 부분을 찾아야 할 테니까요.

 

 

그러면 추가 작업을 편리하게 하기 위해서는 어떻게 할 수 있을까요? 가장 간단한 것은 프롬프트에서 불필요한 응답을 제거하도록 하는 것일 거예요. 다음과 같이요.

prompt = f"""
3개의 가상 영화 제목과 감독, 장르를 목록으로 생성하세요.
JSON 형식으로 제공하되, 설명 없이, JSON 배열만 응답하세요. 마크다운 없이.
JSON 형식에는 다음 키를 포함해야 합니다:
movie_id, title, director, genre.
"""

위와 같이 프롬프트 내 "설명 없이, JSON 배열만 응답하세요. 마크다운 없이."를 추가하는 거예요. 물론, input token 수는 증가하겠죠. 그런데, 아래 출력 내용에서 보이듯 output token 수가 감소할 수 있다면 실제 token 수 증가는 없다고 볼 수 있겠죠. 사실 좀 더 세밀하게 생각해 보면 openai api의 경우, input 보다 output token 비용이 더 크므로 위와 같은 경우는 오히려 비용이 감소할 수도 있겠죠.

JSON 파싱과 프롬프트 엔지니어링-02
JSON 파싱과 프롬프트 엔지니어링-02

 

물론, 위의 출력도 아직은 type은 문자열(str)이에요. 그럼에도 앞뒤로 어떤 내용도 없으므로 python 형식으로 바로 변경이 가능해요. 다음과 같이 말이죠.

import json
movie_list = json.loads(response)

 

간단하죠? 앞에서 이미 봤던 json의 형태가 리스트 모양이므로, python type은 리스트가 되겠죠. 

 

 

자, 그러면 python 리스트 구조를 생각하면서 위에서 json 출력 내용 중 "사라진 기억"을 출력하려면 어떻게 해야 할까요?

movie_list[1]['title']
# 출력: '사라진 기억'

movie_list[0]
# 출력: {'movie_id': 1, 'title': '시간의 경계', 'director': '김지훈', 'genre': 'SF'}

 

위와 같이 파이썬의 리스트로 간편하게 다룰 수 있어요.

 


 

2025.04.22 - [Generative AI/Prompt Engineering] - 프롬프트 엔지니어링으로 챗GPT와 OpenAI API 활용 - GPT에게 원하는 답을 얻는 법 #1

 

프롬프트 엔지니어링으로 챗GPT와 OpenAI API 활용 - GPT에게 원하는 답을 얻는 법 #1

이번 글부터는 최근 이슈가 되고 있는 생성형 AI와 관련한 기술에 대해 시작해 보겠습니다. 그중 오늘부터 몇 회에 걸쳐 프롬프트 엔지니어링에 살펴보겠습니다. 물론, 가장 많이 사용되는 OpenAI

eco7t.tistory.com

 

반응형