logo
Published on

AI agent 2 (RAG)

Authors
  • avatar
    Name
    seren-wib
    Twitter
Contents

1. RAG(Retrieval Augmented Generation, 검색 증강 생성)

외부에서 검색된 데이터를 질문 또는 지시와 함께 제공하여 개선된 결과 도출

1. RAG 과정

1. indexing(인덱싱)

1. chunk 분할

문서를 작은 단위로 분할

청크 생성 전략
1. 고정 크기 분할

간단하지만 문맥의 단절 위험이 있다.

2. 중첩 분할

인접 청크간 일부를 중첩시켜서 문맥의 연속성을 보존시킨다

3. 문단/섹션 기반 분할

문단 경계, 헤더 기준으로 문서를 분할시킨다

4. 재귀적 분할

문단 > 문장 > 단어 순으로 분할시킨다 크기 초과시 더 잘게 분할시킨다

2. embedding vector 생성

임베딩 벡터의 정의

텍스트를 의미 보존하며 숫자 벡터로 변환

의미가 비슷한 단어는벡터 공간에서 가까이 위치

예시

"강아지" → [0.23, -0.87, 0.14, 0.56, 0.91, ...]
"개" → [0.21, -0.83, 0.17, 0.52, 0.88, ...] ← 비슷
"자동차" → [0.91, 0.34, -0.67, 0.12, -0.44, ...] ← 다름
임베딩 벡터의 encoder 생성 방법
용어 정리
  1. hidden state: Transformer가 문맥을 반영해서 만든 각 토큰의 내부 표현 벡터
  2. polling: 여러 토큰 hidden state를 하나의 고정 크기 벡터로 합치는 방법
  3. RoBERTa: BERT 계열의 Transformer encoder, 입력 문장을 토큰으로 쪼개고, 각 토큰을 문맥이 반영된 벡터로 바꾼다.
  4. CLS(Classification):
    • BERT 계열 모델에서 문장 맨 앞에 붙이는 특수 토큰
    • CLS의 hidden state를 문장 전체를 대표하는 벡터처럼 사용할 수 있다.
  5. Mean Polling: 모든 토큰 벡터의 평균, sentence-BERT에서 사용(더 좋은 성능)
  6. Max Polling: 각 차원별 최댓값, 특징 강조에 유리
  7. CLS 토큰 사용 Polling: 문장 전체 의미를 압축한 CLS 토큰 사용
  8. Bi-encoder: 동일한 모델 2개가 각각 다른 문장을 입력으로 받아 유사도 학습, 임베딩 벡터 DB구성에 사용
  9. Cross-encoder: 인코더가 두 개의 문장을 동시에 입력으로 받아 유사도 학습, 후보들 중에서 질의에 부합하는 것의 선별을 위해 사용(재랭킹)
    • Bi-encoder가 대충 뽑은 후보 중에서 Cross-encoder가 진짜 관련 높은 것을 다시 고른다
단계 흐름
  1. 입력텍스트를 토크나이저가 토큰 형태로 만든다.
  2. Transformer 인코더는 토큰별 hidden state를 만든다.
  3. 문장/청크 임베딩을 만들려면 토큰별 hidden state를 하나로 합쳐야 한다.
  4. 이 합치는 방법이 pooling이다.
  5. pooling의 선택지로 [CLS], mean pooling, max pooling, 마지막 토큰 사용 등이 있다.
  6. 이렇게 만들어진 텍스트 벡터를 Bi-encoder에서는 질문/문서 각각에 대해 만들고 유사도를 비교한다.
  7. 고정 크기 벡터 생성하여 DB에 저장
  8. Cross-encoder에서는 질문과 문서를 함께 넣어 DB에 있는 벡터들의 관련성 점수를 직접 계산한다.

3. vector DB 저장

2. retrieval(검색)

1. query embedding

2. Top-K방식의 유사도 검색

3. generation(생성)

1. 컨텍스트 구성

2. LLM의 답변 생성