제19회 사내 AI 어시스턴트 구축 – RAG로 구현하는 검색 기반 질의응답 시스템

들어가며

지난 회에서는 시맨틱 검색의 개념을 정리했습니다. 이번 글에서는 그 발전 형태로서 RAG(Retrieval-Augmented Generation)를 사용한 사내 AI 어시스턴트를 구축합니다.

RAG는 “검색으로 관련 문서를 찾고, LLM(대규모 언어 모델)이 해당 내용을 바탕으로 답변을 생성하는” 구조입니다. 사내 문서에 기반한 답변을 생성하기 때문에, 일반적인 채팅 AI로는 답할 수 없는 사내 고유의 질문에도 대응할 수 있습니다.

대상 독자

  • 사내 AI 어시스턴트 구축에 관심이 있는 분

  • RAG 구현 방법을 배우고 싶은 분

  • LLM 연동 옵션을 이해하고 싶은 분

RAG의 구조

RAG 파이프라인

Fess의 AI 검색 모드는 다음 파이프라인으로 동작합니다.

  1. 의도 분석(Intent): 사용자의 질문을 분석하여 의도를 분류(검색, 요약, FAQ, 불명확)

  2. 검색(Search): Fess 인덱스에서 관련 문서를 가져옴(제로 히트 시 쿼리를 자동 재생성하여 재검색)

  3. 평가(Evaluate): 가져온 문서의 관련성을 LLM이 평가

  4. 전문 가져오기(Fetch): 관련성이 높은 문서의 전문을 가져옴

  5. 답변 생성(Answer): 문서 내용을 바탕으로 LLM이 인용이 포함된 답변을 스트리밍 생성

이 파이프라인을 통해 LLM의 “그럴듯하지만 부정확한 답변(할루시네이션)”을 줄이고, 사내 문서에 근거한 답변을 제공합니다.

Fess의 AI 검색 모드는 벡터 검색(임베딩 모델)을 필요로 하지 않습니다. 기존의 전문 검색 인덱스를 그대로 활용하며, LLM이 검색 결과의 평가와 답변 생성을 담당합니다. 따라서 임베딩 모델 선정이나 벡터 데이터베이스 구축 같은 추가 인프라 준비 없이 바로 RAG 기반의 AI 검색을 도입할 수 있습니다.

LLM 프로바이더 선택

Fess는 3가지 LLM 백엔드를 지원합니다. 각각의 특징과 선택 기준을 정리합니다.

LLM 프로바이더 비교
프로바이더 플러그인 비용 특징
OpenAI fess-llm-openai API 종량 과금 높은 답변 품질, GPT-4o 지원, 쉽게 시작 가능
Google Gemini fess-llm-gemini API 종량 과금 확장 사고 지원, 긴 컨텍스트
Ollama fess-llm-ollama 하드웨어 비용 로컬 실행, 데이터가 외부로 나가지 않음, 프라이버시 중시

선택 기준

클라우드 API(OpenAI / Gemini)를 선택하는 경우

  • 초기 비용을 억제하고 싶은 경우

  • GPU 서버를 준비할 수 없는 경우

  • 답변 품질을 최우선으로 하는 경우

  • 데이터의 외부 전송이 허용되는 경우

로컬 실행(Ollama)을 선택하는 경우

  • 사내 데이터의 외부 전송이 허가되지 않는 경우

  • 보안 및 프라이버시 요건이 엄격한 경우

  • GPU 서버를 준비할 수 있는 경우

  • 운영 비용을 억제하고 싶은 경우(대량 이용 시)

AI 검색 모드 설정

플러그인 설치

사용할 LLM 프로바이더에 대응하는 플러그인을 설치합니다.

  1. 관리 화면에서 [시스템] > [플러그인]을 선택

  2. 해당 플러그인을 설치(예: fess-llm-openai)

AI 검색 모드 활성화

Fess 설정에서 AI 검색 모드를 활성화합니다.

관리 화면의 설정 또는 설정 파일에서 rag.chat.enabled=true 를 설정합니다.

LLM 접속 설정

각 LLM 프로바이더에 따른 접속 정보를 설정합니다.

OpenAI의 경우

  • API 키

  • 사용할 모델(gpt-4o, gpt-4o-mini 등)

  • 최대 토큰 수

Ollama의 경우

  • Ollama 서버 URL

  • 사용할 모델명

  • Docker Compose로 서비스 추가

services:
  ollama:
    image: ollama/ollama
    volumes:
      - ollama-data:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

AI 채팅 경험

채팅 UI

AI 검색 모드를 활성화하면 Fess 검색 화면에 AI 검색 모드가 추가됩니다. 사용자는 키워드 검색과 AI 채팅을 전환하여 이용할 수 있습니다.

질문과 답변 예시

질문: “유급 휴가 신청 방법을 알려 주세요”

AI 답변:

유급 휴가 신청은 다음 절차로 진행합니다.

  1. 사내 포털의 “근태 관리” 페이지에 접속합니다

  2. “휴가 신청” 메뉴에서 “유급 휴가”를 선택합니다

  3. 일정을 입력하고, 상급자를 선택하여 신청합니다

신청은 휴가 3영업일 전까지 완료해 주세요.

참고: [취업 규칙 제15조](https://portal/rules/chapter15.html)

답변에는 정보 출처 링크가 포함되어 있어 사용자가 원문을 확인할 수 있습니다.

Chat API(SSE) 활용

프로그램에서 AI 검색 모드를 이용하려면 Chat API를 사용합니다. Chat API는 Server-Sent Events(SSE)로 스트리밍 응답을 반환합니다.

스트리밍 응답(SSE)을 이용하는 경우:

GET /api/v1/chat/stream?message=유급 휴가 신청 방법

비스트리밍 JSON 응답을 가져오는 경우:

POST /api/v1/chat
Content-Type: application/x-www-form-urlencoded

message=유급 휴가 신청 방법

SSE를 통해 답변이 생성될 때마다 실시간으로 클라이언트에 전송됩니다. 사용자는 답변이 완전히 생성되기를 기다리지 않고, 점차 표시되는 답변을 읽기 시작할 수 있습니다.

대화 이력

Chat API는 세션 기반의 대화 이력을 지원합니다. 이전 질문의 맥락을 고려한 추가 질문이 가능합니다.

예시:

  • Q1: “유급 휴가 신청 방법을 알려 주세요”

  • A1: (위의 답변)

  • Q2: “신청 기한을 넘긴 경우에는 어떻게 하면 됩니까?”

  • A2: (Q1의 맥락을 고려한 답변)

RAG 튜닝

답변 품질 개선

RAG의 답변 품질은 다음 요소에 영향을 받습니다.

검색 품질

RAG는 검색 결과를 바탕으로 답변을 생성하므로, 검색 품질이 답변 품질에 직결됩니다. 제8회의 튜닝 사이클로 검색 품질을 개선하는 것이 RAG 품질 개선에도 이어집니다.

문서 품질

검색 대상 문서 자체가 오래되었거나 부정확하거나 모호한 경우, RAG 답변의 품질도 저하됩니다. 문서의 정기적인 업데이트와 품질 관리가 중요합니다.

프롬프트 설정

LLM에 전송하는 프롬프트(지시문) 튜닝을 통해 답변의 스타일과 정확도를 조정할 수 있습니다.

안전성 고려

프롬프트 인젝션 대책

Fess의 RAG 기능에는 프롬프트 인젝션 방어가 내장되어 있습니다. 악의적인 입력으로 LLM의 동작을 조작하려는 공격으로부터 보호합니다.

정보 유출 방지

RAG는 검색 결과를 바탕으로 답변하므로, 역할 기반 검색(제5회)과 결합하면 사용자의 권한에 따른 답변만 생성됩니다. 권한이 없는 문서의 내용은 RAG 답변에도 포함되지 않습니다.

정리

이번 글에서는 Fess의 AI 검색 모드를 사용한 사내 AI 어시스턴트 구축 방법을 설명했습니다.

  • RAG 파이프라인의 구조(의도 분석 -> 검색 -> 평가 -> 답변 생성)

  • 3가지 LLM 프로바이더(OpenAI, Gemini, Ollama)의 선택 기준

  • AI 검색 모드의 설정과 경험

  • Chat API(SSE)를 통한 프로그램에서의 활용

  • 답변 품질 튜닝과 안전성 고려

사내 문서에 기반한 AI 어시스턴트를 통해, “찾기”에서 “묻기”로 지식 활용의 형태가 변화합니다.

다음 회에서는 Fess를 MCP 서버로서 AI 에이전트에 통합하는 방법을 다룹니다.

참고 자료