
LLM의 응답은 기본적으로 자유 형식의 텍스트입니다. OutputParser를 사용하면 이 응답을 문자열, JSON, 리스트 등 원하는 형태로 구조화할 수 있습니다. 본 포스트에서는 다양한 OutputParser 사용법을 정리합니다.
OutputParser와 Chain을 사용하기 위해 필요한 패키지를 설치합니다.
pip install langchain-core langchain-openai python-dotenv
| 패키지 | 설명 |
|---|---|
langchain-core | OutputParser (StrOutputParser, JsonOutputParser 등) |
langchain-openai | OpenAI 모델 연동 |
python-dotenv | .env 파일에서 환경 변수 로드 |
가장 기본적인 파서로, 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'>
쉼표로 구분된 리스트 형태의 응답을 파싱합니다.
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'>
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'>
| 파서 | 출력 타입 | 용도 |
|---|---|---|
StrOutputParser | str | 단순 텍스트 응답 |
CommaSeparatedListOutputParser | list | 쉼표 구분 목록 |
JsonOutputParser | dict | 구조화된 데이터 |
chain = prompt | llm
result = chain.invoke({"topic": "Python"})
print(type(result)) # <class 'langchain_core.messages.ai.AIMessage'>
print(result.content) # 텍스트 접근 필요
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)}")