RAG 시스템은 단순한 LLM 호출이 아니라, 여러 단계로 이루어져있다.사용자 질문관련 문서 검색문서를 프롬프트에 넣기LLM 답변 생성출처와 함께 반환그래서 RAG 답변이 틀렸을 때 원인도 여러 가지다.검색이 잘못됐을 수 있다.검색은 맞았는데 LLM이 문서를 잘못 읽었을 수 있다.답은 맞았는데 출처가 틀렸을 수 있다.문서 자체가 오래됐을 수 있다.RAG 평가는 이 원인을 분리해서 보는 작업이다.예시로 보기질문이 들어왔다고 하자.질문:해외배송 상품을 환불하면 위약금은 얼마인가요?정답을 만들려면 두 개의 근거가 필요하다.근거 A: 해외배송 상품의 환불 정책근거 B: 환불 정책이 참조하는 위약금 산정 조항RAG 시스템은 이 두 근거를 찾아서 LLM에게 줘야 한다.정상적인 흐름은질문 → 검색 단계에서 A와 B를..
RAG나 임베딩 검색을 만들면 결국 이런 작업을 해야 한다.질문을 벡터로 바꾼다.문서 조각들도 벡터로 저장해둔다.질문 벡터와 가장 가까운 문서 벡터를 찾는다.예를 들어 사용자가 이렇게 묻는다고 하자: "택배가 아직 안 왔을 때 보상 받을 수 있나요?"이 질문은 문서의 정확한 문장과 단어가 다를 수 있는데,문서에는 "배송 지연으로 인한 보상 기준은 다음과 같다." 라고 쓰여있을 수 있다.즉, 키워드는 완전히 같지 않고, 그러나 의미는 가깝다.임베딩 검색은 이런 의미 유사성을 이용하는데, 문제는 문서가 많아졌을 때다.문서 조각 1,000개 → 하나씩 비교 가능문서 조각 100만 개 → 하나씩 비교하면 느림문서 조각 1억 개 → 단순 비교는 거의 불가능그래서 필요한 것이 Vector DB와 ANN 검색이다.V..
지도학습에서는 입력 `x`와 정답 `y`가 함께 있다.모델은 `x`를 보고 `y`를 맞히도록 학습한다. CS 문의 분류 문제를 생각해보자.입력 `x`: 문의 문장, 고객 등급, 주문 상태, 배송 상태, 결제 금액정답 `y`: 배송 문의 / 환불 문의 / 교환 문의 / 상품 문의 / 기타 문의이번에는 딥러닝 이전부터 널리 쓰인 머신러닝 모델을 알아본다.먼저 볼 기준기준질문문제 유형회귀인가, 분류인가?데이터 형태숫자형인가, 범주형인가, 텍스트인가?비선형성단순 직선 관계인가, 복잡한 조건 관계인가?해석 가능성왜 그런 예측을 했는지 설명해야 하는가?전처리 필요스케일링, 인코딩, 결측치 처리에 민감한가?데이터 크기샘플 수와 특징(feature) 수가 어느 정도인가?운영 조건빠른 예측, 작은 모델, 설명 가능성이 ..
머신러닝 모델을 만들면 보통 이런 기대를 한다.학습 데이터에서 잘 맞으면새 데이터에서도 잘 맞겠지.하지만 실제로는 그렇지 않을 수 있다.모델이 학습 데이터에서는 거의 완벽한데, 처음 보는 데이터에서는 성능이 떨어지는 경우가 많다.이 현상을 과적합(overfitting)이라고 한다.과적합과적합은 모델이 데이터의 일반적인 패턴이 아니라 학습 데이터에만 있는 우연한 흔들림과 노이즈까지 외워버리는 상태다.예를 들어 학생이 시험공부를 한다고 하자.좋은 공부:문제의 원리를 이해한다.새 문제가 나와도 풀 수 있다.나쁜 공부:기출문제 답만 외운다.기출과 똑같은 문제는 맞힌다.조금만 바뀌면 틀린다.과적합된 모델은 두 번째 학생과 비슷하다.학습 데이터라는 기출문제는 잘 맞히지만, 실제 운영에서 들어오는 새 데이터에는 약하..
분류 모델은 입력을 보고 정해진 범주 중 하나를 고른다.예를 들어 이상거래 탐지 모델을 만든다고 하자.입력: 거래 금액, 거래 시간, 사용자 위치, 결제 수단, 과거 거래 패턴출력: 정상 거래 / 이상 거래모델이 예측을 끝내면 이 모델은 얼마나 잘 맞혔을까? 라는 질문이 생긴다.이 때, 가장 먼저 떠오르는 지표는 정확도다.(정확도 = 전체 중 맞힌 비율)그러나 분류 문제에서는 정확도만 보면 위험한 경우가 많다.특히 정답 비율이 한쪽으로 치우친 데이터에서는 정확도가 매우 그럴듯하게 속일 수 있다.이상거래 탐지 예시를 끝까지 사용해보자.전체 거래: 10,000건실제 정상 거래: 9,900건실제 이상 거래: 100건→ 이상거래는 전체의 1%뿐.모델이 예측한 결과가 다음과 같다고 하자.모델이 이상 거래라고 예측..
머신러닝 모델은 학습 데이터에 잘 맞는 것만으로는 충분하지 않다.중요한 질문은 이거다.이 모델이 처음 보는 새 데이터에서도 잘 맞을까?예를 들어 CS 문의 분류 모델을 만든다고 하자.목표: 고객 문의 문장을 보고 문의 유형을 예측한다.입력 예시: "배송이 너무 늦어요"정답 예시: 배송 지연 문의데이터가 10,000건 있다고 해서, 10,000건 전부로 학습하고 같은 10,000건으로 평가하면 안 된다.그건 모델이 시험 문제를 미리 보고 공부한 뒤 같은 문제로 시험을 보는 것과 비슷하다.모델이 진짜로 잘하는지 보려면, 학습에 쓰지 않은 데이터를 따로 남겨두고 평가해야 한다.전체 데이터 10,000건→ 학습용 데이터 8,000건→ 검증용 데이터 1,000건→ 테스트용 데이터 1,000건데이터 분리의 목적은 ..
머신러닝 문제를 처음 볼 때 가장 먼저 확인할 것정답 라벨이 있느냐?정답 라벨이 있으면 지도학습에 가깝다.정답 라벨이 없고 데이터의 구조를 찾는다면 비지도학습에 가깝다.라벨이 조금만 있거나, 데이터 자체에서 학습 문제를 만들거나, 행동에 대한 보상을 통해 배우는 경우도 있다.지도학습: 입력과 정답이 함께 있는가?비지도학습: 정답 없이 데이터 구조를 찾는가?반지도학습: 라벨 있는 데이터가 적고, 라벨 없는 데이터가 많은가?자기지도학습: 데이터 자체에서 맞혀야 할 문제를 만들 수 있는가?강화학습: 행동의 결과로 보상을 받고, 장기 보상을 키우는가?전체 기준머신러닝 문제는 보통 다음 순서로 생각하면 된다.1. 정답 y가 있는가? → 있다: 지도학습 → 없다: 다음 질문2. 데이터끼리 구조를 찾고 싶은가..
이 글에서 다루는 것머신러닝에서 “학습한다”는 말은 막연하게 똑똑해진다는 뜻이 아니다.정확히는 다음 과정을 반복한다는 뜻이다.입력 데이터를 넣는다→ 모델이 예측값을 만든다→ 정답과 비교해서 얼마나 틀렸는지 숫자로 계산한다→ 그 숫자를 줄이는 방향으로 모델 내부 값을 조금 바꾼다→ 이 과정을 여러 번 반복한다이 글의 목표는 다음 개념을 하나의 흐름으로 연결하는 것이다.개념의미모델입력을 받아 예측을 만드는 함수파라미터모델 내부에서 학습으로 바뀌는 숫자예측값모델이 낸 답손실함수예측이 얼마나 틀렸는지 계산하는 함수경사손실을 줄이려면 어느 방향으로 움직여야 하는지 알려주는 값경사하강법경사를 따라 손실이 작아지는 쪽으로 파라미터를 갱신하는 방법옵티마이저파라미터를 실제로 어떻게 갱신할지 정하는 알고리즘학습손실이 작아..
RAG의 한계에서 출발RAG는 질문과 벡터가 "직접 비슷한" 문서만 찾는다. 그런데 실제 질문은 종종 여러 단계를 거쳐야 답이 나오는 경우가 있다.e.g) "해외배송 상품을 환불하면 위약금은 얼마인가?먼저 "해외배송 상품의 환불 정책이 무엇인지"를 찾고그다음 "그 환불 정책이 참조하는 위약금 산정 조항"을 찾아야 한다이 두 조각이 임베딩 공간에서 서로 가깝지 않을 수 있다. "위약금 산정 조항"이라는 텍스트는 "해외배송 환불 정책"이라는 텍스트와 단어도 다르고 문맥도 다를 수 있다. 벡터 검색만으로는 이런 "간접적으로 연결된" 정보를 놓치기 쉽다.GraphRAG는 문서 조각들 사이의 명시적인 관계(어떤 조항이 어떤 조항을 참조하는지, 어떤 정책이 어떤 정책을 인용하는지)를 그래프로 미리 저장해두고, 검색..
1.RAG?검색(Retrieval): 질문과 관련된 문서 조각을 데이터베이스에서 먼저 찾아온다증강(Augumented): 찾아온 문서 조각을 LLM 프롬프트에 근거로 추가(증강)한다생성(Generation): LLM이 그 근거를 바탕으로 답변을 생성한다문제 상황LLM은 학습 시점까지의 데이터만 알고 있다. 회사 내부 정책 문서, 최신 이용약관, 특정 서비스의 세부 매뉴얼처럼 모델이 애초에 본 적 없는 정보는 답변에 반영할 수 없다. 예를 들어 쇼핑몰 CS 챗봇이 "이번에 바뀐 해외배송 환불 규정"을 답변에 반영하려면, 그 규정 문서를 어떻게든 모델에게 전달해야 한다. 이걸 해결하는 가장 직관적인 방법은 "필요한 정보를 프롬프트에 직접 넣어주는 것"인데, 문서 전체를 매번 통째로 넣으면 비용이 크고 비효율..
1. 임베딩과의 관계 임베딩은 숫자로 끝나고, LLM은 다음 단어를 계속 만들어낸다. 임베딩은 "텍스트→벡터" 변환만 하고 끝남LLM은 같은 트랜스포머 계열 구조를 쓰지만 벡터에서 다시 텍스트를 생성한다.둘 다 "문맥을 이해한다"는 점은 같은데, 출력 형태가 다른 것. [ML] 벡터 임베딩(Vector Embedding) - 의미를 벡터로cf) TF-IDF [ML] TF-IDF(Term Frequency-Inverse Document Frequency)1. TF-IDF?정의단어의 빈도(TF)와 역문서빈도(IDF)를 곱해서, 문서 내 각 단어의 "중요도"를 가중치로 매기는 방법단순히 "몇 번 나왔는가"만 세는 빈blog.chaenii.me2. 트랜스포머트랜스포머의 핵심은 어텐션(attention) 메커니즘..
cf) TF-IDF [ML] TF-IDF(Term Frequency-Inverse Document Frequency)1. TF-IDF?정의단어의 빈도(TF)와 역문서빈도(IDF)를 곱해서, 문서 내 각 단어의 "중요도"를 가중치로 매기는 방법단순히 "몇 번 나왔는가"만 세는 빈도수 카운트(Bag of Words)의 한계를 보완쓰임문서 간blog.chaenii.meTF-IDF도 텍스트를 벡터로 바꾼다. 그런데 TF-IDF는 순수하게 "단어가 몇 번 등장했는가"라는 통계에 기반한다."강아지"와 "개"는 글자가 다르니 전혀 다른 차원으로 취급 → 의미가 같다는 것을 전혀 모른다.임베딩(embedding): 신경망이 대량의 텍스트를 학습 → "이 단어가 어떤 맥락에서 쓰이는가" 함께 학습"강아지"와 "개"는 비..
1. SOM?Self-Organizing Map. 입력 데이터를 2차원 격자 위에 스스로 배치하도록 학습하는 신경망 구조의 고전적 비지도학습 알고리즘.목적은 KMeans와 같지만(데이터를 비슷한 그룹으로 묶기), 중심점들이 고정된 격자 위에서 이웃과 함께 움직인다는 점이 다르다.주의할 점은 SOM을 보통 CNN/Transformer 같은 현대적 의미의 "딥러닝"으로 분류하지는 않는다는 것이다. 여러 층을 깊게 쌓은 모델이라기보다, 경쟁학습(competitive learning)을 사용하는 얕은 신경망에 가깝다.2. K-Means와 다른 점KMeans$K$개의 중심점이 공간에서 자유롭게 독립적으로 움직임.중심점 5번이 어디로 가든 50번에게 영향 없음.SOM노드들이 고정된 격자(grid) 위에 배치학습 중..
1. Silhouette Score?[STUDY/ML(Machine Learning)] - [ML] K-means clustering [ML] K-means clustering1. K-means clustering?데이터를 $K$개의 그룹(군집)으로 자동으로 나눠주는 비지도학습 알고리즘각 군집을 대표하는 중심점(centroid)을 그 군집에 속한 데이터들의 평균(mean) 위치로 잡아가면서 군집을blog.chaenii.me클러스터링은 비지도학습이라 "정답"이 없다. KMeans를 $K=10$으로 돌린 결과와 $K=70$으로 돌린 결과 중 뭐가 더 "좋은" 군집인지 어떻게 판단할까?우선 좋은 군집화란: 같은 군집 안의 데이터끼리는 가깝고, 다른 군집과는 멀어야 한다 이 두 조건을 하나의 점수로 합쳐, 좋은..