과제를 진행하면서 LLM을 활용한 애플리케이션을 개발해야했다.
회사에서 가장 활용성이 좋은 애플리케이션이 무엇일까 생각했더니 ChatBot이라고 생각했다.
그래서 챗봇을 개발하기로 결심!!
기술 스택은 아래와 같다.
개발의 핵심은 내가 익숙한 언어로, 약 2-3일 동안의 시간동안 구현하는 게 목표였기에
사용해본 FastAPI와 React를 사용해서 구현했다.
LLM 사용하기
Hugging Face에서 Llama3 사용을 위한 Access 신청을 해야한다.
보통 1시간 이내면 허용 이메일이 온다.
개발 환경은 당연 colab을 사용했다. 노트북으로 개발을 했기에 GPU가 없었다.
발급받은 허깅페이스 키로 로그인 해주고,
모델 로드를 했다.
import torch
from transformers import pipeline
# Llama-3 모델 ID
model_id = "meta-llama/Meta-Llama-3-8B-Instruct"
# Hugging Face에서 모델 로드
pipeline_obj = pipeline(
"text-generation", # 작업: 텍스트 생성
model=model_id, # 모델 ID
device_map="auto", # GPU 자동 할당
torch_dtype=torch.bfloat16, # GPU 메모리 최적화
)
print("모델 로드 완료!")
이렇게 허깅페이스에 transformers 라이브러리를 활용해서 모델을 가져왔고,
GPU 최적화를 적용해서 성능을 극대화했다.
이렇게 총 로드하는데 처음에는 거의 1시간 걸렸다.
그리고 GPU 메모리 최적화를 안하면 자꾸 코랩에서 할당이 다 되었다고 오류뜨고, 다른 계정으로 다시 시도를 하고 그랬다.
Llama3의 Instruct의 경우 질문-응답에 최적화 되어있어서 선택을 했다.
이렇게 모델 로드를 했다면 이제 이 모델을 서버와 연결해야 한다.
Fine-tuning
이미 Pre-training 모델을 가져왔으니 회사 정보에 맞고 임직원들의 요청에 정확도 있게 응답하기 위해 미세 조정이 필수적이었다.
그래서 많은 양은 아니지만 조금이라도 요청-응답 형태로 data를 만들어서 학습시켰다.
dataset = load_dataset("json", data_files={"train": "train.json", "test": "test.json"})
LLM Serving
사실 서빙이라고 명을 붙이기에도 민망하지만;; ㅎㅎ
코랩에서 로드한 llm을 가지고 일단 로컬에서 써보기로 했다. (응답을 반환하는 API를 만들기로)
라이브러리 임포트랑 CORS 설정은 필수로 해주고, 모델을 사용하는 API를 만들었다.
@app.post("/chat")
async def chat(data: ChatRequest, request: Request):
try:
# LLM 파라미터
response = pipeline_obj(
user_input,
max_new_tokens=200, # 모델 응답 길이
do_sample=True, # 텍스트 생성시 샘플링을 사용할지
temperature=0.6, # 창의성과 예측 가능성 조절
top_p=0.9, # 텍스트의 다양성 확보
)
print(formatted_prompt)
return {
"response": response[0]["generated_text"] # 모델 응답
}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
사실 어떤 파라미터를 넣어야.. 응답의 정확도가 높게 나올지 테스트를 많이 해봤지만
이 정도가 정확성, 속도 면에서 그나마 괜찮았기에 선택했다.
FastAPI 실행 (Uvicorn + Ngrok)
코랩에서만 사용하던 llm을 이제 public 하게 사용해야 하니 ngrok을 사용했다.
대신 코랩을 끄고 킬 때마다 클라이언트에서 url을 변경해줘야 하고 회사에서는 ngrok을 프록시라고 솔루션이 잡아내서 집에서만 개발을 해야 했다 ㅎ..
Client
const API_URL = "https://1ed6-35-198-237-254.ngrok-free.app/chat";
try {
const response = await fetch(API_URL, {
method: "POST",
body: JSON.stringify({ user_input: input }),
});
ngrok이 만들어준 api로 client와 연결했다.
물론 UI는 비루하지만 ㅎㅎ ,, 나름 회사 포인트 컬러랑 실제 챗봇처럼 텍스트 애니메이션도 넣었다..
*한국어 학습이 된 모델이 아니라 영어로 요청-응답하는 것에 초점이 맞춰져있다.*
이상한 응답에 어떻게 반응하는지 테스트
민감 정보 유출 하는지 테스트
이번 설날 연휴는 그동안 계획만 세워두고 실행하지 못했던 LLM 기반 애플리케이션 개발과 보안 연구를 본격적으로 진행한 의미 있는 시간이었다. 사실 이번 과제의 핵심은 LLM의 보안 위협을 식별하고, 이를 방어할 수 있는 가이드를 작성하는 것이었지만, 연구를 진행하면서 단순한 이론 분석에 머무르는 것이 아니라, 직접 LLM을 활용한 애플리케이션을 만들어보는 것이 더 효과적인 접근법이 될 것 같다고 판단했다. 그래서 자연스럽게 FastAPI 기반의 LLM 챗봇을 개발하고, 이를 활용하여 보안 테스트를 수행하는 방식으로 연구를 진행했다.
연휴 동안 꽤 많은 시간을 개발에 투자하게 되었는데, 오랜만에 코드를 치면서 다시 개발의 재미를 느낄 수 있었다. ㅎ,ㅎ