빅데이타 & 머신러닝/생성형 AI (ChatGPT etc)

LLM 애플리케이션 개발을 위한 Langchain #1-소개

Terry Cho 2023. 12. 12. 18:14

LLM 애플리케이션 개발을 위한 Langchain 프레임웍

#1 소개와 ChatGPT, PaLM2 예제

조대협 (http://bcho.tistory.com)

배경

Open AI의 ChatGPT나 구글의 PaLM2와 같은 LLM 모델의 경우에는 LLM을 이용하여 서비스를 개발하기 위한 SDK를 제공한다. 이 SDK를 이용해서 애플리케이션을 직접 개발해도 되겠지만, SDK의 기능들을 추상화한 프레임웍을 사용한다면 조금 더 쉽게 애플리케이션을 개발할 수 있다. 

 

예를 들어 데이터베이스들도 각각의 SDK를 제공하지만 자바와 같은 언어에서 개발을 할때는 JDBC와 같은 추상화 프레임웍을 사용하여 데이터베이스 종류에 상관없이 단일 프레임웍을 사용하여 개발할 수 있도록 하고, 더 나아가서는 JPA와 같은 고급 추상화 프레임웍을 이용하여, 개발의 생산성을 높일 수 있다. 

 

비단 추상화와 생산성뿐만 아니라 LLM은 애프케이션 특성상 여러단계를 처리를 거쳐서 결과를 내는 시나리오가 많은데, 이렇게 여러 처리 단계를 묶은 것을 체인 이라고 하며, Langchain은 LLM을 이용한 여러단계의 처리에 강점을 가지고 있다. 

 

예를 들어서 Q&A 쳇봇을 만드는 시나리오가 있다고 가정하자. 아직 Chatgpt에 한글 질문 보다는 영어 질문이 인식이 잘된다고 가정을 했을때, 우리는 첫번째 단계에서 질문을 영문으로 번역한 다음에, 영문으로 번역된 질문을 LLM에 질의해야 한다. 즉 번역과, 질의 2가지 단계를 순차적으로 실행하는 체인이 필요하다. 

또한 번역은 높은 수준의 LLM을 필요로하지 않기 때문에, 번역은 비교적 가격이 저렴한 Chatgpt 3.5 turbo를 사용하고, 질문에 대한 답변은 높은 높은 수준의 LLM이 필요하기 때문에 고성능의 Chatgpt 4.0 Turbo를 사용하도록 아래와 같이 구성할 수 있다. 

 

Langchain

Langchain은 이렇게 복잡한 LLM 애플리케이션 개발을 돕기 위해서 개발된 오픈소스 프레임웍으로 2023년 12월 현재 파이썬과 자바스크립트를 지원한다. 놀라운 사실은 파이썬에서 인기있는 오픈소스인 장고(Django) 프레임웍이 40만 스타를 받기까지 8년이 걸렸는 반면, Langchain은 6개월만에 40만 스타를 받을 만큼 빠른 성장을 하고 있다. 거의 매달 새로운 기능들이 추가되고 있으며 공식 사이트의 문서도 계속 업데이트 되고 있다. 

그림 출처 : https://medium.com/international-school-of-ai-data-science/breaking-down-the-langchain-a4a992cc54ff

 

여러가지 장점을 가지고 있는데, 대략적인 특징을 나열해보면 다음과 같다

  • LLM 종류에 상관없이 LangChain으로 개발한 후, 다양한 LLM으로 쉽게 전환이 가능하다.
  • 여러단계의 처리를 쉽게 구현할 수 있다.
  • LLM 외부의 데이터 베이스나, 벡터 데이터베이스 또는 검색 엔진등 다양한 외부 컴포넌트와 쉬운 통합이 가능하다. (Agent 기능)
  • LangChain의 에코 시스템인 LangSmith, LangServ등을 통하여 모델 서빙, 모니터링, 모델 평가등의 운영에 필요한 기능 개발이 가능하다. 

Hello LangChain

간단하게 Langchain이 어떻게 작동하는지 살펴보도록 하자. 아래 예제는 OpenAI의 ChatGPT와 구글의 PaLM 모델을 호출하는 예제이다.

OpenAI API 키 생성

OpenAI의 경우 사이트에 가입한 후에, 유료 사용자로 전환한후에, 대쉬보드의 좌측 메뉴 “API Keys”메뉴에서 API키를 생성할 수 있다.

<그림. platform.openai.com 에서, apikey를 생성한 메뉴>

이렇게 생성된 Open AI api key 문자열은 코드에서 api key로 지정해서 사용한다.

Google Cloud Service Account

구글 클라우드의 PaLM API의 경우에는 api key가 문자열이 아니라 파일이 된다. 

구글 클라우드에 가입한후에, http://console.cloud.google.com에 접속하여 좌측 메뉴에서 IAM > Service Accounts 메뉴로 간다.

다음 상단의 Create Service Account 메뉴를 선택한다.

다음으로, 아래 그림과 같이 생성하고자하는 service account 이름을 입력한다. 여기서는 “sa-vertex-llm”이라는 이름을 사용하였다.

다음으로, 아래 그림과 같이 이 api key 파일로 억세스가 가능한 API들을 선택해야 하는데, 전체 프로젝트에 대한 권한을 줬을 경우, 이 서비스 어카운트 파일이 분실되었을 경우, 악의적으로 타인이 구글 클라우드 프로젝트에 대한 전체 억세스를 가질 수 있다. 그래서 서비스 어카운트의 접근 범위는 최소한으로 하는 것이 좋다. 여기서는 Vertex AI User 권한을 주었다. Vertex AI는 구글 클라우드의 AI 플랫폼으로 PaLM2와 같은 생성형 AI 뿐만 아니라, 모델 학습이나 서빙등의 전반적인 AI 플랫폼에 대한 기능을 제공한다. 

다음과 같이 서비스 어카운트가 생성된것을 확인할 수 있다. 이 어카운트가 생성되었으면, 어카운트의 권한으로 API를 접근할 수 있는 API 파일을 생성해야 한다. 



서비스 어카운트를 클릭하면 다음과 같이 서비스 어카운트 파일을 생성할 수 있다. 아래와 같이 JSON 파일을 생성하도록 한후, 로컬에 다운로드 한다. 

 

다음 구글 클라우드의 PaLM API를 호출하려면 이 API 키를 사용하는데, 아래와 같이 환경 변수 “GOOGLE_APPLICATION_CREDIENTIALS”라는 변수에 API 키 파일의 경로를 명시해 준다.  아래는 주피터 노트북에서 환경 변수를 지정한 예제이다. 

 

%env GOOGLE_APPLICATION_CREDENTIALS=/Users/terrycho/Downloads/terrycho-autopilot-55dxxxxx.json



주의!! : 파이썬의 경우 “” 따옴표를 넣으면 이를 파일명으로 인식한다. 예를 들어 “/Users/terrycho/Downloads/terrycho-autopilot-55dxxxxx.json”.  따옴표를 넣지 않도록 주의한다. 

Hello Langchain 예제 

아래는 좌측은 OpenAI, 우측은 Google의 LLM을 이용한 Langchain 예제이다. 

간단하게 “What is top 5 Korean reastaurant in BayArea?” 의 질문에 대해서 답변하도록 하였다.


from langchain.llms import OpenAI

llm = OpenAI(openai_api_key="{Youe API Key} ",model_name="text-davinci-003",temperature=0.8)

question = "What is top 5 Korean reastaurant in BayArea?"
answer= llm(question)
print(answer)


from langchain.llms import VertexAI

# Vertex AI LLM Initialization part
import vertexai
PROJECT_ID = "terrycho-autopilot"
LOCATION = "us-central1" #e.g. us-central1
vertexai.init(project=PROJECT_ID, location=LOCATION)

llm = VertexAI()

question = "What is top 5 Korean reastaurant in BayArea?"
answer= llm(question)
print(answer)


1. Ohgane Korean BBQ (San Francisco)
2. Oiji Korean BBQ (San Francisco)
3. Hangawi Korean Restaurant (San Francisco)
4. Soji Korean BBQ (San Jose)
5. Manbok Korean BBQ (San Jose)
1. **San Ho Won** (San Francisco)
2. **The Chairman** (San Francisco)
3. **Bambul Bam** (Oakland)
4. **Seoul Garden** (Berkeley)
5. **Han Il Kwan** (San Jose)

 

먼저 OpenAI쪽 코드를 보면 llm=OpenAI(...)로 llm 객체를 생성하였다. 이때 API Key를 넣어야 하며, LLM 관련 패러미터, 예를 들어 사용하고자 하는 모델명이나, Temperature와 같은 변수를 같이 정의할 수 있다. 

 

구글의 경우에는 약간 더 복잡한데, PROJECT_ID에 현재 사용하는 프로젝트 ID와, 사용하고자 하는 리전 정보를 넣은 후, vertexai.init 명령을 이용하여 초기화를 한훙, llm=VertexAI()를 이용하여 LLM 객체를 생성한다.

 

LLM 객체가 생성된이후에는 LLM 객체는 Langchain의 추상화된 LLM 모델이기 때문에 OpenAI나, Google 에 상관 없이 같은 API로 사용이 가능하다. 여기서는 llm(question)으로 간단한 질문을 하고 답변을 받아서 출력하는 방식을 사용하였다. 

 

Langchain은 여러 LLM 모델을 지원하는데, 주요 모델들만 살펴보면 Open AI ChatGPT, Google PaLM, Huggine Face, MS Azure ChatGPT, AWS BedRock, Anthropic claude 등을 지원한다. 주요 모델 프로파이더는 https://python.langchain.com/docs/integrations/providers 를 참고하면 된다. 


지원하는 LLM에 따라서 Langchain의 기능이 일부만 제공되는 경우가 있는데, 예를 들어 Streaming 기능 같은 경우에는 지원 안되는 모델들이 많다. 기능에 대한 지원 여부는 LLM 컴포넌트 쪽을 확인하면 된다. https://python.langchain.com/docs/integrations/llms/