랭체인 (LangChain) 개념과 실습

ddurru·2024년 6월 19일
0

랭체인 (LangChain)

목록 보기
1/2
post-thumbnail

랭체인(LangChain)이란 무엇이며, 왜 쓰이는 것일까? 🧐

00. 배경

  • OpenAI의 ChatGPT, Google의 Gemini, 네이버의 하이퍼클로바X와 같이 수많은 언어 모델이 계속해서 새롭게 나타나고 있다.
    서비스를 만들고자 할 때, 기능 요구사항에 따라서 특정 LLM을 사용하더라도 추후 다른 LLM 모델로 바꾸고 싶은 니즈가 생길 수 있다.
    그렇다면 프로세스 수정 과정이 필요하게 될 것이고, 이러한 과정을 쉽게 변경할 수 있는 방법은 없을까?
  • GPT 앱을 구축하려면 OpenAI 파이썬 패키지를 사용함과 동시에 챗봇에 메모리 추가, 프롬프트 형식 지정, 유효성 검사, 출력 파싱, 벡터 저장소 연동 등 추가적인 과정이 필요하다. 랭체인의 경우, 앞서 언급한 모든 과정에 대한 기능과 그 이상의 기능이 존재한다.
    모델부터 프롬프트, 출력 파서, 벡터 저장소, 임베딩 모델, 에이전트, 툴킷, 모니터링, 디버깅, 병렬화 등 ...
    여러 복수 시스템이나 툴을 이용해야 하는 요구사항이 발생하는 경우, 통합할 수 있는 환경을 만들 수 없을까?

01. 개념 및 기능 : 자연어 처리 혁신을 위한 새로운 프레임워크

위와 같은 배경 상황들을 기반으로 2022년 10월 해리슨 체이스가 랭체인을 출시하게 되었다.

랭체인에 대한 설명은 다음과 같다.

  • 자연어 처리(NLP) 모델을 중심으로 하는 프레임워크로, 대형 언어 모델(LLM)을 활용하여 다양한 언어 작업을 수행하는 데 사용
  • LLM을 중심으로 데이터 흐름, 변환, 조작 등을 수행하는 기능을 제공하며 이를 통해 복잡한 언어 작업을 간단하게 처리 가능
  • 언어 모델 기반 애플리케이션을 매우 쉽고 빠르게 구축할 수 있도록 미리 만들어진 수많은 구성 요소와 모듈이 포함된 프레임워크
  • LLM 기반 애플리케이션에 필요한 모든 구성 요소 간 호환성 레이어와 같은 역할
  • LLM 대부분을 위한 일반적인 인터페이스로 LLM 애플리케이션을 구축한 이후 통합할 수 있는 중앙 집중식 개발 환경을 갖춤

02. 기본 구성 요소

랭체인은 추상화(abstraction)를 통해 LLM 애플리케이션의 프로그래밍을 간소화하는 역할을 수행한다.

추상화?...🤔

자동차 예시를 통해 이해해 보자.

우리는 자동차 시동을 켜기 위해 엔진이 어떻게 동작하는지, 다른 부품과는 어떻게 연결이 되어져 있는지 알 필요가 없다. 자동차의 내부 구현과 로직은 사용자로부터 숨겨져 있다. 사용자는 자동차의 내부 동작 원리를 알 필요가 없다.

즉, 추상화는 사용자에게 불필요한 세부 사항을 숨겨 복잡성을 처리하는 것이 목표이며 이를 통해 사용자는 숨겨져 있는 복잡성을 모두 이해하지 않아도 제공된 추상화 위에서 본인만의 로직을 구현할 수 있다.

랭체인의 추상화란 결국 언어 모델을 사용하는 데 필요한 일반적인 단계와 개념을 나타내며, 언어 모델(language model)을 연결(chain)하여 애플리케이션 을 만들 수 있으므로 복잡한 NLP 작업을 실행함에 있어 코드의 양을 최소화할 수 있다!
(* Language Model + Chain = LangChain)

랭체인은 LLM을 효율적으로 사용하기 위해 아래와 같이 여러 추상화 된 요소들을 제공하며, 내용은 다음과 같다.

1. 모델 (Models)

  • 주로 GPT-3 같은 대형 언어 모델(LLM)을 사용하며, 텍스트 생성, 요약, 번역 등의 다양한 언어 작업을 수행한다.

2. 프롬프트 (Prompts)

  • LLM이 태스크 수행을 할 수 있도록 전달하는 명령어로 LLM의 출력을 제어하는 데 중요한 역할을 한다.
  • 랭체인에 명령을 잘 전달하기 위해서는 프롬프트 템플릿 클래스를 이용해야 한다.

3. 인덱스 (Indexes)

  • 데이터 콘텐츠에 대한 정보를 저장하는 고유한 데이터 구조로 각 문서에서 발견된 용어, 데이터셋 내 문서의 위치, 문서 간의 관계 등이 포함될 수 있다.
  • 즉, 특정 작업을 수행하기 위한 애플리케이션이 모델 학습 데이터 셋에 포함되지 않은 특정 외부 데이터를 총칭하여 인덱스라고 한다.
  • 인덱스 기능을 이루는 요소는 다음과 같다.
    도큐먼트 로더 (Document Loaders), 벡터 DB (Vector Database), 텍스트 스플리터 (Text Splitters)

4. 메모리 (Memory)

  • LLM이 나중에 접근할 수 있는 데이터를 저장하는 방법을 말한다.
  • 다시 말해 메모리는 사용자가 LLM과 프롬프트 기반의 대화를 하는 동안 사용자의 정보를 포함하여 대화에 대한 주요 사실을 기억하고 향후 상호 작용에 있어 해당 정보를 적용할 수 있게 된다.
  • 간단히 말하자면 대화 내용을 저장하고 처리하는 것으로, 이를 통해 본인이 누구인지 인지하며 대화의 문맥을 기억하고 이해하면서 대화를 할 수 있다.
  • 기본적으로 LLM은 입력으로 채팅 결과를 전달하지 않는 한 이전 대화에 대한 장기적인 메모리를 가지고 있지 않지만 랭체인은 애플리케이션에 메모리를 추가하는 방법으로 이러한 문제를 해결할 수 있다. (대화 전체 기억하는 옵션, 지금까지 한 대화에 대한 요약만을 기억하는 옵션 존재)
  • 따라서 이전 체인 결과, 현제 체인의 컨텍스트, LLM이 필요로 하는 기타 정보가 포함될 수 있으며 이를 통해 애플리케이션은 현재 대화의 컨텍스트를 추적할 수 있게 된다.

5. 체인 (Chains)

  • 랭체인 프레임워크가 작업을 수행하기 위해 실행하는 명령어 시퀀스로 이를 통해 애플리케이션 요구 사항에 따라 다른 랭체인 구성 요소를 연결할 수 있는 역할을 한다.
  • 즉 체인은 LLM을 다른 구성 요소와 결합하여 일련의 태스크를 실행함으로써 애플리케이션을 생성하는 데 도움을 주며 이를 통해 프레임워크는 다양한 작업을 수행할 수 있게 된다.
  • 체인은 말 그대로 연결 고리를 만드는 것인데 이는 랭체인 워크플로우의 핵심이다!

6. 에이전트와 도구 (Agents and Tools)

  • 에이전트는 텍스트 생성, 언어 번역, 질문 응답과 같은 특정 작업을 수행할 수 있는 재사용 가능한 구성 요소를 말한다.
  • 쉽게 설명을 하자면 대표 에이전트 서비스는 챗봇이라고 생각하면 된다.
  • 랭체인의 에이전트는 LLM과 다른 데이터 소스, 도구 등을 조합하여 사용이 가능하며 선택한 LLM을 추론 엔진으로 사용하여 어떤 작업을 수행할지 결정할 수 있게 된다.
  • 에이전트 구축 시, 에이전트가 사용 가능한 도구 목록, 프롬프트 및 쿼리와 같은 사용자 입력, 이전에 실행된 기타 관련 단계를 입력으로 제공할 수 있다.
  • 구는 다양한 에이전트를 개발하는 데 도움이 되는 함수 라이브러리이다.

03. RAG과 랭체인의 장점 : LLM 서비스 제작 시 왜 랭체인이 필요할까?

랭체인의 장점을 살펴보기 이전에 앞서 LLM의 한계에 대해 알아볼 필요성이 있다.

LLM은 다음과 같은 한계점을 지니고 있다.

  1. 할루시네이션(hallucination : AI 모델이 정확하지 않거나 사실이 아닌 정보를 생성하는 것) 혹은 답변의 정확성
  2. 스냅샷(Snapshot : 특정 시점에 모델 학습을 종료하고 서비스로 배포하는 것) 시점을 기준으로, 그 이후 받아들이는 정보
    에 대한 답변이 어려움
  3. 개인 혹은 기업의 내부 정부를 학습하지 않은 경우 원활한 답변이 어려움

따라서 대부분 LLM API만을 이용하여 서비스를 만들지 않으며 RAG(Retrieval-Augmented Generation) 아키텍처를 구축하여 할루시네이션을 제어하고 기업의 데이터도 함께 활용할 수 있도록 하고자 한다.
즉, RAG이란 LLM API를 이용할 때 개인/기업의 데이터도 함께 활용하기 위한 아키텍처를 말한다.

그렇다면 할루시네이션을 어떻게 제어할 수 있을까?

RAG(Retrieval-Augmented Generation)은 검색 기반 모델을 생성형 언어 모델에 결합하여 생성된 텍스트의 질과 정확성을 향상시키는 기술이다.

이를 통해 외부 소스에서 가져온 정보를 활용하여 더 맥락에 맞는, 정확한 응답을 생성할 수 있도록 한다. RAG은 외부 데이터 소스를 활용하여 생성된 결과물의 품질과 다양성을 높일 뿐 아니라 라벨링된 데이터에 의존하지 않으면서도 모델의 작동 방식이나 데이터의 특징을 크게 변경하지 않고 유연성을 제공한다.

이러한 RAG을 제공하는 모듈에는 랭체인이 있는 것이다!

하지만 꼭 랭체인이어야 할까? 🧐
랭체인을 이용하지 않고도 LLM 서비스를 만들 수 있다. 하지만 랭체인이 각광받고 있는 이유는 다음과 같다.

랭체인의 장점

  • 쉽고 빠르게 서비스 결과물 도출 가능
  • 무료 버전

반면, 랭체인의 단점은 다음과 같다.

랭체인의 단점

  • 빠르게 변하는 기술로 인해 버그가 자주 발생
  • 기술 변화 시점에서 사용자에게 알림을 주지 않아 사전 준비 시간의 부족

OpenAI API의 경우 변경이 잦으며 지속적으로 모델을 업그레이드하다 보니 새로 출시되는 모델이 많다. 또한 기존 모델 서비스를 제공한지 않는 경우도 발생한다.
또한 코드 수정이 잦다면 이는 단점으로 다가올 수도 있다.

하지만 빠른 변화에 유연하게 대처할 수 있는 능력을 키워 랭체인을 활용한 LLM 서비스를 개발해 나가는 것 또한 중요한 역량으로 자리잡지 않을까 싶다.

우선 서비스를 개발한 후, 사용자들에게 사용성 평가를 받은 후 솔루션을 도입해 나간다면 큰 발전이 있을 것이라고 생각한다.

04. [실습] 작은 번역기 챗봇 만들기 (Google Colab 환경)

작은 번역기 챗봇을 생성하는 실습을 통해 동작 과정에 대해 이해를 해 볼수 있도록 하고자 하였다.

영어로 입력된 내용을 한글로 바꾸는 챗봇을 만들어보자.

실습은 Colab 환경에서 진행 되었으며 다음과 같이 단계별로 수행하면 될 것이다.

*추가로 API KEY 발급 과정을 아래에 작성해 두었다!
1. 필요 라이브러리 설치
pip install openai
pip install openai langchain 
pip install openai==0.28 
pip install langchain-openai
2. 클래스 가져오기
from langchain.prompts import ChatPromptTemplate # ChatPromptTemplate 클래스 가져오기 
from langchain.chat_models import ChatOpenAI # ChatOpenAI 클래스 가져오기
3. 메세지로 구성된 프롬프트 구성
# 메세지로 구성된 프롬프트 구성 
prompt = ChatPromptTemplate.from_messages(
    [
        (
            # AI의 기본값과 작동 방식 설정 
            # AI에게 번역 봇 역할 
            "system",
            "You are a translator bot. Translate sentences from {source_language} to {target_language}.",             
        ), 
        (
            # 번역을 원하는 문장에 해당하는 변수 
            "human",
            "Translate this: {sentence}",
        ),
    ]
)

chat = ChatOpenAI(
    temperature=0.1, # 낮을수록 응답의 무작위성을 줄일 수 있음 
    openai_api_key="_YOUR_API_KEY_",  # API key 추가 
    model_name="gpt-3.5-turbo", # 모델 선택

)
4. 체인 생성
# 체인 생성 (액션 순서 지정)
# 파이프 연산자(|)는 각 구성요소를 다음 구성요소로 연결하고 실행시킴 
# LangChainExpression Language(LCEL) : 여러 단계로 이루어진 매우 복잡한 체인을 구성할 수 있으며, 체인을 다른 체인과 연결하여 병렬로 실행 가능 
# chair = prompt | chat | output_parser # 랭체인은 프롬프트의 형식 지정 > 채팅 모델에 전달 > 결과를 출력 파서를 통해 실행 
chain = prompt | chat # prompt 형식 지정 > prompt를 LLM에 전달 
5. 체인 실행
# response = chain.invoke() # invoke 메서드를 사용하여 체인 실행 
# 입력값 유효성 검사 필요 
# 템플릿은 필요한 모든 입력이 있는지 선 검증 과정을 필수로 함 
# source_language, target_language, sentence
# 템플릿에 필요한 변수 제공 
response = chain.invoke(
    {
    "source_language": "en",
    "target_language": "ko",
    "sentence": "I love you",
    }
) 

print(response)
6. 결과물
이후 실행을 하면 다음과 같이 결과가 나오게 된다. 
👉🏻 content='나는 너를 사랑해.' ~~~~
* API KEY 발급 과정
1. URL 클릭 >>> https://platform.openai.com/account/api-keys 
2. 로그인 후, 오른쪽 상단 Create new secret key 클릭! 
3. 채워줘야 할 칸과 설정을 마친 후, Create secret key을 클릭하면 API KEY 값을 Copy할 수 있다. (* 이후 생성된 키는 조회가 불가능하니 자신만의 공간에 저장해두자) 
4. 이후, 결제를 하면 사용이 가능하다.  

05. 전체 코드

이를 통해 작동 원리에 대해서 어느 정도 이해가 갔길 바라며, 직접 입력을 통해 번역을 하는 과정을 담은 수정된 코드도 추가해 두었다. 🙂

import openai
import os

# 환경 변수 설정 
os.environ["OPENAI_API_KEY"] = "_YOUR_API_KEY_"

# OpenAI API 가져오기 
openai.api_key = os.getenv("OPENAI_API_KEY")

# 번역 함수 작성
def translate_text(source_language, target_language, sentence):
    prompt = [
        {
            "role": "system",
            "content": f"You are a translator bot. Translate sentences from {source_language} to {target_language}.",
        },
        {
            "role": "user",
            "content": f"Translate this: {sentence}",
        },
    ]

    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=prompt,
        temperature=0.1,
    )

    translated_text = response['choices'][0]['message']['content'].strip()
    return translated_text

# 사용자 입력 받기
source_language = input("Enter the source language: ")
target_language = input("Enter the target language: ")
sentence = input("Enter the sentence to translate: ")

# 번역 수행
translated_sentence = translate_text(source_language, target_language, sentence)

# 번역 결과 출력
print(f"Translated sentence: {translated_sentence}")
결과물
Enter the source language: en
Enter the source language : ko
Enter the sentence to translate : i love you 
Translated sentence: 나는 너를 사랑해 

🔗

10분 만에 랭체인(LangChain) 이해하기
[LLM] 생성형 AI - 랭체인 구성요소 공부하기: AI 언어 모델의 혁신적 활용
LLM 서비스 제작에 왜 랭체인이 필요할까?
RAG, 랭체인 그게 뭔데??
노마드 코더 : 아직도 '랭체인'을 모른다고 해서 5분 설명해드림

profile
2024.04.15 ~

0개의 댓글