본문 바로가기

AI 소식/오픈소스 AI 모델

오픈소스 EEVE 모델 로컬환경에서 실행하기 2탄 (LangChain / LangServe / ngrok)

안녕하세요.

지난 포스팅에서는 오픈소스 EEVE 모델을 로컬 환경에 설치하고 실행하는 과정을 다뤘습니다. 이번에는 설치된 EEVE 모델을 LangServe를 이용하여 외부 웹사이트에 배포하는 방법을 소개하고자 합니다.

 

지난 글을 놓치신 분들은 아래 링크를 통해 확인하실 수 있습니다.

[Marcus' Stroy] - 오픈소스 EEVE 모델 로컬환경에서 실행하기 1탄


반응형


1. LangChain / LangServe

 LangChain와 LangServe는 대형 언어 모델(LLM)을 활용한 애플리케이션을 개발할 수 있게 도와주는 도구로써, 이번에 이를 활용하여 오픈소스 EEVE 모델을 설정하여 서버를 구동하는 방법을 다루고자 합니다.

 

LangChainLLM을 다양한 데이터 소스와 API에 연결할 수 있는 유연한 추상화와 컴포넌트 라이브러리를 제공하는 프레임워크입니다. Python과 TypeScript를 지원하며, 병렬 처리, 스트리밍, 비동기 작업 등 고급 기능을 포함해 AI 애플리케이션 구축에 적합합니다.

LangServe LangChain 애플리케이션을 즉시 API 서버로 변환해주는 플랫폼입니다. FastAPI 기반으로 구축되었으며, GitHub와의 통합을 통해 간편한 배포가 가능합니다. 자동 문서화, 네이티브 회귀 테스트, 성능 모니터링 등의 기능을 갖추고 있어 프로덕션 환경으로의 전환을 빠르게 진행할 수 있습니다.

 

이번 포스팅에서는 위의 플랫폼을 활용하여 EEVE 모델을 설정하고, ngrok를 이용해 로컬서버로 포워딩하는 과정을 소개하겠습니다.

 

 

2. 설치 계획

  • LangChain / LangServe 설치
  • LangChain 프로젝트 생성
  • LangServe 실행
  • ngrok 활용하여 로컬서버 포워딩

 

 

3. 실행 환경

  • 운영체제 : Window 11
  • python : 3.10.6
  • langserve : 0.1.1
  • langchain : 0.2.0
  • LLM : EEVE Model (upstage의 Solar 모델을 야놀자에서 한국어로 조정한 버전)

 

 

4. LangChain / LangServe 설치

Windows의 PowerShell에서 아래의 명령어를 실행하여 LangServe 및 LangChain을 설치합니다.

pip install "langserve[all]"
pip install -U langchain-cli

LangChain의 자세한 정보와 문서에 대해 더 궁금하신 분들은 LangChain 공식 사이트에서 확인하실 수 있습니다.

 

 

5. LangChain 프로젝트 생성

다음 단계로, 원하는 설치 경로에서 PowerShell을 사용하여 프로젝트를 생성합니다.

 

 1) 설치 경로 설정

cd /[경로]/

여기서 [경로]는 파일을 설치하고 싶은 위치입니다.

 

 

 2) 프로젝트 생성

langchain app new [파일명]

이 명령어를 통해 필요한 프로젝트 파일을 생성합니다. [파일명]은 원하는 프로젝트 이름으로 지정하세요.

 

 

프로젝트 생성 후, 아래와 같이 필요한 파일들이 생성됩니다.

LangChain 프로젝트 생성

 

더 많은 LangChain 명령어 정보가 궁금하신 분들은 LangChain 공식 깃허브에서 확인하실 수 있습니다.

 

 3) 코드 추가

 

프로젝트 생성 후, EEVE 모델이 사용자와 채팅 형식으로 효과적으로 작동하도록 하기 위해 app 폴더 내에 chat.py 파일을 생성합니다. 이 파일은 EEVE 모델이 사용자와 상호작용할 수 있도록 설정하는 코드를 포함합니다. 필요한 코드는 다음과 같습니다:

from langchain_community.chat_models import ChatOllama
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

# 로컬환경에서 만들어놓은 EEVE 모델 사용
llm_eeve = ChatOllama(model = 'EEVE-Korean-10.8B:latest')

# Prompt 설정
prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "You are a helpful AI Assistant Your name is 'Marcus bot'. You are a smart and humorous and intellectual. You always answer in Korean.",
        ),
        
        MessagesPlaceholder(variable_name="messages"), 
        # 최근 사용자와의 대화기록을 기억하기 위한 명령어
    ]
)

# LangChain 표현식
chain = prompt | llm_eeve | StrOutputParser()
# prompt : LLM 설정
# llm_eeve : LLM 종류
# StrOutputParser() : 채팅 메시지를 문자열로 변환하는 간단한 출력 구문 분석기

 

두 번째로, server.py 파일에 필요한 코드를 추가합니다. 이 코드는 서버의 기능을 구현하며 EEVE 모델과의 통신을 가능하게 합니다.

 

 

from fastapi import FastAPI
from fastapi.responses import RedirectResponse
from langserve import add_routes

# 추가된 코드
from fastapi.middleware.cors import CORSMiddleware
from typing import List, Union
from langserve.pydantic_v1 import BaseModel, Field
from langchain_core.messages import HumanMessage, AIMessage, SystemMessage
from chat import chain


app = FastAPI()


# 추가된 코드
# FastAPI 애플리케이션에서 Cross-Origin Resource Sharing(CORS) 설정을 관리하는 미들웨어
app.add_middleware(
    CORSMiddleware,
    allow_origins = ["*"], # 모든 출처의 요청 허용
    allow_credentials = True, # 교차 출처 요청에 대해 쿠키가 지원되어야 함
    allow_methods = ["*"], # 교차 출처 요청에 허용되어야 하는 HTTP 메소드 목록
    allow_headers = ["*"], # 교차 출처 요청에 대해 지원되어야 하는 HTTP 요청 헤더 목록
    expose_headers = ["*"], # 브라우저에서 액세스할 수 있어야 하는 응답 헤더
)


# 수정된 코드
@app.get("/")
async def redirect_root_to_docs():
    return RedirectResponse("/chat/playground")


# 추가된 코드
# 메시지 데이터를 효과적으로 모델링하고 유효성 검사와 데이터 관리 기능을 제공
class Input(BaseModel):
    """Input for the chat endpoint."""  # Input 클래스 용도

    messages: List[Union[HumanMessage, AIMessage, SystemMessage]] = Field(
        ...,
    description = "the messages representing the current converation.", # Field 설명 추가
    )


# 수정된 코드
add_routes(app, 
           chain.with_types(input_type=Input),
           path="/chat",
           enable_feedback_endpoint=True,
           enable_public_trace_link_endpoint=True,
           playground_type="chat",
)


if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="0.0.0.0", port=8000)

LangChain 명령어에 대해 더 궁금하신 분들은 LangChain 공식문서에서 확인하실 수 있습니다.

 

 4) 서버 실행

python server.py

 

 

6. ngrok 활용하여 로컬서버 포워딩

 ngrok은 개발자가 로컬에서 실행 중인 애플리케이션을 인터넷에 안전하게 노출할 수 있도록 지원하는 도구입니다. 이를 통해 웹 애플리케이션, API, 데이터베이스 등을 월드 와이드 웹에 임시로 연결할 수 있습니다. 이 기능은 테스트, 데모, 또는 외부와의 통합을 수행할 때 특히 유용합니다. ngrok을 사용하여 로컬 호스트에서 실행 중인 웹 애플리케이션을 인터넷에 임시로 노출하는 방법을 살펴보겠습니다.

 

 1) ngrok 설치 - ngrok 공식 사이트에서 다운받으실 수 있습니다.

 

 2) 환경 변수 설정

  • Windows 검색창에 "시스템 환경 변수 편집" 입력 후 실행
  • 시스템 속성
  • 고급 탭 선택
  • 환경 변수 클릭
  • Path 선택
  • 편집 클릭

 

  • 새로 만들기 클릭
  • ngrok.exe 파일이 있는 경로 입력
  • 확인

 

 3) 로컬 서버 포워딩

 

Windows의 PowerShell에서 아래 명령어를 실행합니다:

ngrok http --domain=[ngrok_url] 8000

여기서 [ngrok_url]ngrok dashboard에서 확인하실 수 있습니다.

 

※ ngrok 포워딩 주소 확인

  • ngrok dashboard
  • Cloud Edge 섹션
  • Domains 선택
  • Domain 주소 확인

 

 

 이 과정을 통해 생성된 도메인 주소(URL)를 사용하여 외부 사용자는 로컬에서 구동 중인 EEVE 모델에 접근할 수 있습니다. 이 URL을 통해 접속하면, 외부에서도 로컬에서 설정한 EEVE 모델을 사용할 수 있게 됩니다.

 

 

7. 결과 확인

ngrok에 생성된 도메인 주소(https://eel-upward-wolf.ngrok-free.app/)로 접속합니다.(앱이 정상적으로 작동한다면 아래와 같이 EEVE chat application 화면으로 접속하게 됩니다.)

 

앱이 정상적으로 작동하는지 질문을 입력해보겠습니다.

 

질문에 대해 정상적으로 답변을 생성합니다. 이로써 외부 네트워크에서 로컬서버로 접근이 가능하고, EEVE모델이 정상작동을 확인함을 확인할 수 있습니다.

 


728x90

 

 

LangChain과 LangServe를 통해 로컬 환경에서 EEVE 모델을 성공적으로 설정하고 실행하는 과정을 살펴보았습니다. 이번 포스팅에서는 EEVE 모델을 ngrok을 활용해 외부에서 접근 가능하게 만드는 방법을 다루었습니다. 이러한 도구들은 개발자가 AI 모델을 보다 폭넓게 활용할 수 있게 하며, 실제 운영 환경에서의 테스트와 데모를 간편하게 할 수 있도록 지원합니다. ngrok은 특히 로컬 개발 환경을 신속하게 외부에 노출시키는 강력한 방법을 제공하며, 보안과 접근성을 동시에 관리할 수 있습니다.

 

다음 포스팅에서는 RemoteRunnable과 Streamlit를 활용하여 EEVE 모델을 배포하는 방법에 대해 알아보겠습니다.

 

 

감사합니다 :)