EnumOutputParser에 대해 알아보겠습니다.
Enum이란 열거형을 의미합니다. 어떤 값들을 열거하여 표현하는 방식인것이지요
from enum import Enum
class Colors(Enum):
RED = "빨간색",
GREEN = "초록색",
BLUE = "파란색"
와 같이 열거하여 표현합니다. Enum을 상속받은 클래스을 정의합니다.
# EnumOutputParser 인스턴스 생성
parser = EnumOutputParser(enum=Colors)
으로 EnumOutputParser의 인스턴스 parser로 만들어 주는데 인수로 아까 만든 Colors클래스가 enum클래스로 지정되어 들어갑니다.
parser.get_format_instructions()
을 통해 확인한 지침은
'Select one of the following options: 빨간색, 초록색, 파란색'
이렇게 됩니다.
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
# 프롬프트 템플릿을 생성합니다.
prompt = PromptTemplate.from_template(
"""다음의 물체는 어떤 색깔인가요?
Object: {object}
Instructions: {instructions}"""
# 파서에서 지시사항 형식을 가져와 부분적으로 적용합니다.
).partial(instructions=parser.get_format_instructions())
# 체인을 생성합니다.
chain = prompt | ChatOpenAI() | parser
와 같이 프롬프트를 정의하고 여기서 instructions는 PromptTemplate.fromt_templat.partial()메서드를 사용하여 …
prompt = PromptTemplate.from_template(template)
# name 변수를 미리 설정 partial_prompt = prompt.partial(name="Alice")
사실 PromptTemplate.from_template()는 PromptTemplate객체를 생성합니다. 따라서 prompt.partial는 사실 PromptTemplate.from_template().partial()입니다.
따라서 partial 메서드를 통해 instructions의 값을 채워넣어주는데 instructions(지침)은 어디서 가져오냐 한다면 parser.get_format_instructions()를 통해 파서의 지침을 가져온 것입니다. 따라서
object를 invoke시에 object가 뭘 지목하는지 알려주고 partial()을 통해 지침을 집어 넣을 수 있습니다.
더 정석적으로 설명하면
PromptTemplate.from_template()는 문자열 템플릿을 받아 PromptTemplate 객체를 생성합니다.
코드에서 prompt = PromptTemplate.from_template(…)로 생성된 prompt 객체에 대해, prompt.partial()은 PromptTemplate.from_template().partial()과 동일한 동작을 합니다.
여기서 partial(instructions=parser.get_format_instructions())는 instructions 변수를 parser.get_format_instructions()에서 가져온 지침(예: CommaSeparatedListOutputParser의 출력 형식 지침)으로 미리 설정합니다.
이후 chain.invoke({“object”: “apple”})처럼 호출하면, {object}에 지정된 물체(예: “apple”)가 템플릿에 주입되고, {instructions}는 이미 설정된 지침을 사용해 프롬프트가 완성됩니다.
입니다.
# 체인을 실행합니다.
response = chain.invoke({"object": "하늘"})
print(response)
따라서 하늘은 무슨 색이냐고 묻는다면
파란색이라고 하지 않고 EnumOutputParser에 의해
Colors.BLUE
라는 결과가 출력됩니다.
# 출력의 타입을 확인합니다.
type(response)
<enum ‘Colors’>
# 출력의 값을 확인합니다.
response.value
‘파란색’
이 되는 것을 보실 수 있습니다.