본문 바로가기
글쓰기

LangChain을 이용한 비즈니스 어플리케이션을 고민하다

by zian지안 2023. 4. 28.

ChatGPT의 등장 이후, 인공지능 업계에서는 ChatGPT 어떻게 비즈니스에 활용할지에 대해 많은 고민들이 있었습니다. 일반인들 입장에서는 ChatGPT만으로도 충분히 재미있고 작문, 취미, 업무 등에 도움이 될 수 있지만 비즈니스 입장에서 ChatGPT는 재미있는 장난감일 뿐, 비즈니스 애플리케이션으로 활용하기에는 환각(Hallucination)과 같은 신뢰성 문제가 치명적인 단점이었기 때문입니다.

이런 신뢰성 문제 때문에 ChatGPT이전에도 생성형 챗봇을 비즈니스에 도입하려는 시도들이 있었지만, 결국 비즈니스 영역에서는 사전에 사람에 의해 구축된 지식을 바탕으로 사용자의 질의를 분석한 뒤 정해진 답변을 하는 '분류형 챗봇'을 활용하는 수준에 그치고 있었습니다.

그러나 ChatGPT등장 이후, ChatGPT와 같은 생성형 LLM을 비즈니스 애플리케이션으로 활용하기 위한 다양한 시도들이 이루어졌고, 그 결과물 중의 하나가 오늘 이야기할 LangChain입니다. LangChain 프레임워크에 대한 상세 설명과 실제 개발에 대한 내용은 다른 문서 등에 잘 나와있으니, 여기서는 실제로 LangChain을 비즈니스 애플리케이션으로 활용할 수 있는 방법에 대해 생각해 보려고 합니다.

LangChain이란?

Image Credit: LangChain

LangChain은 새로운 기술은 아닙니다. 공식 문서에도 '언어모델을 이용하여 개발하기 위한 프레임워크(LangChain is a framework for developing applications powered by language models)'라고 명시하고 있습니다. LangChain에 구현되어 있는 개념들은 이미 이전에도 나와있던 기술들이며 LangChain은 언어 처리를 위한 기술들을 하나로 묶은 프레임워크라고 이해하면 되겠습니다.

LangChain은 현재 Python버전Javascript/Typescript버전 2가지로 제공되고 있으니, 자신에게 맞는 언어를 선택하여 손쉽게 LLM기반의 애플리케이션을 만들 수 있습니다.

LangChain의 구성요소

LangChain은 6가지 모듈을 제공하고 있습니다. 6가지 모듈을 쉽게 설명하면,

  • Models: LangChain이 제공하는 다양한 언어모델을 로딩하거나 연동(API를 통해)할 수 있는 기능을 제공합니다.
  • Prompts: 프롬프트를 생성하고 관리합니다.
  • Indexes: 텍스트를 분할하고 벡터화하는 기능을 제공합니다.
  • Memory: 대화 내용을 기억하고 관리하는 기능을 제공합니다.
  • Chains: 단순한 LLM에 질의/답변뿐 아니라 다양한 요소들을 연결하여 구성할 수 있는 기능을 제공합니다.
  • Agents: 다양한 역할과 데이터의 종류 등에 따라 LLM을 다룰 수 있는 기능을 제공합니다.

각 모듈들은 그 성격에 맞는 다양한 기능을 제공하고 있으며 프레임워크에서 제공하는 모듈을 활용하여 의도에 맞게 LLM을 활용한 애플리케이션을 만들 수 있습니다. 

LangChain을 어떻게 활용해야 할까?

단순히 모듈이 있고, 모듈을 잘 써서 애플리케이션을 만든다고 하면 감이 잘 안 오니까, 간단한 애플리케이션 구조를 예시로 들어 보겠습니다.

사용자의 question에 대한 answer를 응답하는 애플리케이션입니다. 애플리케이션은 특정 데이터를 수집하여 보관하고 있으며, LLM은 저장된 데이터를 기반으로 사용자에게 답변을 하게 됩니다.

  1.  원본 Data는 데이터의 맥락별, 문장별로 데이터 분리(Split) 과정을 통해 chuck로 생성됩니다.
  2. 생성된 chunk는 embedding과정을 통해 수치화된 뒤, vectorzie 되어 store에 저장됩니다.
  3. 사용자의 질의(question)는 마찬가지로 embedding을 통해 수치화된 뒤, VectorStore에 저장된 데이터 중 사용자의 질의와 유사한 질의를 찾게(search) 됩니다. 찾아낸 결과(result)는 가장 순위가 높은 데이터의 상위 n개 목록으로 되어있습니다.
  4. LLM에 질의를 위한 Prompt를 구성합니다. Prompt는 사전에 PromptTemplate으로 관리할 수 있으며 LLM의 특성, 데이터 특성에 따라 개별적으로 관리합니다.
  5. 사용자 질의에 대한 유사 데이터 검색결과(result)를 Prompt와 합쳐 LLM에 질의합니다. 
  6. LLM은 result의 내용을 분석하여 가장 적합한 답변을 사용자에게 응답(answer)합니다.

이런 과정을 통하면 LLM은 지정된 지식의 범위 내에서 사용자의 의도에 적합한 답변을 하게 됩니다. LLM은 해당 지식을 알고 있지 않아도 답변할 수 있으며, Prompt에 따라 LLM 스스로 가진 지식을 덧붙일 수도, 모른다고 대답할 수 도 있습니다.

이런 과정을 통해 비즈니스 애플리케이션에서 LLM을 활용하기 위해 고민하던 몇 가지 문제가 해결됩니다.

  • 사전학습시키지 않은 지식도 LLM이 답변할 수 있습니다. 굳이 비용을 들여 언어모델을 Fine-tuning 할 필요가 없습니다.
  • Vector store의 검색결과(result)에 없는 데이터는 답변을 하지 않도록 Prompt를 구성하여 환각 문제를 해결할 수 있습니다. 
  • 지식 구축 단계가 사라집니다. 기업이 기존에 보유한 KM을 연동하거나 수집한 데이터를 연동하는 것 만으로 질의/응답 챗봇을 운영할 수 있습니다.
  • LLM에 별도의 학습이 필요 없으므로 가장 최신의 정보와 실시간으로 연동할 수 있게 됩니다.

LangChain을 이용해 비즈니스 애플리케이션을 만들 때 중요한 요소들

실제로 간단하게 애플리케이션을 만들어 테스트해 보면서 몇 가지 중요하게 느껴지는 요소들이 있었습니다.

데이터 수집/가공 처리

LLM은 직접 데이터를 가지고 있는 것이 아니라 사용자 질의에 대해 검색된 결과 목록 중 가장 적합한 데이터를 정리해 주는 역할을 하기 때문에 애초에 잘 정리된 데이터가 있어야 합니다. VectorStore에 저장된 데이터가 제대로 정제되지 않은 데이터라면 검색 결과 데이터도 좋지 않을 것이고,  결국 LLM을 거친 답변도 제대로 나오지 않은 것이기 때문입니다. 

VectorStore 또는 검색엔진

VectorStore의 역할은 데이터를 보관하고 있다가, 사용자의 질의와 비교하여 유사한 데이터를 찾아주는 역할입니다. 결국 검색엔진과 같은 역할을 하는 것이고 VectorStore 또는 검색엔진의 성능이 결과 데이터에 영향을 줄 수 있습니다.

Prompt

LLM에 데이터만 보내서 질의하는 게 아니라 Prompt를 구성하여 질의를 하게 됩니다. 이때 Prompt Engineering이 중요하게 됩니다. Prompt를 어떻게 구성하느냐에 따라 LLM의 답변이나 뉘앙스도 달라지게 할 수 있습니다.

기타..

이 예제에서 표현하지 않았지만 이 외에도 Memory와 Agent 등 LangChain에서 제공하는 모듈을 적절히 활용하면 좀 더 품질이 높은 응답을 할 수 있습니다.(기존 대화를 기억해 맥락에 맞게 답변하기, 데이터의 특성에 따라 답변하기 등) 

결론

서두에도 이야기하였지만 LangChain은 프레임워크일 뿐, 직접적인 기술들을 포함하고 있지는 않습니다.  LangChain을 이용하여 실제 비즈니스 애플리케이션을 만들기 위해서는 위와 같이 애플리케이션의 목적에 맞게 프로세스와 모듈을 설계하고 각 기술요소들에 대한 연구(프롬프트 엔지니어링 등)가 필요하며, 기술요소 추가 (검색엔진, 벡터 DB 등)를 통해 애플리케이션의 품질을 향상할 수 있는 방법을 찾는 과정도 필요하겠다는 생각을 했습니다.

아직은 LangChain에서 제공하는 모듈을 일부만 이용해 보았지만, 이후에 조금 더 알아보면서 추가적인 고민들을 공유할 수 있었으면 합니다.