🤖 AI/ML

질의응답

Question Answering

자연어 질문에 답변 생성. RAG, 검색 엔진 활용.

📖 상세 설명

질의응답(Question Answering, QA)은 자연어로 주어진 질문에 대해 적절한 답변을 자동으로 생성하거나 추출하는 NLP 태스크입니다. 단순 키워드 검색을 넘어 질문의 의도를 이해하고, 관련 정보에서 정확한 답을 찾아내는 것이 핵심입니다.

QA 시스템은 크게 두 가지 유형으로 발전해왔습니다. 추출형(Extractive) QA는 주어진 문서에서 답변을 직접 추출하며, SQuAD 데이터셋으로 BERT 기반 모델이 큰 발전을 이뤘습니다. 생성형(Generative) QA는 LLM이 답변을 새롭게 생성하며, 2023년 이후 ChatGPT, Claude 등이 이 방식의 상용화를 이끌었습니다. 2024-2025년에는 RAG(검색 증강 생성)가 두 방식을 결합한 주류 아키텍처로 자리잡았습니다.

현대 QA 시스템의 핵심 기술은 RAG입니다. 먼저 질문과 관련된 문서를 벡터 검색으로 찾고(Retrieval), 이를 컨텍스트로 LLM에 제공하여 답변을 생성(Generation)합니다. 이 방식은 LLM의 환각(Hallucination) 문제를 줄이고, 최신 정보나 기업 내부 데이터에 기반한 답변을 가능하게 합니다.

실무에서 QA 시스템은 고객 지원 챗봇, 기업 내부 지식 검색, 법률/의료 문서 분석, 교육 튜터링 등에 광범위하게 적용됩니다. 2025년 기준 대부분의 엔터프라이즈 AI 솔루션은 RAG 기반 QA를 핵심 기능으로 포함하며, Anthropic, OpenAI, Cohere 등이 RAG 최적화 API를 제공합니다. 성공적인 QA 시스템 구축의 핵심은 검색 품질, 프롬프트 엔지니어링, 그리고 평가 체계입니다.

💻 코드 예제

LangChain을 활용한 RAG 기반 QA 시스템 구현:

# RAG 기반 질의응답 시스템 (LangChain + OpenAI)
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
import os

# 1. 문서 로드 및 청킹
loader = TextLoader("company_docs.txt", encoding="utf-8")
documents = loader.load()

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,      # 청크 크기
    chunk_overlap=50,    # 청크 간 오버랩
    separators=["\n\n", "\n", ".", " "]
)
chunks = text_splitter.split_documents(documents)
print(f"총 {len(chunks)}개 청크 생성")

# 2. 벡터 저장소 생성
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=embeddings,
    persist_directory="./chroma_db"
)

# 3. Retriever 설정
retriever = vectorstore.as_retriever(
    search_type="mmr",  # Maximum Marginal Relevance
    search_kwargs={"k": 5, "fetch_k": 10}
)

# 4. 프롬프트 템플릿
qa_prompt = PromptTemplate(
    template="""다음 컨텍스트를 바탕으로 질문에 답변하세요.
컨텍스트에 답이 없으면 "해당 정보를 찾을 수 없습니다"라고 답하세요.

컨텍스트:
{context}

질문: {question}

답변:""",
    input_variables=["context", "question"]
)

# 5. QA 체인 생성
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=retriever,
    chain_type_kwargs={"prompt": qa_prompt},
    return_source_documents=True
)

# 6. 질문하기
def ask_question(question):
    result = qa_chain({"query": question})
    print(f"질문: {question}")
    print(f"답변: {result['result']}")
    print(f"\n참조 문서 ({len(result['source_documents'])}개):")
    for i, doc in enumerate(result['source_documents'][:3]):
        print(f"  [{i+1}] {doc.page_content[:100]}...")
    return result

# 사용 예시
ask_question("회사의 휴가 정책은 어떻게 되나요?")

Hugging Face Transformers 기반 추출형 QA:

# 추출형 QA (Extractive QA) - BERT 기반
from transformers import pipeline, AutoModelForQuestionAnswering, AutoTokenizer

# 한국어 QA 모델 로드
model_name = "monologg/koelectra-base-v3-finetuned-korquad"
qa_pipeline = pipeline(
    "question-answering",
    model=model_name,
    tokenizer=model_name
)

# 컨텍스트 (문서)
context = """
인공지능(AI)은 인간의 학습능력, 추론능력, 지각능력을 인공적으로 구현한
컴퓨터 프로그램 또는 시스템입니다. 머신러닝은 AI의 한 분야로, 데이터로부터
패턴을 학습하여 예측이나 결정을 수행합니다. 딥러닝은 머신러닝의 하위 분야로,
다층 신경망을 사용하여 더 복잡한 패턴을 학습합니다. 2012년 알렉스넷이
이미지넷 대회에서 우승하면서 딥러닝 혁명이 시작되었습니다.
"""

# 질문 목록
questions = [
    "AI란 무엇인가요?",
    "머신러닝은 어떤 분야인가요?",
    "딥러닝 혁명은 언제 시작되었나요?"
]

# 답변 추출
print("=== 추출형 QA 결과 ===\n")
for question in questions:
    result = qa_pipeline(question=question, context=context)
    print(f"Q: {question}")
    print(f"A: {result['answer']}")
    print(f"   신뢰도: {result['score']:.2%}")
    print(f"   위치: {result['start']}-{result['end']}\n")

📊 성능 & 비용

QA 시스템 아키텍처별 비교 (2025년 기준):

아키텍처 정확도 지연 시간 비용/1K 쿼리 적합 케이스
추출형 QA (BERT) 85-90% 50-100ms $0.01 정형화된 FAQ
RAG + GPT-4o-mini 88-93% 1-2s $0.15-0.30 일반 지식베이스
RAG + Claude 3.5 90-95% 2-3s $0.30-0.60 복잡한 추론 필요
RAG + GPT-4o 92-96% 3-5s $0.50-1.00 고품질 요구
Fine-tuned LLM 94-98% 0.5-1s $0.05-0.10 특정 도메인 특화

* 정확도는 도메인과 데이터 품질에 따라 크게 달라질 수 있음

🗣️ 실무에서 이렇게 말하세요

💬 회의에서
"고객 문의의 70%가 FAQ 범위 내입니다. RAG로 사내 문서 기반 QA 시스템을 구축하면, 상담원 업무 부하를 크게 줄일 수 있어요. 먼저 파일럿으로 상위 20개 질문 유형부터 자동화해보죠."
💬 면접에서
"RAG 시스템에서 Retrieval 품질이 전체 성능의 80%를 좌우합니다. 청킹 전략, 임베딩 모델 선택, 리랭킹 적용 여부가 핵심이고, 생성 단계에서는 프롬프트 엔지니어링과 Few-shot 예제가 중요합니다."
💬 기술 토론에서
"Hallucination 방지가 가장 큰 도전이에요. 컨텍스트에 없는 내용은 '모른다'고 답하도록 프롬프트를 설계하고, Citation을 강제로 출력하게 해서 검증 가능성을 높여야 합니다. Anthropic의 Constitutional AI 접근도 참고할 만해요."

⚠️ 흔한 실수 & 주의사항

청킹 전략 무시

문서를 무작정 큰 청크로 나누면 검색 정확도가 떨어지고, 너무 작게 나누면 맥락이 손실됩니다. 문서 유형에 맞는 청킹 전략(semantic chunking, recursive splitting)을 선택하세요.

평가 체계 없이 배포

QA 시스템의 정확도, 관련성, 완전성을 측정하는 평가 체계 없이 배포하면 품질 관리가 불가능합니다. Ground Truth 데이터셋과 자동 평가 파이프라인을 먼저 구축하세요.

올바른 접근법

RAGAS, TruLens 같은 RAG 평가 프레임워크를 도입하여 Context Relevance, Answer Faithfulness, Answer Relevance를 지속적으로 모니터링하세요. 사용자 피드백 루프도 필수입니다.

🔗 관련 용어

📚 더 배우기