ICT 드림업 - 무물 매니저/기획-설계

[무물매니저] LangChain 또는 LlamaIndex + LLaMA로 경량형 RAG 만들기

kangchaewon 2025. 4. 18. 14:56

 

LangChain 또는 LlamaIndex + LLaMA로 경량형 RAG 만들기 , 개발 프로세스 전체 숙지해오기

아키텍처

 

전체 구조 흐름도

graph TD
A[카메라 촬영] --> B[이미지 객체 감지]
B --> C[객체별 영역 분할]
C --> D[사용자 터치 객체 선택]
D --> E[객체 크롭 & 업로드 to S3]
E --> F[객체 관련 메타데이터 검색 (Vector DB)]
F --> G[관련 정보 문서 추출]
G --> H[LLM (LLaMA) + Prompting]
H --> I[대화형 응답 생성]
I --> J[사용자 추가 질문 → RAG 반복]

 

개발 프로세스

1. 이미지 객체 인식 및 분할

  • 모델 후보: YOLOv8 (속도 우수) + Segment Anything
  • 출력: bounding box 혹은 segmentation mask
  • 클릭 감지: 사용자가 특정 객체 클릭 → 해당 객체 영역만 crop

2. 벡터 DB용 데이터 구성

  • 객체와 관련된 정보를 미리 문서화하고 벡터화
    • 예: "모네의 수련화" → 작가, 작품 설명, 시대적 배경, 비슷한 그림 등
  • 텍스트 벡터화 모델: sentence-transformers (all-MiniLM 등 경량)
  • 저장소: Chroma / FAISS (local 우선, 추후 Pinecone 고려)

3. LangChain or LlamaIndex 기반 RAG 구성

  • 문서 검색 → LLaMA 모델에게 요약 질문 전달
  • LangChain 예시 구조:
from langchain.chains import ConversationalRetrievalChain
qa_chain = ConversationalRetrievalChain.from_llm(
    llm=llama_llm,
    retriever=vectorstore.as_retriever()
)

4. LLaMA 또는 TinyLLaMA 또는 gpt 연동

  • LLM 선택 기준:
    • 앱에 올릴 수 있도록 경량 모델
    • llama.cpp or Ollama로 로컬 추론 가능

 5. 대화 지속형 처리

  • LangChain의 ConversationalRetrievalChain 사용하여 메모리 유지
  • 사용자가 후속 질문해도 문맥 따라감

랭체인에서 필요한 기능

[사용자 질의] 
     ↓
[LangChain RAG 시스템]
 ├── Document Loader        ← S3/로컬의 미술작품 설명 텍스트
 ├── Text Splitter          ← 긴 문서를 쪼개기
 ├── Embedding Model        ← HuggingFace (예: MiniLM) 사용해 벡터화
 ├── Vector Store           ← FAISS, Chroma 등 로컬 벡터DB 저장
 ├── Retriever              ← 질의에 맞는 관련 벡터 문서 검색
 ├── Memory                 ← 대화 이력 유지 (옵션)
 └── ConversationalRetrievalChain
       └─ LLM               ← LLaMA (로컬), Ollama, llama-cpp 등

      ↓
[최종 응답 생성]

 

아키텍처

필수 구성 요소

벡터 검색 기반 QA ConversationalRetrievalChain
벡터 DB 저장/로드 VectorStore (FAISS/Chroma)
로컬 임베딩 HuggingFaceEmbeddings
로컬 LLM 연결 LlamaCpp or Ollama
대화형 응답 ConversationMemory (선택)

각 구성요소의 연결 구조

📄 문서 로딩 DocumentLoader S3, 로컬 텍스트
✂️ 문서 분할 TextSplitter 문서 덩어리 (Chunk)
📐 임베딩 HuggingFaceEmbeddings 분할 문서 → 벡터
🧠 벡터 저장 VectorStore (예: FAISS) 벡터 → 저장 및 검색
🔍 검색 .as_retriever() 사용자 질의 기반 검색
💬 대화 유지 ConversationMemory 이전 질문과 맥락 유지
🤖 응답 생성 ConversationalRetrievalChain LLM과 Retriever 통합
🧠 LLM LlamaCpp, Ollama, OpenAI  로컬 LLaMA or API

10일 안에 경량 RAG 도슨트 앱 프로토타입을 만들기 위한 개발 순서

 

목표

사진 속 객체 감지 → 객체 클릭 → RAG 검색 → 대화형 응답

 

사용자 질문 형식

1. 사용자: 그림 찍기 → 객체 탐지
2. 사용자: "비너스" 클릭
3. 시스템: "비너스에 대해 알려줘" → RAG 검색
4. LLaMA 응답: "비너스는 고대 로마의 사랑의 여신을 의미하며..."

 

1~2일차 - 이미지 객체 감지

  1. 객체 탐지 모델 준비
    • 간단히 YOLOv5 / YOLOv8 or Roboflow 모델 활용
    • 미술 작품에 특화된 모델이 아니어도 괜찮음 (시연용이면 일반 객체 탐지 OK)
  2. 이미지 업로드 시 객체 영역 감지 및 좌표 출력
    • 결과 예시: [{label: "사과", x:100, y:200, w:50, h:50}]
  3. 클릭 시 해당 label 전달 가능하게 처리 (프론트 or 백엔드)
    • "사과" 클릭 시 → "사과에 대해 알려줘" 형식으로 전송

 3~4일차 - 데이터 정리 및 벡터화

  1. 작품 설명 정리 & 로딩 (art_info.txt 등)
  2. LangChain으로 문서 분할 + 임베딩 + FAISS 저장
    • TextLoader, RecursiveCharacterTextSplitter, HuggingFaceEmbeddings, FAISS

 5~6일차 - RAG 체인 구성

  1. 로컬 LLaMA 연결 (llama-cpp or Ollama + LLaMA2/3)
  2. LangChain RAG 구성
    • ConversationalRetrievalChain
    • FAISS.as_retriever() 연결
    • ConversationMemory 적용 (선택)

 7~8일차 - FastAPI + 객체 탐지 연동

  1. FastAPI로 /ask API 구성
    • 입력: 객체명, 사용자 질문
    • 처리: "{객체명}에 대해 알려줘" 형태로 질의
    • 응답: LLaMA로부터 도출된 응답
  2. 프론트엔드 or 노트북에서 클릭 → 질문 연결 처리
    • 예: 객체 클릭 시 자동으로 질문 텍스트 생성

 9~10일차 - 대화 시나리오 구성 & 시연

  1. 대화 흐름 테스트
    • 예: 사용자 → "이건 누구 그림이야?" → 객체: "별이 빛나는 밤"
  2. 다중 질의 시나리오 점검
  3. 응답 튜닝 (token 수, temperature)