10줄의 Python 코드로 RAG 시스템 구축하기 (프레임워크 없이)
RAG(Retrieval Augmented Generation)의 힘을 unleash하는 10줄 Python 코드 튜토리얼입니다. 정보 검색에 빠져들고, 자신만의 문서 시스템을 구축하며, 복잡한 프레임워크에 의존하지 않고도 강력한 응답을 위해 LLM을 활용하세요. SEO와 참여도를 위해 콘텐츠를 최적화하세요.
2025년 2월 24일

스크래치에서 10줄의 Python 코드로 강력한 검색 증강 생성(RAG) 시스템을 구축하는 방법을 발견하세요. 외부 프레임워크에 의존하지 않습니다. 이 간결하지만 포괄적인 접근 방식은 핵심 구성 요소에 대한 깊은 이해를 제공하여 문서 기반 애플리케이션을 위한 강력하고 사용자 정의 가능한 AI 기반 솔루션을 만들 수 있습니다.
검색 보강 생성(Retrieval Augmented Generation, RAG) 개념 이해하기
문서를 단락으로 분할하는 방법 배우기
문서와 사용자 쿼리를 문장 변환기를 사용하여 임베딩하기
코사인 유사도를 기반으로 관련 단락 검색하기
검색된 단락으로 사용자 쿼리를 보강하고 OpenAI GPT-4를 사용하여 응답 생성하기
결론
검색 보강 생성(Retrieval Augmented Generation, RAG) 개념 이해하기
검색 보강 생성(Retrieval Augmented Generation, RAG) 개념 이해하기
검색 증강 생성(Retrieval Augmented Generation, RAG)은 자신의 문서에서 정보를 검색하는 데 사용되는 기술입니다. 이는 두 단계 프로세스를 포함합니다:
-
지식베이스 생성: 문서를 더 작은 하위 문서로 청크화하고, 각 청크에 대한 임베딩을 계산합니다. 이러한 임베딩과 원본 청크는 일반적으로 벡터 저장소에 저장됩니다.
-
검색 및 생성: 새로운 사용자 쿼리가 들어오면, 쿼리에 대한 임베딩이 계산됩니다. 가장 관련성 있는 청크는 쿼리 임베딩과 저장된 청크 임베딩을 비교하여 검색됩니다. 검색된 청크는 원래 쿼리에 추가되어 언어 모델(LLM)에 입력됩니다. 이를 통해 최종 응답이 생성됩니다.
이 설정은 "검색 증강 생성" 파이프라인이라고 불리며, LLM의 생성이 지식베이스에서 검색된 관련 정보로 증강됩니다.
문서를 단락으로 분할하는 방법 배우기
문서를 단락으로 분할하는 방법 배우기
검색 증강 생성(RAG) 시스템을 구축할 때 핵심 단계 중 하나는 입력 문서를 더 작고 관리하기 쉬운 조각으로 청크화하는 것입니다. 이 예에서는 입력 문서(Wikipedia 기사)를 문단으로 청크화하고 있습니다.
이 접근 방식의 근거는 문단이 종종 효과적으로 검색되고 사용자 쿼리를 증강하는 데 사용될 수 있는 정보의 논리적 단위를 나타낸다는 것입니다. 문서를 이렇게 분해하면 최종 응답에 포함할 가장 관련성 있는 섹션을 더 잘 식별할 수 있습니다.
이 단계에 대한 코드는 다음과 같습니다:
# 문서를 문단으로 청크화
chunks = [paragraph.strip() for paragraph in text.split('\n') if paragraph.strip()]
여기서는 입력 텍스트를 줄바꿈 문자로 분할하여 개별 문단을 추출하는 간단한 접근 방식을 사용합니다. 그런 다음 각 문단의 선행 및 후행 공백을 제거하여 깨끗한 표현을 보장합니다.
결과 chunks
목록에는 개별 문단이 포함되며, 이를 임베딩하고 벡터 저장소에 저장할 수 있습니다. 이를 통해 사용자 쿼리를 기반으로 가장 관련성 있는 문단을 효율적으로 검색하고 언어 모델이 생성한 최종 응답에 포함할 수 있습니다.
문서와 사용자 쿼리를 문장 변환기를 사용하여 임베딩하기
문서와 사용자 쿼리를 문장 변환기를 사용하여 임베딩하기
문서 청크와 사용자 쿼리를 임베딩하기 위해 Sentence Transformers 라이브러리를 사용할 것입니다. 이 라이브러리는 텍스트에 대한 고품질 임베딩을 생성할 수 있는 사전 학습된 모델을 제공합니다.
먼저 임베딩 모델을 로드합니다:
from sentence_transformers import SentenceTransformer
embedding_model = SentenceTransformer('all-mpnet-base-v2')
다음으로 문서 청크에 대한 임베딩을 계산합니다:
chunk_embeddings = embedding_model.encode(chunks, normalize_embeddings=True)
여기서 chunks
는 문서에서 추출한 텍스트 청크 목록입니다. normalize_embeddings=True
옵션은 임베딩을 정규화하는데, 이는 이후 유사성 계산에 중요합니다.
사용자 쿼리의 임베딩을 얻으려면 다음과 같이 실행하면 됩니다:
query_embedding = embedding_model.encode([user_query], normalize_embeddings=True)[0]
이제 문서 청크와 사용자 쿼리의 임베딩을 모두 확보했으므로 검색 단계에 사용할 수 있습니다.
코사인 유사도를 기반으로 관련 단락 검색하기
코사인 유사도를 기반으로 관련 단락 검색하기
사용자 쿼리를 기반으로 가장 관련성 있는 청크를 검색하려면 먼저 쿼리 임베딩과 문서 청크 임베딩 간의 코사인 유사도를 계산해야 합니다. 다음과 같이 수행할 수 있습니다:
- 문서 청크와 동일한 임베딩 모델을 사용하여 사용자 쿼리의 임베딩을 계산합니다.
- 쿼리 임베딩과 각 문서 청크 임베딩 간의 내적을 계산합니다. 이를 통해 코사인 유사도 점수를 얻을 수 있습니다.
- 코사인 유사도 점수를 기준으로 문서 청크를 정렬하고 상위 K개의 가장 관련성 있는 청크를 선택합니다.
- 선택된 청크의 텍스트 내용을 검색하여 언어 모델의 컨텍스트로 사용합니다.
핵심 단계는 다음과 같습니다:
- 쿼리 임베딩 계산
- 코사인 유사도 점수 계산
- 상위 K개 청크 정렬 및 선택
- 청크 텍스트 내용 검색
이러한 간단한 접근 방식을 통해 문서 컬렉션에서 가장 관련성 있는 정보를 효율적으로 검색하여 언어 모델의 생성에 활용할 수 있습니다.
검색된 단락으로 사용자 쿼리를 보강하고 OpenAI GPT-4를 사용하여 응답 생성하기
검색된 단락으로 사용자 쿼리를 보강하고 OpenAI GPT-4를 사용하여 응답 생성하기
검색된 청크와 사용자 쿼리를 사용하여 응답을 생성하려면 먼저 관련 청크와 사용자 쿼리를 포함하는 프롬프트를 만듭니다. 그런 다음 OpenAI GPT-4 모델을 사용하여 이 프롬프트를 기반으로 응답을 생성합니다.
코드는 다음과 같습니다:
# 사용자 쿼리 가져오기
user_query = "What is the capital of France?"
# 사용자 쿼리를 기반으로 가장 관련성 있는 청크 검색
top_chunk_ids = [6, 8, 5]
top_chunks = [chunks[i] for i in top_chunk_ids]
# 프롬프트 생성
prompt = "Use the following context to answer the question at the end. If you don't know the answer, say that you don't know and do not try to make up an answer.\n\nContext:\n"
for chunk in top_chunks:
prompt += chunk + "\n\n"
prompt += f"\nQuestion: {user_query}"
# OpenAI GPT-4를 사용하여 응답 생성
response = openai_client.chat.create(
model="gpt-4",
messages=[
{"role": "user", "content": prompt}
],
max_tokens=1024,
n=1,
stop=None,
temperature=0.7,
).choices[0].message.content
print(response)
이 코드에서는 먼저 사용자 쿼리와의 유사도가 가장 높은 상위 3개 청크를 검색합니다. 그런 다음 이러한 청크와 사용자 쿼리를 포함하는 프롬프트를 생성합니다. 마지막으로 OpenAI GPT-4 모델을 사용하여 이 프롬프트를 기반으로 응답을 생성합니다.
생성된 응답은 검색된 청크의 정보를 활용하여 사용자 쿼리에 대한 간결하고 관련성 있는 답변이 될 것입니다.
결론
결론
이 튜토리얼에서는 10줄의 Python 코드로 문서 검색 시스템이 포함된 완전한 채팅 시스템을 구축하는 방법을 배웠습니다. 검색 증강 생성(RAG) 파이프라인의 핵심 구성 요소, 즉 지식베이스 생성, 문서 청크화, 임베딩, 검색 및 언어 모델을 사용한 생성 등을 다루었습니다.
주요 요점은 다음과 같습니다:
- Langchain이나 LlamaIndex와 같은 복잡한 프레임워크 없이도 기본적인 RAG 파이프라인을 구현할 수 있습니다. 순수 Python과 몇 가지 라이브러리면 충분합니다.
- 문서 구조(예: 문단)를 기반으로 문서를 청크화하는 것은 대부분의 사용 사례에 대해 간단하면서도 효과적인 전략입니다.
- 문서 청크와 사용자 쿼리의 임베딩을 계산하고 유사도 점수를 계산하면 사용자 쿼리를 증강하는 데 가장 관련성 있는 정보를 검색할 수 있습니다.
- 검색된 청크를 사용자 쿼리와 통합하여 대형 언어 모델에 입력하면 관련성 있고 정보가 풍부한 응답을 생성할 수 있습니다.
이 예제는 견고한 기반을 제공하지만, 더 강력하고 발전된 RAG 시스템을 구축할 수 있는 많은 기회가 있습니다. Langchain과 LlamaIndex와 같은 프레임워크는 다양한 벡터 저장소 및 언어 모델과 통합할 때 도움이 될 수 있습니다. 그러나 순수 Python 구현으로 시작하면 RAG 파이프라인의 핵심 개념과 구성 요소를 더 잘 이해할 수 있습니다.
더 고급 RAG 기술에 관심이 있다면 "RAG Beyond Basics" 강좌를 확인해 보시기 바랍니다. 이 강좌에서는 복잡하고 프로덕션 준비가 된 RAG 시스템 구축에 대해 깊이 있게 다룹니다.
자주하는 질문
자주하는 질문