본문 바로가기
데이터&AI/LLM

Openai 패키지에서 원하는 결과를 output으로 받기(Structured outputs)

by 일등박사 2024. 11. 4.
728x90

 

GPT API를 활용하여 텍스트 생성은 이제 기본중에 기본인데요!!,

이에 더해서 작업에서 필요한 정보만 명확하게 뽑아내고 싶을떄가있습니다!!

예를 들면!!

뉴스기사에서 중요성이 얼만큼인지, 긍정 부정이 얼만큼인지, 주요 키워드가 뭔지가 궁금할떄!!

기존 방식은 아래와 같이 프롬포트에 결과물 양식을 알려주고 그 결과를 받아 사용했었습니다!

 

from openai import OpenAI

client = OpenAI()

completion = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "뉴스에서 주요 정보를 추출해워"},
        {"role": "user", "content": """뉴스제목 : 1억 바라보던 '비트코인' 9600만 원대로 하락... 남은 이틀이 관건?
         위 뉴스에서 아래와 같이 결과를 추출해줘
         {'중요도' : '중요도점수', '긍부정': '긍정 혹은 부정', '주요키워드' : '뉴스의 주요 키워드 최대 3개' }
         """},
    ]
)

completion.choices[0].message.content

 

그런데!! 이를 확실하게!!

필요하는 양식으로만 추출하는 방법이 있었으니!!! 

바로 openai 에서 제공하는

Structured outputs

기능입니다!!

묻고 따지지 않고 먼저 위의 예시를 새로운 기능으로 진행해봅시다!!

from pydantic import BaseModel
from openai import OpenAI

client = OpenAI()

class news(BaseModel):
    importance : int
    positiveness : str
    keywords: list[str]

completion = client.beta.chat.completions.parse(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "뉴스에서 주요 정보를 추출해워"},
        {"role": "user", "content": """뉴스제목 : 1억 바라보던 '비트코인' 9600만 원대로 하락... 남은 이틀이 관건?
         """},
    ],
    response_format=news,
)

event = completion.choices[0].message.parsed
event

 

그럼!! 뿌듯하게도!!

 

객채로서 필요한 정보를 잘 뽑아줍니다!!

그래서!! 각각의 정보를 손쉽게 뽑을수 있지요~~

 

 

또다른 간단한 예시로 아래와 같이!!  판매정보를 추출해볼수 있습니다!!

from pydantic import BaseModel
from openai import OpenAI

client = OpenAI()

class Selling(BaseModel):
    customer_name: str
    date: str
    buying_items: list[str]

completion = client.beta.chat.completions.parse(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "판매 정보를 추출해주세요"},
        {"role": "user", "content": "일등박사는 24년 11월 4일 우유와 옥수수 그리고 모니터를 구매했습니다"},
    ],
    response_format=Selling,
)

event = completion.choices[0].message.parsed
event

 

이 기능을 활용해 CoT를 더욱 강화할수 있는데요!!

수학 문제를 푼다고헀을떄!!

class Step(BaseModel):
    explanation: str
    output: str

class MathReasoning(BaseModel):
    steps: list[Step]
    final_answer: str

completion = client.beta.chat.completions.parse(
    model="gpt-4o-2024-08-06",
    messages=[
        {"role": "system", "content": "너는 친절한 수학 선생님이야. 문제 푸는법을 단계단계 한국어로 알려줘"},
        {"role": "user", "content": "8x + 7 = -23의 해결법 알고싶어"}
    ],
    response_format=MathReasoning,
)

math_reasoning = completion.choices[0].message

# If the model refuses to respond, you will get a refusal message
if (math_reasoning.refusal):
    print(math_reasoning.refusal)
else:
    print(math_reasoning.parsed)

 

요렇게 해서!! MathReasoning 내에 Step이란 객채를 두고 실행해보면!!

단계별로의 계산 방식과 최종 결과를 구조적인 데이터로 받을 수 있습니다!!

 

 

이 결과물 객체에 제공되는 Supported types은 아래와 같습니다!!

  • String
  • Number
  • Boolean
  • Integer
  • Object
  • Array
  • Enum
  • anyOf

이에 단순 텍스트, 숫자, 리스트외에도 활용해볼 수 있겠지요!?

 

결론적으로!! 
openai 패키지를 활용, structred date를 추출하기 위해선

아래 3가지 차이점이있습니다!!

1. BaseModel 패키지 import!!

2. 추출하고자하는 형식을 Object식으로 선언!

3. beta.chat.completions.parse 기능 (베타니 많은 변경이 있을수도 있겠지요) & response_format 입력해주기!

 

 

ㅁ 참고 : https://platform.openai.com/docs/guides/structured-outputs?context=ex2

728x90

댓글