지토의 개발일기/RAG
출력 파서 [OutputParser] - JsonOutputParser
지아토
2025. 5. 15. 16:56
"JsonOutputParser"는 LLM의 출력 결과를 JSON의 형태로 파싱하고 반환하기 위한 파서이다. 주로 LangChain, OpenAI function calling 또는 기타 LLM 파이프라인에서 사용되며, 모델 출력이 JSON 포맷을 따르도록 유도하고, 안정적이고 프로그래밍에 친숙한 형태로 변환하는데 사용됩니다.
JSON이란 ?
JSON 데이터는 이름(키)과 값의 쌍으로 이루어져 있습니다. 여기서 "이름"은 문자열이고, "값"은 다양한 데이터 유형일 수 있습니다. JSON은 두 가지 기본 구조를 가집니다:
- 객체: 중괄호 {}로 둘러싸인 키-값 쌍의 집합입니다. 각 키는 콜론 :을 사용하여 해당하는 값과 연결되며, 여러 키-값 쌍은 쉼표 ,로 구분됩니다.
- 배열: 대괄호 []로 둘러싸인 값의 순서 있는 목록입니다. 배열 내의 값은 쉼표 ,로 구분됩니다.
#JSON 예시
{
"sender": "홍길동",
"company": "ABC전자",
"email": "hong@abc.co.kr",
"subject": "제품 문의 관련 회신",
"summary": "고객이 제품에 대한 기술적인 문의를 보냈으며, 빠른 회신이 필요합니다.",
"date": "2025-05-15",
"additional_information": "홍길동은 ABC전자 고객지원팀 소속으로 최근 자사 홈페이지를 통해 여러 건의 문의를 접수한 이력이 있습니다. 네이버 블로그 등에서도 유사한 문의 사례가 다수 확인됩니다."
}
JSONOutputParser를 활용한 간단한 예시
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import JsonOutputParser
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field
# OpenAI 객체를 생성합니다.
model = ChatOpenAI(temperature=0, model_name="gpt-4o")
원하는 출력 구조 정의
# 원하는 데이터 구조를 정의합니다.
class Topic(BaseModel):
description: str = Field(description="주제에 대한 간단한 설명")
hashtags: str = Field(description="해시태그 형식의 키워드(2개 이상)")
"JsonOutpuParser"를 사용하여 파서를 설정하고, 프롬프트 템플릿에 지시사항을 넣는다.
# 질의 작성
question = "지구 온난화의 심각성 대해 알려주세요."
# 파서를 설정하고 프롬프트 템플릿에 지시사항을 주입합니다.
parser = JsonOutputParser(pydantic_object=Topic)
print(parser.get_format_instructions())
print를 통해 parser.get_format_instructions을 확인해보면
프롬프트 템플릿 설정
# 프롬프트 템플릿을 설정합니다.
prompt = ChatPromptTemplate.from_messages(
[
("system", "당신은 친절한 AI 어시스턴트 입니다. 질문에 간결하게 답변하세요."),
("user", "#Format: {format_instructions}\n\n#Question: {question}"),
]
)
prompt = prompt.partial(format_instructions=parser.get_format_instructions())
# 체인을 구성합니다.
chain = prompt | model | parser
# 체인을 호출하여 쿼리 실행
answer = chain.invoke({"question": question})
# answer 객체를 출력합니다.
answer
출력 결과
요구한 내용 1. 간단하게설명, 2. 해시태그 2개 포함에대한 결과 포함해서 description출력 된것을 확인할 수 있다.