본문 바로가기
Natural Language Processing

[SeSac] LangChain 5 - Output Parser

by 자몽먹은토끼 2024. 7. 14.
728x90
반응형
CSV Parser

 

: 모델의 출력 형태를 csv 형태로 변환한다.

from langchain_core.output_parsers import CommaSeparatedListOutputParser

output_parser = CommaSeparatedListOutputParser()
format_instructions_text = output_parser.get_format_instructions()

print(format_instructions_text)
# Your response should be a list of comma separated values, eg: `foo, bar, baz`

> 모델이 출력을 생성할 때 쉼표로 구분된 형식을 반환하라는 지침을 프롬프트에 추가한다.

from langchain_core.prompts import PromptTemplate

prompt = PromptTemplate(
    template="List five {subject}.\n{format_instructions}",
    input_variables=["subject"],
    partial_variables={"format_instructions": format_instructions_text},
)

llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)

chain = prompt | llm | output_parser

chain.invoke({"subject": "popular Korean cusine"})
# ['Bibimbap', 'Kimchi', 'Bulgogi', 'Japchae', 'Tteokbokki']
  • PromptTemplate ()
    • 프롬프트에는 "List five {subject}"(다섯가지를 나열해줘) 라는 지시문과 함께,
       "출력 시에는 comma로 구분된 값의 리스트 형식으로 반환해달라"는 지시문도 넣는다.
    • input_variables : 프롬프트 템플릿을 채우기 위해 반드시 채워야 할 변수 목록.
      이 변수들은 템플릿의 실행시점에 값을 채워야 한다. (사용자의 입력 변수)
    • partial_variables : 템플릿 생성시에 미리 정의된 값으로 채워지는 변수들.
      이미 고정된 값이므로 매번 입력할 필요없이 프롬프트 템플릿이 생성될 때 한번만 설정하면 된다.(설정변수)
  • outputparser : 출력형태를 콤마를 기준으로 구분되는 리스트 형식으로 변환하여 출력한다.

 

 

여기서 들었던 의문 ❗

이미 지시사항으로 리스트 형식의 결과물을 반환해달라고 했는데, 굳이 parser를 또 사용해서 이중으로 리스트 반환할 필요가 있을까?

→ 프롬프팅을 통해 나온 출력값은 그저 텍스트 타입의 리스트이다. 그러니까 예를 들어,

" ['Bibimbap', 'Kimchi', 'Bulgogi', 'Japchae', 'Tteokbokki'] "

이런 의미이다. type이 리스트가 아닌 리스트처럼 보이는 텍스트

 

따라서 이를 진짜 리스트 type으로 반환하기 위해 output parser를 통해

['Bibimbap', 'Kimchi', 'Bulgogi', 'Japchae', 'Tteokbokki']

이와 같이 리스트로 변환한다.

 

 

 

 

 

 

 

JSON Parser

 

: 출력형태를 json형태로 반환

from langchain_core.output_parsers import JsonOutputParser
from langchain_core.pydantic_v1 import BaseModel, Field

# 자료구조 정의 (pydantic)
class CusineRecipe(BaseModel):
    name: str = Field(description="name of a cusine")
    recipe: str = Field(description="recipe to cook the cusine")

# 출력 파서 정의
output_parser = JsonOutputParser(pydantic_object=CusineRecipe)

format_instructions = output_parser.get_format_instructions()

print(format_instructions)
The output should be formatted as a JSON instance that conforms to the JSON schema below.

As an example, for the schema {"properties": {"foo": {"title": "Foo", "description": "a list of strings", "type": "array", "items": {"type": "string"}}}, "required": ["foo"]}
the object {"foo": ["bar", "baz"]} is a well-formatted instance of the schema. The object {"properties": {"foo": ["bar", "baz"]}} is not well-formatted.

Here is the output schema:
"""
{
"properties": {
		"name": {"title": "Name",
			"description": "name of a cusine",
       	  	   	"type": "string"},
                "recipe": {"title": "Recipe",
                	"description": "recipe to cook the cusine",
                            "type": "string"}
                },
"required": ["name", "recipe"]
}
"""

> 지정한 클래스의 예시를 미리 보여주기 까지 한다

 

 

# prompt 구성
prompt = PromptTemplate(
    template="Answer the user query.\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": format_instructions},
)
chain = prompt | model | output_parser

chain.invoke({"query": "Let me know how to cook Bibimbap"})
{'name': 'Bibimbap',
'recipe': 'Bibimbap is a Korean mixed rice dish. To cook Bibimbap, you will need the following ingredients: cooked rice, vegetables (such as spinach, bean sprouts, carrots, zucchini, mushrooms), beef or tofu, eggs, sesame oil, soy sauce, sugar, garlic, and Korean red pepper paste (gochujang). To prepare Bibimbap, sauté the vegetables separately,'}
728x90
반응형