CommaSeparatedListOutputParser는 LangChain 프레임워크에서 제공하는 강력한 출력 파서 중 하나로, 언어 모델(LLM)의 텍스트 응답을 쉼표(,)로 구분된 리스트 형태로 변환하는 데 사용됩니다. 이를 통해 언어 모델이 생성한 비구조화된 텍스트 데이터를 구조화된 리스트 형태로 가공하여, 후속 작업에서 보다 쉽게 활용할 수 있도록 돕습니다. 예를 들어, “인기 있는 한국 음식 5가지” 또는 “대한민국 관광 명소 5곳”과 같은 질문에 대해 쉼표로 구분된 텍스트 응답을 받아 이를 Python 리스트로 변환할 수 있습니다.
이 파서는 특히 데이터 가공, API 응답 처리, 또는 데이터 분석과 같은 작업에서 유용합니다.
주요 기능
- 쉼표로 구분된 텍스트를 리스트로 변환: 언어 모델이 쉼표로 항목을 구분한 텍스트를 반환하면, 이를 Python 리스트로 자동 변환합니다.
- 데이터 가독성 향상: 비구조화된 텍스트를 구조화된 형태로 변환하여 코드 내에서 쉽게 다룰 수 있도록 합니다.
- 다양한 작업에 활용 가능: 리스트 형태의 데이터가 필요한 데이터베이스 입력, UI 표시, 또는 후속 처리 작업에 적합합니다.
사용 예제
CommaSeparatedListOutputParser를 활용하여 EXAone 3.5 모델을 기반으로 LangChain에서 “대한민국 관광 명소 5곳”을 요청하고, 결과를 리스트로 변환하는 과정을 살펴보겠습니다. 아래는 이를 구현한 코드와 실행 결과입니다.
예제 1: 기본 호출
from langchain_core.output_parsers import CommaSeparatedListOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_ollama import ChatOllama
# 콤마로 구분된 리스트 출력 파서 초기화
output_parser = CommaSeparatedListOutputParser()
# 출력 형식 지침 가져오기
format_instructions = output_parser.get_format_instructions()
# 프롬프트 템플릿 설정
prompt = PromptTemplate(
template="다음 주제에 대해 5가지 항목을 한국어로 나열해주세요.\n{subject}\n{format_instructions}",
input_variables=["subject"],
partial_variables={"format_instructions": format_instructions + "\n답변은 반드시 한국어로 작성해주세요."},
)
# EXAone 3.5 모델 초기화
llm_model = ChatOllama(model="exaone3.5")
# 프롬프트, 모델, 출력 파서를 연결하여 체인 생성
chain = prompt | llm_model | output_parser
# "대한민국 관광 명소"에 대한 체인 호출
result = chain.invoke({"subject": "대한민국 관광 명소"})
print(result)
[‘경복궁’, ‘남산 타워’, ‘부산 해운대 해수욕장’, ‘제주도 올레길’, ‘경복궁 야간 개장지’]
설명:
- PromptTemplate은 사용자가 입력한 주제(subject)와 출력 형식 지침(format_instructions)을 조합하여 모델에 전달합니다.
- format_instructions은 CommaSeparatedListOutputParser가 요구하는 형식(쉼표로 구분된 텍스트)을 모델에 명시합니다.
- CommaSeparatedListOutputParser는 모델의 응답을 파싱하여 Python 리스트로 변환합니다.
예제 2: 스트리밍 호출
LangChain의 chain.stream 기능을 사용하면 응답을 실시간으로 스트리밍하여 처리할 수 있습니다. 이는 대량의 데이터를 처리하거나 실시간 응답이 필요한 경우 유용합니다. 아래는 스트리밍을 통해 “대한민국 관광 명소”를 요청하는 예제입니다.
# 스트리밍 호출
for s in chain.stream({"subject": "대한민국 관광 명소"}):
print(s) # 스트림으로 받은 각 항목을 출력
[‘한강공원’]
[‘경복궁’]
[‘부산 해운대 해수욕장’]
[‘제주도 올레길’]
[‘강원도 설악산 등산코스’]
설명:
- chain.stream은 모델의 응답을 즉시 처리하며, 각 항목이 생성될 때마다 리스트 형태로 반환합니다.
- 스트리밍 방식은 사용자 경험을 향상시키거나 대규모 응답을 효율적으로 처리할 때 적합합니다.
주의사항
- 응답 형식 일관성: EXAone 3.5 모델이 쉼표로 구분된 형식으로 정확히 응답하도록 프롬프트에서 명확히 지시해야 합니다. 예를 들어, format_instructions에 쉼표 구분 형식을 명시적으로 포함해야 합니다.
- 한국어 처리: EXAone 3.5는 한국어에 최적화된 모델이므로, 프롬프트에 “한국어로 답변”을 명시하면 더 자연스러운 결과를 얻을 수 있습니다.
- 스트리밍 성능: 스트리밍 호출은 네트워크 환경과 Ollama 서버의 성능에 따라 지연이 발생할 수 있으므로, 안정적인 환경에서 테스트하는 것이 좋습니다.
활용 사례
- 여행 추천 시스템: 사용자가 요청한 관광 명소를 리스트로 변환하여 데이터베이스에 저장하거나 UI에 표시.
- 설문조사 응답 처리: 사용자가 쉼표로 구분하여 입력한 답변을 리스트로 가공.
- 자연어 기반 데이터 추출: 언어 모델이 생성한 비구조화된 텍스트에서 필요한 항목을 리스트로 추출.
CommaSeparatedListOutputParser는 단순하지만 강력한 도구로, 다양한 애플리케이션에서 데이터 구조화를 간소화합니다.