[LangChain] Chains와 LCEL 사용법

2023. 10. 27. 12:00·공부/AI
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
'공부/AI' 카테고리의 다른 글
  • [LangChain] Agent와 Tool 사용법
  • [LangChain] Retrieval, RAG (document에서 검색하기)
  • [LangChain] Few Shot Prompting, Dynamic Few Shot Prompting
  • [LangChain] Prompts, Caching, Streaming, Token Usage
웅대
웅대
알고리즘과 백엔드를 중심으로 열심히 공부 중입니다! 같이 소통하며 공부해요!
    250x250
  • 웅대
    웅대 개발 블로그
    웅대
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 백준 알고리즘
        • dp
        • 문자열
        • 정렬
        • 스택
        • 브루트 포스
        • 이진 탐색
        • 정리
        • 우선순위 큐
        • 자료구조
        • 그래프
        • 기타
        • 그리디
      • 컴퓨터 언어
        • Kotlin
        • Python
        • C#
      • 공부
        • Database
        • Android Studio
        • Algorithm
        • 컴퓨터 구조론
        • Spring
        • lombok
        • AWS
        • Network
        • OS
        • Git & GitHub
        • AI
        • Computer Vision
        • 보안
        • Nginx
        • 프론트
        • express
        • GCP
        • grokking concurrency
        • DevOps
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Vector Store
    RNN
    embedding
    influxDB CLI
    binary search
    openvidu 배포
    bfs
    파이썬
    AWS Lambda
    codetree
    code tree
    nn.RNN
    Merge
    스택
    다익스트라
    ChatPromptTemplate
    parametric search
    푸쉬 알람
    스프링 OAuth2
    ci/cd
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
웅대
[LangChain] Chains와 LCEL 사용법
상단으로

티스토리툴바