StructuredOutputParser는 LLM에 대한 답변을 dict 형식으로 구성하고, key/value 쌍으로 여러 필드를 반환하고자 할 때 유용하게 사용할 수 있습니다.
1 장점
Pydantic/JSON 파서가 더 강력하다는 평가를 받지만, StructuredOutputParser는 로컬 모델과 같은 덜 강력한 모델에서도 유용합니다. 이는 GPT나 Claude 모델보다 인텔리전스가 낮은(즉, parameter 수가 적은) 모델에서 특히 효과적입니다.
2 참고 사항
로컬 모델의 경우 Pydantic 파서가 동작하지 않는 상황이 빈번하게 발생할 수 있습니다. 이러한 경우, 대안으로 StructuredOutputParser를 사용하는 것이 좋은 해결책이 될 수 있습니다.
# LangSmith 추적을 설정합니다. https://smith.langchain.com
# !pip install langchain-teddynote
from langchain_teddynote import logging
# 프로젝트 이름을 입력합니다.
logging.langsmith("CH03-OutputParser")from langchain.output_parsers import ResponseSchema, StructuredOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAIResponseSchema클래스를 사용하여 사용자의 질문에 대한 답변과 사용된 소스(웹사이트)에 대한 설명을 포함하는 응답 스키마를 정의합니다.StructuredOutputParser를response_schemas를 사용하여 초기화하여, 정의된 응답 스키마에 따라 출력을 구조화합니다.
# 사용자의 질문에 대한 답변
response_schemas = [
ResponseSchema(name="answer", description="사용자의 질문에 대한 답변"),
ResponseSchema(
name="source",
description="사용자의 질문에 답하기 위해 사용된 `출처`, `웹사이트주소` 이여야 합니다.",
),
]
# 응답 스키마를 기반으로 한 구조화된 출력 파서 초기화
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)이제 응답이 어떻게 포맷되어야 하는지에 대한 지시사항이 포함된 문자열을 받게 되며(schemas), 정의된 스키마를 프롬프트에 삽입합니다.
# 출력 형식 지시사항을 파싱합니다.
format_instructions = output_parser.get_format_instructions()
prompt = PromptTemplate(
# 사용자의 질문에 최대한 답변하도록 템플릿을 설정합니다.
template="answer the users question as best as possible.\n{format_instructions}\n{question}",
# 입력 변수로 'question'을 사용합니다.
input_variables=["question"],
# 부분 변수로 'format_instructions'을 사용합니다.
partial_variables={"format_instructions": format_instructions},
)model = ChatOpenAI(temperature=0) # ChatOpenAI 모델 초기화
chain = prompt | model | output_parser # 프롬프트, 모델, 출력 파서를 연결chain.stream 메소드를 사용하여 “세종대왕의 업적은 무엇인가요?” 라는 질문에 대한 스트림 응답을 받습니다.