1. RAG란?
RAG(Retrieval-Augmented Generation)는 **검색(Retrieval)**과 **생성(Generation)**을 결합한 AI 기술로, LLM(Large Language Model)의 Hallucination(부정확하거나 가상의 답변 생성)을 줄이고 정확한 답변을 제공합니다.
- 검색 단계: 질문과 관련된 외부 데이터(문서, DB 등)를 검색.
- 생성 단계: 검색된 데이터를 컨텍스트로 LLM이 자연스러운 답변 생성.
- 목적: 외부 데이터 기반으로 신뢰성 있는 답변 제공.
- 핵심: 데이터 검색 후 프롬프트(시스템/사용자)에 컨텍스트로 포함해 LLM 호출.
Hallucination 문제:
- LLM은 학습 데이터 외 정보에 대해 잘못된 답변 생성 가능.
- RAG 해결: 실제 데이터(예: 문서)를 검색해 컨텍스트로 제공, Hallucination 감소.
2. RAG 구현 방법
RAG는 데이터 규모와 요구사항에 따라 다양한 방식으로 구현 가능하며, 모두 정확한 답변 제공을 목표로 합니다.
2.1 ChatGPT/NotebookLM에 파일 업로드
- 설명: ChatGPT, NotebookLM 같은 플랫폼에 텍스트/PDF 업로드 후 질문.
- 내부 동작: 플랫폼이 문서를 파싱하고 키워드 매칭 또는 간단한 검색 수행 후 LLM 답변 생성.
- 장점: 설정 간단, 즉시 사용.
- 단점: 검색 과정 불투명, 대규모 데이터 비효율.
2.2 시스템 프롬프트에 문서 삽입 (짧은 문서)
- 설명: 짧은 문서(예: 500~2,000 토큰)를 시스템 프롬프트에 직접 포함.
- 검색: 별도 검색 없이 LLM이 프롬프트 내 데이터 참조.
- 장점: 간단, 추가 도구 불필요, 토큰 제한(예: Grok 128k) 내 처리 가능.
- 단점: 긴 문서 불가, 검색 정밀도 낮음.
2.3 사용자 프롬프트에 문서 삽입 (일반 텍스트)
- 설명: Text/PDF Loader로 문서 로드, 청크로 분할, 키워드 매칭으로 검색 후 사용자 프롬프트에 선택된 텍스트 포함.
- 검색: 문자열 매칭으로 질문과 관련된 청크 선택.
- 장점: 소규모 문서 처리 간단, 벡터화 불필요.
- 단점: 대규모 데이터 비효율, 검색 정확도 제한.
2.4 벡터 DB 및 메모리 기반 검색
- 설명: 문서를 청크로 나누고 임베딩(벡터화)해 벡터 DB(예: ChromaDB, Pinecone) 또는 메모리 기반 저장소(InMemorySearch)에 저장. 질문과 유사한 청크 검색 후 프롬프트에 포함.
- 검색: 질문 임베딩과 벡터 간 유사도 검색(예: 코사인 유사도).
- 장점: 대규모 데이터 처리, 높은 검색 정확도.
- 단점: 설정 복잡, 비용 증가.
2.5 RDBMS 활용
2.5.1 SQL 쿼리 활용
- 설명: 구조화된 데이터(예: 명령 로그)를 SQL 쿼리로 검색해 프롬프트에 포함.
- 검색: 키워드/조건 기반 SQL 쿼리.
- 장점: 기존 DB 활용, 정밀 검색.
- 단점: 비구조화 데이터 처리 어려움, 쿼리 설계 필요.
2.5.2 PostgreSQL + 벡터 임베딩 (pgvector)
- 설명: PostgreSQL에 pgvector 확장으로 벡터 임베딩 저장, 텍스트와 벡터 검색 결합.
- 검색: SQL로 구조화 데이터 검색 + 벡터 유사도 검색.
- 장점: 구조/비구조 데이터 통합.
- 단점: 설정 및 관리 복잡.
3. API 프롬프트 예시
API 호출 시 검색된 데이터는 사용자 프롬프트에 컨텍스트로 포함되는 경우가 일반적이나, 짧은 문서는 시스템 프롬프트에 포함 가능. 아래는 홈로봇 제어 명령어로 작성.
- 시스템 프롬프트 (기본 움직임 제어, 짧은 문서):
당신은 홈로봇 제어 시스템입니다. 다음 기본 움직임 명령을 참고하세요:
- "앞으로 이동": 로봇이 직진 (속도: 0.5m/s).
- "뒤로 이동": 로봇이 후진 (속도: 0.3m/s).
- "왼쪽 회전": 로봇이 90도 좌회전.
- "오른쪽 회전": 로봇이 90도 우회전.
- "정지": 로봇이 즉시 멈춤.
요청이 명령 목록에 있으면 "명령 인식: {command}, 세부 정보: {description}"로 답변. 없으면 "일반 제어: {user_input}" 답변.
- 사용자 프롬프트 (IoT 포함, 긴 문서에서 첨부):
질문: TV 켜줘
첨부 문서:
- "TV 켜줘": 거실 TV 전원 ON.
- "불 꺼줘": 거실 조명 OFF.
- "에어컨 켜줘": 에어컨 ON (설정 온도: 24도).
- "창문 열어줘": 스마트 창문 개방.
- "청소 시작": 로봇 청소기 작동 시작.
- "속도 증가": 로봇 이동 속도 0.1m/s 증가.
- "속도 감소": 로봇 이동 속도 0.1m/s 감소.
- "부엌으로 이동": 로봇이 부엌 위치로 이동.
- "문 잠가줘": 현관문 스마트 잠금.
- "히터 켜줘": 히터 ON (설정 온도: 22도).
- "환기 시작": 공기청정기 환기 모드 ON.
- "커튼 올려줘": 스마트 커튼 상승.
- "TV 끄기": 거실 TV 전원 OFF.
- "불 켜줘": 거실 조명 ON.
명령이 첨부 문서에 있으면 "명령 인식: {command}, 세부 정보: {description}"로 답변. 없으면 "일반 제어: {user_input}" 답변.
4. 데이터 규모와 토큰 비용
- 짧은 문서 (500~2,000 토큰): 시스템 프롬프트에 포함 가능. 예: 위 기본 움직임 명령(약 200 토큰)은 Grok 128k 제한 내 충분.
- 대규모 데이터: 전체 문서를 프롬프트에 포함 시 토큰 비용 증가. 벡터 DB 또는 SQL 쿼리로 필요한 데이터만 검색해 비용 절감.
- 회사 DB 활용:
- SQL 쿼리: 구조화 데이터(예: 명령 로그) 검색, 프롬프트에 포함.
- PostgreSQL + pgvector: 기존 DB에 벡터 임베딩 추가, 텍스트 기반 검색 강화.
5. 결론
- RAG의 핵심: 정확한 답변을 위해 데이터 검색 후 프롬프트에 컨텍스트로 제공.
- 구현 유연성: ChatGPT 업로드, 시스템/사용자 프롬프트, 벡터 DB, SQL, pgvector 등 다양.
- 토큰 비용: 대규모 데이터는 벡터 DB/SQL로 필요한 데이터만 검색.
- 회사 활용: SQL로 구조화 데이터 검색, pgvector로 텍스트 검색 통합.