RAG 구현 과정 (안드로이드 환경)
1. 질의 입력 & 토크나이징
- 사용자가 앱에서 질문을 입력합니다.
- HuggingFace Tokenizers (Java) + Android용 Tokenizers 네이티브(AAR)
→ 입력된 텍스트를 모델이 이해할 수 있는 토큰 시퀀스로 변환합니다.
→ JNI 기반 네이티브 라이브러리를 활용해 안드로이드 환경에서도 빠르고 효율적인 토크나이징이 가능합니다.
2. 질의 임베딩 생성
- ONNX Runtime (onnxruntime-android)
→ 사전 학습된 임베딩 모델(예: MiniLM, BERT 기반 Sentence Embedding 모델)을 ONNX 포맷으로 로드합니다.
→ 토크나이즈된 질의를 벡터(고차원 임베딩)로 변환합니다.
→ 이 벡터는 의미적으로 유사한 문장을 찾는 데 사용됩니다.
3. 지식 베이스 검색 (Retrieval 단계)
- ObjectBox (로컬 DB)
→ 앱 내부에 저장된 문서, FAQ, 또는 외부 데이터 소스에서 가져온 텍스트를 임베딩과 함께 저장합니다.
→ 질의 임베딩과 DB에 저장된 문서 임베딩을 비교하여 코사인 유사도 또는 내적(dot product) 기반으로 가장 관련성 높은 문서를 검색합니다.
→ 이 단계에서 "질문과 가장 관련 있는 컨텍스트"를 가져옵니다.
4. 컨텍스트 결합 (Augmentation 단계)
- 검색된 문서(컨텍스트)를 원래 질의와 함께 모델 입력으로 구성합니다.
- 예:
사용자 질문: "안드로이드에서 RAG란 무엇인가요?" 검색된 문서: "RAG는 Retrieval-Augmented Generation의 약자로, 검색과 생성 모델을 결합한 방식이다." 모델 입력: "질문: 안드로이드에서 RAG란 무엇인가요? 참고 문서: RAG는 Retrieval-Augmented Generation의 약자로..."
5. 응답 생성 (Generation 단계)
- DJL (Deep Java Library) BOM + HuggingFace 모델 지원
→ DJL을 통해 HuggingFace 기반 언어 모델을 로드합니다.
→ Augmented Input(질문 + 검색된 컨텍스트)을 모델에 전달하여 최종 답변을 생성합니다.
→ DJL은 안드로이드 환경에서도 ONNX, PyTorch, TensorFlow 등 다양한 백엔드를 지원하므로 유연하게 모델을 실행할 수 있습니다.
6. 결과 반환
- 모델이 생성한 답변을 사용자에게 보여줍니다.
- 이때, 검색된 문서 기반으로 답변이 강화되었기 때문에 정확성과 신뢰성이 높아집니다.
🔗 전체 흐름 요약
- 입력 질문 → 토크나이징
- 질문 임베딩 생성 (ONNX Runtime)
- ObjectBox DB에서 관련 문서 검색
- 질문 + 문서 컨텍스트 결합
- DJL + HuggingFace 모델로 답변 생성
- 사용자에게 응답 제공
👉 이렇게 구성하면, 단순히 모델이 "기억"하는 지식에 의존하지 않고, 앱 내부 DB(ObjectBox) 또는 외부 데이터 소스를 활용해 최신/맞춤형 정보를 반영할 수 있습니다. 즉, 검색 기반 정확성 + 생성 기반 유연성을 동시에 얻는 것이 RAG의 핵심입니다.
혹시 원하시면, 제가 안드로이드에서 RAG를 구현할 때의 예시 코드 흐름(질의 → 임베딩 → 검색 → 응답)을 간단히 정리해드릴까요?
0 댓글