Retrieval Augmented Generation(RAG)
Introducing Retrieval Augmented Generation
큰 문서가 입력으로 들어오고 내용에 대한 질문이 들어온다고 가정했을 때, 전체를 보는것 보다 text를 덩어리로 나누고, 각 덩어리에서 프롬프트 내용을 찾는걸 말한다.
RAG의 장점은 아래와 같다.
- 클로드는 가장 관련있는 내용에만 집중하면 된다
- scale-up 가능
- scale-out도 가능(여러 문서에 걸쳐서 적용 가능하다)
- 프롬프트의 크기가 줄어든다
하지만 다음의 도전점도 생각해야 한다.
- 전처리 필요함
- 연관성 있는 덩어리를 찾기 위한 검색 기술이 필요하다
- 선택된 덩어리에 필요한 내용이 모자랄 수도 있다
- 덩어리를 나누는 많은 방법들 중에 선택해야 한다
Text chunking strategies
- 크기 기반 : 쉽지만 잘리는 부분과 맥락이 있다. overlap을 둬야 할까?
- 구조 기반(제목 등) : 근데 문서가 통째로 정리가 안 되어있다면 못 쓸거 같은데?
- 의미 기반 : 가장 세련된 접근법. 문장들로 나누고 자연어 처리를 통해 서로가 얼마나 연관성 있는지 탐색하고 자른다. 하지만 계산 비용이 든다.
- 문장 기반 : 문장 단위 + 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
- 텍스트를 section에 따라 나눈다
- 각 덩어리의 임베딩을 만든다
- vector store에 2를 저장한다.
- 사용자의 질문에 대한 임베딩을 만든다.
- 각 임베딩과 사용자 질문 임베딩 간의 cosine 거리를 계산한다.
BM25 lexical search
semantic search에서도 원하는 값을 못 얻을 수 있다. semantic search에 BM25라는 걸 같이 써서 보완해 보자.
BM25는 lexical search이다. 만약 고유 명사 혹은 id같은 걸 문서에서 찾을 때, text embedding은 제대로 작동하지 않을 수 있다.
그래서 BM25와 semantic search를 병행해서 사용하고 그 결과를 합치는 전략을 사용한다.
BM25(Best Match 25)의 작동 원리에 대해 알아보자.
- 유저 질문을 토큰화 한다.
- 각 토큰(term)이 '전체' 문서에서 얼마나 등장하는지 빈도를 계산한다.
- term의 등장 빈도가 낮을 수록 중요도를 올린다.
- 가장 중요도가 높은 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 |