Ollama와 함께 항공사 리뷰를 위한 로컬 RAG AI 에이전트 구축

발행: (2026년 1월 17일 오전 01:51 GMT+9)
6 min read
원문: Dev.to

Source: Dev.to

Ollama를 사용한 항공사 리뷰용 로컬 RAG AI 에이전트 구축

저는 Retrieval‑Augmented Generation (RAG)을 활용한 완전 local AI agent가 얼마나 멀리 갈 수 있는지 탐구하고 싶었습니다. 작은 호기심 기반 저녁 프로젝트로, 저는 항공사 리뷰에 관한 질문에 답변할 수 있는 에이전트를 구축했습니다 — 완전히 오프라인이며, 빠르고, 비용도 저렴합니다.

기술 스택 개요

언어: Python
LLM 런타임: Ollama

모델

  • llama3.2는 질문 응답용
  • mxbai-embed-large는 임베딩용

벡터 스토어: Chroma

라이브러리

  • langchain
  • langchain-ollama
  • langchain-chroma
  • pandas

데이터셋: Kaggle의 Airline Reviews (CSV)

왜 Ollama인가?

  • 로컬에서 쉽게 실행 가능
  • 저렴함 (API 비용 없음)
  • 실험에 충분히 빠름

사이드 프로젝트와 학습에 완벽합니다.

데이터셋 준비

이 데이터셋은 Kaggle에서 가져온 것으로, CSV 형식의 항공사 리뷰를 포함하고 있습니다.
벡터 인제스트를 더 빠르고 가볍게 만들기 위해, 의미 검색에 관련된 열(리뷰 텍스트, 항공사 이름, 평점 등)만 남긴 축소된 CSV 버전을 만들었습니다. 이를 통해 크게 개선되었습니다:

  • 임베딩 생성 시간
  • 벡터 스토어 로딩 속도

고수준 아키텍처

  1. pandas를 사용하여 CSV에서 항공사 리뷰를 로드합니다.
  2. mxbai-embed-large로 임베딩을 생성합니다.
  3. 벡터를 Chroma에 저장합니다.
  4. 사용자 질문에 대한 관련 리뷰를 검색합니다.
  5. 검색된 리뷰와 질문을 llama3.2에 전달합니다.
  6. 검색된 내용에만 엄격히 기반한 답변을 생성합니다.

프롬프트 디자인

프롬프트는 명확하고 제한적이며 환각을 방지하도록 설계되었습니다:

You are an expert in answering questions about airline reviews.
Use the provided reviews to answer the question as accurately as possible.

Here are some relevant reviews: {reviews}

Here is the question to answer: {question}

IMPORTANT: Base your answer ONLY on the reviews provided above. If no reviews are provided, say "No reviews were found."

이 단일 지시문만으로도 답변 신뢰성이 크게 향상되었습니다.

최소 파이썬 설정 (개념적)

import pandas as pd
from langchain_ollama import OllamaEmbeddings, OllamaLLM
from langchain_chroma import Chroma
from langchain.chains import RetrievalQA

# 1. Load CSV
df = pd.read_csv("airline_reviews_reduced.csv")

# 2. Create embeddings
embeddings = OllamaEmbeddings(model="mxbai-embed-large")

# 3. Build vector store
vector_store = Chroma.from_documents(
    documents=df["review_text"].tolist(),
    embedding=embeddings,
    collection_name="airline_reviews"
)

# 4. Set up LLM
llm = OllamaLLM(model="llama3.2")

# 5. RetrievalQA chain
qa = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vector_store.as_retriever(),
    chain_type_kwargs={"prompt": YOUR_PROMPT_STRING}
)

# 6. Ask a question
answer = qa.run("How do passengers generally feel about Emirates?")
print(answer)

이 코드는 의도적으로 간단하고 읽기 쉽게 작성되었으며, 추상화 레이어보다 명확성에 중점을 두었습니다.

예시 결과

✅ 예시 1: 유효한 질문

Question: 승객들은 일반적으로 Emirates에 대해 어떻게 느끼나요?

Result: 에이전트는 여러 관련 리뷰를 검색하고 올바르게 요약했습니다.

Valid Answer

❌ 예시 2: 관련 데이터 없음

Question: Honda CRA는 좋은 SUV 차인가요?

Result: 관련 리뷰가 검색되지 않아 에이전트가 다음과 같이 응답했습니다:

No reviews were found…

No Relevant Data

GitHub 리포지토리

전체 소스 코드는 여기에서 확인할 수 있습니다:
👉 GitHub Repo: local-AI-agent-RAG

README의 지침에 따라 리포지토리를 클론하고 프로젝트를 실행할 수 있습니다.

최종 생각

이 프로젝트는 호기심과 재미로 시작되었습니다—복잡하게 만들지 않고 로컬 RAG 시스템을 실험할 수 있는 방법이죠. 동일한 접근 방식은 더 확장할 수 있습니다: 더 큰 데이터셋성능이 뛰어난 하드웨어를 사용하면 훨씬 빠르고, 더 정확하며, 프로덕션‑준비된 것을 만들 수 있습니다.

현재는 확실한 개념 증명으로서, 의미 있는 AI 프로젝트를 시작하는 데 항상 방대한 인프라가 필요하지 않다는 것을 상기시켜 줍니다 🚀

Back to Blog

관련 글

더 보기 »

왜 우리는 모니터링 통계를 공개했는가

대부분의 모니터링 서비스는 숫자를 숨깁니다. 우리는 반대로 하기로 했습니다. 여기에서 Boop이 현재 어떻게 수행되고 있는지 정확히 볼 수 있습니다 – 분당 체크 수, 지역…