RAG 개념 + Vector와 Embedding (Python)

2025. 5. 13. 17:34·Python/Langchain

들어가며

LangChain 공식문서

요새 AI의 중요성을 뼈저리게 느끼면서, 구름톤 동아리 스터디에서 LLM 강의를 수강하기로 하였다. LLM은 강력한 텍스트 생성 능력을 가지고 있지만, 최신 정보나 특정 도메인의 법률과 같이 아주 구체적인 데이터는 잘 다루지 못한다. 따라서 이러한 약점을 보완할 수 있는 구조가 필요했고, RAG가 그 해답이었다고한다. 실제로 강의를 수강하고, 프로젝트에서 어떻게 적용해볼지에 대한 부분까지 계획하고 공유하는 스터디를 진행해보기로 하였다

Streamlit 예제

 

예를 들어 GPT-4는 2023년 12월까지의 데이터까지만 보유하고 있어서 이후 개정된 세법을 반영할 수 없다던지, 외부 지식를 기반으로 답변을 생성하게 해줘야하므로, RAG를 효율적으로 활용한 튜닝 또한, LLM에서 정말 중요한 부분이라고 느꼈다


본문


RAG이란 ?

RAG는 단어 그대로 해석하면, Retrieval + Augmented + Generation, 즉 검색 + 증강 + 생성이라는 뜻이다

    1. Retrieval: 필요한 데이터를 외부 문서나 시스템에서 검색하여 가져오는 단계이다
      더 구체적으로는
      컴퓨터 시스템에 저장된 자료를 취득하는것 을 의미한다. 예를 들어, GPT-4는 자체적으로 2023년 12월까지의 지식만 포함하고 있는데, 이후에 내용들을 설명하기 위해서는 웹크롤링을 한 뒤에 생각해서 답변을 생성해주는 구조라고 생각해주면 된다 
      ex) 사내 보안 문서, 법률 문서, 최신 보고서 등
    2. Augmented: 가져온 데이터를 마치 모델이 원래 알고 있었던 것처럼 문맥 속에 자연스럽게 녹여내는 단계이다
      AR/VR에서의 증강현실과 유사한 개념
      ex) 포켓몬고처럼 실제 아닌 정보를 실제처럼 보여주는 방식과 비슷함
    3. Generation: Augmented된 문맥을 기반으로 자연어 답변을 생성하는 과정이다
      ex) 소득세법 제56조에 대한 질문이 들어오면, 해당 조항 내용을 기반으로 구체적인 수치와 해석을 포함한 답변을 제공함

LLM 구성시 4가지 포인트

강의에선 소득세 챗봇을 포함한 RAG 기반 시스템 고도화에 대해서 설명하면서, 가장 중요한 것은 어떻게 올바른 데이터를 모델에게 잘 전달할 것인가를 강조하는 느낌이였다

 

1. 데이터 생성은 LLM이 한다

이 부분은 LLM이 해주는 역할이지만, 우리가 직접 조문을 요약하거나 텍스트를 쓰는 것이 아니라, 모델이 자동으로 답변을 만들어주는 것을 깊게 고민하고 생각해줘야한다

 

2. 우리는 데이터를 ‘잘 전달’해야 한다

여기서 RAG가 필요해지는데, 모델이 생성해내는 답변의 품질은 우리가 제공하는 데이터의 정합성과 정확도에 따라 결정되기 때문에 해당 내용 또한 중요한 부분이였다

 

3. 데이터를 잘 저장하고 관리해야 한다

세번째로 가장 어렵다고 느꼈던 부분은, 그 데이터를 어떻게 저장하고 인덱싱할 것이냐는 것이다. 개인적으로 생각했던 내용은 문서를 무작위로 넣는다고 해서 모델이 잘 사용하는 게 아니기때문에, 문서를 어떻게 나누고, 어떤 메타데이터와 함께 저장할지, 그리고 어떻게 검색할지를 설계하는 것이 핵심이라고 생각했다.

 

4. 목적별로 프롬포트를 분리해서 잘 구성해야 한다

마지막으론 프롬프트도 단순 요약용, 채팅용 등 상황에 따라 다르게 설계되어야 한다고 설명했다 요약 프롬프트는 내용 압축이 목적이라면, 대화형 프롬프트는 사용자의 질문 의도와 가장 관련 있는 조각을 정확히 끌어와야 한다. 이 차이를 명확히 이해하고 챗봇에 적용하는 것이 중요하다고 설명했다


Vector와 Embedding 모델 이해하기

앞서 잠깐 얘기했던 부분인데, 챗봇의 예상 플로우는 사용자가 우리가 만든 챗봇에 자유롭게 질문을 던지면(“ 세액공제 요건은? ”, “근로소득세율은 몇 %인가요?” 등등) 해당 질문에 대한 관련있는 정보를 뽑아내서, 답변해주는 구조이다

더 간단히 말하면, 이런 자연어 질문과 관련 있는 정보를 정확히 뽑아내는 것이 시스템의 성능을 결정짓는다고 생각해주면 된다. 그러면 좀 더 구체적으로 어떤 방식으로 이런 고도화를 진행해줄 수 있을까 ?


강의에서는 RAG의 개념과 함께,
Vector와 Embedding 개념에 대해서도 중요하게 다루는 느낌이였다
먼저 Vector의 개념부터 설명해보고, Embedding 모델과 Vector Database를 비교해보는 내용도 작성해보겠다


Vector의 정의와 유사도 측정

Vector란 ?
텍스트를 수학적으로 표현한 형태로, LLM에서 문장이나 단어 간 의미를 수치적으로 계산할 수 있도록 해준다

 

유사도 검색은 두 개의 벡터가 얼마나 가까운지를 판단하는 방식으로, 대표적으로 아래와 같은 방법이 있는데, 아래 사진과 함께 내용을 서명했어서 사진과 함께 보면 이해가 빠를거같다

 

Euclidean Distance

해당 방식은, 두 벡터 간의 직선 거리 계산하는 방식으로, 두 점 a, b 사이 거리를 d(a,b)로 계산해준다. 예시를 들어서 설명해보면, 

“세액공제 요건”이라는 내용에 대한 질문이 들어오면, 가장 가까운 문서 조각이 소득세법 제59조의2와 같은 실제 법조항일 가능성이 높기때문에, 해당 내용으로 판단할 수 있다

 

Cosine Similarity

그리고 위 사진은, 두 벡터가 이루는 각도의 코사인 값을 이용하여 방향 유사도 측정하는 방식인데, 원점 기준 벡터 a, b의 각도 차이를 보는 방식이다. 해당 내용도 예시를 들어보면, “이자소득 과세 방식”과 “금융소득 분리과세”는 거리는 멀어도, 방향(문맥)이 비슷할 수 있어 cosine 기준에서 높은 유사도를 갖는다고 생각해주면 될거같다 즉, 방향이랑 문맥을 토대로 분석해주는 방식이다

 

개인적으로 생각해본 이 방식들의 공통점은, 어떤 방식이든 얼마나 유사도를 정확히 측정하느냐에 따라, 사용자가 기대하는 정답에 가까운 정보를 제공해줄 수 있겠다 라는 생각이 들었다

 

해당 내용에 대해서 추가로 궁금한 점이 있거나, 학습하고 싶다면 아래 공식문서를 참고하는걸 추천한다 🔥

https://www.pinecone.io/learn/vector-similarity/

 

Vector Similarity Explained | Pinecone

Vector embeddings have proven to be an effective tool in a variety of fields, including natural language processing and computer vision. Comparing vector embeddings and determining their similarity is an essential part of semantic search, recommendation sy

www.pinecone.io


마치며

LLM의 개념은 많이 생소하고 처음이지만, 플로우 자체를 이해해보고 흐름을 잡는 느낌으로 강의를 수강하고 있는중이다. RAG는 단순한 AI라기 보다는, 데이터 설계, 프롬프트 구조, 저장 구조까지 설계가 정교해야 결과가 나온다는 사실도 재미있었다

 

강의에서 챗GPT의 환각(hallucination) 문제도 함께 언급되었는데, 정확하지 않은 정보를 사실처럼 말하는 AI의 특성을 극복하기 위해서라도 신뢰할 수 있는 벡터와 메타데이터 설계가 정말 중요하다고 생각했다

또한 인상 깊었던 점은, 강의에서 GPT 모델과 비교해서 추가로 설명한 업스테이지 KoEmbedding 모델이, 한국어 환경에서는 다른 글로벌 모델에 비해 약 30% 이상 정확도가 높다는 점이 재밌었다

실제로도 무료 크레딧과 저렴한 가격 구조 덕분에 프로덕션 적용에도 큰 부담이 없다는 설명이 인상적이였어서, 나중에 LLM 관련한 내용에 대한 학습을 추가로 진행한 뒤에, 아래 내용도 스프링 프로젝트들에 적용 해보고싶다는 생각 또한 들었다

https://console.upstage.ai/docs/capabilities/embeddings

 

Upstage Console

Empower your business with Upstage Console.

console.upstage.ai

다음 포스팅은 실제 강의를 들으며 실습을 진행했던 내용으로 아티클을 작성해보려고 한다

 

 

참고한 자료

https://python.langchain.com/docs/introduction/

 

'Python > Langchain' 카테고리의 다른 글

FewShot, ChatHistory 활용해서 RAG 고도화 + Streamlit으로 배포 (LangChain)  (2) 2025.05.28
키워드 사전 활용으로 Retrieval 효율개선 (LangChain)  (1) 2025.05.17
'Python/Langchain' 카테고리의 다른 글
  • FewShot, ChatHistory 활용해서 RAG 고도화 + Streamlit으로 배포 (LangChain)
  • 키워드 사전 활용으로 Retrieval 효율개선 (LangChain)
huncozyboy
huncozyboy
이지훈
  • huncozyboy
    열정을 기록하기
    huncozyboy
  • 전체
    오늘
    어제
    • 분류 전체보기 (63)
      • Spring (26)
        • JWT (3)
        • 무한 스크롤 (1)
        • 매칭 로직 (2)
        • OAuth (4)
        • 자동화 (1)
        • 캐싱 (1)
        • AOP (2)
        • Swagger (1)
        • S3 (1)
        • CORS (1)
        • Spring Retry (0)
        • Webhook (2)
        • Grapheme Cluster (1)
        • 연관관계 (1)
        • CS 개념 (5)
      • DevOps (13)
        • 스왑 메모리 (1)
        • Blue Green (2)
        • Docker (7)
        • Route 53 (1)
        • 리버스 프록시 (2)
      • AI (2)
        • Claude Code (1)
        • Copilot (1)
      • CS (4)
        • JAVA (4)
      • Github (1)
        • Conflict (1)
      • Python (4)
        • Langchain (3)
        • Crawling (1)
      • 일상 (3)
        • 회고록 (1)
      • 알고리즘 (10)
        • 투포인터 (0)
        • 슬라이딩 윈도우 (0)
        • 정렬 (0)
        • 이분 탐색 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    https
    OAuth
    수도코드
    Docker
    redis
    LangChain
    Spring
    도커
    EC2
    백준
    java
    JWT
    코딩테스트
    알고리즘
    프로그래머스
    DevOps
    aws
    스프링
    자바
    코테
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
huncozyboy
RAG 개념 + Vector와 Embedding (Python)
상단으로

티스토리툴바