BizSpring.ai AI 모드

지식센터 / 레퍼런스

RAG를 통한 LLM 정확도 향상(1) - BizSpring BLOG

RAG를 통한 LLM 정확도 향상(1) 2024년 11월 20일 2025년 01월 08일 테크 RAG (Retrieval-Augmented Generation), 검색 증강 생성은 LLM 모델이 주어진 컨텍스트를 기반으로 텍스트를 생성하게 하는 방법입니다. 이를 통해 LLM 모델

핵심 요약

  • RAG(검색 증강 생성)은 LLM에 참고 문서를 제공해 할루시네이션 문제를 완화하는 기법을 소개한다
  • RAG은 쿼리 분석, 관련 문서 검색, 검색 문서 기반 응답 생성, 응답 반환의 순서로 동작한다
  • Huggingface의 BERT(임베딩), FAISS(유사도 검색), GPT-2(응답 생성)를 이용해 간단한 RAG 구현 예제를 제공한다
  • 예시로 서울에 관한 짧은 문서 4개를 벡터화해 질문에 맞는 문서를 검색하고 이를 컨텍스트로 답변을 생성하는 과정을 보여준다
  • 다음 아티클에서는 LangChain을 활용한 RAG 기법과 사용 시 유의사항을 다룰 예정임을 예고한다

# RAG를 통한 LLM 정확도 향상(1)

2024년 11월 20일 2025년 01월 08일

테크

RAG (Retrieval-Augmented Generation), 검색 증강 생성은 LLM 모델이 주어진 컨텍스트를 기반으로 텍스트를 생성하게 하는 방법입니다. 이를 통해 LLM 모델의 할루시네이션 문제를 어느정도 해결할 수 있습니다.

LLM 모델의 한계: 할루시네이션

Chat-gpt와 같은 LLM 모델은 우리의 일상 생활에 깊이 들어와 있습니다. 업무 뿐 아니라 일상적으로 사용하는 어플리케이션에도 AI가 사용되어 집니다. 하지만 이미 많은 분들이 겪은 것처럼, LLM 모델에는 할루시네이션 이라는 한계점이 있습니다. 할루시네이션은 LLM 모델이 ‘모른다’라는 대답 대신 어떻게든 대답을 하기 위해 잘못된 정보를 생성하는 현상입니다.

[할루시네이션 예시]

LLM 모델이 발전됨에 따라서 위와 같은 터무니 없는 정보를 생성하는 현상은 사라졌지만, 여전히 복잡한 태스크를 요청할 경우 잘못된 정보를 생성하거나 똑같은 응답을 반복하는 현상을 보입니다.

[개선된 LLM 모델]

이처럼 LLM 모델은 할루시네이션이라는 고질적인 한계를 가지고 있습니다. RAG은 LLM 모델에 컨텍스트를 부여해 응답의 정확도를 높이는 기법입니다.

RAG(Retrieval-Augmented Generation) : 검색 증강 생성

[RAG 구조]

RAG은 LLM 모델에게 참고할 문서(데이터, db, Web 검색)를 주어 문서의 컨텍스트를 기반으로 응답을 하게 합니다. 위의 RAG은 다음과 같은 순서로 응답을 생성합니다.

사용자의 입력을 받아 쿼리를 분석

연관성이 높은 문서를 검색

연관된 문서를 바탕으로 응답을 생성

사용자에 응답

위 과정에서 컨텍스트에 사용되는 문서와 LLM 모델의 구성은 다양한 옵션들이 있습니다. 이번 아티클에서는 텍스트 기반의 문서와 Huggingface 의 모델을 사용해 간단한 RAG 구현을 구현해 보겠습니다.

RAG Example

가상환경 구성 및 필요 라이브러리 설치

python -m venv .venv

. .venv/Scripts/activate

pip install transformers faiss-cpu dotenv

pip install torch torchvision torchaudio

환경 변수 설정 / .env

KMP_DUPLICATE_LIB_OK=TRUE

예시 문서 생성 / document.py

documents = [

"Seoul is the capital of South Korea and its largest city, with a population of over 9 million people.",

"It has been the capital for over 600 years, dating back to the Joseon Dynasty in 1394.",

"The city is home to UNESCO World Heritage Sites such as Changdeokgung Palace and Jongmyo Shrine.",

"Surrounded by mountains like Bukhansan, Seoul is a favorite spot for urban hikers."

]

검색기와 생성기를 각각 정의합니다.

# 검색

def get_embeddings(texts, model, tokenizer):

inputs = tokenizer(texts, return_tensors='pt',

padding=True, truncation=True)

outputs = model(**inputs)

embeddings = outputs.last_hidden_state.mean(dim=1)

return embeddings.detach().numpy()

# Get Model

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

model = BertModel.from_pretrained('bert-base-uncased')

# Generate Embeddings, index

doc_embeddings = get_embeddings(documents, model, tokenizer)

index = faiss.IndexFlatL2(doc_embeddings.shape[1])

index.add(doc_embeddings)

# Searching function

def search(query, top_k=1):

embedding = get_embeddings([query], model, tokenizer)

D, I = index.search(embedding , top_k)

return [documents[i] for i in I[0]]

주어진 문서를 벡터화하고 faiss 라이브러리를 이용해 유사도를 분석합니다.

# 생성

gpt2_tokenizer = GPT2Tokenizer.from_pretrained('gpt2')

gpt2_model = GPT2LMHeadModel.from_pretrained('gpt2')

# Generating function

def generate_answer(query, context):

input_text = f"Context: {context}\n\nQuestion: {query}\n\nAnswer:"

inputs = gpt2_tokenizer.encode(input_text, return_tensors='pt')

outputs = gpt2_model.generate(

inputs, max_length=100, num_return_sequences=1)

return gpt2_tokenizer.decode(outputs[0], skip_special_tokens=True)

유사한 문서를 컨텍스트로 사용해 응답을 생성합니다.

RAG 실행

load_dotenv()

# 사용자 질문

query = "Where's capital of Korea?"

# 관련 문서 검색

retrieved_docs = search(query, top_k=1)

context = retrieved_docs[0]

# 답변 생성

answer = generate_answer(query, context)

print(f"Question: {query}")

print(f"Answer: {answer}")

응답 결과

Question : Where's capital of Korea?

Answer : Context: Seoul is the capital of South Korea and its largest city, with a population of over 9 million people.

주어진 문서 중 첫 번째 문장을 활용해 서울이 한국의 수도라는 응답을 얻었습니다. (사용된 베이스 모델이 gpt-2인 점, 문서가 빈약한 문제로 질문에 따라 엉뚱한 응답이 생성될 수 있습니다.)

결론

RAG은 LLM 모델의 한계점인 할루시네이션을 보완하기 위해 LLM 모델이 컨텍스트로 사용할 수 있는 문서를 제공해 정확도를 높이는 기법입니다. 이번 아티클에서는 RAG의 정의와 간단한 예시 코드를 작성해 보았습니다. 다음 아티클에서는 LangChain을 활용한 RAG 기법과, RAG을 사용할 때 유의할 사항들에 대해 알아보겠습니다.

[References]

https://blog.deeplink.kr/?p=3478

https://hi-lu.tistory.com/entry/%EC%99%95%EC%B4%88%EB%B3%B4%EC%9A%A9-langchain-%EC%BD%94%EB%93%9C-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC-w-RAG

https://blog.naver.com/htk1019/223423287480

구글애즈가 정확검색·구문검색 키워드까지 AI 모드에 노출하기 시작했다 — 자동화 상품 없이 AI 답변 화면에 들어가는 첫 실험

AI가 React 앱을 직접 디버깅 – Agent 기반 디버깅

ChatGPT 광고가 픽셀·전환 API·맞춤 오디언스를 갖췄다 — 답변 화면이 측정 가능한 광고 매체가 되는 순간

AI 시대, 데이터도 설명이 필요합니다

MCP 클라이언트는 Authorization Server를 어떻게 찾는가: 공식 MCP TypeScript SDK와 VS Code 구현 비교

RAG 시대의 GEO: AI가 콘텐츠를 읽는 방식과 스키마의 진짜 역할

AI 에이전트로 웹 데이터 수집 가능 여부 자동 검증하기

GA4 Intraday 실시간 테이블, 대시보드 원천 데이터로 바로 사용할 수 있을까?

워크플로우 오케스트레이션 플랫폼 Temporal 알아보기

iOS 14.5부터 GA4까지, 환경 변화가 가져온 업무 폭증을 해결하는 실무 전략은…?

다음에 대해 검색하기...

최신 글 둘러보기

기존 SEO와 무엇이 같고 무엇이 다른가

콘텐츠가 답인 걸 모르는 사람은 없습니다 — 문제는 지속입니다

광고비를 늘리지 않고 매출을 늘린 회사들은 무엇을 했나

코호트로 비교하면 광고 예산 판단이 달라집니다

GEO를 위한 글쓰기를 위한 작은 노하우

(해외동향) 광고주가 광고플랫폼 리포트에서 자체 측정으로 옮겨가고 있다.

구글애즈가 정확검색·구문검색 키워드까지 AI 모드에 노출하기 시작했다 — 자동화 상품 없이 AI 답변 화면에 들어가는 첫 실험

AI가 React 앱을 직접 디버깅 – Agent 기반 디버깅

ChatGPT 광고가 픽셀·전환 API·맞춤 오디언스를 갖췄다 — 답변 화면이 측정 가능한 광고 매체가 되는 순간

마케팅 자동화, 무엇부터 자동화해야 할까?

출처: https://blog.bizspring.co.kr/%ed%85%8c%ed%81%ac/rag-%ea%b2%80%ec%83%89-%ec%a6%9d%ea%b0%95-%ec%83%9d%ec%84%b1-llm-%ec%a0%95%ed%99%95%eb%8f%84-%ed%96%a5%ec%83%81/

자주 묻는 질문

할루시네이션이 정확히 뭔가요?

LLM 모델이 '모른다'고 답하는 대신 어떻게든 답을 하려고 잘못된 정보를 생성하는 현상입니다. LLM 모델이 발전하며 터무니없는 정보 생성은 줄었지만, 복잡한 태스크에서는 여전히 잘못된 정보나 반복 응답이 나타날 수 있습니다.

RAG은 어떤 순서로 응답을 생성하나요?

먼저 사용자 입력을 받아 쿼리를 분석하고, 연관성이 높은 문서를 검색한 뒤, 해당 문서를 바탕으로 응답을 생성해 사용자에게 전달합니다.

본문에서 소개한 RAG 예제는 어떤 라이브러리를 쓰나요?

transformers, faiss-cpu, dotenv, torch 등을 사용하며, 검색에는 BERT 기반 임베딩과 FAISS를, 생성에는 GPT-2 모델을 사용합니다.

예제에서 실제로 어떤 결과가 나왔나요?

'한국의 수도는 어디인가'라는 질문에 대해 문서 중 서울이 한국의 수도라는 문장을 검색해 이를 컨텍스트로 답변을 생성했습니다. 다만 사용된 모델이 GPT-2이고 문서가 빈약해 질문에 따라 엉뚱한 응답이 나올 수 있다고 설명합니다.

다음 아티클에서는 어떤 내용을 다루나요?

LangChain을 활용한 RAG 기법과 RAG을 사용할 때 유의할 사항들에 대해 다룰 예정이라고 안내하고 있습니다.

다른 표현: Markdown · JSON · 최종 갱신 2026-09-06