RAG의 이해 – LangChain

RAG의 이해 – LangChain

RAG란?

RAG(Retrieval-Augmented Generation, 검색 증강 생성)는 쉽게 말해 AI가 ‘자신의 기억(학습 데이터)’에만 의존하지 않고, ‘최신 백과사전이나 전용 문서(외부 데이터)’를 찾아보며 답변하게 만드는 기술입니다.

LLM(거대 언어 모델)이 가진 한계를 극복하기 위해 현재 가장 많이 쓰이는 방식이죠.

🔍 왜 RAG가 필요한가요? (LLM의 3대 약점 해결)

LLM은 학습된 시점 이후의 정보는 알지 못하며, 가끔 그럴듯한 거짓말을 하는 환각(Hallucination) 현상이 발생합니다. RAG는 이를 다음과 같이 해결합니다.

  • 최신성 유지: 실시간 뉴스나 오늘 업데이트된 사내 규정도 반영할 수 있습니다.
  • 정확성 향상: 근거가 되는 문서를 직접 확인하고 답하므로 거짓말이 줄어듭니다.
  • 투명성: 답변의 출처(어떤 문서에서 가져왔는지)를 명시할 수 있어 신뢰도가 높습니다.
  • 보안성: 외부 모델을 재학습시키지 않고도, 우리 회사의 내부 기밀 문서를 안전하게 참조하게 할 수 있습니다.

RAG를 이용하면 AI는 다음 과정을 거칩니다.

  • 검색 (Retrieval): 질문과 관련된 내용을 미리 준비된 데이터베이스(벡터 DB 등)에서 찾아냅니다.
  • 증강 (Augmentation): 찾아낸 관련 정보와 사용자의 질문을 하나로 합칩니다. (예: “이 문서 내용을 참고해서 질문에 답해줘.”)
  • 생성 (Generation): 합쳐진 정보를 바탕으로 LLM이 최종 답변을 작성합니다.

RAG 주요 용어 공부

먼저 RAG를 이해하기 위해서는 텍스트 임베딩이 필요한데요. 바로 앞에서 말씀드린 벡터 DB를 만들어야 하기 때문입니다.

임베딩(Embedding)은 텍스트 데이터를 숫자로 이루어진 벡터로 변환하는 과정을 말합니다. 이러한 벡터 표현을 사용하면, 텍스트 데이터를 벡터 공간 내에서 수학적으로 다룰 수 있게 되며, 이를 통해 텍스트 간의 유사성을 계산하거나, 텍스트 데이터를 기반으로 하는 다양한 머신러닝 및 자연어 처리 작업을 수행할 수 있습니다. 임베딩 과정은 텍스트의 의미적인 정보를 보존하도록 설계되어 있어, 벡터 공간에서 가까이 위치한 텍스트 조각들은 의미적으로도 유사한 것으로 간주됩니다.

즉 어제 배운 토큰화과정의 좀 더 큰 버전이라고 생각하면 되는데요.

이제 AI가 검색한 결과와 함께 데이터를 증강하는데요.

RAG 실습

RAG 실습을 위해서 Langchain을 이용하는데요. 기본적인 패키지를 설치해줍니다.

LangChain은 한마디로 ‘LLM(거대 언어 모델)을 활용한 애플리케이션을 쉽고 빠르게 개발할 수 있도록 도와주는 프레임워크’라고 할 수 있는데요.

단순히 AI에게 질문을 던지는 수준을 넘어, 앞서 언급한 RAG(검색 증강 생성) 시스템을 구축하거나, 복잡한 업무 프로세스를 자동화할 때 필수적인 도구로 꼽힙니다.

  • 모델 교체의 유연성: 코드를 거의 바꾸지 않고도 모델을 OpenAI에서 Gemini로, 혹은 로컬 모델(Llama 등)로 쉽게 갈아끼울 수 있습니다.
  • 복잡한 작업의 구조화: 단순히 한 번 묻고 답하는 게 아니라, 데이터를 찾고 가공하는 복잡한 단계를 체계적으로 관리해 줍니다.
  • 방대한 생태계: 수많은 외부 서비스(Google Search, Slack, Notion 등)와 이미 연결되어 있어 확장성이 뛰어납니다.
pip install openai 
pip install langchain 
pip install langchain-openai 
pip install langchain-core 
pip install langchain-community

기본적인 코드는 아래와 같습니다.

.env 파일은 아래처럼 설정하구요.

import os  
os.environ['OPENAI_API_KEY'] = '본인키'
os.environ['OPENAI_API_TYPE'] = 'azure'
os.environ['AZURE_OPENAI_ENDPOINT'] = 'https://endpoint.openai.azure.com'
os.environ['OPENAI_API_VERSION'] = '2024-12-01-preview'
MODEL_DEPLOYMENT_NAME = 'gpt-4.1'

챗봇 코드는 아래와 같습니다.

from langchain_openai import AzureChatOpenAI
import os
from dotenv import load_dotenv
load_dotenv()

MODEL_DEPLOYMENT_NAME = 'gpt-4.1'

llm = AzureChatOpenAI(azure_deployment=MODEL_DEPLOYMENT_NAME)
answer = llm.invoke('why python is the most popular language? answer in korean')
print(answer.content)

간단한 번역기를 만들어 보겠습니다.

이번에는 간단한 챗봇과 달리 시스템 메시지를 통해서 통역가라는 롤을 정의 했습니다.

from langchain_openai import AzureChatOpenAI 
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage 
import os
from dotenv import load_dotenv
load_dotenv()

MODEL_DEPLOYMENT_NAME = 'gpt-4.1'

llm = AzureChatOpenAI(deployment_name = MODEL_DEPLOYMENT_NAME, temperature=0) 
messages = [ SystemMessage( 
    content = 'You are a helpful assistant that translates English to Korean' ), 
    HumanMessage( content = 'I love langchain.' ) 
    ] 

response = llm.invoke(messages) 
print(response.content)

나머지는 이어서 포스팅 하겠습니다.

Similar Posts

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다