들어가기 전에 RAG 간략 정리
Retrieval Augmented Generation : 검색 증강 생성
- LLM이 사전학습된 상태이므로 검색결과에 사내에만 존재하는 정보(문서, 디비 등) 를 알 수가 없어 결과에 반영하지 못함
- 사내 정보들을 임베딩하여 백터화 해서 질의에 함께 사용함으로써 사용자가 원하는 답변을 도출하도록 함
cf. KNN 알고리즘
K-NN(K-Nearest Neighbors, K-최근접 이웃) 알고리즘은 가장 직관적이고 간단한 머신러닝 분류 알고리즘 중 하나임. 어떤 데이터가 주어졌을 때 그 주변의 가장 가까운 K개의 데이터를 참고해서 분류하거나 예측하는 방식.
-> 데이터의 양이 많아질수록(유저 혹은 아이템의 수가 많아지는 경우) 연산량이 기하 급수적 증가됨 -> 대안으로 ANN(Approximate Nearest Neighbor)을 많이 사용함 : trade-off 관계인 정확도와 속도에서 정확도를 일부 포기하고 연산 속도 면에서 이점을 갖도록 근사하는 방법
- OpenSearch service
- JSON 기반 동작
- REST Api활용 사용자의 질의와 답변을 json으로 처리
- 문서의 전달 과정 : 데이터가 json으로 전달되면 인덱스로 전송 > 문서는 토큰화 정규화 하여 샤드 구조로 저장(인덱스는 샤드 구조로 동작) > 여러 데이터 노드에 분산 저장
- Lucene 기반 검색 (역인덱스)
- 분석기 통해 텀으로 나눔 (기계가 이해하기 쉬운 데이터)
- Okapi BM25 사용 랭킹 (텍스트 기반 검색 시 높은 정확도)

- idf :특 단어가 문서내 얼마나 적게 존재
- 결국 용어 출현빈도, 문서 길이에 대한 편향 제거, 단어의 희소성 고려 등을 통해 스코링을 하게 됨
- 단, 질의에 숨은 의도가 있거나 단어가 포함되지 않을 경우 검색이 제대로 이루어지지 못함 -> 이럴 경우 백터를 활용함
- 임베딩
- 원본 문서 -> 임베딩용 모델에 요청하여 청킹(chunk), 저장 (베드록 등이 사용됨)
- 검색 시 쿼리를 임베딩 -> 사전에 저장된 데이터의 임베딩 결과와 비교 (KNN) 백터 검색을 진행 -> 결과 도출