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
반응형
'공부 > AI' 카테고리의 다른 글
[LangChain] Agent와 Tool 사용법 (0) | 2023.11.27 |
---|---|
[LangChain] Retrieval, RAG (document에서 검색하기) (0) | 2023.10.23 |
[LangChain] Few Shot Prompting, Dynamic Few Shot Prompting (1) | 2023.10.21 |
[LangChain] Prompts, Caching, Streaming, Token Usage (0) | 2023.10.20 |
[LangChain] LangChain 개념 및 사용법 (0) | 2023.10.18 |
댓글