Sign in to save your progressYou can keep reading without an account, but completed lessons won't be saved.
Sign in

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 파이프라인입니다:

  1. 소스 문서를 청크로 나눕니다
  2. 각 청크에 대한 임베딩을 생성합니다
  3. 임베딩을 벡터 데이터베이스에 저장합니다
  4. 사용자가 질문을 하면, 해당 쿼리를 임베딩합니다
  5. 코사인 유사도를 사용하여 가장 유사한 저장된 임베딩을 찾습니다
  6. 관련 청크를 사용자의 질문과 함께 프롬프트에 추가합니다
  7. 향상된 프롬프트를 Claude에 전송하여 응답을 받습니다

이 과정과 그 뒤에 있는 수학을 이해하면 벡터 데이터베이스를 효과적으로 다루고, RAG 시스템이 예상한 결과를 반환하지 않을 때 문제를 디버깅하는 데 도움이 될 것입니다.