OutputParser로 LLM 응답 구조화하기

gclee·2026년 1월 21일

LangChain-RAG

목록 보기
5/13

LLM의 응답은 기본적으로 자유 형식의 텍스트입니다. OutputParser를 사용하면 이 응답을 문자열, JSON, 리스트 등 원하는 형태로 구조화할 수 있습니다. 본 포스트에서는 다양한 OutputParser 사용법을 정리합니다.

준비 사항

  • Python 3.9 이상
  • OpenAI API 키 설정 (.env 파일)

라이브러리 설치

OutputParser와 Chain을 사용하기 위해 필요한 패키지를 설치합니다.

pip install langchain-core langchain-openai python-dotenv
패키지설명
langchain-coreOutputParser (StrOutputParser, JsonOutputParser 등)
langchain-openaiOpenAI 모델 연동
python-dotenv.env 파일에서 환경 변수 로드

StrOutputParser

가장 기본적인 파서로, AIMessage에서 텍스트 내용만 추출합니다.

from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

load_dotenv()

prompt = ChatPromptTemplate.from_template("{topic}에 대해 한 문장으로 설명해줘")
llm = ChatOpenAI(model="gpt-4o-mini")
output_parser = StrOutputParser()

chain = prompt | llm | output_parser

result = chain.invoke({"topic": "클라우드 컴퓨팅"})
print(result)  # 문자열 출력
print(type(result))  # <class 'str'>

CommaSeparatedListOutputParser

쉼표로 구분된 리스트 형태의 응답을 파싱합니다.

from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import CommaSeparatedListOutputParser

load_dotenv()

output_parser = CommaSeparatedListOutputParser()

prompt = ChatPromptTemplate.from_template(
    "{topic}와 관련된 키워드 5개를 쉼표로 구분해서 나열해줘"
)
llm = ChatOpenAI(model="gpt-4o-mini")

chain = prompt | llm | output_parser

result = chain.invoke({"topic": "인공지능"})
print(result)  # ['머신러닝', '딥러닝', '신경망', '자연어처리', '컴퓨터비전']
print(type(result))  # <class 'list'>

JsonOutputParser

JSON 형태의 응답을 파싱하여 딕셔너리로 변환합니다.

기본 사용법

from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import JsonOutputParser

load_dotenv()

output_parser = JsonOutputParser()

prompt = ChatPromptTemplate.from_template(
    """{country}의 수도와 인구를 JSON 형식으로 알려줘.
형식: {{"capital": "수도명", "population": "인구수"}}"""
)
llm = ChatOpenAI(model="gpt-4o-mini")

chain = prompt | llm | output_parser

result = chain.invoke({"country": "대한민국"})
print(result)  # {'capital': '서울', 'population': '약 5100만명'}
print(type(result))  # <class 'dict'>

파서 비교

파서출력 타입용도
StrOutputParserstr단순 텍스트 응답
CommaSeparatedListOutputParserlist쉼표 구분 목록
JsonOutputParserdict구조화된 데이터

파서 없이 사용할 때 vs 파서 사용할 때

파서 없이 사용

chain = prompt | llm
result = chain.invoke({"topic": "Python"})
print(type(result))  # <class 'langchain_core.messages.ai.AIMessage'>
print(result.content)  # 텍스트 접근 필요

StrOutputParser 사용

chain = prompt | llm | StrOutputParser()
result = chain.invoke({"topic": "Python"})
print(type(result))  # <class 'str'>
print(result)  # 바로 텍스트 출력

전체 예제 코드

from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import (
    StrOutputParser,
    CommaSeparatedListOutputParser,
    JsonOutputParser
)

load_dotenv()

llm = ChatOpenAI(model="gpt-4o-mini")

# 1. StrOutputParser 사용
str_prompt = ChatPromptTemplate.from_template("{topic}에 대해 한 문장으로 설명해줘")
str_chain = str_prompt | llm | StrOutputParser()

str_result = str_chain.invoke({"topic": "클라우드 컴퓨팅"})
print("=== StrOutputParser ===")
print(f"결과: {str_result}")
print(f"타입: {type(str_result)}")

# 2. CommaSeparatedListOutputParser 사용
list_prompt = ChatPromptTemplate.from_template(
    "{topic}와 관련된 키워드 5개를 쉼표로 구분해서 나열해줘"
)
list_chain = list_prompt | llm | CommaSeparatedListOutputParser()

list_result = list_chain.invoke({"topic": "인공지능"})
print("\n=== CommaSeparatedListOutputParser ===")
print(f"결과: {list_result}")
print(f"타입: {type(list_result)}")

# 3. JsonOutputParser 사용
json_prompt = ChatPromptTemplate.from_template(
    """{country}의 수도와 인구를 JSON 형식으로 알려줘.
형식: {{"capital": "수도명", "population": "인구수"}}"""
)
json_chain = json_prompt | llm | JsonOutputParser()

json_result = json_chain.invoke({"country": "대한민국"})
print("\n=== JsonOutputParser ===")
print(f"결과: {json_result}")
print(f"수도: {json_result['capital']}")
print(f"타입: {type(json_result)}")

0개의 댓글