Chatbot 프로젝트/LangChain

10. Runnable 인터페이스와 체이닝

조찬국 2024. 11. 25. 22:37
728x90

1. LCEL로 기본 체인 구성하기

from langchain_core.output_parsers import StrOutputParser # LLM의 답변만 잘라서 가지고 오는 것
from langchain_core.prompts import ChatPromptTemplate # 프롬프트 
from langchain_openai import ChatOpenAI # OPEN AI

#프롬프트 템플릿 설정
prompt = ChatPromptTemplate.from_template("tell me a short joke about {topic}")

#LLM 호출
model = ChatOpenAI(model="gpt-4o-mini")

#출력 파서 설정
output_parser = StrOutputParser()

#LCEL로 프롬프트템플릿-LLM-출력 파서 연결하기
chain = prompt | model | output_parser

#invoke함수로 chain 실행하기
chain.invoke({"topic": "ice cream"})

prompt -> model이 넘겨받은 prompt를 통해 답변 생성 -> output_parser로 답변만 받음

 

1.2. Streaming 기능 추가를 더욱 쉽게, stream()

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

#Chain 선언
model = ChatOpenAI(model="gpt-4o-mini")
prompt = ChatPromptTemplate.from_template("tell me a joke about {topic}")
chain = prompt | model

#Chain의 stream()함수를 통해 스트리밍 기능 추가
for s in chain.stream({"topic": "bears"}):
    print(s.content, end="", flush=True)

토큰 별로 타이핑 되듯이 나타난다.

 

1.3. 한꺼번에 여러 개 API 요청하고 답변 받기, batch()

1.3.1. 5개 문장 번역 batch 수행

%%time
model = ChatOpenAI(model="gpt-4o-mini")
prompt = ChatPromptTemplate.from_template("다음 한글 문장을 프랑스어로 번역해줘 {sentence}")
chain = prompt | model

chain.batch([
    {"sentence": "그녀는 매일 아침 책을 읽습니다."},
    {"sentence": "오늘 날씨가 참 좋네요."},
    {"sentence": "저녁에 친구들과 영화를 볼 거예요."},
    {"sentence": "그 학생은 매우 성실하게 공부합니다."},
    {"sentence": "커피 한 잔이 지금 딱 필요해요."}

])

batch를 통해 리스트를 넣어

 

1.3.2. 1개 문장 번역 invoke 수행

%%time
prompt = ChatPromptTemplate.from_template("다음 한글 문장을 프랑스어로 번역해줘 {sentence}")
chain = prompt | model

chain.invoke({"sentence": "그녀는 매일 아침 책을 읽습니다."})

 

<결과>

 

1개의 문장의 소요시간이 0.67초이면 5개 문장을 실시하면 이보다 훨씬 더 오래걸려야 하지만 batch를 통해 1.1초 만 걸린것을 확인할 수 있다.

 

 

2. RunnablePassthroug

RunnablePassthrough는 가장 단순한 Runnable 객체로, 들어온 입력을 그대로 전달합니다.

 

from langchain_core.runnables import RunnablePassthrough

RunnablePassthrough().invoke("안녕하세요")

 

RunnablePassthrough는 assin 함수를 통해 새로운 변수에 계산된 값을 입력할 수 있습니다.

from langchain_core.runnables import RunnableParallel, RunnablePassthrough

runnable = RunnableParallel(
    extra=RunnablePassthrough.assign(mult=lambda x: x["num"] * 3),
    modified=lambda x: x["num"] + 1,
)

runnable.invoke({"num": 1})

 

<결과>

3. RunnableLambda

RunnableLambda는 임의의 함수를 Chain에 결합할 수 있게 Runnable 객체로 변환합니다.

 

3.1. 체인을 시각적으로 확인하기 (gradalf=> ascii 코드로 확인 가능)

 

4. RunnableParallel

RunnableParallel은 여러 요소가 병렬 처리되도록 처리합니다

 

4.1. 2개의 체인도 동시에 설정하기

max_token값을 128로 주어 최대한 짧게 답변하도록 한다.

 

 

5. LCEL로 RAG 구축하기

728x90