LangChain의 OutputParser는 LLM의 응답을 원하는 형식으로 후처리해주는 도구다.
LLM은 기본적으로 텍스트를 출력하지만, 우리는 그 결과를 JSON, 숫자, 리스트 등으로 바꿔서 활용해야 하는 경우가 많다.
이럴 때 OutputParser를 사용한다.
왜 사용하는가?
OutputParser를 쓰면 응답을 원하는 타입으로 자동 변환할 수 있다.가장 기본적인 파서.
LLM 응답을 문자열 그대로 추출한다.
from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.schema.output_parser import StrOutputParser
template = PromptTemplate.from_template("'{word}' 단어의 정의를 알려줘.")
prompt = template.format(word="인공지능")
llm = ChatOpenAI()
parser = StrOutputParser()
chain = prompt | llm | parser
result = chain.invoke({})
print(result)
LLM이 출력한 텍스트를 JSON으로 파싱해주는 파서이다.
Pydantic 모델과 함께 쓰면 JSON 구조를 타입 안전하게 받아올 수 있다.
from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.output_parsers import JsonOutputParser
from pydantic import BaseModel
class Answer(BaseModel):
term: str
definition: str
parser = JsonOutputParser(pydantic_object=Answer)
format_instructions = parser.get_format_instructions()
prompt = PromptTemplate(
input_variables=["word"],
partial_variables={"format_instructions": format_instructions},
template="""
'{word}'의 정의를 아래 형식에 맞춰 알려줘.
{format_instructions}
"""
)
llm = ChatOpenAI()
chain = prompt | llm | parser
result = chain.invoke({"word": "딥러닝"})
print(result)
Answer(term='딥러닝', definition='인공신경망을 기반으로 하는 기계 학습 기술입니다.')
보통 Json 형식으로 많이 저장해서 사용하니까 이렇게 파싱하는 방식을 잘 활용할 수 있어야 할 것 같다.
그리고 여기서 중요한거는 llm = ChatOpenAI() 꼭 선언 해주어야 한다 !!!
그리고 CommaSeparatedListOutputParser 라고 리스트 형태로 반환하는 것도 있고,
RunnableLambda로 custom parser도 구현이 가능하다.