LangChain은 대규모 언어 모델(LLM)을 기반으로 애플리케이션을 구축하기 위한 오픈소스 프레임워크이다. LangChain을 통해 LLM의 기능을 극대화하여 다양한 AI 애플리케이션을 개발할 수 있다.
모듈화:LangChain은 다양한 모듈을 제공하여 개발자가 필요에 따라 기능을 조합할 수 있다. 이를 통해 복잡한 AI 워크플로우를 쉽게 구성할 수 있다.
다양한 도구와의 통합: 여러 언어 모델과 도구를 결합하여 고급 AI 애플리케이션을 구축할 수 있다. 예를 들어, 데이터베이스, API, 웹 스크래핑 도구와의 통합이 가능하다.
유연한 API:LangChain은 다양한 API를 제공하여 개발자가 쉽게LLM과 상호작용할 수 있도록 한다. 이를 통해 사용자 맞춤형 솔루션을 개발할 수 있다.
이처럼 LangChain은 대규모 언어 모델을 통해 AI 어플리케이션 개발을 지원하는 프레임워크다. 본 게시글에서는 OpenAI의 gpt-3.5 모델을 이용한다. 따라서 OpenAI의 API 키가 필요함을 유의하자.
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.pydantic_v1 import BaseModel, Field
model = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0, max_tokens=4096)
class Response(BaseModel):
title: str = Field(description="Title of an Article")
content: str = Field(description="Summarization of an Article")
output_parser = JsonOutputParser(pydantic_object=Response)
format_instructions = output_parser.get_format_instructions()
prompt = PromptTemplate(
template="""Answer the user query in JSON format.
{format_instructions}
Write a concise summary of the following article in Korean, and include a 'title':
Return the response in valid JSON format with 'title' and 'content' fields:
{text}
CONSICE SUMMARY:""",
input_variables={"text"},
partial_variables={"format_instructions": format_instructions}
)
chain = prompt | model | output_parser
def lambda_handler(event, context):
return chain.invoke({"text": event["article"]})
간단한 파이썬으로 LangChain 어플리케이션을 작성할 수 있다.
기사 본문이 입력될 때, 해당 기사의 제목, 요약본을 반환한다.
대부분 이전 게시글을 참고하여 Lambda 함수를 작성할 수 있지만, 몇 가지 주의할 점이 있다.
위 LangChain 코드에는 환경 변수가 필요하다.
OpenAI의 gpt-3.5 모델을 사용하기 때문에, OpenAI API Key 가 필요하다.
Lambda 함수의 구성 탭의 환경 변수 에서 편집을 통해 환경 변수를 추가할 수 있다.
키는 OPENAI_API_KEY, 값은 해당하는 API KEY 값을 입력해주면 된다.
우리가 사용하고자 하는 LangChain은 파이썬에서 기본 제공되지 않는 외부 라이브러리다.
이런 외부 라이브러리를 람다 서비스에서 사용하고자 한다면 Layer를 이용해 업로드 해야한다.
라이브러리를 업로드하기 위해서는 최상위 폴더 이름이 python이어야 함에 유의하자.
mkdir python
cd python
pip install langchain_core -t .
pip install langchain_openai -t .
cd ..
zip -r layer.zip python/

Lambda 메인 대시보드에서 계층 클릭 후, 계층 생성을 클릭해준다.
계층의 이름과 방금 압축한 라이브러리를 업로드해준다. 이후 생성 버튼을 누르면 계층을 생성할 수 있다.
다시 레이어를 적용하고자 하는 Lambda 함수로 돌아와, 계층 탭의 [Add a layer] 를 통해 레이어를 적용할 수 있다.
사용자 지정 계층을 선택해주고, 방금 생성한 계층을 추가해준다. 방금 생성한 계층이라면 버전은 1 밖에 없다. 이후 계층이 수정될 때 마다 새로운 버전을 지정해줄 수 있다.
이제 테스트 케이스를 만들어 Lambda 함수를 테스트해보자.

런타임 오류가 생겼고 그 내용은 아래와 같다.
pydantic_core라이브러리를 찾지 못함.
하지만 내가 다운로드한 라이브러리에는 pydantic_core가 버젓이 존재한다.
이러한 오류가 생기는 이유는 무엇일까? 그 이유는 다음과 같다.

현재 Lambda 함수의 환경은 다음과 같다. Python 3.11은, Amazon Linux2 OS 상에서 실행됨을 알 수 있다. Amazon Linux2는 CPU 아키텍처로 x86_64를 사용한다.
하지만 내 노트북의 CPU 아키텍처를 확인해본다면 아래와 같이 arm64 임을 확인할 수 있다.
즉, 내 노트북에서 다운로드한 라이브러리는 arm64에 의존적인 라이브러리이며, x86_64 환경의 람다 함수는 이를 제대로 인식하지 못한다. 따라서 라이브러리를 x86_64 환경에서 인식될 수 있도록 수정해주어야 한다.
pip install -r requirements.txt --platform manylinux2014_x86_64 --target ./python --only-binary=:all:
위와 같이 호환되는 OS를 명시하여 다운로드 받아준 후, .zip 파일로 업로드해준다.
필요한 라이브러리들은 requirements.txt에 명시해주면 된다.
이제 테스트해보면 정상적인 결과를 반환받을 수 있다.
위 과정들을 통해 훌륭한 서버리스 API를 구현했다. 하지만 문제점을 몇 확인할 수 있었다.
코드 작성
AWS Lambda의 웹 UI에서 코드를 작성하기는 여간 쉬운 일이 아니다. 코딱지만한 UI에 의존해 코드를 작성하면 거북이의 목을 빠르게 가질 수 있다.버전 관리
웹 UI에서 직접 작성한다면 버전 관리에도 어려움이 생긴다. 로컬 IDE에서 코드 작성 후 복붙한다면 어느정도 해결 가능하지만 자동화에 미쳐버린 개발자들의 성에는 차지 않는다.
로컬 환경과의 불일치
레이어 생성에도 확인했듯이 로컬 환경과
Lambda환경이 일치하지 않는다면 다양한 문제가 생길 수 있다.테스트와 디버깅
AWS의 GUI 환경에서는 테스트와 디버깅이 어려워 정확한 문제를 알아내기 힘든 경우가 많다.
이런 문제점을 보완할 수 있는 방법이 있으니, 그게 SAM(Serverless Application Model) 이다.
로컬 환경에서 손쉽게 AWS Lambda 함수를 작성하고 배포할 수 있는 도구로, 다음 게시물에서 SAM을 이용해 서버리스 API를 작성하도록 하겠다.