본문 바로가기

공부방/Upstage AI Lab 4기

Langchain과 RAG에 관한 찍먹 기본 지식

RAG는 언제, 어떨 때 쓰려고 만들어진 것일까?

미리 준비된 지식 베이스에서 관련 정보를 찾아서 정확하고 신뢰할 수 있는 답변을 생성하고 싶을 때. 

 

대충 RAG가 돌아가는 시나리오(RAG pipeline)

1) 인공지능 관련 지식을 모아서 [지식 베이스?]에 저장해둔다. (Vector DB에 저장)

2) 사용자가 질문을 한다. "인공지능에 대해서 알려줘"

3) RAG : 질문을 벡터로 변환(임베딩이라고 부름)한다. (질문 처리는 RAG 시스템의 일부인 특별한 모델이나 컴포넌트가 수행.)

4) RAG : 질문과 연관된 정보를 [지식 베이스?]에서 찾는다. 질문 벡터와 가장 유사한 문서 벡터를 찾아낸다. 

5) RAG : 가장 관련성이 높은 부분을 추출해 하나의 컨텍스트로 만든다.

6) LLM에게 넘겨준다. "사용자가 이런 질문을 했어. 그리고 내가 이런 정보를 찾았거든. 답변을 생성해줘"

7) LLM이 답변을 생성하면 사용자에게 답변을 전달한다

 

 


 

*네모칸에 들어 있는 문장은 강사쌤이 정리해주신 Langchain 문서에 적혀있던 설명이고, 그 설명에 대해 자세한 풀이를 밑에 달았다.

RAG는 Knowledge Base(KB)를 구축해야 사용할 수 있다. 이 때 KB는 Vector DB/Vector Store/Vector Index라 불리는
embedding vector를 저장하는 전용 데이터베이스가 있어야 한다.

RAG는 특정 문서(데이터)를 참조해서 전문화되고 올바른(?) 답변을 해준다. 이때 참조하는 문서를 Knowledge Base(KB)라고 하고,  Vector DB는, 벡터 형태의 데이터를 효율적으로 저장하고 검색할 수 있게 해주는 특별한 종류의 데이터베이스 또는 데이터 구조를 말한다. 여기서 벡터 형태의 데이터라는 건 여러 개의 숫자로 이루어진 리스트나 배열을 말한다. 그러니까 KB에 들어가는 건 숫자 덩어리라는 뜻(?).

예를 들어 봅시다:

  1. 텍스트 데이터의 경우: 문장 "나는 사과를 좋아한다"를 벡터로 변환하면 다음과 같을 수 있습니다: [0.2, -0.5, 0.8, 0.1, -0.3]
  2. 이미지 데이터의 경우: 작은 흑백 이미지(3x3 픽셀)를 벡터로 표현하면 다음과 같을 수 있습니다: [0.1, 0.5, 0.7, 0.2, 0.9, 0.3, 0.6, 0.4, 0.8]
  3. 사용자 프로필 데이터의 경우: 나이, 성별, 관심사 등을 벡터로 표현하면 다음과 같을 수 있습니다: [25, 1, 0.8, 0.2, 0.6] (여기서 25는 나이, 1은 성별, 나머지는 각각의 관심사에 대한 점수일 수 있습니다)

-> 텍스트나 이미지 등의 데이터를 숫자로 변환하는 것을 embedding 이라고 한다. 

이러한 벡터들은 원본 데이터의 특징을 수치화하여 표현한 것입니다. 인공지능 모델은 이런 숫자들을 이용해 데이터를 처리하고 분석합니다.

Vector DB는 이런 벡터들을 저장하고, 필요할 때 유사한 벡터를 빠르게 찾을 수 있도록 설계되어 있습니다. 예를 들어, "사과가 맛있다"라는 새로운 문장이 들어오면, 이를 벡터로 변환한 후 가장 유사한 벡터(위의 예시에서 "나는 사과를 좋아한다")를 찾아낼 수 있습니다.

 

Vector DB에는 ChromaDB, Pinecone, Milvus 등이 있는데, Langchain은 주로 ChromaDB를 사용한다.

ChromaDB는 오픈소스 벡터 데이터베이스. Chroma라는 회사에서 개발했으며, Google의 Chrome과는 무관! 

 

Langchain에는 Prompt ↔ SQL query로 변환해주는 SQL chain이 있기 때문에 SQL을 직접 사용해서 QA engine을 만들 수도 있다.
  1. SQL 쿼리란?
    • SQL(Structured Query Language)은 데이터베이스를 관리하고 데이터를 조작하는 데 사용되는 프로그래밍 언어입니다.
    • SQL 쿼리는 데이터베이스에서 정보를 검색, 삽입, 업데이트, 삭제하는 명령어입니다.
  2. Prompt란?
    • AI 모델에게 주는 지시나 질문을 의미합니다.
    • 보통 자연어(일상적인 언어)로 작성됩니다.
  3. Langchain의 SQL Chain:
    • 이 기능은 자연어로 된 질문(Prompt)을 SQL 쿼리로 변환해주고, 그 반대로도 작동합니다.
  4. 작동 방식:
    • 사용자가 "서울의 평균 기온은 얼마인가요?"라고 질문하면
    • SQL Chain이 이를 "SELECT AVG(temperature) FROM weather_data WHERE city = 'Seoul';" 같은 SQL 쿼리로 변환합니다.
    • 데이터베이스에서 이 쿼리를 실행하여 결과를 얻습니다.
    • 그 결과를 다시 자연어 응답으로 변환하여 사용자에게 제공합니다.
  5. QA Engine 만들기:
    • 이 기능을 활용하면, 데이터베이스에 저장된 정보를 바탕으로 질의응답(QA) 시스템을 만들 수 있습니다.
    • 사용자는 자연어로 질문하고, 시스템은 이를 SQL로 변환하여 데이터베이스에서 정보를 찾아 답변합니다.
  6. 장점:
    • 사용자는 SQL을 몰라도 데이터베이스의 정보를 쉽게 활용할 수 있습니다.
    • 개발자는 SQL과 자연어 처리를 쉽게 연결할 수 있습니다.

이렇게 Langchain의 SQL Chain은 자연어와 데이터베이스 쿼리 사이의 다리 역할을 합니다. 이를 통해 더 직관적이고 사용자 친화적인 데이터 검색 시스템을 만들 수 있습니다.

 


 

질문을 어떻게 벡터로 변환하나?

RAG 시스템의 일부인 특별한 모델이나 컴포넌트가 질문을 처리한다. 일반적으로 '인코더(Encoder)' 또는 '임베딩 모델(Embedding Model)'이라고 불리는 특수한 AI 모델이 이 작업을 수행한다.

주요 모델 예시:

  • BERT, RoBERTa, Sentence-BERT 등의 모델이 자주 사용됩니다.
  • OpenAI의 경우 'text-embedding-ada-002' 같은 전용 임베딩 모델을 제공합니다.