본문 바로가기

AI 소식/오픈소스 AI 모델

오픈소스 EEVE 모델 로컬환경에서 실행하기 3탄 (RemoteRunnable / Streamlit)

안녕하세요.

지난 포스팅에서 오픈소스를 활용하여 서버에서 작동하는 EEVE 모델을 만들었습니다. 이번에는 RemoteRunnableStreamlit을 사용하여 프론트엔드 코드를 구성하고, 로컬 서버에서 EEVE 모델이 작동하는 형태로 만들어보겠습니다.

 

EEVE 모델을 활용하여 로컬 서버로 백엔드를 구성하는 작업에 대해 궁금하신 분들은 아래 링크를 통해 확인하실 수 있습니다.

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

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

 


반응형

 

1. RemoteRunnable / Streamlit

 RemoteRunnableStreamlit은 각각 원격 작업 처리와 대화형 웹 애플리케이션 개발을 위한 도구입니다. 두 도구는 주로 Python 내에서 사용되며, 서로 보완적인 역할을 할 수 있습니다.

 

RemoteRunnable특정 작업을 원격 서버(백엔드 서버)에서 실행하고, 그 결과를 클라이언트 애플리케이션으로 가져오는 도구 또는 인터페이스입니다.  이는 주로 분산 컴퓨팅, 클라우드 컴퓨팅, 또는 원격 프로시저 호출(RPC) 환경에서 사용됩니다. LangChain 라이브러리에서 RemoteRunnable은 특히 중요한 역할을 합니다. HTTP 요청을 통해 서버와 통신하며, 원격 서버에서 작업을 실행하고 그 결과를 가져오는 기능을 합니다. 예를 들어, LangChain의 RemoteRunnable은 주로 FastAPI와 같은 웹 프레임워크와 함께 사용하여 서버에 요청을 보내고, 응답을 처리합니다. 여러 개의 실행 가능한 작업을 체인 형태로 묶어, 순차적으로 실행할 수 있습니다. 이를 통해 복잡한 작업 흐름을 간단하게 관리하고 실행할 수 있습니다.

 

Streamlit 파이썬을 사용하여 인터랙티브 웹 애플리케이션을 쉽게 만들 수 있도록 도와주는 오픈소스 프레임워크입니다. 이를 통해 사용자는 간단한 Python 스크립트로 데이터 애플리케이션을 만들고, Streamlit의 다양한 기능을 활용하여 빠르고 효율적으로 인터랙티브한 대시보드를 생성할 수 있습니다.

 

 

2. 계획

  • RemoteRunnable / Streamlit 설치
  • 프론트엔드 구성 (Streamlit, RemoteRunnable, Streamlit Community Cloud, Github)
  • 백엔드 구성 (LangChain, FastAPI, Uvicorn)
  • 모델 실행

 

 

3. 실행 환경

  • 운영체제 : Window 11
  • Python : 3.10.6
  • Streamlit : 1.34.0
  • LangChain : 0.2.0
  • FastAPI : 0.110.3
  • Uvicorn : 0.23.2

 

 

4. RemoteRunnabel / Streamlit 설치

LangChain 설치 (RemoteRunnable 포함)

 

RemoteRunnable은 LangChain 패키지에 포함된 기능 중 하나입니다. 따라서 LangChain을 이미 설치하신 분들은 따로 설치하실 필요가 없습니다. 만약 LangChain을 설치해야 한다면 아래 코드를 실행하여 설치하실 수 있습니다.

# Windows PowerShell
pip install langchain

 

 

streamlit 설치

 

Streamlit은 아래 코드를 실행하여 설치하실 수 있습니다.

# Windows PowerShell
pip install streamlit

 

 

5. 프론트엔드 구성 (Streamlit, Streamlit Community Cloud, Github)

1) RemoteRunnable / Streamlit

 

RemoteRunnable과 Streamlit을 활용하여 프론트엔드 코드를 작성합니다.

# Python code

import streamlit as st
from langserve import RemoteRunnable

st.title('LangChain 기반 영어 번역 애플리케이션')

user_input = st.text_input("영어 문장을 넣어주세요:")

if st.button('전송'):
    remote = RemoteRunnable(url="http://localhost:8000/translate")
    result = remote.invoke({"input": user_input})
    st.write("응답:", result)

 

이렇게 작성한 코드를 GitHub에 업로드하겠습니다.

 

 

 2) Github 

 

 GitHub는 소프트웨어 개발 프로젝트를 호스팅하고 관리하기 위한 플랫폼으로, 주로 소스 코드 관리와 버전 관리를 위해 사용됩니다. GitHub는 Git을 기반으로 하며, 개발자들이 협업하고 코드를 관리하는 데 필수적인 도구로 자리잡고 있습니다.

 

 a) 깃허브 공식 페이지에 접속 후 로그인 - https://github.com/

 b) 깃허브에서 "new repository" 생성

 

※ new repository 생성 방법

  • 로그인 후 우측 상단에서 자신의 프로필을 클릭합니다.
  • "Your repositories"를 클릭합니다.
  • 우측 상단의 "New" 버튼을 클릭합니다.
  • Repository name을 입력한 후 "Create repository"를 클릭합니다.

깃허브 로그인 후 우측 상단 클릭

 

Your repositories 클릭

 

우측 상단 "New" 버튼 클릭

 

Repository name 입력 후 Create repository 클릭

 

위 과정을 완료하면 repository가 생성됩니다. Github에서 repository는 code들을 한곳에 모아두는 폴더 정도로 생각하시면 됩니다. repository 생성이 끝났으면 처음에 작성했던 프론트엔드 코드를 Github에 업로드합니다.

 

  Github 코드 업로드 방법

  • uploading an existing file 버튼 클릭
  • 이 후 화면에서 프론트엔드 코드 파일을 드래그하여 업로드
  • 좌측 하단의 "Commit changes" 버튼을 눌러 저장

 

 

추가적으로 "requirements.txt" 파일을 하나 더 업로드 시켜줍니다. 파일의 내용은 아래와 같습니다.

# .txt 파일
streamlit>=1.21.0
langserve>=0.1.0
requests>=2.31.0
fastapi>=0.95.0

 

이 파일을 업로드하는 이유는 Streamlit Community Cloud에서 해당 코드를 작동시키기 위해서입니다. Streamlit Community Cloud에서 더 자세히 설명하겠습니다.

 

모든 파일을 업로드한 후, repository에는 두 개의 파일이 업로드된 것을 확인할 수 있습니다.

 

 3) Streamlit Community Cloud

 

 Streamlit Community Cloud는 Streamlit 애플리케이션을 쉽게 배포하고 공유할 수 있는 플랫폼입니다. 간편한 배포 방식과 무료 호스팅이 가능하여 Streamlit Community Cloud를 선택했습니다. 또한, Streamlit Community Cloud와 GitHub는 매우 긴밀하게 연계되어 있어, Streamlit 애플리케이션을 GitHub에 업로드한 후 Streamlit Community Cloud로 쉽게 배포할 수 있습니다

 

GitHub에 업로드한 파일을 이용하여 Streamlit Community Cloud에서 배포해보겠습니다.

 

 a) Streamlit 공식 사이트 접속 후 로그인 - https://streamlit.io/

 b) Github와 계정 연동 (Github 아이디로 접속하셨다면 생략)

 c) app 생성

 

  app 생성 방법

  • Streamlit 공식 사이트 우측 상단 Create app 클릭
  • GitHub에서 만든 Repository를 선택
  • Main file path에는 처음 작성했던 프론트엔드 코드 파일 입력 (예를 들어, 파일명을 "streamlit_app.py"로 저장한 경우 이 파일명을 입력합니다.)
  • Deploy 버튼 클릭

 

 

 Github에서 만들어놓은 Repository를 선택해줍니다. 그리고 Main file path는 처음에 작성했던 streamlit 코드 파일명을 정해주셔야합니다. 저의 경우 Github에 업로드할때부터 해당 코드 파일의 이름을 "streamlit_app.py"로 저장해놓고 진행하였습니다. 모두 완료하셨으면 "Deploy" 버튼을 클릭해줍니다.

 

※  GitHub에 requirements.txt 업로드 이유
 requirements.txt 파일을 GitHub에 업로드한 이유는 Streamlit Community Cloud에서 애플리케이션을 실행할 때 필요한 라이브러리들을 자동으로 설치하도록 하기 위함입니다. 이 파일에는 애플리케이션이 의존하는 패키지들의 목록과 버전 정보가 포함되어 있습니다. 이렇게 하면, Streamlit Community Cloud는 애플리케이션을 배포할 때 해당 파일을 읽고 필요한 라이브러리들을 설치하여 애플리케이션이 원활히 실행될 수 있도록 합니다.

 

 

아래 이미지와 같이 페이지가 출력된다면 Streamlit을 통한 프론트엔드 설정 및 배포가  완료된 것입니다.


728x90

 

6. 백엔드 구성 ( LangChain, FastAPI, Uvicorn)

 백엔드는 LangChain, FastAPI, 그리고 Uvicorn을 사용하여 구성했습니다. 자세한 과정은 생략하고, 해당 코드만 공유하겠습니다. 자세한 과정이 궁금하시다면 아래 링크를 통해 지난 포스팅 글을 확인하실 수 있습니다.

 

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

 

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

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

marcus-story.tistory.com

 

server.py

# Python code

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 translate 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 = ["*"], # 브라우저에서 액세스할 수 있어야 하는 응답 헤더
)

# 추가된 코드
add_routes(app, chain, path = "/translate")

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

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

# 수정된 코드
@app.post("/")
async def invoke_chain(data: Input_ms):
    # 모델 응답 호출
    result = chain.invoke({"input": data.input})
    # 참고 내용 제거
    result = result.split("참고:")[0].strip()
    return {"output": result}

if __name__ == "__main__":
    import uvicorn

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

 

translate.py

# Python code

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_template(
    "You are a great translator from English to Korean,"
    "You noly translate user input,"
    "No additional information is provided,"
    "you do not respond to the user input,: \n{input}"
    )

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

 

 

위 코드들의 작성이 완료되면, 아래 명령어를 통해 로컬 서버를 실행합니다.

# Windows PowerShell
python server.py

 

해당 명령어를 server.py 파일이 있는 경로에서 실행해야 합니다. 아래 이미지와 같이 실행이 되면 로컬 서버에서 EEVE 모델이 정상 작동 중임을 나타냅니다.

 

 

 

7. EEVE모델 실행

 프론트엔드(Streamlit Community Cloud)에서 질문을 입력했을 때, EEVE 모델이 답변을 잘 응답하는지 확인해봅니다.

 

 

사용자 입력 "my name is marcus"에 대해 EEVE 모델이 설정한 대로 영어 문장을 한국어로 번역해주었습니다.


 

 이번 포스팅에서는 RemoteRunnable과 Streamlit을 사용하여 애플리케이션을 구현하고 배포하는 방법에 대해 알아보았습니다. RemoteRunnable과 Streamlit은 LangChain과 더불어 AI 모델을 애플리케이션으로 구현하고 배포하는 데 적절한 도구입니다. RemoteRunnable을 통해 복잡한 AI 연산을 원격 서버에서 처리하여 로컬 환경의 부담을 줄일 수 있고, Streamlit을 사용하면 개발자는 쉽게 대화형 웹 인터페이스를 구축할 수 있으며, LangChain은 AI 모델의 다양한 기능을 체인 형태로 결합하여 복잡한 워크플로우를 간단하게 구현할 수 있습니다. 결과적으로, RemoteRunnable, Streamlit, 그리고 LangChain은 AI 모델의 개발, 배포, 운영에 있어 강력한 솔루션을 제공합니다.

 

다만 아쉬웠던 점은 EEVE 모델을 미세 조정하지 않고, 간단한 역할만 부여해서인지 성능이 기대에 미치지 못했습니다. 영어 질문을 입력하면 번역 대신 질문에 대한 답변을 제공하거나 추가적인 설명을 첨부하는 경우가 종종 있었습니다. 특정한 서비스를 위한 모델을 만들기 위해서는 Fine-tuning이나 RAG 기법이 필요해 보입니다. 다음 포스팅에서는 이러한 기법을 사용하여 EEVE 모델에 더 명확한 역할을 부여하는 방법에 대해 다뤄보겠습니다.

 

 

긴 글 읽어주셔서 감사합니다 :)