지금까지 만든 Dialogflow 챗봇(json 파일을 이용하는)은 정해진 Training phrases에만 반응할 수 있었음
예를 들어 '돈까스가 뭐야?' 라는 질문이 json 파일에 있으면 응답하지만
'돈까스 뜻 알려줘' 같은 유사 질문엔 응답하지 못하는 구조...
그래서 유사어도 해석이 가능한 챗봇을 만들고자 했음
--> Universal Sentence Encoder (USE) 를 도입해, 입력된 문장을 벡터화하여 유사도 기반 응답을 시도
하지만...
Firebase Functions에서 TensorFlow USE 사용이 어려운 이유
1. 메모리 부족
- @tensorflow/tfjs-node 기반 모델 로딩에는 최소 500~700MB 이상 메모리 필요.
- Firebase Functions 기본 메모리: 256MB / 512MB / 1024MB
- 1024MB(최대) 설정 후에도, USE 모델 로딩 중 1088MB 사용 → 초과 발생.
Memory limit of 1024 MiB exceeded with 1088 MiB used.
2. 타임아웃
- Firebase Functions 1세대는 60초 안에 HTTP 응답을 반환해야 함.
- 모델 로딩이나 외부 다운로드에 60초 이상 걸리면 timeout 발생.
1, 2 문제를 해결하기 위해...
const use = require("@tensorflow-models/universal-sentence-encoder");
const tf = require("@tensorflow/tfjs-node");
let useModel;
use.load().then(model => {
useModel = model;
});
Universal Sentence Encoder (USE) 모델을 외부에서 직접 다운로드하여 메모리에 로딩하는 구조에서
await bucket.file(`models/use_model/saved_model.pb`).download({ destination: localPath });
Firebase Storage에 모델을 업로드하고, Functions가 Storage에서만 가져오는 구조로 변경 했으나...
메모리 초과
- 모델을 /tmp에 저장하더라도, 로드 시점에 최소 1GB 이상 메모리 사용
- Firebase Functions 최대 메모리 제한: 1GB
- 결국 모델을 불러오자마자 Memory limit exceeded 에러 발생
타임아웃
- Firebase Storage에서 파일 다운로드 시 네트워크 지연 → 여전히 느림
- cold start + 다운로드 = 60초 초과
3. tfjs-node의 Native 모듈 오류
- @tensorflow/tfjs-node는 C++ 기반의 native binding (tfjs_binding.node) 을 사용
- Firebase Functions는 이 모듈을 로딩하지 못하거나 빌드 실패
Error: Cannot find module '.../tfjs_binding.node'
4. 네트워크 지연 + cold start
- use.load() 또는 외부 모델 다운로드 시, 함수 cold start 상태에서 네트워크 응답 지연으로 실패.
- 특히 모델을 Firebase Storage에서 불러올 경우도 5~10초 이상 걸림.
5. 비용과 효율 문제
- 메모리 1GB, timeout 확장, 빌드 최적화 등 해결은 가능하더라도 복잡하고,
- 결국 비용 대비 성능이 떨어짐 → 실시간 응답성도 나빠짐
정리하면
메모리 초과 | 모델 로딩에 필요한 공간 부족 |
타임아웃 | 초기 모델 로딩 시간 60초 초과 |
tfjs-node native binding | functions 환경에서 실패 |
느린 네트워크 | cold start 시 모델 다운로드 지연 |
구조적 비효율 | request마다 모델 재로드 필요, 유지 어려움 |
결론...
Firebase Functions는 모델을 로딩하는 구조엔 적합하지 않다.
(단순 파일에서 가져오는 QnA 형식이나, Dialogflow 에서 지원하는 Training phrases 를 사용하면 적합함 )
>> Cloud Run + 사전 임베딩 구조로 변경 할 예정
Dialogflow → Firebase Functions(Webhook) → 자연어 처리 모델 로딩 → 질문 응답
소스 정리는 다음 게시물에...
'개발' 카테고리의 다른 글
Universal Sentence Encoder의 한계와 sentence-transformers (0) | 2025.04.03 |
---|---|
Dialogflow에 Firebase 연동하기 (0) | 2025.03.31 |
내가 만든 쿠키 (하루 동안 보지않기) (1) | 2025.01.22 |
char.js 로 jsp에서 차트 그리기 (1) | 2025.01.22 |
ORA-00997: illegal use of LONG datatype (1) | 2025.01.22 |