RAG, 텍스트 청킹, 임베딩의 기본 사항을 다루었으니, 이제 전체 RAG 파이프라인을 단계별로 살펴보겠습니다. 이 상세한 예제는 실제 구현에서 모든 요소가 어떻게 맞물리는지 정확히 보여줄 것입니다.
1단계: 소스 텍스트 청킹
먼저, 소스 문서를 가져와 관리하기 쉬운 청크로 나눕니다. 이 예제에서는 두 개의 간단한 텍스트 섹션을 사용하겠습니다:
- 섹션 1: 의학 연구 - "올해는 이전에 본 적 없는 '버그'인 XDR-47에 대한 이해에서 중요한 진전을 이루었습니다."
- 섹션 2: 소프트웨어 엔지니어링 - "이 부서는 분산 시스템에서 다양한 감염 경로를 연구하는 데 상당한 노력을 기울였습니다"
2단계: 임베딩 생성
다음으로, 각 텍스트 청크를 숫자 임베딩으로 변환합니다. 이 개념을 명확히 하기 위해, 항상 정확히 두 개의 숫자를 반환하는 완벽한 임베딩 모델이 있고, 각 숫자가 무엇을 나타내는지 알고 있다고 가정해 보겠습니다:

이 가상의 모델에서:
- 첫 번째 숫자: 텍스트가 의학 분야에 대해 얼마나 이야기하는지
- 두 번째 숫자: 텍스트가 소프트웨어 엔지니어링에 대해 얼마나 이야기하는지
따라서 의학 연구 섹션은 [0.97, 0.34]라는 임베딩을 얻습니다 - 매우 의학적이며, "버그"라는 단어 때문에 소프트웨어와도 약간 관련이 있습니다. 소프트웨어 엔지니어링 섹션은 [0.30, 0.97]을 얻습니다 - 매우 소프트웨어 중심적이지만, "감염 경로"는 의학적 함의를 가지고 있습니다.
정규화
이러한 임베딩을 저장하기 전에, 각 벡터의 크기를 1.0으로 조정하는 정규화 과정을 거칩니다. 이는 일반적으로 임베딩 API에서 자동으로 처리되지만, 이 과정이 일어난다는 것을 이해하는 것이 중요합니다.

정규화 후, 우리의 임베딩은 [0.944, 0.331]과 [0.295, 0.955]가 됩니다. 이를 단위 원 위에 시각화할 수 있으며, 각 점은 원의 가장자리에 정확히 위치합니다.

3단계: 벡터 데이터베이스에 저장
정규화된 임베딩은 벡터 데이터베이스에 저장됩니다 - 이는 우리의 임베딩과 같은 긴 숫자 목록을 저장, 비교, 검색하는 데 최적화된 특수 데이터베이스입니다.

이 시점에서 잠시 멈춥니다. 지금까지의 모든 작업은 사전에 미리 수행되는 전처리였습니다. 이제 사용자가 쿼리를 제출하기를 기다립니다.
4단계: 사용자 쿼리 처리
사용자가 "회사에 대해 궁금합니다. 특히, 소프트웨어 엔지니어링 부서가 올해 무엇을 했나요?"와 같은 질문을 하면, 동일한 임베딩 모델을 통해 해당 쿼리를 실행합니다.

이 쿼리는 [0.1, 0.89]로 임베딩됩니다 - 낮은 의학 점수, 높은 소프트웨어 엔지니어링 점수입니다. 정규화 후에는 [0.112, 0.993]이 됩니다.
5단계: 유사한 임베딩 찾기
이제 벡터 데이터베이스에 "이 사용자 쿼리 임베딩과 가장 가까운 저장된 임베딩을 찾아라"라고 요청합니다. 데이터베이스는 가장 유사한 소프트웨어 엔지니어링 섹션을 반환합니다.

유사도 작동 방식: 코사인 유사도
벡터 데이터베이스는 코사인 유사도를 사용하여 어떤 임베딩이 가장 유사한지 판단합니다. 이는 두 벡터 사이의 각도의 코사인 값을 측정합니다.

코사인 유사도에 대한 핵심 사항:
- 결과는 -1에서 1까지의 범위를 가집니다
- 1에 가까운 값은 매우 유사함을 의미합니다
- 0에 가까운 값은 수직(관련 없음)을 의미합니다
- -1에 가까운 값은 완전히 반대임을 의미합니다
계산은 내적 공식을 사용합니다: cos(a) = (A · B) / (||A|| · ||B||)

이 예제에서, 사용자 쿼리는 소프트웨어 엔지니어링 청크와 0.983의 코사인 유사도를 가지며, 의학 연구 청크와는 0.398에 불과합니다. 소프트웨어 엔지니어링 청크가 명백히 더 나은 일치입니다.
코사인 거리
벡터 데이터베이스 문서에서 "코사인 거리"를 자주 보게 될 것입니다. 이는 단순히 1 - 코사인 유사도이며, 다음과 같이 해석하기 더 쉬운 숫자를 제공합니다:
- 0에 가까운 값은 높은 유사도를 의미합니다
- 값이 클수록 유사도가 낮음을 의미합니다
6단계: 최종 프롬프트 구성
마지막으로, 사용자의 질문과 우리가 찾은 가장 관련성 높은 텍스트 청크를 가져와 Claude를 위한 프롬프트로 결합합니다:

이 프롬프트에는 사용자의 질문과 문서에서 가져온 관련 컨텍스트가 모두 포함되어 있어, Claude가 지식 베이스의 특정 정보를 기반으로 정보에 입각한 답변을 제공할 수 있게 합니다.
전체 흐름
이것이 처음부터 끝까지의 전체 RAG 파이프라인입니다:
- 소스 문서를 청크로 나눕니다
- 각 청크에 대한 임베딩을 생성합니다
- 임베딩을 벡터 데이터베이스에 저장합니다
- 사용자가 질문을 하면, 해당 쿼리를 임베딩합니다
- 코사인 유사도를 사용하여 가장 유사한 저장된 임베딩을 찾습니다
- 관련 청크를 사용자의 질문과 함께 프롬프트에 추가합니다
- 향상된 프롬프트를 Claude에 전송하여 응답을 받습니다
이 과정과 그 뒤에 있는 수학을 이해하면 벡터 데이터베이스를 효과적으로 다루고, RAG 시스템이 예상한 결과를 반환하지 않을 때 문제를 디버깅하는 데 도움이 될 것입니다.