본문 바로가기
공부/AI

[LangChain] Chains와 LCEL 사용법

by 웅대 2023. 10. 27.
728x90
반응형

LLM은 단독으로 사용하는 것보다는 여러 요소들(prompt, parser 등등...)을 함께 사용하는 것이 좋다.

 

이 때 LangChain이 제공해주는 Chains을 사용하면 여러 요소들을 쉽게 통합할 수 있다.

 

그리고 이 Chains를 구현하기 위해서 크게 두가지 방법이 존재하는데 그 중 LCEL에 대해서 알아보자.

 

LCEL(LangChain Expression Language)

prompt, chat model, output parser들을 LCEL을 사용하여 연결해보자.

 

우선 역사적 인물의 이름을 입력하면 이 인물의 정보를 class로 반환해주는 것을 만들어보자.

 

prompt는 ChatPromptTemplate, chat model은 ChatOpenAI, output parser는 PydanticOutputParser를 사용했다.

 

from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.output_parsers import PydanticOutputParser
from langchain.pydantic_v1 import BaseModel, Field

# 반환 형식
class Person(BaseModel):
    name : str = Field(description="person's name")
    hometown : str = Field(description="person's hometown")
    birthday : str = Field(description="person's birthday")

# prompt 생성
chat_prompt = ChatPromptTemplate.from_messages([
    ("system", "You are an AI that provides information about historical figures.\n{format_instructions}"),
    ("human", "Tell me about {name}"),
])

# chat model 생성
chat = ChatOpenAI()

# output parser 생성
output_parser = PydanticOutputParser(pydantic_object=Person)

# chain 형성
runnable = chat_prompt | chat | output_parser

# chain 실행
res = runnable.invoke({"name" : "George Washington", "format_instructions" : output_parser.get_format_instructions()})
print(res)

위에서 보다싶이 prompt, chat model, output parser를 정의하고 |로 연결하면 된다.

 

형성한 chain에게 query를 주는 방법은 여러가지가 있다.

 

1. invoke

dictionary를 input으로 준다.

res = runnable.invoke({"name" : "George Washington", "format_instructions" : output_parser.get_format_instructions()})
print(res)

 

출력
name='George Washington' hometown='Westmoreland County, Virginia, USA' birthday='February 22, 1732'

2. batch

dictionary를 요소로 가지는 리스트를 준다.

res = runnable.batch([
    {"name" : "George Washington", "format_instructions" : output_parser.get_format_instructions()},
    {"name" : "Son heungmin", "format_instructions" : output_parser.get_format_instructions()}
])
print(res)
출력
[Person(name='George Washington', hometown='Westmoreland County, Virginia', birthday='February 22, 1732'), Person(name='Son Heung-min', hometown='Chuncheon, South Korea', birthday='July 8, 1992')]

3. stream

for s in chain.stream({"topic": "bears"}):
    print(s.content, end="", flush=True)

스트리밍 

 

Parallel

여러 개의 체인을 순서대로 실행하는 것이 아니라 RunnableParallel을 사용하여 병렬적으로 실행할 수도 있다.

from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema.runnable import RunnableParallel


model = ChatOpenAI()
joke_chain = ChatPromptTemplate.from_template("tell me a joke about {topic}") | model
poem_chain = ChatPromptTemplate.from_template("write a 2-line poem about {topic}") | model

map_chain = RunnableParallel(first=joke_chain, second=poem_chain)

map_chain.invoke({"topic": "bear"})
출력
{'first': AIMessage(content="Sure, here's a bear joke for you:\n\nWhy don't bears wear shoes?\n\nBecause they have bear feet!"),
'second': AIMessage(content="In the forest's embrace, a bear roams free,\nStrength and grace, in nature's symphony.")}
728x90
반응형

댓글