- 출처 : https://python.langchain.com/docs/modules/model_io/
- 이 블로그 글은 LangChain API document의 글을 기반으로 번역되었으며 이 과정에서 약간의 내용이 추가되었습니다.
- MODEL I/O는 Prompts, Language Model, Output Parser로 이루어져 있습니다.
- Output Parsers에서는 Langchain에서 output을 다루는 여러 가지 방법에 대해 설명합니다.
- 본 글에서는 Output parser base, List parser, Datatime parser, Enum parser에 대해 다룹니다.
Language model은 문자열을 반환합니다. 그러나 대부분의 경우, 문자열보다 더 구조화된 정보(ex, dictionary, list, json 등)를 얻기 원할 것입니다. 이 때를 위해 Output parsers를 준비했습니다.
Output parsers는 Language model의 응답을 구조화할 때 도움을 주는 클래스입니다. Output parsers가 반드시 시행해야하는 2개의 메서드가 존재합니다.
- 1. Get format instructions : 어떤 형식으로 출력을 형식화할지에 대한 지침(문자열)을 반환하는 메서드입니다.
- 2. Parse : 문자열을 받아 파싱하여 구조화된 형식으로 변환합니다.
또한 하나의 옵션이 더 있습니다.
- 3. Parse with prompt : 문자열을 받아 파싱하여 구조화된 형식으로 변환합니다. 프롬프트는 대부분 OutputParser가 출력을 재시도하거나 수정해야 할 경우에 제공되며, 그에 필요한 정보를 프롬프트에서 가져와 수행하는 경우 사용됩니다.
자세한 내용은 이후 세션에서 확인하겠습니다.
이번 세션에서는 PydanticOutputParser를 사용하여 응답 문자열로부터 형식화된 구조로 변환하는 것을 다룹니다.
먼저 모델을 불러오고, Pydatic을 사용하여 데이터 구조를 선언합니다.
from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field, validator
from typing import List
model_name = 'text-davinci-003'
temperature = 0.0
model = OpenAI(model_name=model_name, temperature=temperature)
# 반환받고자 하는 data structure를 선언합니다.
class Joke(BaseModel):
setup: str = Field(description="question to set up a joke")
punchline: str = Field(description="answer to resolve the joke")
# Pydantic을 사용하여 custom validation logic을 간단히 추가할 수 있습니다.
@validator('setup')
def question_ends_with_question_mark(cls, field):
if field[-1] != '?':
raise ValueError("Badly formed question!")
return field
다음으로 parser를 준비하고, 쿼리를 통해 문자열을 반환받습니다.
# parser를 setup하고 prompt template에 instruction을 추가합니다.
parser = PydanticOutputParser(pydantic_object=Joke)
prompt = PromptTemplate(
template="Answer the user query.\n{format_instructions}\n{query}\n",
input_variables=["query"],
partial_variables={"format_instructions": parser.get_format_instructions()} # -> `get_format_instructions`을 통해 위에서 선언한 data structure를 지시합니다.
)
# query를 작성해 prompt로 만듭니다.
joke_query = 'Tell me a joke'
_input = prompt.format_prompt(query=joke_query)
output = model(_input.to_string())
마지막으로 위에서 선언한 parser를 사용하여 반환된 문자열을 구조화된 형식으로 변환합니다.
parser.parse(output)
Joke(setup='Why did the chicken cross the road?', punchline='To get to the other side!')
List parser는 comma-separated item의 리스트를 반환하고 싶을 때 사용합니다.
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
output_parser = CommaSeparatedListOutputParser()
format_instructions = output_parser.get_format_instructions()
prompt = PromptTemplate(
template="List five {subject}.\n{format_instructions}",
input_variables=["subject"],
partial_variables={"format_instructions": format_instructions}
)
model = OpenAI(temperature=0)
_input = prompt.format(subject="ice cream flavors")
output = model(_input)
print('base_string : ', output, '\n')
print('comma_separated items : ',output_parser.parse(output))
base_string :
Vanilla, Chocolate, Strawberry, Mint Chocolate Chip, Cookies and Cream
comma_separated items : ['Vanilla', 'Chocolate', 'Strawberry', 'Mint Chocolate Chip', 'Cookies and Cream']
Datatime parser는 문자열을 datatime 형식으로 변환하는 parser입니다.
from langchain.prompts import PromptTemplate
from langchain.output_parsers import DatetimeOutputParser
from langchain.chains import LLMChain
from langchain.llms import OpenAI
output_parser = DatetimeOutputParser()
template = """Answer the users question:
{question}
{format_instructions}"""
prompt = PromptTemplate.from_template(
template,
partial_variables={"format_instructions": output_parser.get_format_instructions()},
)
chain = LLMChain(prompt=prompt, llm=OpenAI())
output = chain.run("around when was bitcoin founded?")
print('파싱전 :',output)
print('\n 파싱후 : ',output_parser.parse(output))
파싱전 :
2009-01-03T18:15:05.000000Z
파싱후 : 2009-01-03 18:15:05
Enum parser는 문자열을 통해 Enum 자료형을 파싱합니다. 하지만, 부적절한 변수가 입력되면 에러가 발생합니다.
from langchain.output_parsers.enum import EnumOutputParser
from enum import Enum
class Colors(Enum):
RED = 'red'
GREEN = 'green'
BLUE = 'blue'
parser = EnumOutputParser(enum=Colors)
print('base : ',parser.parse('red'))
print('띄어쓰기 인식 : ',parser.parse(' green'))
print('줄넘기기 인식 : ',parser.parse('blue\n'))
base : Colors.RED
띄어쓰기 인식 : Colors.GREEN
줄넘기기 인식 : Colors.BLUE
[Retrieval] (1) | 2023.08.23 |
---|---|
[MODEL I/O - Langauge Models] Output Parsers - 2 (0) | 2023.07.24 |
[MODEL I/O - Langauge Models] Chat Model How to (0) | 2023.07.13 |
[MODEL I/O - Langauge Models] Chat Models Base (0) | 2023.07.13 |
[MODEL I/O - Langauge Models] LLM How to - 2 (1) | 2023.07.12 |
댓글 영역