AIㆍML / 개발자

“LLM 개발을 더 간편하게” 랭체인(LangChain)의 이해

Martin Heller | InfoWorld 2023.09.13
대규모 언어 모델(LLM)을 위한 효과적인 프롬프트를 작성하는 데는 기술이 필요하지만 LLM 사용법은 대체로 간단하다. 반면 언어 모델을 사용한 프로그래밍은 어려울 수 있다. 그럴 때 랭체인(LangChain)을 사용하면 된다. 

랭체인은 언어 모델 기반의 애플리케이션을 개발하는 프레임워크다. 랭체인을 사용해 챗봇 또는 개인 비서를 만들고, 문서 또는 구조화된 데이터에 대한 Q&A를 요약, 분석, 생성하고, 코드를 쓰거나 이해하고, API와 상호작용하고, 생성형 AI를 활용하는 여러 가지 애플리케이션을 만들 수 있다. 현재 랭체인에는 파이썬과 타입스크립트/자바스크립트의 두 가지 버전이 있다. 

랭체인은 언어 모델이 데이터 소스에 연결하고 환경과 상호작용할 수 있게 해준다. 랭체인 주요 요소는 모듈식 추상화 및 추상화 구현의 모음으로 구성돼 있다. 랭체인 기성형(off-the-shelf) 체인은 특정 상위 수준의 작업을 수행하기 위한 구성 요소의 구조화된 어셈블리다. 구성요소를 사용해 기존 체인을 맞춤설정하고 새 체인을 만들 수 있다. 

언어 모델에는 LLM과 채팅 모델, 두 종류가 있다. LLM은 문자열을 입력으로 받고 문자열을 반환한다. 채팅 모델은 메시지 목록을 입력으로 받고 채팅 메시지를 반환한다. 채팅 메시지에는 내용과 역할, 두 가지 구성요소가 포함된다. 역할은 사람, AI, 시스템, 함수 호출 또는 일반 입력 등 내용이 어디서 오는지를 지정한다.

일반적으로 LLM은 입력에 프롬프트 템플릿을 사용한다. 프롬프트 템플릿을 사용해 LLM 또는 채팅 모델이 취할 역할, 예를 들어 “영어를 프랑스어로 번역하는 유용한 비서” 등을 지정할 수 있다. 또한 프롬프트 템플릿을 이용하면 번역할 구문 목록과 같은 다양한 내용 인스턴스에 이 템플릿을 적용할 수 있다. 
 

랭체인의 작동 방식 : 모듈 

랭체인에는 다음 6개 모듈이 있다. 
 
  1. 모델 I/O : 언어 모델과의 인터페이스 
  2. 데이터 연결 : 애플리케이션별 데이터와의 인터페이스 
  3. 체인 : 호출 시퀀스 구축 
  4. 에이전트 : 상위 지시문이 주어지면 체인이 사용할 툴을 선택할 수 있도록 함 
  5. 메모리 : 체인 실행 간에 애플리케이션 상태 유지 
  6. 콜백 : 체인의 중간 단계를 기록 및 스트리밍 

모델 I/O는 프롬프트를 관리하고 공통 인터페이스를 통해 언어 모델을 호출하고 모델 출력에서 정보를 추출할 수 있게 해준다. 
 
ⓒ IDG

데이터 연결은 데이터를 로드, 변형, 저장 및 쿼리하기 위한 빌딩 블록을 제공한다. 
 
ⓒ IDG

복잡한 애플리케이션은 LLM을 상호, 또는 다른 구성요소와 체인으로 연결해야 한다. 랭체인은 이러한 “체인으로 연결된” 애플리케이션을 위한 체인 인터페이스를 제공한다. 대화형 시스템은 어느 정도 기간의 과거 메시지에 직접 액세스할 수 있어야 한다. 랭체인에서는 이 기능을 메모리라고 한다. 
 
ⓒ IDG

시퀀스를 하드 코딩하는 체인과 달리, 에이전트는 언어 모델을 추론 엔진으로 사용해 어느 작업을 어느 순서에 따라 수행할지를 결정한다. 콜백은 LLM 애플리케이션의 다양한 단계에 연결할 수 있게 해준다. 로깅, 모니터링, 스트리밍 등의 작업에 유용하다. 
 

랭스미스를 사용한 디버깅 

랭스미스(LangSmith)는 프로토타입에서 프로덕션으로 이전하기 위해 랭체인 언어 모델 애플리케이션 및 지능형 에이전트를 추적하고 평가하는 데 유용하다. 2023년 9월 초 기준 비공개 베타 단계다. 베타 테스트에 참여하지 않아도 랭스미스 안내 자료랭스미스 문서를 볼 수 있다. 
 

랭체인 사용 사례 

랭체인 사용 사례를 보면 문서에 대한 Q&A, 구조화된 데이터 분석, API와의 통합, 코드 이해, 에이전트 시뮬레이션, 에이전트, 자율(장기 실행) 에이전트, 챗봇, 코드 작성, 추출, 그래프 데이터 분석, 멀티 모달 출력, 자가 검사, 요약, 태깅 등이 포함돼 있다. 일부 사용 사례에는 많은 예제가 있다. 예를 들어 Q&A에는 17개 정도가 있다. 웹 스크랩과 같이 예제가 하나인 경우도 있다. 
 

랭체인 통합 

현재 약 163개 랭체인 통합이 있다. 콜백 5개, 챗 모델 9개, 문서 로더 115개, 문서 변환기 6개, LLM 54개, 메모리 구현 방법 11개(대부분 데이터베이스 사용), 리트리버 22개(대부분 검색 방법), 텍스트 임베딩 모델 31개, 에이전트 툴킷 21개, 툴 34개, 벡터 저장소 42개 등이다. 통합은 공급자별 그룹으로도 제공된다. 랭체인은 기본적으로 이러한 모든 기능을 위한 중립적 허브 역할을 한다. 
 

파이썬 및 자바스크립트를 위한 랭체인 설치 

파이썬용 랭체인을 설치하려면 pip 또는 conda를 사용한다. 종속 항목에 대한 버전 충돌이 일어나지 않도록 가상 환경에 파이썬 패키지를 설치하는 것이 좋다. 여기서는 pip 명령을 사용한다. conda 명령의 경우 설치 페이지를 방문해 Conda를 클릭하면 볼 수 있다. 기본 최소 설치는 다음과 같다. 
 
pip install langchain

참고로 필자는 이렇게만 사용했다. 모델 공급자, 데이터 저장소 또는 다른 통합을 위한 모듈은 포함되지 않는다. 필요할 때 필요한 모듈을 설치할 계획이다. 랭체인 및 일반적인 언어 모델을 설치하려면 다음을 사용한다. 
 
pip install langchain[llms]

랭체인과 모든 통합을 설치하려면 다음을 사용한다. 
 
pip install langchain[all]

맥OS 최근 버전의 기본 셸인 zsh를 사용하는 경우 대괄호 식을 인용 부호로 감싸야 한다. 그렇지 않으면 셸은 대괄호가 배열을 나타내는 것으로 해석한다. 예를 들면 다음과 같다. 
 
pip install 'langchain[all]'

자바스크립트용 랭체인을 설치하려면 npm, Yarn, 또는 pnpm을 사용한다. 예를 들면 다음과 같다. 
 
npm install -S langchain

자바스크립트용 랭체인은 Node.js, 클라우드플레어 워커(Cloudflare Workers), 버셀(Vercel)/Next.js(브라우저, 서버리스, 엣지 함수), 수파베이스 엣지(Supabase Edge) 함수, 웹 브라우저, 디노(Deno)에서 사용할 수 있다. 여기서 자바스크립트용 랭체인에 대해 더 살펴보지는 않는다. 설치 페이지에서 자바스크립트용 랭체인을 시작하는 방법을 참고할 수 있다. 
 

랭체인 예제 

랭체인 문서에는 수백 개 예제가 있지만 여기서는 한 가지만 살펴보자. 다음 파이썬 코드는 퀵스타트의 끝에 나오는 코드로, LLM체인(LLMChain)을 보여준다. 체인은 입력 변수를 받아서 프롬프트 템플릿으로 보내 프롬프트를 만들고, 이 프롬프트를 LLM인 챗오픈AI(ChatOpenAI)로 전달한 다음 선택적인 출력 파서를 통해 CSV 출력을 전달해 파이썬 문자열 배열을 생성한다. 
 
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
from langchain.chains import LLMChain
from langchain.schema import BaseOutputParser

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."""
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template = "{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)

chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
chain = LLMChain(
    llm=ChatOpenAI(),
    prompt=chat_prompt,
    output_parser=CommaSeparatedListOutputParser()
)
chain.run("colors")
# >> ['red', 'blue', 'green', 'yellow', 'orange']
 

랭체인 식 언어(LCEL) 

랭체인 식 언어(LangChain Expression Language)는 체인을 구성하고 스트리밍, 배치 및 비동기 지원을 기본적으로 제공하는 선언적 방법이다. LCEL은 랭체인을 더 쉽게 사용할 수 있게 해준다. LCEL은 기본적으로 파이썬 또는 타입스크립트/자바스크립트를 사용한 체인 만들기의 고수준 대안이므로 코드를 사용해 구성할 때 사용하는 모든 기존 랭체인 생성자를 그대로 사용해 체인을 만들 수 있다. 

대화형 방식의 랭체인 티처(Teacher)를 통해 LCEL에 대해 배울 수 있는데, 이를 위해서는 먼저 파이썬용 랭체인을 설치해야 한다. 필자는 특정 버전에 종속된 버그로 보이는 문제로 인해 티처를 실행할 수 없었다. LCEL 식은 파이프 문자(|)를 사용해 변수를 체인으로 연결한다. 예를 들어 기본적인 일반 체인은 다음과 같이 모델과 프롬프트를 사용한다. 
 
chain = prompt | model

맥락상 다음과 같은 파이썬 프로그램을 생각해 볼 수 있다. 
 
from langchain.prompts import ChatPromptTemplate
from langchain.chat_models import ChatOpenAI

model = ChatOpenAI()
prompt = ChatPromptTemplate.from_template("tell me a joke about {foo}")

chain = prompt | model

chain.invoke({"foo": "bears"})

출력(사이트에서 제공된 대로)은 다음과 같다. 
 
AIMessage(content='Why don\'t bears use cell phones? \n\nBecause they always get terrible "grizzly" reception!', additional_kwargs={}, example=False)

정리하면 랭체인은 체인으로 연결된 언어 모델 및 데이터 기반의 생성형 AI 애플리케이션을 만들기 위한 강력한 방법을 제공한다.
editor@itworld.co.kr
Sponsored

회사명 : 한국IDG | 제호: ITWorld | 주소 : 서울시 중구 세종대로 23, 4층 우)04512
| 등록번호 : 서울 아00743 등록발행일자 : 2009년 01월 19일

발행인 : 박형미 | 편집인 : 박재곤 | 청소년보호책임자 : 한정규
| 사업자 등록번호 : 214-87-22467 Tel : 02-558-6950

Copyright © 2024 International Data Group. All rights reserved.