[CCA-F] Building With The Claude API (4/6)

2026. 8. 27. 15:47·AI/CLAUDE

Retrieval Augmented Generation(RAG)

Introducing Retrieval Augmented Generation

큰 문서가 입력으로 들어오고 내용에 대한 질문이 들어온다고 가정했을 때, 전체를 보는것 보다 text를 덩어리로 나누고, 각 덩어리에서 프롬프트 내용을 찾는걸 말한다.

RAG의 장점은 아래와 같다.

  • 클로드는 가장 관련있는 내용에만 집중하면 된다
  • scale-up 가능
  • scale-out도 가능(여러 문서에 걸쳐서 적용 가능하다)
  • 프롬프트의 크기가 줄어든다

하지만 다음의 도전점도 생각해야 한다.

  • 전처리 필요함
  • 연관성 있는 덩어리를 찾기 위한 검색 기술이 필요하다
  • 선택된 덩어리에 필요한 내용이 모자랄 수도 있다
  • 덩어리를 나누는 많은 방법들 중에 선택해야 한다

Text chunking strategies

  1. 크기 기반 : 쉽지만 잘리는 부분과 맥락이 있다. overlap을 둬야 할까?
  2. 구조 기반(제목 등) : 근데 문서가 통째로 정리가 안 되어있다면 못 쓸거 같은데?
  3. 의미 기반 : 가장 세련된 접근법. 문장들로 나누고 자연어 처리를 통해 서로가 얼마나 연관성 있는지 탐색하고 자른다. 하지만 계산 비용이 든다.
  4. 문장 기반 : 문장 단위 + overlap으로 나누기

Text Embeddings

문서를 덩어리로 나눈 후에는 RAG에서 어떤 덩어리가 사용자의 요청에 가장 관련있는지 찾는 일이다.
어떤 덩어리가 가장 관련있는지 찾는 일반적인 방법은 sementic search이다. keyword-based 검색과는 달리, 여기서는 text embeddings을 사용한다.
text embedding은 텍스트에 담긴 의미를 숫자로 표현한다. 각 숫자가 정확히 뭘 의미하는지 모르지만 임베딩으로 내용을 대표할 수 있다.
임베딩을 이루는건 -1에서 1 사이의 값이며, 이는 입력 텍스트의 다른 qualities나 features를 의미한다. (여기서는 score of qualities 라고 적혀있음)

The full RAG flow

RAG의 전체 과정은 다음과 같다.

chunck 만들기 -> 임베딩 생성하기 -> normalizing -> vector database에 넣기 -> user query도 임베딩 생성 -> 비슷한 임베딩 찾기(코사인 유사도) -> 코사인 거리에 따라 가까운 값 찾기 -> 프롬프트 작성
코사인 거리는 (1-코사인유사도)로 계산한다.

Implementing the RAG flow

  1. 텍스트를 section에 따라 나눈다
  2. 각 덩어리의 임베딩을 만든다
  3. vector store에 2를 저장한다.
  4. 사용자의 질문에 대한 임베딩을 만든다.
  5. 각 임베딩과 사용자 질문 임베딩 간의 cosine 거리를 계산한다.

BM25 lexical search

semantic search에서도 원하는 값을 못 얻을 수 있다. semantic search에 BM25라는 걸 같이 써서 보완해 보자.
BM25는 lexical search이다. 만약 고유 명사 혹은 id같은 걸 문서에서 찾을 때, text embedding은 제대로 작동하지 않을 수 있다.
그래서 BM25와 semantic search를 병행해서 사용하고 그 결과를 합치는 전략을 사용한다.

BM25(Best Match 25)의 작동 원리에 대해 알아보자.

  1. 유저 질문을 토큰화 한다.
  2. 각 토큰(term)이 '전체' 문서에서 얼마나 등장하는지 빈도를 계산한다.
  3. term의 등장 빈도가 낮을 수록 중요도를 올린다.
  4. 가장 중요도가 높은 term들이 더 많이 등장하는 덩어리들을 찾아낸다.

A Multi-Index RAG Pipeline

BM25랑 vector Index 둘 다 쓴다고 할 때, Reciprocal Rank Fusion 식을 세워서 관련 있는 덩어리인지 점수를 메긴다.

RRF_score(d) = Σ(1 / (k + rank_i(d)))

Feature of Claude

(추후 작성. 해당 챕터에서는 extended thinking이랑 prompt caching 정도 짚고 넘어가려고 했는데, 그냥 한번 읽어보면 될 거 같다)

저작자표시 비영리 (새창열림)

'AI > CLAUDE' 카테고리의 다른 글

[CCA-F] Building With The Claude API (3/6)  (0) 2026.07.31
[CCA-F] Building With The Claude API (2/6)  (0) 2026.06.17
[CCA-F] Building With The Claude API (1/6)  (0) 2026.06.10
[CCA-F] Claude Code in Action(2/2)  (0) 2026.06.10
[CCA-F] 중간 상황 공유  (1) 2026.06.09
'AI/CLAUDE' 카테고리의 다른 글
  • [CCA-F] Building With The Claude API (3/6)
  • [CCA-F] Building With The Claude API (2/6)
  • [CCA-F] Building With The Claude API (1/6)
  • [CCA-F] Claude Code in Action(2/2)
정햄
정햄
(GIS) Data Engineer, 재밌는 일을 찾고 있습니다. 메일 : jungham97@naver.com LinkedIn : Hyemi Jeong으로 찾아주세요. 궁금한 점이 있다면 언제든 연락주세요!
  • 정햄
    Hello, My World!
    정햄
    • 분류 전체보기 (37)
      • AI (9)
        • CLAUDE (9)
      • GIS (14)
        • Spatial Query (1)
      • Develope (3)
        • Error Report (1)
        • Python (0)
        • 조각모음 (4)
      • Study (4)
        • AIFFEL 대전 (3)
        • PS (0)
      • Community (0)
      • 매일 기록(블로그 챌린지) (0)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 공지사항

    • 궁금한 점이 있다면 언제든 편하게 남겨주세요.
  • 인기 글

  • 최근 댓글

  • 최근 글

  • 전체
    오늘
    어제
  • hELLO· Designed By정상우.v4.10.6
정햄
[CCA-F] Building With The Claude API (4/6)
상단으로

티스토리툴바