LLM: RAG & CoT

Ohback·2025년 3월 12일

1. RAG (검색 증강 생성)

RAG (Retrieval-Augmented Generation)는 Vector Database와 LLM을 결합하여 검색된 데이터를 활용해 문맥 기반 응답을 생성하는 기술이다.

1-1. 작동 원리

  • 검색: 사용자의 질문을 벡터화해 관련 데이터를 Vector DB에서 검색
  • 생성: 검색된 데이터를 바탕으로 LLM이 자연어 응답 생성

1-2. 장점

  • 최신 정보 제공: 모델 학습 이후 발생한 데이터도 사용 가능
    (모델 학습 이후 발생한 데이터를 사용하는 것이지 외부 API를 통한 실시간 정보 반영과는 다른 것임)
  • 정확성 향상: 검색 데이터를 기반으로 환각(hallucination) 현상 감소
  • 유연성: 다양한 도메인 데이터 활용 가능

2. RAG 성능 최적화 기법

2-1. Chunking 전략 (데이터 단위 분할)

  • 문서를 일정 크기의 단위(Chunk)로 나누어 벡터화하면 검색 정확도가 향상된다.(문서 길이를 300~800 token 범위로)
  • 일반적으로 문장 단위, 패러그래프 단위, 슬라이딩 윈도우 방식 등이 사용된다.

2-2. Embedding 모델 선택

  • RAG에서 벡터화를 수행하는 모델 선택이 중요하다.
    all-MiniLM-L6-v2, bge-m3, E5, OpenAI ada-002 등 사용 목적에 맞는 모델 선택

2-3. Retrieval 전략 (검색 최적화)

  • Top-K 검색: 관련성이 높은 상위 K개의 문서를 검색 한다. (일반적으로 K=3~5)
  • Re-ranking 기법: 검색된 문서들을 다시 정렬하여 가장 관련성이 높은 문서만 활용한다.
  • Hybrid Search: 벡터 검색 + 전통적인 키워드 검색 조합을 사용하는 전략이다.

3. RAG의 한계점

  • 최신 정보 반영 불가능 (정적 데이터)
    해결 방법: SerpAPI 또는 GoogleSearchAPIWrapper()를 활용한 실시간 검색 적용
  • 환각(Hallucination) 발생 가능 (RAG가 검색된 문서가 부족할 경우, LLM이 임의로 답변을 생성할 가능성이 있음)
    해결 방법: 검색된 문서가 없을 때 "답변할 정보가 없습니다."라고 응답하도록 설정
  • 벡터 검색의 성능 한계
    해결 방법: Hybrid Search 적용 (벡터 검색 + 키워드 검색 결합)

3-1. 실시간 검색 API 비교

실시간 검색 API는 다양하지만 간단히 두가지만 비교해 보았다.

비교 항목GoogleSearchAPIWrapper()SerpAPI
사용 목적Google Custom Search API 사용Google, Bing, YouTube, Baidu 등 다양한 검색 지원
지원 검색 엔진Google만 지원✅ Google, Bing, DuckDuckGo, YouTube, Baidu, Yahoo 등
LangChain 내장 지원✅ LangChain에서 기본 제공✅ LangChain에서 SerpAPIWrapper로 지원
설치 필요 여부❌ (LangChain에 기본 포함)✅ serpapi 라이브러리 설치 필요
(pip install google-search-results)
API 키 필요 여부✅ Google Custom Search API 키 필요✅ SerpAPI API 키 필요
무료 사용❌ 100개 요청 후 유료❌ 무료 요청 제한 있음 (100회/월)
응답 속도보통빠름

4. CoT (Chain of Thought)

Chain of Thought (CoT)는 LLM이 복잡한 문제를 해결하기 위해 단계적 사고 과정을 명시적으로 전개하도록 설계된 프롬프트 전략이다. 이는 수학 문제, 논리 퍼즐, 과학적 추론 등 복잡한 작업에서 정확성을 향상시킨다.
CoT는 복잡한 문제를 해결하는 데 필수적인 도구로, Zero-shot 및 Few-shot CoT 전략으로 다양한 작업에 활용할 수 있다.

4-1. 기존 LLM의 문제점

LLM은 강력한 자연어 처리 능력을 가지고 있지만, 복잡한 문제를 해결하는 데 한계를 가지고 있다.

  • 즉답형(End-to-End) 방식으로 답을 생성 → 논리적 사고 과정 없이 단순히 답만 출력
  • 문제를 이해하지 않고 학습 데이터에서 유사한 답을 찾으려는 경향
  • 다단계 문제에서 오류가 누적될 확률이 높음 (ex. 수학 문제에서 실수 발생)
# CoT 없이
Q: What is 12 × 15?
A: 180

# CoT 적용
Q: Solve step by step: What is 12 × 15?
A: First, calculate 12 × 10 = 120.
   Then, calculate 12 × 5 = 60.
   Add them: 120 + 60 = 180.

4-2. CoT 비교

CoT는 프롬프트를 통해 논리적 사고가 가능하도록 유도하는 기법으로 Zero-Shot CoTFew-Shot CoT가 있다.

# Zero-shot CoT 적용 프롬프트
cot_prompt = '단계별로 생각해보세요: 123 x 31은 얼마인가요?'

cot_res = client.chat.completions.create(
    model='gpt-4',
    messages=[{"role":"user", "content": cot_prompt}]
    
cot_res.choices[0].message.content

# Zero-shot CoT 응답
123 x 31을 계산하기 위해 다음과 같은 단계를 따릅니다:
1. 먼저, 1 (31의 일의 자리)123에 곱합니다: 1 x 123 = 123
2. 다음으로, 3 (31의 십의 자리)123에 곱하고, 그 결과에 10을 곱합니다 (왜냐하면 3은 십의 자리에 있음): 3 x 123 x 10 = 3690
3. 마지막으로, 두 결과를 더합니다: 123 (1단계의 결과) + 3690 (2단계의 결과) = 3813 따라서, 123 x 31 = 3813입니다.
)


# Few-shot CoT 적용 프롬프트
few_shot_cot = """
Q: 123 x 31을 단계별로 계산해 보겠습니다.
A:
1. 123를 분해합니다:
123 = 100 + 20 + 3
2. 각 항을 31과 곱합니다:
    - 100 x 31 = 3100
    - 20 x 31 = 620
    - 3 x 31 = 93

3. 이제 이 결과들을 더합니다:
    - 3100 + 620 + 93

4. 계산을 진행하면:
    - 3100 + 620 = 3720
    - 3720 + 93 = 3813

따라서, 123 x 31 = 3813입니다.

Q: 789 x 56 은 얼마인가요?
A:
"""

res = client.chat.completions.create(
    model='gpt-4',
    messages=[{"role":"user", "content":few_shot_cot}]
)

res.choices[0].message.content

# Few-shot CoT 응답
1. 789를 분해합니다:
789 = 700 + 80 + 9
2. 각 항을 56과 곱합니다:
    - 700 x 56 = 39200
    - 80 x 56 = 4480
    - 9 x 56 = 504
3. 이제 이 결과들을 더합니다:
    - 39200 + 4480 + 504
4. 계산을 진행하면:
    - 39200 + 4480 = 43680
    - 43680 + 504 = 44184

따라서, 789 x 56 = 44184입니다.
profile
기록은 기억을 지배한다.

0개의 댓글