본문 바로가기
Tech Insights

LangChain - 초보자를 위한 완벽 가이드

by Kudos IT Daily 2023. 10. 14.
반응형

LangChain - 초보자를 위한 완벽 가이드

목차

  • 폭발적으로 증가하는 LLM 플랫폼
  • 그래서 랭체인은 무엇일까?
  • 랭체인의 주요 모듈
  • 랭체인 실습 예제
  • 마치며

 

폭발적으로 증가하는 LLM 플랫폼

안녕하세요. 오늘 포스팅에서 다룰 주제는 핫한 랭체인입니다. ChatGPT 출시 이후, LLM(Large Language Model)이 점점 유행세를 타고 있습니다. 새로운 LLM 기반의 도구와 플랫폼이 시장에 하루를 마다하고 출시되고 있습니다. LLM은 챗봇이나 문서 분석이나 요약, 심지어 요즘은 이미지, 음성을 포함한 멀티모달 플랫폼을 만드는 데에도 사용됩니다.

 

LLM과 관련한 연구와 기술개발이 활발히 진행되면서 그에 따른 오픈소스 모델이나 데이터셋 등 이미 잘 훈련이 된 질 좋은 모델이나 정제되어 있는 데이터셋에 쉽게 접근하여 활용할 수 있습니다. 따라서, train from scratch, 즉, 모델을 처음부터 훈련시킬 필요 없이 사전에 훈련된 파라미터와 데이터를 통해 모델을 생성하기가 너무 좋은 시대입니다. 또한, 단순히 모델이나 데이터셋뿐만 아니라 LLM을 개발하기 위한 수많은 프레임워크가 시장에 출시되고 있습니다. 그중, 대표적인 프레임워크가 오늘 소개드릴 랭체인입니다.

 

이미 많은 개발자들은 랭체인을 통해 LLM 기반의 어플리케이션을 수없이 생산하고 있습니다. Github 저장소의 Star의 추세를 볼 수 있는 Star History 홈페이지를 통해 랭체인 저장소의 Star의 추세를 보면 이미 60k를 넘어서 지속적으로 증가하는 것을 볼 수 있습니다. 이렇듯 LLM 프레임워크가 이미 수많은 개발자들 사이에서 사용되고 있습니다. 저희도 놓칠 수만은 없겠죠? 랭체인의 주요 구성요소와 사용방법에 대한 가이드를 이번 포스팅을 통해 이해하기 쉽도록 전달드리도록 하겠습니다.

 

23.10.13 기준 LangChain Github 저장소 Star 추세

 

그래서 랭체인은 무엇일까?

우선, 랭체인을 쉽게 설명부터 하고 넘어가면 LLM을 활용해서 보다 쉽게 어플리케이션을 만들도록 도와주는 프레임워크입니다. 즉, 저희가 개발하기 용이한 형태로 다양한 모듈이 구성되어 있고, 이러한 모듈들을 조합해서 어플리케이션을 개발할 수 있습니다. 랭체인 프레임워크에서 제공하는 모듈들은 LLM을 활용한 개발을 간편하게 수행할 수 있도록 기능을 제공합니다.

 

이름에 포함된 체인의 단어에 걸맞게 랭체인은 LLM 모델이나 프롬프트 템플릿, Output parser 등 다양한 요소들을 체인처럼 엮어서 쓸 수 있도록 추상화 모듈들을 제공합니다. 이러한 모듈들을 잘 사용한다면 원하는 기능들을 체인처럼 엮어서 다양한 어플리케이션 개발에 활용할 수 있습니다.

 

앞서 말씀드린 것처럼 랭체인의 기능을 잘 활용하기 위해서는 랭체인을 구성하고 있는 주요 모듈에 대한 이해가 필요합니다. 랭체인의 주요 모듈은 Model I/O, Retrieval, Chains, Memory, Agents, Callbacks 6가지로 볼 수 있습니다. 이 핵심 모듈에 대해 아래에서 차근차근 설명할 수 있도록 하겠습니다. 만약, 랭체인에 대해 깊게 이해하시고 싶으신 분들은 랭체인 공식 문서(Docs)를 참고하시면 도움이 되실 겁니다.

 

랭체인의 주요 모듈

랭체인 패키지는 다양한 기본 모델과 컴퍼넌트로 구성이 되어 있습니다. 해당 모듈에서는 확장가능한 인터페이스와 외부 통합 등을 지원합니다. 각 모듈에 대해 하나씩 살펴보도록 하겠습니다.

 

Model I/O

어떤 언어 모델이든 언어 모델의 핵심은 모델이라고 할 수 있습니다. Model I/O는 Prompts, Language Models, Output Parser 세 가지 모듈로 구성되어 있습니다.

  • Prompts: 프롬프트는 모델로부터 응답을 얻어내기 위한 사용자의 입력입니다. 랭체인은 프롬프트에 대한 템플릿을 제공합니다. 프롬프트 템플릿은 프롬프트를 생성하기 위해서 정의된 레시피라고 생각하시면 됩니다.
  • Language models: 랭체인 프레임워크는 LLMs와 Chat Model 두 가지의 모델을 제공합니다. LLMs는 텍스트 문자열을 입력받아 텍스트 출력을 내보내는 형태이고, Chat model은 채팅 메시지 리스트를 입력받아 채팅 메시지를 출력하는 형태이며, 채팅 메시지의 종류에는 Speaker에 따라 "System", "AI", "Human"이 있습니다.
  • Output parser: 기본 언어 모델의 경우는 텍스트를 출력하기 때문에 만약 텍스트 출력을 더 구조화된 형태로 다듬고 싶으신 경우에는 이 Output parser를 사용하시면 됩니다.

 

Retrieval

현재 시중에 나와있는 많은 LLM 어플리케이션에서는 도메인에 특화된 데이터를 많이 사용합니다. 하지만, 이러한 데이터들은 랭체인에서 제공하는 언어모델의 트레이닝 데이터셋에 활용되지 않은 데이터입니다. 따라서, 도메인에 특화된 데이터를 활용하기 위한 방법이 요구되는데, 사용자는 이러한 한계를 RAG(Retrieval Augmented Generation)을 통해 극복할 수 있습니다. 즉, RAG를 활용하면 사전에 학습된 LLM과 도메인 특화된 데이터를 사용해서 답변을 생성할 수 있습니다. 이제 검색 기능에 대한 상세 설명을 진행하겠습니다.

  • Document Loaders: 저희가 사용하는 문서의 형태는 정말 다양합니다. HTML, PDF, code, Json 등 수많은 형태의 문서를 다루는데요. 랭체인은 여러 형태의 문서를 다룰 수 있도록 100개 이상의 Document loaders를 제공합니다.
  • Document transformers: Retreival의 핵심 부분은 문서의 관련 부분을 가져오는 것입니다. Document transformer는 검색 작업을 위해 여러 가지 변환 작업을 수행하는데, 주요 작업 중 하나가 문서를 작은 청크(chunk)로 분할하는 작업입니다. 랭체인은 이러한 작업을 위한 여러 알고리즘을 제공하고, 코드나 마크다운 등에 최적화된 로직도 제공합니다.
  • Text embedding models: 검색 작업 중 주된 항목 중 하나가 임베딩(embeddings)을 생성하는 작업입니다. 임베딩이랑 텍스트의 의미론적 의미(semantic meaning)를 저장해 둔 작은 조각이라고 보시면 되겠습니다. 랭체인은 25개 이상의 임베딩 프로바이더(embedding provider)를 제공합니다. 사용자가 사용하기 편한 형태의 프로바이더를 사용하면 되고, 랭체인에서 표준 인터페이스를 제공하기 때문에 쉽게 바꿔가면서 사용할 수 있습니다.
  • Vector stores: 임베딩을 효과적으로 저장하고 검색하기 위한 데이터베이스가 필요한데, 랭체인은 50가지 이상의 다양한 Vector stores와 통합을 제공합니다. 이 또한, 사용자의 입맛에 맞게 선택해서 사용하시면 되고, 표준 인터페이스를 제공하기 때문에 여러 Vector stores를 전환하며 사용할 수 있습니다.
  • Retrievers: 언어 모델 기반 어플리케이션 개발 시, 데이터베이스 내부에서 어떻게 데이터를 검색해 올지는 중요한 요소입니다. 랭체인에서는 다양한 검색 알고리즘을 지원하고, 성능 향상을 위해 Parent Document Retriever, Self Query Retriever, Ensemble Retriever 등의 기법들도 적용되었습니다.

 

Chains

만약 저희가 간단한 어플리케이션을 개발할 경우, 독립적인 LLM을 사용해서도 개발할 수 있습니다. 하지만 어플레케이션을 확장해서 복잡해지거나 규모가 커질 경우, 여러 LLM을 복합적으로 통합해서 사용해야 할 수 있습니다. 이런 경우에 우리는 Chain 모듈을 통해 여러 컴퍼넌트를 통합해서 사용할 수 있습니다. 이러한 접근 방법은 모듈화 설계에 용이하고 추후 확장성, 유지보수성이 좋은 어플리케이션을 개발할 수 있습니다.

  • LLMChain: LLMCHain은 가장 기초적인 체인의 형태로 프롬프트 템플릿을 활용해 특정 포맷으로 변환된 사용자의 입력을 LLM에 전달 후, LLM으로부터 출력된 응답을 얻어냅니다. LLMChain을 통해 이러한 작업을 복잡한 작업 없이 진행할 수 있습니다.

 

Memory

챗봇과 같은 채팅형 어플리케이션은 LLM을 활용한 대표적인 어플리케이션 사례라고 볼 수 있습니다. 사용자와 LLM 간의 대화는 채팅형 어플리케이션의 주된 역할을 하는데요. 대화에서 중요한 요소 중 하나가 과거에 수행했던 내용을 기억해서 참고하는 것입니다. 이런 작업을 수행하기 위해서 대화를 기억하기 위한 메모리가 요구되는데, 랭체인 내부에서는 이러한 기능을 제공합니다. Chain을 통해 아래의 그림과 같이 메모리와 상호작용하는 기능을 구현할 수 있고, 이를 통해 기억의 기능이 부여된 채팅 어플리케이션을 개발할 수 있습니다.

 

Agents

Agents의 핵심 기능은 언어 모델을 활용해서 어떤 절차를 통해 액션을 수행할지 결정합니다. Chain에서는 이러한 일련의 과정이 하드 코딩되어 있지만, Agents에서는 언어 모델이 이러한 액션을 어떠한 순서로 추론을 통해 결정합니다. Agent의 핵심은 의사 결정에 있습니다. Agent는 언어모델을 사용하여 다른 환경 및 도구와 상호작용을 하고, 의사결정 과정에서 메모리에 데이터를 저장하거나 메모리의 데이터를 검색, 사용하게 됩니다. Agent를 활용함으로써 질문/답변을 하는 어플리케이션이나 API와 상호작용하는 작업이 있는 어플리케이션에 활용될 수 있습니다.

 

Callbacks

랭체인은 Callback 기능을 제공합니다. Callback 기능을 활용해서 이벤트나 특정 시퀀스 제어가 가능하고 기능을 활용해서 로깅, 모니터링, 스트리밍 등 다양한 작업이 가능합니다. 또한, API를 통해 특정 이벤트를 구독해서 사용할 수도 있습니다.

 

랭체인 실습 예제

이번에 살펴볼 랭체인의 예제는 Python을 활용해서 진행하도록 하겠습니다. 실습 예제는 랭체인 공식 문서에서 제공하는 예제로 상세한 내용을 보고 싶으신 경우, 공식 문서를 참고해 주시면 감사하겠습니다.

 

랭체인의 기본 설치 과정은 아래와 같습니다. 프롬프트 템플릿, Output parser는 랭체인 패키지에서 제공하는 기본 기능을 활용해서 진행하도록 하겠습니다. 단, 사용하는 언어모델의 경우, OpenAI의 모델을 사용하기 때문에 API Key가 필요하다는 것을 사전에 말씀드립니다.

 

  • 랭체인 패키지 설치는 아래와 같이 진행합니다.
pip install langchain

 

  • 설치가 완료되면 아래와 같이 언어 모델, 프롬프트 템플릿, Output parser를 임포트 합니다.
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import ChatPromptTemplate
from langchain.schema import BaseOutputParser

 

  • 저희가 사용할 Output parser와 템플릿에 대해 아래와 같이 정의하고 프롬프트를 생성합니다. 프롬프트에서 system에 특정 역할을 부여하고 사용자의 입력을 human을 통해 입력할 예정입니다.
class CommaSeparatedListOutputParser(BaseOutputParser):
    """Parse the output of an LLM call to a comma-separated list."""


    def parse(self, text: str):
        """Parse the output of an LLM call."""
        return text.strip().split(", ")

template = """You are a helpful assistant who generates comma separated lists.
A user will pass in a category, and you should generate 5 objects in that category in a comma separated list.
ONLY return a comma separated list, and nothing more."""
human_template = "{text}"

chat_prompt = ChatPromptTemplate.from_messages([
    ("system", template),
    ("human", human_template),
])

 

  • 마지막으로, OPENAI_API_KEY를 입력하고 Chain을 활용해서 기능을 서로 엮어준 후, chain.invoke를 통해 응답을 얻고자 하는 입력을 입력해 줍니다. 이를 결과로 출력하면 예시와 같은 응답을 얻을 수 있습니다. (앞서 말씀드린 것처럼 해당 기능을 사용하실 경우, API 키가 필요하고 기회가 될 때, API 사용 방법에 대해 다뤄볼 수 있도록 하겠습니다.)
key = "OPENAI_API_KEY" 	  # Replace with your API key
chain = chat_prompt | ChatOpenAI(openai_api_key=key) | CommaSeparatedListOutputParser()
print(chain.invoke({"text": "colors"}))
# >> ['red', 'blue', 'green', 'yellow', 'orange']

 

위의 예제를 통해 랭체인을 활용해서 간단한 기능을 하는 어플리케이션을 구성해 봤습니다. 랭체인 프레임워크를 사용했을 때, 개발자가 직접 구현해야 하는 많은 부분들을 간단하게 활용할 수 있었습니다. 보여드린 예제는 단편적인 예제이고, 랭체인을 검색해 보시면 랭체인을 활용한 다양한 어플리케이션 사례를 살펴보실 수 있습니다.

 

마치며

오늘 포스팅에서는 랭체인이 무엇인지에 대한 내용과 랭체인을 구성하는 기본적인 6가지 모듈에 대해 살펴보았습니다. 또한, 간단한 예제를 통해 랭체인을 활용한 사례를 살펴보았습니다. 랭체인 저장소의 인기를 통해 확인할 수 있듯이 개발자들로부터 상당한 관심을 받고 있는 프레임워크입니다. LLM의 인기가 급상승하고 있는 요즘 랭체인을 활용해 보신다면 빠르게 파급력 있는 어플리케이션을 개발할 수 있을 것 같습니다.

 

추후, 포스팅에서 랭체인을 활용한 어플리케이션 개발 사례를 소개할 수 있도록 준비하겠습니다. 오늘도 제 글을 읽어주셔서 감사합니다. 좋은 하루 보내시길 바랍니다.

반응형