지토의 개발일기/RAG

출력 파서 (OutputParser) - PydanticOutputParser

지아토 2025. 5. 13. 18:53

PydanticOutputParser란 ?

 

언어 모델의 출력을 구조화된 정보로 변환하는데 도움을 주는 클래스이다. 이 클래스는 단순 텍스트 응답 대신 "명확하고 체계적인 형태로 필요한 정보를 제공 할 수 있다. 

 

이클래스를 활용하면 언어 모델의 출력을 특정 데이터 모델에 맞게 변환하여 정보를 더 쉽게 처리하고 활용할 수 있다. 

 

▶ 주요 매서드

 

1. get_format_instructions()  : LLM에게 제공할 출력 형식을 안내하는 문자열(JSON등 포함)을 반환한다. 

언어 모델이 출력해야 할 정보의 형식을 정의하는 지침 제공, 언어 모델이 출력해야할 데이터의 필드와 그 형태를 설명하는 지침을 문자열로 반환 가능, 이 지침은 언어 모델이 출력을 구조화하고 특정 데이터 모델에 맞게 변환하는데 매우 중요.

 

2. parse() : LLM이 생성항 문자열을 Pydantic 모델 객체로 변환한다. (실제 구조화 파싱 핵심) , 언어 모델의 출력을 받아 이를 특정 구조로 분석하고 변환한다. Pydantic과 같은 도구를 사용하여 입력된 문자열을 사전 정의된 스키마에 따라 검증하고, 해당 스키마를 따르는 데이터 구조로 변환한다

 

 

필요한 ChatOpenAI, PydanticOutputParser, BaseModel, Field 선언 후 

llm 변수에 chatgpt 모델과, 모델 이름을 작성해준다 여기서는 gpt-4o버전 사용.

from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field


llm = ChatOpenAI(temperature=0, model_name="gpt-4o")

 

 

email 예시 

 

email 예시 형태를 email_conversation 변수에 담아 저장. 

email_conversation = """From: 김건태 (kkt@naver.com)  
To: 여우수 (woosoo@naver.com)  
Subject: “광계측기” 제품 관련 회의 일정 및 미팅 제안

안녕하세요, 여우수 사원님.

이니트의 김건태 과장입니다.  
최근 귀사의 신규 제품인 "광계측기"에 대한 뉴스를 접하고 깊은 관심을 갖게 되었습니다.

저희 이니트는 정밀 계측 장비 분야에서 다양한 프로젝트 수행 경험과 기술적 전문성을 보유하고 있으며, 산업용 계측 솔루션 확대를 모색하고 있는 중입니다. 귀사의 제품이 저희의 사업 방향성과 잘 맞는다고 판단하여 협업 가능성을 타진드리고자 이렇게 연락드렸습니다.

우선, das 모델에 대한 브로슈어를 요청드립니다. 특히 기술 사양, 배터리 성능, 디자인 관련 정보가 포함되어 있으면 감사하겠습니다. 해당 자료는 제품 이해와 유통·마케팅 전략 수립에 큰 도움이 될 것입니다.

또한, 협력 논의를 위한 미팅을 다음 주 화요일(1월 15일) 오전 10시에 제안드립니다. 가능하시다면 귀사 사무실에서 직접 찾아뵙고 논의드리고 싶습니다.

긍정적인 검토 부탁드리며, 회신 기다리겠습니다.  
감사합니다.

김건태 드림  
과장  
이니트
"""

 

 

위와 같은 이메일 예시가 주어졌을 경우 Pydantic 스타일로 정의된 클래스 활용하여 이메일 정보 파싱.

 

EmailOfsm 클래스에 BaseModel을 인자로 받고 아래와 같은 형태로 작성하여 이메일 정보를 Pydantic스타일로 정의

 

Field안의 description의 경우 텍스트형태의 답변에서 주요 정보 추출하기 위한 중요한 요소이므로 정확하고 명확하게 작성해야함.

class EmailOfsm(BaseModel):
    person: str = Field(description="메일을 보낸 사람")
    email: str = Field(description="메일을 보낸 사람의 이메일 주소")
    subject: str = Field(description="메일 제목")
    summary: str = Field(description="메일 본문을 요약한 텍스트")
    date: str = Field(description="메일 본문에 언급된 미팅 날짜와 시간")


# PydanticOutputParser 생성
parser = PydanticOutputParser(pydantic_object=EmailOfsm)


# instruction 을 출력합니다.
print(parser.get_format_instructions())

 

parser.get_format_instructions()을 print하면 아래와 같이 

 

output 은 반드시 JSON형태로 작성되어야 하며 아래와 같은 형태의 예시로 구성되어있음을 알 수 있다. 

 

 

프롬프트 정의 

 

from langchain_core.prompts import PromptTemplate 

prompt = PromptTemplate.from_template(
    """
You are a helpful assistant. Please answer the following questions in KOREAN.

QUESTION:
{question}

EMAIL CONVERSATION:
{email_conversation}

FORMAT:
{format}
"""
)

# format 에 PydanticOutputParser의 부분 포맷팅(partial) 추가
prompt = prompt.partial(format=parser.get_format_instructions())



##여기서 promptTemplate.from_template안에
## 1.Question : 질문
## 2.email_conversation : 이메일 형식 (위의 작성내용)
## 3.format : 형태
## prompt안에 partial을 통해 parser로 저장항 EmailOfsm 클래서 인자 지정

 

 

Chain 생성

 

# 체인
chain = prompt | llm | parser

 

 

Chain 실행 및 결과 실행 

 

# chain 을 실행하고 결과를 출력
response = chain.invoke(
    {
        "email_conversation": email_conversation,
        "question": "이메일 내용중 주요 내용을 추출해 주세요.",
    }
)

# 결과는 EmailOfsm 객체 형태로 출력
response

 

 

결과

 

결과

 

EmailOfsm 클래스에 선언한 내용의 형태로 email 내용이 요약이 되어 잘 출력된 모습을 볼 수 있다.