Skip to content

Latest commit

 

History

History
738 lines (532 loc) · 16.9 KB

File metadata and controls

738 lines (532 loc) · 16.9 KB

🚀 고급 주제 및 성능 개선 가이드

프로젝트 완성도를 높이고 성능을 향상시키는 방법 (2025년 10월 기준)


📚 목차

  1. 핵심 기술 스택
  2. 관련 논문 및 연구
  3. [그 외 학습 자료](#-그 외-학습-자료)
  4. 성능 개선 방법
  5. 완성도 향상 전략
  6. 2025년 최신 트렌드

🔧 핵심 기술 스택

1. RAG (Retrieval-Augmented Generation)

개념: 검색과 생성을 결합한 AI 시스템

질문 입력
  ↓
벡터 검색 (ChromaDB)
  ↓
관련 문서 검색
  ↓
LLM에 문서 + 질문 전달
  ↓
정확한 답변 생성

핵심 논문:

최신 발전:

  • Self-RAG (2024): 검색이 필요한지 스스로 판단
  • Corrective RAG (C-RAG, 2024): 검색 결과의 품질 평가
  • Adaptive RAG (2024): 쿼리 복잡도에 따라 전략 변경

2. Vector Embeddings

개념: 텍스트를 고차원 벡터로 변환

OpenAI Embeddings API:

  • text-embedding-3-large: 3072차원, 가장 정확
  • text-embedding-3-small: 1536차원, 빠르고 저렴
  • 비용: $0.13 / 1M tokens (3-large 기준)

핵심 논문:

3. Vector Database (ChromaDB)

개념: 벡터 유사도 기반 빠른 검색

알고리즘: HNSW (Hierarchical Navigable Small World)

  • 시간 복잡도: O(log N)
  • 정확도: 99%+
  • 확장성: 수백만 벡터 지원

대안 기술:

  • Pinecone: 클라우드 기반, 관리형
  • Weaviate: GraphQL 지원, 하이브리드 검색
  • Milvus: 대규모 프로덕션용
  • Qdrant: Rust 기반, 고성능

4. LLM (Large Language Model)

사용 모델: GPT-4o-mini

  • 비용 효율적: $0.15 / 1M 입력 토큰
  • 빠른 응답: ~500ms
  • 컨텍스트: 128K 토큰

최신 대안 (2025년 10월): GPT, Claude 등


📖 관련 논문 및 연구

RAG 관련 필독 논문

  1. "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks"

  2. "Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection"

  3. "Corrective Retrieval Augmented Generation"

  4. "RAPTOR: Recursive Abstractive Processing for Tree-Organized Retrieval"

Embedding 관련

  1. "Text Embeddings by Weakly-Supervised Contrastive Pre-training"

  2. "Matryoshka Representation Learning"

챗봇 및 대화 시스템

  1. "Constitutional AI: Harmlessness from AI Feedback"

  2. "LLM-as-a-Judge: Evaluating Chat Assistants with Large Language Models"


📚 그 외 학습 자료

공식 문서

  1. OpenAI Documentation

  2. LangChain Documentation

  3. ChromaDB Documentation

온라인 강의

  1. DeepLearning.AI - LangChain for LLM Application Development

  2. OpenAI Cookbook

서적

  1. "Building LLM Apps" by Joao Moura (2024)

    • RAG 시스템 구축 실전 가이드
  2. "Generative AI on AWS" by Chris Fregly (2024)

    • 프로덕션 배포 가이드

블로그 & 아티클

  1. Pinecone Learning Center

  2. LlamaIndex Blog

  3. Anthropic Research


🚀 성능 개선 방법

1. RAG 성능 최적화

A. Embedding 전략 개선

현재:

embedding = openai.embeddings.create(
    input=query,
    model="text-embedding-3-large"
)

개선 1: 쿼리 확장 (Query Expansion)

def expand_query(original_query):
    """LLM으로 쿼리를 여러 관점으로 확장"""
    prompt = f"""
    다음 질문을 3가지 다른 방식으로 다시 작성하세요:
    질문: {original_query}
    """
    expanded = llm.generate(prompt)
    return [original_query] + expanded

# 여러 쿼리로 검색 후 결과 결합
results = []
for query in expand_query(user_query):
    results.extend(search_similar(query))

개선 2: Hypothetical Document Embeddings (HyDE)

def hyde_search(query):
    """가상 답변을 먼저 생성 후 검색"""
    # 1. LLM으로 가상 답변 생성
    hypothetical_answer = llm.generate(
        f"질문에 대한 상세한 답변을 작성하세요: {query}"
    )

    # 2. 가상 답변의 embedding으로 검색
    embedding = create_embedding(hypothetical_answer)
    return vector_db.search(embedding)

B. 리랭킹 (Re-ranking)

문제: 벡터 검색만으로는 최적이 아닐 수 있음

해결:

from sentence_transformers import CrossEncoder

# 1차: 벡터 검색 (빠름)
candidates = vector_db.search(query, top_k=20)

# 2차: CrossEncoder로 정확도 재평가 (느림)
reranker = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')
scores = reranker.predict([(query, doc) for doc in candidates])

# 상위 5개만 사용
top_docs = sorted(zip(candidates, scores),
                  key=lambda x: x[1], reverse=True)[:5]

C. 하이브리드 검색

벡터 + 키워드 검색 결합:

def hybrid_search(query):
    # 벡터 검색 (의미론적)
    vector_results = vector_db.search(query, top_k=10)

    # BM25 키워드 검색 (정확한 매칭)
    from rank_bm25 import BM25Okapi
    bm25_results = bm25.get_top_n(query.split(), documents, n=10)

    # 결과 결합 (RRF - Reciprocal Rank Fusion)
    combined = reciprocal_rank_fusion([vector_results, bm25_results])
    return combined

2. 응답 생성 최적화

A. 스트리밍 응답

현재: 전체 응답 생성 후 반환 (느림)

개선:

def generate_response_stream(user_message):
    """실시간 스트리밍 응답"""
    for chunk in openai.chat.completions.create(
        model="gpt-4o-mini",
        messages=[...],
        stream=True  # ← 스트리밍 활성화
    ):
        if chunk.choices[0].delta.content:
            yield chunk.choices[0].delta.content

# Flask에서
@app.route('/api/chat/stream')
def chat_stream():
    def generate():
        for text in generate_response_stream(message):
            yield f"data: {json.dumps({'text': text})}\n\n"
    return Response(generate(), mimetype='text/event-stream')

B. 프롬프트 최적화

현재:

당신은 서강대 선배입니다.
질문에 답변하세요.

개선 (Few-Shot 예시 추가):

당신은 서강대 선배입니다.

[좋은 답변 예시]
질문: 학식 어디가 맛있어?
답변: 학식은 곤자가 2층이 제일 맛있어. 특히 수요일 돈까스는 줄 서서 먹을 가치가 있지.
      가격도 5,000원으로 저렴하고, 양도 푸짐해서 인기가 많아. 점심시간(12-1시)에는
      사람이 많으니 11시 30분에 가는 걸 추천해!

이제 질문에 답변하세요:

C. 캐싱

동일한 질문 반복 시 캐싱:

from functools import lru_cache

@lru_cache(maxsize=100)
def cached_search(query_hash):
    """자주 묻는 질문은 캐싱"""
    return vector_db.search(query)

# 사용
query_hash = hash(user_message.lower().strip())
results = cached_search(query_hash)

3. 데이터 품질 향상

A. 청킹 전략 개선

현재: 고정 크기 (400자)

개선 (의미 단위 분할):

from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50,
    separators=["\n\n", "\n", ". ", " ", ""],  # 우선순위
    length_function=len
)

B. 메타데이터 추가

# 더 풍부한 메타데이터
collection.add(
    documents=[text],
    embeddings=[embedding],
    metadatas=[{
        "type": "qa",
        "source": "학사공지",
        "date": "2025-10-01",
        "category": "학사일정",
        "importance": "high",
        "keywords": ["수강신청", "일정"]  # 키워드 태깅
    }]
)

# 필터링 검색
results = collection.query(
    query_embeddings=[embedding],
    n_results=5,
    where={"category": "학사일정"}  # 필터
)

4. 멀티모달 지원

A. 이미지 검색 추가

from PIL import Image
import clip  # OpenAI CLIP 모델

def search_similar_image(query_text):
    """텍스트로 이미지 검색"""
    # 텍스트 → 이미지 embedding
    text_embedding = clip.encode_text(query_text)

    # 이미지 DB에서 검색
    results = image_db.query(text_embedding)
    return results

B. 음성 지원

from openai import OpenAI

# 음성 → 텍스트
def speech_to_text(audio_file):
    transcript = openai.audio.transcriptions.create(
        model="whisper-1",
        file=audio_file
    )
    return transcript.text

# 텍스트 → 음성
def text_to_speech(text):
    response = openai.audio.speech.create(
        model="tts-1",
        voice="alloy",
        input=text
    )
    return response.content

💎 완성도 향상 전략

1. 평가 시스템 구축

A. 자동 평가

def evaluate_response(question, answer, ground_truth):
    """LLM으로 답변 품질 평가"""
    eval_prompt = f"""
    질문: {question}
    답변: {answer}
    정답: {ground_truth}

    답변을 1-5점으로 평가하고 이유를 설명하세요.
    """
    score = llm.generate(eval_prompt)
    return score

B. 사용자 피드백

# 피드백 수집
@app.route('/api/feedback', methods=['POST'])
def collect_feedback():
    data = request.json
    # {message_id, rating (1-5), comment}
    save_feedback(data)

    # 낮은 평가 → 자동으로 데이터 추가
    if data['rating'] <= 2:
        add_to_training_data(data)

2. 안전성 강화

A. 콘텐츠 필터링

from openai import OpenAI

def moderate_content(text):
    """유해 콘텐츠 감지"""
    response = openai.moderations.create(input=text)
    if response.results[0].flagged:
        return None, "부적절한 내용이 감지되었습니다."
    return text, None

B. PII (개인정보) 보호

import re

def redact_pii(text):
    """개인정보 마스킹"""
    # 전화번호
    text = re.sub(r'\d{3}-\d{4}-\d{4}', '[전화번호]', text)
    # 이메일
    text = re.sub(r'\S+@\S+\.\S+', '[이메일]', text)
    # 주민등록번호
    text = re.sub(r'\d{6}-\d{7}', '[주민번호]', text)
    return text

3. 성능 모니터링

import time
from functools import wraps

def monitor_performance(func):
    """응답 시간 모니터링"""
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        elapsed = time.time() - start

        # 로깅 또는 메트릭 전송
        log_metric('response_time', elapsed)

        if elapsed > 3.0:
            alert('Slow response detected', elapsed)

        return result
    return wrapper

4. A/B 테스팅

def ab_test_strategy(user_id):
    """다양한 RAG 전략 테스트"""
    strategy = hash(user_id) % 3

    if strategy == 0:
        # 기본 RAG
        return basic_rag
    elif strategy == 1:
        # HyDE 전략
        return hyde_rag
    else:
        # 하이브리드 검색
        return hybrid_rag

🌟 2025년 최신 트렌드

1. Agentic RAG

개념: LLM이 스스로 도구를 선택하고 실행

from langchain.agents import create_react_agent

tools = [
    VectorSearchTool(),
    WebSearchTool(),
    CalculatorTool(),
    WikipediaTool()
]

agent = create_react_agent(
    llm=ChatOpenAI(model="gpt-4o"),
    tools=tools,
    prompt=agent_prompt
)

# LLM이 필요에 따라 도구 선택
result = agent.run("2024년 노벨물리학상 수상자는?")

2. Graph RAG

개념: 지식을 그래프 구조로 저장

from neo4j import GraphDatabase

# 지식 그래프 구축
CREATE (학식:Entity {name: "학식"})
CREATE (곤자가:Entity {name: "곤자가"})
CREATE (학식)-[:LOCATED_AT]->(곤자가)
CREATE (학식)-[:HAS_MENU {price: 5000}]->(돈까스)

# 그래프 기반 검색
def graph_rag(query):
    # 1. 엔티티 추출
    entities = extract_entities(query)

    # 2. 그래프 탐색
    subgraph = neo4j.query(f"MATCH path=({entities[0]})-[*1..3]-()")

    # 3. 서브그래프를 컨텍스트로 제공
    return generate_with_graph_context(query, subgraph)

3. 멀티에이전트 시스템

# 전문화된 에이전트들
researcher_agent = Agent(role="정보 수집", tools=[search])
writer_agent = Agent(role="답변 작성", tools=[llm])
critic_agent = Agent(role="품질 검증", tools=[evaluator])

def multi_agent_response(query):
    # 1. 정보 수집
    info = researcher_agent.run(query)

    # 2. 답변 작성
    draft = writer_agent.run(info)

    # 3. 검증 및 개선
    final = critic_agent.review_and_improve(draft)

    return final

4. 지속적 학습 (Continual Learning)

def continual_learning():
    """사용자 피드백으로 지속 개선"""

    # 1. 피드백 수집
    feedbacks = get_new_feedbacks()

    # 2. 파인튜닝 데이터셋 구축
    training_data = []
    for fb in feedbacks:
        if fb.rating >= 4:  # 좋은 답변
            training_data.append({
                "question": fb.question,
                "answer": fb.answer
            })

    # 3. Embedding 재학습 또는 프롬프트 개선
    update_system_prompt(training_data)

    # 4. 새로운 데이터 추가
    add_to_vector_db(training_data)

📊 성능 벤치마크

목표 지표 (프로덕션)

메트릭 목표 측정 방법
응답 시간 < 2초 평균
정확도 > 85% 사용자 평가
만족도 > 4.0/5.0 피드백
가용성 > 99% Uptime
비용 < $0.05/대화 API 비용

측정 도구

import prometheus_client as prom

# 메트릭 정의
response_time = prom.Histogram('response_time_seconds', 'Response time')
accuracy_score = prom.Gauge('accuracy_score', 'Answer accuracy')

# 측정
with response_time.time():
    answer = generate_response(query)

accuracy_score.set(evaluate_accuracy(answer))

🎯 프로젝트 완성 체크리스트

기본 (필수)

  • RAG 시스템 동작
  • 5개 이상 Q&A 데이터
  • 기본 UI 완성
  • Vercel 배포

중급 (권장)

  • 20개 이상 Q&A 데이터
  • 리랭킹 구현
  • 스트리밍 응답
  • 에러 처리
  • 사용자 피드백 수집

고급 (차별화)

  • 하이브리드 검색
  • 멀티모달 (이미지)
  • A/B 테스팅
  • 성능 모니터링
  • 지속적 학습

📖 더 읽어볼 자료

최신 블로그 포스트 (2025)

  1. "State of RAG 2025" - LangChain Blog

  2. "Production RAG at Scale" - Pinecone

  3. "Advanced RAG Techniques" - LlamaIndex