AI

Langchain 사용하기 - 03. Sequential chain

김덕꾸 ㅣ 2024. 8. 14. 14:35

이전 글 보기 👇

 

Langchain 사용하기 - 02. prompt template 정의

이전 글은 여기서 볼수있다.https://musej.tistory.com/9?category=1179483 prompt template 정의✅prompt 란 ?AI 의 답변을 받을 때 요구하는 답변 가이드. 자세하게 적을 수록 좀 더 세밀하고 요구사항에 가까운 답

musej.tistory.com

✅ Sequential chain 이란?

Langchain 에서 제공하는 체인 유형 중 하나로, 여러 개의 체인을 순차적으로 실행할 수 있게 해주는 도구.

복잡한 작업을 여러 단계로 나누어 처리할 때 유용하다.

✅ Sequential chain 주요 특징

  1. 모듈성 : 각 단계를 독립적인 체인으로 구성하여 모듈화 할 수 있다.
  2. 유연성 : 필요에 따라 체인을 추가하거나 제거할 수 있다.
  3. 명확성 : 복잡한 프로세스를 논리적 단계로 분리하여 이해하기 쉽다.
  4. 재사용성 : 개별 체인을 다른 Sequential chain 에서도 재사용할 수 있다.

기본 설정

from langchain.chains.llm import LLMChain
from langchain.chains.sequential import SequentialChain
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
import os
from dotenv import load_dotenv
load_dotenv()
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

# Temperature 설정
openai = ChatOpenAI(model="gpt-3.5-turbo",
                    api_key=OPENAI_API_KEY, temperature=0.7)

기본 설정에 대한 설명은 앞선 포스팅을 참고하면 된다.

Prompt Template 설정

# 리뷰 요약
prompt1 = PromptTemplate.from_template(
    "다음 식당 리뷰를 한 문장으로 요약하세요.\n\n{review}"
)
chain1 = LLMChain(llm=openai, prompt=prompt1, output_key="summary")

# 감정 점수 평가
prompt2 = PromptTemplate.from_template(
    "다음 식당 리뷰를 읽고 0점부터 10점 사이에서 부정/긍정 점수를 매기세요. 숫자만 대답하세요.\n\n{review}"
)
chain2 = LLMChain(llm=openai, prompt=prompt2, output_key="sentiment_score")

# 리뷰에 대한 답변 작성
prompt3 = PromptTemplate.from_template(
    "다음 식당 리뷰 요약에 대해 공손한 답변을 작성하세요.\n리뷰 요약:{summary}"
)
chain3 = LLMChain(llm=openai, prompt=prompt3, output_key="reply")

prompt1에 대한 체인은 chain1, prompt2 에 대한 체인은 chain2, prompt3 에 대한 체인은 chain3으로 작성한 뒤 

Chain 설정

all_chain = SequentialChain(
    chains=[chain1, chain2, chain3],
    input_variables=['review'],
    output_variables=['summary', 'sentiment_score', 'reply'],
)

# 사용할 식당 리뷰
review = """
이 식당은 맛도 좋고 분위기도 좋았습니다. 가격 대비 만족도가 높아요.
하지만, 서비스 속도가 너무 느려서 조금 실망스러웠습니다.
전반적으로는 다시 방문할 의사가 있습니다.
"""

여기서 모든 체인을 SequentialChain 내장 함수를 활용해 연결해 주었다.

Chain 실행

try:
    result = all_chain.invoke(input={'review': review})
    print(f'summary 결과 \n {result["summary"]} \n')
    print(f'sentiment_score 결과 \n {result["sentiment_score"]} \n')
    print(f'reply 결과 \n {result["reply"]}')
except Exception as e:
    print(f"Error: {e}")

all_chain.invoke로 실행하여 결과를 확인하면 아래와 같다.

결과

summary 결과

sentiment_score 결과

reply 결과

두번 돌려보니 reply 부분은 미세하게 달라진 답변을 결과로 준다.