[LangChain] 프롬프트, 모델, 아웃풋 파서 연결하기 (Chaining a prompt template, a model, and output parser using LangChain Expression Language)
지난번 포스팅에서 LangChain 은 대규모 언어 모델을 사용해서 애플리케이션을 개발, 프로덕트화, 배포하는 것을 도와주는 프레임워크라고 소개했습니다. 그리고 LangChain Expression Language (LCEL) 는 LangChain의 기본적인 컴포넌트들을 chaining 기법을 써서 다단계 작업들의 연결 체인을 만들어 복잡한 기능을 구현할 수 있도록 해준다고 했습니다.
이번 포스팅에서는 LangChain Expression Language (LCEL) 의 가장 간단한 형태의 chaining 예시를 들어보겠습니다.
LCEL Chaining 기본 형태: Prompt + Model + Output Parser
이때 Model 로서 ChatModel과 LLM 모델을 사용할 때 input 과 output 이 조금 다르기 때문에, Model에 따라서 나누어서 소개하겠습니다.
(1) ChatModel 사용 시 Pipeline: Input --> {Dict} --> PromptTemplate --> PromptValue --> ChatModel --> ChatMessage --> StrOutputParser --> String --> Result
(2) LLM 사용 시 Pipeline: Input String --> LLM --> Output String
(1) ChatModel 을 사용한 Chaining 예: Prompt + ChatModel + Output Parser
: Input --> {Dict} --> PromptTemplate --> PromptValue --> ChatModel --> ChatMessage --> StrOutputParser --> String --> Result
만약 실습 환경에 langchain, openai 모듈이 설치가 안되어 있다면 termianl 이나 Jupyter Notebook (pip install 앞에 '!' 를 붙여서 사용) 에서 langchain, openai 모듈을 먼저 설치하기 바랍니다.
! pip install -q langchain
! pip install openai
(1) 필요한 modules 을 불러옵니다.
(2) OpenAI 의 API Key 를 설정해줍니다.
(3) Prompt Template, Chat Model, Output Parser 의 인스턴스를 생성합니다.
(4) '|' 를 사용해서 chain = promt | model | output_parser 를 연결(Chaining)해줍니다
(5) chain.invoke() 를 사용해서 chain pipeline 을 실행시켜줍니다. 이때 invoke({"topic": "bird"}) 처럼 Dictionary 형태로 PromptTemplate 에 들어갈 Input을 넣어주면 됩니다.
## (1) Importe modules
from langchain.prompts import ChatPromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
## (2) set with your openai api key
openai_api_key="sk-xxxxxx..."
## (3) Create instances of prompt, ChatModel, adn output parser
prompt = ChatPromptTemplate.from_template("tell me a short joke about {topic}")
model = ChatOpenAI(openai_api_key=openai_api_key)
output_parser = StrOutputParser()
## (4) Chaining a PromptTemplate + ChatModel + Output Parser using '|'
chain = prompt | model | output_parser
## (5) Run the whole pipeline of chain
chain.invoke({"topic": "bird"})
# \n\nWhy was the bird kicked out of the comedy club? Because it kept telling fowl jokes!
위에서 생성한 ChatPromptTemplate 의 인풋, 아웃풋을 단계별로 하나씩 살펴보겠습니다.
- ChatPromptValue: prompt.invoke()
- Messages: prompt_value.to_messages()
- HumanMessage: prompt_value.to_string()
ChatModel 은 인풋으로 PromptValue 를 받는 반면에, LLM 은 a string을 인풋으로 받는 차이점이 있습니다. (LLM도 PromptValue를 인풋으로 넣어줘도 작동합니다)
## ChatPromptValue
prompt_value = prompt.invoke({"topic": "bird"})
prompt_value
# ChatPromptValue(messages=[HumanMessage(content='tell me a short joke about bird')])
prompt_value.to_messages()
# Human: tell me a short joke about bird
prompt_value.to_string()
# Human: tell me a short joke about bird
다음으로, ChatModel의 아웃풋인 AIMessage 를 살펴보겠습니다.
## ChatModel AIMessage
message = model.invoke(prompt_value)
message
# AIMessage(content="Why don't birds wear shoes? \n\nBecause they have talon-t!")
(2) LLM Model 을 사용 예
: Input String --> LLM --> Output String
LLM 모델로는 OpenAI의 OpenAI(model="gpt-3.5-turbo-instruct") 모델을 사용해서 예를 들어보겠습니다. LLM 모델의 인풋으로 string 을 받고, 아웃풋으로는 생성된 string 을 반환합니다. (위의 ChatModel 대비 인풋과 아웃풋이 모두 string 으로 상대적으로 간단합니다.)
# prompt + llm model + output parser
from langchain.llms import OpenAI
# Set your OpenAI API Key
openai_api_key="sk-xxxxx..."
# Create an instance of LLM model
llm = OpenAI(model="gpt-3.5-turbo-instruct", openai_api_key=openai_api_key)
# Run LLM model, put a string as an input, and outputs a string
llm.invoke("tell me a short joke about bird")
# \n\nWhy did the chicken go to the seance? To get in touch with its inner chick!
[Reference]
* LangChain Expression Language
: https://python.langchain.com/docs/expression_language/get_started#basic-example-prompt-model-output-parser
이번 포스팅이 많은 도움이 되었기를 바랍니다.
행복한 데이터 과학자 되세요! :-)