Study/AI

[LangChain] Parser

hongeeii 2025. 8. 10.
728x90
반응형

여기서는 3가지 파서를 알아본다

  • StrOutputParser
  • JsonOutputParser
  • CommaSeparatedListOutputParser

StrOutputParser

from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate

llm = ChatOpenAI(model="gpt-4o-mini")
prompt_template = PromptTemplate.from_template(
    "입력한 단어에 대해 간단히 설명하세요 : {word}"
)

chain = prompt_template | llm
chain.invoke(
    input = {
        "word": "병원"
    }
)
 

result

AIMessage(content='병원은 질병이나 부상을 치료하고, 건강 관리를 제공하는 의료 기관입니다. 병원은 일반적으로 의사, 간호사, 기타 의료 전문 인력이 근무하며, 환자를 진단하고 치료하는 다양한 의료 서비스를 제공합니다. 급성질환 및 응급 상황을 다루는 응급실, 수술을 시행하는 외과, 입원 환자를 치료하는 병동 등 여러 부서가 있으며, 외래 진료와 같은 진료도 제공합니다. 병원은 공공 병원과 사립 병원으로 나뉘며, 각기 다른 종류의 진료를 제공합니다.', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 132, 'prompt_tokens': 22, 'total_tokens': 154, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-mini-2024-07-18', 'system_fingerprint': 'fp_34a54ae93c', 'finish_reason': 'stop', 'logprobs': None}, id='run--b12dfe8c-b337-431e-9d63-6bd732cd2404-0', usage_metadata={'input_tokens': 22, 'output_tokens': 132, 'total_tokens': 154, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})
 

StrOutputParser를 사용해 응답값의 결과만 뽑아낼 수 있다.

from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()

chain = prompt_template | llm | parser
chain.invoke({"word": "병원"})
 

JsonOutputParser

응답을 일반적인 텍스트말고 xml이라던지 json등의 형식을 받을 수 있다. 여기서는 json형식으로 응답을 받는경우를 살펴본다.

from langchain_core.output_parsers import JsonOutputParser
parser = JsonOutputParser()
parser.get_format_instructions() # 포멧을 알려주는 메서드
=> 'Return a JSON object.'
 

JsonOutputParser 객체를 만들고 'get_format_instructions()'를 사용하니 JSON 형식으로 반환된다는걸 알 수 있다.

JsonOutputParser를 사용해 json 형태로 응답받을 수 있는 예제를 봐보자. PromptTemplate 객체를 만들 때 'input_variables'는 chain을 실행시킬 때 항상 사용자가 입력해줘야되는 값이고, 'partial_variables'는 미리 정의해둔 값을 사용함으로서 사용자가 직접입력해주지 않아도 되는 값이다.

prompt_template = PromptTemplate(
    template="""
    입력한 단어와 관련 있는 단어를 알려주세요
    - 제약 사항: {format_instructions}
    - 입력 단어: {word}
    """,
    input_variables=["word"], # input_variables는 항상 사용자가 직접입력해줘야함.
    partial_variables={"format_instructions": parser.get_format_instructions()} # 미리 입력해둔값을 사용하므로써 chain을 사용할때 직접입력해주지 않아도 되는 값

)

chain = prompt_template | llm | parser
chain.invoke({"word": "병원"})
=> {'관련_단어': ['의사', '간호사', '환자', '치료', '약국', '검사', '의료', '수술', '응급실', '진료']}
 

CommaSeparatedListOutputParser

csv(콤마로 구분된)형태로 응답을 받는 경우에 사용할 수 있다.

from langchain_core.output_parsers import CommaSeparatedListOutputParser
parser = CommaSeparatedListOutputParser()
parser.get_format_instructions()

=> 'Your response should be a list of comma separated values, eg: `foo, bar, baz` or `foo,bar,baz`'
 
prompt_template = PromptTemplate(
    template="""
    입력한 단어와 관련 있는 단어를 알려주세요
    - 제약 사항: {format_instructions}
    - 입력 단어: {word}
    """,
    input_variables=["word"],
    partial_variables={"format_instructions": parser.get_format_instructions()}

)

chain = prompt_template | llm | parser
chain.invoke({"word": "병원"})

=> ['의사', '간호사', '치료', '환자', '진료', '응급실', '약국', '검사', '수술', '입원']
728x90
반응형

'Study > AI' 카테고리의 다른 글

[LangChain] 메모리 관리  (0) 2025.08.10
[LangChain] 메모리  (4) 2025.08.10
[LangChain] PromptTemplate  (1) 2025.08.10
[LangChain] LLM과 기본 대화하기  (1) 2025.08.10
[LangChain] LangChain이란  (4) 2025.08.10

추천 글