본문 바로가기

AiDAOps

FastAPI와 LangChain, Ollama를 이용한 LLM 기반 웹 서비스(1)

AiDAOps 시스템구조 설계를 진행하다보니 계속 제자리 걸음입니다.
조금 진행하다보면 테스트한답시고 멈춰서 이것저것 건드리다가 강의가 들어오면 그거 하다가..
개발이 제대로 진척되지 않네요.

그래서 방법을 바꾸었습니다.
사용할만한 작은 기능들을 하나씩 만들면서 그냥 그때그때 수정해 나가는 방식으로 하기로 했습니다.
그렇다고.. 무턱대고 만들어선 제대로 된 시스템이 되지 않을테니 필요한 기능을 만들고 추가하면서 추가 시점에 해당 기능에 관련된 구조까지만을 설계에 반영하는 형태로 진행하려고 합니다.

솔직히 작업하면서 뭔가 눈에 띄는 결과물이 없으면 의욕도 나지 않고..
사실 어떤 코드가 어떻게 들어올지도 잘 모르는 상태에서 큰 시스템을 혼자 설계하고 있는 것이 썩 재미있지는 않네요.

제일 처음 만들어볼 내용은 FastAPI와 Ollama를 이용한 LLM 기반 챗봇 웹 서비스입니다.
기반이 되는 내용은 예전에 이미 다루었던 부분입니다.
꽤 오랜 시간이 지났으니 버전 상승 및 기술 변화에 따라 달라진 부분이 조금 있을 수는 있습니다만.. 별 차이는 없을 것입니다.

 

필요하신 분은 다음 링크를 참고하시기 바랍니다.

 

시작하기 전에 먼저 환경구축부터 하도록 합니다.

파이썬 버전은 최신버전을 사용하도록 하고 Ollama를 설치해 둡니다.

LLM은 HyperCLOVAX-SEED-Text-Instruct-0.5B를 사용하도록 합니다.

모델의 크기도 1.1GB밖에 되지 않고 파라미터의 수도 총 5억 7천만개(0.57 B), 유효 파라미터 수가 약 4억 5천만개(0.45 B)에 불과하기때문에 상당히 가볍습니다.

그리고 한국어/한국 문화의 이해, 수학 역량이 강화된 소형 모델이라고 하니 실습에 쓰기 좋을 것 같습니다.

 

그리고 가상환경을 생성하고 활성화한 후, 기본적으로 필요한 파이썬 라이브러리를 설치합니다.

  • fastapi : Python으로 빠르고 쉽게 웹 API 서버를 만들 수 있는 비동기 기반의 웹 프레임워크
  • uvicorn : ASGI(비동기 서버 게이트웨이 인터페이스)를 지원하는 FastAPI 서버 실행용 초고속 비동기 웹 서버
  • httpx : 비동기 요청을 지원하는 현대적인 HTTP 클라이언트 라이브러리
  • python-dotenv : .env 파일에 저장된 환경 변수들을 Python 프로젝트에서 쉽게 불러올 수 있게 해주는 라이브러리

최근에는 환경설정 정보를 JSON이나 YAML 파일을 사용하는 경우도 많지만 가독성, 편의성을 우선하기 위해서 .env 파일을 사용하도록 했습니다.

 

.env 파일에는 일단 OLLAMA에서 사용할 기본 정보만 저장해 두겠습니다.

 

  • .env
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_MODEL=HyperCLOVAX-SEED-Text-Instruct-0.5B

 

그럼 이제 FastAPI를 작동시킬 수 있는 기본 코드를 main.py 파일에 작성하겠습니다.

FastAPI의 기본 URL인 http://127.0.0.1:8000(또는 http://localhost:8000) 으로 이동하면 JSON 형태로 메시지를 보여주는 가장 단순한 코드입니다.

 

  • main.py
from fastapi import FastAPI

# FastAPI 인스턴스 생성
app = FastAPI()

# 기본 경로 설정
# 이 경로는 FastAPI 애플리케이션의 루트 경로에 대한 핸들러를 정의합니다.
@app.get("/")
async def read_root():
	return {"message": "Hello, FastAPI!"}

 

코드를 main.py라는 이름으로 저장하고 Uvicorn을 이용하여 웹서버를 작동시킨 후, http://127.0.0.1:8000 으로 이동하면 다음과 같은 결과를 보여줍니다.

 

  • FastAPI 애플리케이션 실행
    • main.py가 있는 디렉토리에서 다음 명령을 실행합니다.
uvicorn main:app --reload

 

또한 http://127.0.0.1:8000/docs (또는 http://localhost:8000/docs)로 이동하면 Swagger UI 기반의 대화형 API 문서를 자동으로 생성하여 보여줍니다.

 

이제 결과물을 JSON 데이터가 아닌 HTML로 구성된 웹페이지로 연결하도록 하겠습니다.

 

먼저 첫 웹페이지를 표현하기 위하여 index.html 파일을 읽기 위한 정적 파일 경로를 설정합니다.

앞에서 만들었던 read_root() 함수를 수정하여 URL을를 호출한 클라이언트(브라우저)로 정적 파일(index.html)을 되돌려줄 수 있도록 만듭니다.

 

  • main.py
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
from fastapi.responses import HTMLResponse

# FastAPI 인스턴스 생성
app = FastAPI()

# 정적 파일(index.html) 경로 설정
# 이 경로는 FastAPI가 정적 파일을 제공할 때 사용됩니다.
app.mount("/static", StaticFiles(directory="static"), name="static")

# 기본 경로 설정
# 이 경로는 FastAPI 애플리케이션의 루트 경로에 대한 핸들러를 정의합니다.
# 이 핸들러는 HTML 응답을 반환합니다.
@app.get("/", response_class=HTMLResponse)
async def read_root():
	with open("static/index.html") as f:
		return HTMLResponse(content=f.read())

 

  • static/index.html
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>FastAPI + Ollama 챗봇</title>
</head>
<body>
    <h1>FastAPI + Ollama 챗봇</h1>
</body>
</html>

 

다음과 같이 index.html 화면이 표시되면 성공입니다.

 

 

지금은 단순히 정적파일로 등록된 index.html을 바로 연결해 놓았지만 프로그램이 조금 더 커지면 구조를 제대로 만들겠습니다.

일단 여기까지 해 두고 다음 글에서 계속 진행하겠습니다.

 

 

728x90
반응형