랭체인(LangChain)이란

대규모 언어 모델(LLM, Large Language Model)을 기반 앱 구축을위한 오픈 소스 프레임워크를 말합니다. 원래 ChatGPT, LLama 등의 LLM을 활용한 애플리케이션을 구축하려면 다음과 같은 작업들을 해줘야 합니다.

 

1) 여러 LLM별로 인터페이스 별도 구성

2) LLM에게 했던 이전 대화 내용 기록을 별도로 저장 및 LLM에게 제공(컨텍스트를 맞춘다고도 합니다)

3) 각종 Data source로부터 데이터를 수집해 LLM을 튜닝 또는 LLM에게 질의하는 파이프라인을 직접 구성

4) 등등..

 

즉 랭체인은 이렇게 LLM 기반의 앱 개발을 좀 더 편하고 빠르게 해줄 수 있도록 하는 "프레임워크"라고 보면 됩니다.

 

 

랭체인 구성 요소

1) LLM 추상화

우리가 객체지향 프로그래밍 시간에 배웠던 추상화 개념과 일치합니다. 자동차를 운전할 때, 어떤 차를 운전하든 핸들을 왼쪽으로 꺾으면 차가 왼쪽으로 가고 핸들을 오른쪽으로 꺾으면 차가 오른쪽으로 간다는 것을 우리는 알고 있습니다. 핸들의 움직임에 따라 내부적으로 어떻게 동작하는지는 우리가 알 필요가 없죠. 어떤 차든간에 핸들의 방향에 따라 차가 나아간다는 것만 알면 됩니다.

마찬가지로 현재 세상에 나온 여러 LLM들은 서로 특성 등이 상이하기 때문에, 애플리케이션에서 사용할 LLM별로 특성 등을 파악하는 것은 매우 번거롭고 힘든 일입니다. 따라서 랭체인은 LLM 추상화를 통해 어떤 LLM을 사용하던 간에 동일한 인터페이스를 우리에게 제공해줌으로써, 우리는 내부적으로 어떤 일이 일어나는지 신경쓸 필요 없이 앱을 구축할 수 있게 해줍니다.

 

2) 프롬프트

프롬프트는 LLM에 전달하는 명령어를 말합니다. 특히 랭체인에는 "프롬프트 템플릿 클래스"라는 것이 있습니다. LLM에게 전달할 컨텍스트와 쿼리, 출력 형식 등을 직접 수동으로 작성할 필요 없이 자동으로 프롬프트의 구성을 구조화(템플릿화)해주는 것이라고 이해하면 됩니다.

 

3) 체인

LLM 기반 앱은 단순히 LLM에게 뭔가를 질의하고 끝나기보다는 여러 태스트들이 이어진 형태로 동작하는 경우도 많습니다. 예를 들어

 

1. 특정 데이터 검색

2. 검색된 데이터 요약

3. 요약된 데이터 기반으로 LLM에게 질의

 

체인은 이 일련의 Task들이 서로 연결될 수 있도록 해주는 것이라고 이해하면 됩니다.

 

4) 인덱스

LLM들은 특정 날짜까지만(ex: 2023년 4월 등)의 데이터를 학습했기 때문에 상황에 따라 잘못된 답변을 내놓을 수 있습니다(이를 할루시네이션이라고도 부릅니다). 이 때 LLM에게 외부의 데이터를 직접 학습시켜서 보다 정확한 답을 내놓을 수 있도록 증강시킬 수 있는데 이를 RAG(Retrieval-Augmented Generation)이라 부릅니다. 이 RAG를 위해서는 외부 데이터 소스에 접근할 수 있는 기능이 필요하며, 랭체인에서는 이를 지원합니다. 이때 랭체인에서 이 외부 데이터들을 쉽게 탐색할 수 있도록 구조화하는 모듈을 인덱스라고 부릅니다.

 

5) 메모리

사용자가 프롬프트로 LLM과 질의를 주고받는 동안, 그 대화의 내용(컨텍스트)을 기억해 향후 적용할 수 있어야 합니다. 기본적으로 LLM은 채팅으로 직접 이전 대화에서의 컨텍스트를 전달해야 하지만, 랭체인은 애플리케이션에 "메모리"를 추가해 직접 채팅으로 컨텍스트를 전달하지 않고도 LLM이 컨텍스트를 기억하도록 해준다고 이해하면 됩니다.

 

6) 에이전트

LLM과 하나 이상의 도구를 결합해, LLM을 통해 수행할 일련의 작업을 선택하는 것이라고 이해하면 됩니다. 

 

 

 

참고글

https://brunch.co.kr/@ywkim36/147

어떠한 데이터들이 주어졌다. 이해를 돕기 위해 이 데이터들은 각각 1개의 원인 x와 1개의 결과 y를 가진다고 하자. 그럼 다음과 같이 좌표평면에 나타낼 수 있다.

그리고 이 데이터(검은 점들)을 대표하는 선이 있다고 하면 어떨까?

이 선을 이용한다면, 우리가 가지고 있지 않은 데이터가 있다고 해도 그 데이터의 x값을 이용해 y값을 예측해낼 수 있다. 

 그러나 과연 어떤 선이 '이 데이터들을 대표하는 선'이라 할 수 있느냐는 문제에 직면하게 된다. 이 선도 저 선도 어제 그은 그 선도 다 대표하는 선이라고 갖다 붙일 수 있을텐데 말이다. 이 때, 이 데이터들을 대표하는 선을 다음과 같이 정의한다면 어떨까.

 

"실제 데이터와의 오차들의 합이 가장 작은 선"

 

이렇게 되면 무수히 많은 선들 중 이 데이터를 대표하는 선은 딱 하나가 된다. 실제 데이터과의 오차란, 같은 x에 대해 내가 그은 선에서의 y값과 실제 데이터의 y값과의 차이를 의미한다. 따라서 임의의 직선 y = ax + b가 있을 때, 실제 데이터들과의 오차들의 합이 가장 작게 되는 a와 b를 찾게 된다면 이를 통해 임의의 x값에 대한 y값을 예측 가능하다. 이를 선형 회귀라 하며 영어로는 Linear Regression이라 한다.

 

참고 : 실제 데이터와의 오차들의 합이 가장 작으면 실제 데이터와의 오차 평균이 가장 작은 선이라고 할 수 있다. 또한 엄밀하게 말하자면 오차들은 양수가 될 수 있지만 음수가 될 수도 있으므로 오차합을 따지는 건 적절치 않다. 따라서 오차의 제곱들의 평균이 제일 작게 되는 선이라고 표현하는게 정확하다. 아니면 뭐 오차의 절댓값의 합이 가장 작은 이렇게 편하게 가도 되고..

 

그럼 관건은 이 a와 b값을 도대체 어떻게 찾느냐는 것이다. 최소 제곱법이란 공식을 통해 기울기 a와 y절편 b를 바로 구할 수 있는 방법이 있지만 세상은 그리 녹록치 않다. 방금까지는 일차함수 y = ax + b꼴만을 얘기했으니 원인에 해당하는 값이 1개인 경우만 본 거지만 실제 세상은 하나의 원인만으로 결과가 만들어지지 않기 때문이다. 즉 최소 제곱법으로 a와 b를 직빵으로 구하는 방법을 쓰기엔 처리해야할 입력값들이 너무 많은 것. 

 

그럼 도대체 어떻게 a, b를 찾으라는 건데? 그건 바로

 

"일단 선 하나 그어봐. 그리고 수정해 나가자고"

 

이거다. 가설을 하나 세운 후 이 가설이 주어진 요건을 충족하는지 따져보고, 조금씩 수정해보며 변화가 긍정적인 쪽으로 수정해나가며 오차가 최소가 될 때까지 반복해보는 것. 이것을 하는 대표적인 방법으로 경사하강법이 있으며, 이는 다음 글에서 소개하겠다.

+ Recent posts