안녕하세요.
9기 HuggingFace 파트너 겸 뾰족한 개발자 청강생 정정민입니다. 😁
8기에서 랭체인을 공부하면서,
LCEL을 깊이 있게 이해해야 함을 느끼게 되었습니다. (LCEL이 미래다!!)
얼마나 될지 모르겠지만 LCEL을 알아가는 과정을 담아보려 합니다.
오늘은 첫 시간으로, LCEL를 찾아보면 항상 맨 앞에 나오는 말이죠.
invoke, batch, stream을 사용해보고 각각의 특징을 살펴보려고 합니다.
LCEL 설명 페이지를 찾아보면…
이런 이야기가 있습니다.
앞으로 살펴 볼 많은 이야기가 담겨있네요.
일단 오늘 살펴볼 내용만 초점을 맞춰보면,
LCEL을 활용해 구성한 chain은 일반적으로 많이 사용하는 명령 함수를 사용할 수 있다고 하네요.
거기에는 아래의 것이 포함됩니다.
invoke
batch
stream
이게 좋은지, 어떤 장점이 있는지, 어떤 특징이 있는지 등등을 알아야
LCEL을 이해할 수 있겠네요.
(참고로, 앞에 a가 붙은 비동기 명령문(ainvoke, abatch, astream)들도 있습니다만, 이는 추후에 살펴보죠!)
이 포스트에서 사용할 간단한 chain을 만들어보죠. (공식 페이지의 예시 코드를 활용)
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI
prompt = ChatPromptTemplate.from_template(
"Tell me a short joke about {topic}"
)
output_parser = StrOutputParser()
model = ChatOpenAI(model="gpt-3.5-turbo", api_key=OPENAI_API)
chain = (
{"topic": RunnablePassthrough()}
| prompt
| model
| output_parser
)
invoke
invoke란, 구성한 chain에 단 하나의 입력을 넣어 출력을 반환하는 함수입니다.
저는 invoke 라는 용어를 사용해본 경험이 없었는데요..
네이버 영어 사전을 보니 invoke의 6번째 의미를 이용한 것 같네요 ^^;;
위 chain에 입력으로 ‘ice cream’을 넣어볼까요?
이때 사용하는 메소드가 invoke 입니다.
chain.invoke('ice cream')
결과는 아래와 같습니다.
Why did the ice cream go to the gym?
Because it wanted to be a little "cone"dy!
시간은 얼마나 걸릴까요?
시간 측정 함수를 작성해 결과를 살펴보면 아래와 같습니다.
def measure_execution_time(func, *args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
execution_time = end_time - start_time
print(f"{func.__name__} 실행 시간: {execution_time:.3f}초")
return result
measure_execution_time(chain.invoke, "ice cream") # 1.294 초
사용하는 모델과 인터넷 상황에 따라 다르겠지만 대략 1.294초가 걸렸네요.
batch
batch란, 구성한 chain에 복수의 입력을 넣어 각 입력에 따른 출력을 반환하는 함수입니다.
위 예를 사용했을 때,
ice cream에 따른 결과 뿐 아니라
chocolate의 결과도 그리고 vanilla 결과도 같이 보고싶으면 어떻게 할까요??
가장 쉽게 생각할 수 있는 것은 앞서 살펴본 invoke를 원하는 입력 수 만큼 넣어주면 되겠네요.
마치 아래와 같은 pseudo code 처럼요!
results = []
for 입력 in 원하는 입력들 :
res = chat.invoke(입력)
results.append()