LangChain으로 텍스트 변환과 요약하기: 맞춤형 처리 및 요약 기법

GoGoComputer·2024년 11월 7일
0

LangChain Basics

목록 보기
26/40
post-thumbnail

안녕하세요! 오늘은 LangChain 라이브러리를 활용하여 텍스트 데이터를 변환하고 요약하는 방법에 대해 자세히 알아보겠습니다. 이 과정을 통해 여러분은 맞춤형 파이썬 함수를 사용하여 텍스트를 전처리하고, 대형 언어 모델(LLM)을 사용하여 요약하는 방법을 배우게 될 것입니다.

1. 개요

우리는 Yelp 리뷰 텍스트를 받아서 다음과 같은 작업을 수행할 것입니다:

  • 텍스트 전처리: 리뷰에서 불필요한 부분을 제거하고, 모든 문자를 소문자로 변환합니다.
  • 요약 생성: 전처리된 리뷰를 한 문장으로 요약합니다.

이 과정에서 TransformChainLLMChain, 그리고 이 둘을 연결하는 SimpleSequentialChain을 사용합니다.

2. 필요한 라이브러리 설치

먼저 필요한 라이브러리를 설치해야 합니다. 터미널에서 다음 명령어를 실행하세요:

pip install langchain openai python-dotenv
  • langchain: 체인들을 사용하여 언어 모델 작업을 쉽게 할 수 있게 해주는 라이브러리입니다.
  • openai: OpenAI의 API를 사용하기 위한 라이브러리입니다.
  • python-dotenv: .env 파일에서 환경 변수를 불러오기 위한 라이브러리입니다.

3. OpenAI API 키 설정

OpenAI API를 사용하기 위해서는 API 키가 필요합니다. 이 키는 .env 파일에 저장하고 코드에서 불러오도록 하겠습니다.

.env 파일 생성

프로젝트 디렉토리에 .env 파일을 생성하고 다음과 같이 작성합니다:

OPENAI_API_KEY=your_openai_api_key_here

your_openai_api_key_here 부분을 실제 API 키로 대체하세요.

4. Yelp 리뷰 파일 준비

yelp_review.txt라는 텍스트 파일을 생성하고, 여기에 임의의 Yelp 리뷰를 작성합니다. 예를 들어:

TITLE: 최고의 식당!
RATING: 5
REVIEW: 이 식당은 정말 놀라웠어요. 서비스도 훌륭했고 음식도 맛있었어요.

이 파일은 코드에서 불러와서 처리하게 됩니다.

5. 코드 설명

이제 코드의 각 부분을 자세히 살펴보겠습니다.

5.1 라이브러리 임포트

from langchain.chains import TransformChain, LLMChain, SimpleSequentialChain
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from dotenv import load_dotenv
import os
  • TransformChain: 입력 데이터를 변환하기 위한 체인입니다.
  • LLMChain: 대형 언어 모델을 호출하기 위한 체인입니다.
  • SimpleSequentialChain: 여러 체인을 순차적으로 연결합니다.
  • ChatOpenAI: OpenAI의 채팅 모델을 사용하기 위한 클래스입니다.
  • ChatPromptTemplate: 프롬프트를 생성하기 위한 템플릿입니다.
  • load_dotenv, os: 환경 변수를 불러오기 위한 라이브러리입니다.

5.2 환경 변수 로드

load_dotenv()

.env 파일에 저장된 환경 변수를 로드합니다.

5.3 OpenAI API 키 설정

import openai
openai.api_key = os.getenv('OPENAI_API_KEY')

환경 변수에서 OPENAI_API_KEY를 가져와 OpenAI API 키로 설정합니다.

5.4 Yelp 리뷰 불러오기

yelp_review = open('yelp_review.txt', 'r', encoding='utf-8').read()
print("원본 리뷰:\n", yelp_review)
  • yelp_review.txt 파일을 읽어옵니다.
  • 원본 리뷰를 출력하여 확인합니다.

5.5 변환 함수 정의

def transformer_fun(inputs: dict) -> dict:
    '''
    이 함수는 입력 사전을 받아서 변환된 출력 사전을 반환합니다.
    '''
    text = inputs['text']
    only_review_text = text.split('REVIEW:')[-1]
    lower_case_text = only_review_text.lower()
    return {'text': lower_case_text}
  • inputs['text']: 입력 사전에서 텍스트를 가져옵니다.
  • text.split('REVIEW:')[-1]: 'REVIEW:'를 기준으로 문자열을 분할하고, 리뷰 부분만 가져옵니다.
  • lower_case_text = only_review_text.lower(): 리뷰 텍스트를 모두 소문자로 변환합니다.
  • return {'text': lower_case_text}: 변환된 텍스트를 사전 형태로 반환합니다.

5.6 TransformChain 생성

transform_chain = TransformChain(
    input_variables=['text'],
    output_variables=['text'],
    transform=transformer_fun
)
  • input_variables: 입력 변수 이름을 지정합니다.
  • output_variables: 출력 변수 이름을 지정합니다.
  • transform: 사용할 변환 함수를 지정합니다.

5.7 프롬프트 템플릿 생성

template = "다음 리뷰를 한 문장으로 요약해 주세요:\n{text}"
prompt = ChatPromptTemplate.from_template(template)
  • template: LLM에 전달할 프롬프트 템플릿입니다.
  • {text}: 변환된 리뷰 텍스트가 들어갈 자리입니다.

5.8 LLMChain 생성

llm = ChatOpenAI()
summary_chain = LLMChain(
    llm=llm,
    prompt=prompt,
    output_key="review_summary"
)
  • llm=llm: 사용할 LLM을 지정합니다.
  • prompt=prompt: 사용할 프롬프트를 지정합니다.
  • output_key: 출력 결과의 키를 지정합니다.

5.9 SimpleSequentialChain 생성

sequential_chain = SimpleSequentialChain(
    chains=[transform_chain, summary_chain],
    verbose=True
)
  • chains: 실행할 체인들을 순서대로 지정합니다.
  • verbose=True: 실행 과정을 자세히 출력합니다.

5.10 체인 실행 및 결과 확인

result = sequential_chain(yelp_review)
result_dict = {"review_summary": result}
print("\n요약 결과:\n", result_dict["review_summary"])
  • sequential_chain.run({'text': yelp_review}): 입력 텍스트를 체인에 전달하여 실행합니다.
  • result: 최종 결과를 받아옵니다.
  • 요약 결과를 출력합니다.

6. 전체 코드

아래는 위의 모든 내용을 포함한 전체 코드입니다.

from langchain.chains import TransformChain, LLMChain, SimpleSequentialChain
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from dotenv import load_dotenv
import os
import openai

# 환경 변수 로드
load_dotenv()

# OpenAI API 키 설정
openai.api_key = os.getenv('OPENAI_API_KEY')

# Yelp 리뷰 불러오기
yelp_review = open('yelp_review.txt', 'r', encoding='utf-8').read()
print("원본 리뷰:\n", yelp_review)

# 변환 함수 정의
def transformer_fun(inputs: dict) -> dict:
    '''
    이 함수는 입력 사전을 받아서 변환된 출력 사전을 반환합니다.
    '''
    text = inputs['text']
    only_review_text = text.split('REVIEW:')[-1]
    lower_case_text = only_review_text.lower()
    return {'text': lower_case_text}

# TransformChain 생성
transform_chain = TransformChain(
    input_variables=['text'],
    output_variables=['text'],
    transform=transformer_fun
)

# 프롬프트 템플릿 생성
template = "다음 리뷰를 한 문장으로 요약해 주세요:\n{text}"
prompt = ChatPromptTemplate.from_template(template)

# LLMChain 생성
llm = ChatOpenAI()
summary_chain = LLMChain(
    llm=llm,
    prompt=prompt,
    output_key="review_summary"
)

# SimpleSequentialChain 생성
sequential_chain = SimpleSequentialChain(
    chains=[transform_chain, summary_chain],
    verbose=True
)

# 체인 실행 및 결과 확인
result = sequential_chain(yelp_review)
result_dict = {"review_summary": result}
print("\n요약 결과:\n", result_dict["review_summary"])

7. 실행 결과 예시

코드를 실행하면 다음과 같은 과정이 출력됩니다:

  • 원본 리뷰가 출력됩니다.
  • TransformChain이 실행되어 리뷰 텍스트가 전처리됩니다.
  • LLMChain이 실행되어 전처리된 텍스트를 요약합니다.
  • 최종 요약 결과가 출력됩니다.

예를 들어, 원본 리뷰가 다음과 같다면:

TITLE: 최고의 식당!
RATING: 5
REVIEW: 이 식당은 정말 놀라웠어요. 서비스도 훌륭했고 음식도 맛있었어요.

전처리된 텍스트는:

 이 식당은 정말 놀라웠어요. 서비스도 훌륭했고 음식도 맛있었어요.

요약 결과는:

이 식당은 서비스와 음식이 훌륭한 최고의 장소입니다.

8. 마무리

이렇게 LangChain 라이브러리를 사용하여 맞춤형 변환 함수와 대형 언어 모델을 연결하는 방법을 배웠습니다. 이 방법을 통해 다양한 전처리 작업과 LLM을 활용한 텍스트 처리를 효율적으로 수행할 수 있습니다.

여러분의 프로젝트에 응용해 보시길 바랍니다. 감사합니다!


부록: yelp_review.txt

TITLE: AN ABSOLUTE DELIGHT! A CULINARY HAVEN!

REVIEW:
OH MY GOODNESS, WHERE DO I BEGIN? THIS RESTAURANT IS ABSOLUTELY PHENOMENAL! I WENT THERE LAST NIGHT WITH MY FRIENDS, AND WE WERE BLOWN AWAY BY THE EXPERIENCE!

FIRST OF ALL, THE AMBIANCE IS OUT OF THIS WORLD! THE MOMENT YOU STEP INSIDE, YOU'RE GREETED WITH A WARM AND INVITING ATMOSPHERE. THE DECOR IS STUNNING, AND IT IMMEDIATELY SETS THE TONE FOR AN UNFORGETTABLE DINING EXPERIENCE.

NOW, LET'S TALK ABOUT THE FOOD! WOW, JUST WOW! THE MENU IS A PARADISE FOR FOOD LOVERS. EVERY DISH WE ORDERED WAS A MASTERPIECE. THE FLAVORS WERE BOLD, VIBRANT, AND EXPLODED IN OUR MOUTHS. FROM STARTERS TO DESSERTS, EVERY BITE WAS PURE BLISS!

THEIR SEAFOOD PLATTER IS A MUST-TRY! THE FRESHNESS OF THE SEAFOOD IS UNMATCHED, AND THE PRESENTATION IS SIMPLY STUNNING. I HAVE NEVER TASTED SUCH DELICIOUS AND PERFECTLY COOKED SEAFOOD IN MY LIFE. IT'S A SEAFOOD LOVER'S DREAM COME TRUE!

THE SERVICE WAS EXEMPLARY. THE STAFF WAS ATTENTIVE, FRIENDLY, AND EXTREMELY KNOWLEDGEABLE ABOUT THE MENU. THEY WENT ABOVE AND BEYOND TO ENSURE THAT WE HAD THE BEST DINING EXPERIENCE POSSIBLE.

AND LET'S NOT FORGET ABOUT THE DESSERTS! OH MY, OH MY! I HAD THEIR SIGNATURE CHOCOLATE LAVA CAKE, AND IT WAS PURE HEAVEN. THE CAKE WAS MOIST, AND WHEN I CUT INTO IT, THE WARM CHOCOLATE OOOZED OUT, CREATING AN EXPLOSION OF FLAVOR IN MY MOUTH. IT WAS LIKE A SYMPHONY OF CHOCOLATEY GOODNESS!

IN CONCLUSION, THIS RESTAURANT IS A HIDDEN GEM! IF YOU WANT TO INDULGE IN A MEMORABLE DINING EXPERIENCE, DO YOURSELF A FAVOR AND VISIT THIS PLACE. YOU WON'T REGRET IT! I CAN'T WAIT TO GO BACK AND TRY MORE OF THEIR DELECTABLE DISHES. KUDOS TO THE ENTIRE TEAM FOR CREATING SUCH A CULINARY HAVEN!

ALL I CAN SAY IS... WOOHOO!
profile
IT를 좋아합니다.

0개의 댓글