콘텐츠로 이동

LLM을 이용한 질문 답변

질문 답변(QA) 시스템은 사용자의 질문에 자동으로 정확한 답변을 제공합니다. 고객 지원, 교육, 기술 문서 검색 등 다양한 분야에서 활용됩니다.

핵심 개념

1. 질문 답변의 유형

Closed-Domain QA (폐쇄형 QA)

특정 데이터셋이나 문서 범위 내에서만 답변을 검색합니다.

특징: - 정보 범위가 제한적 (회사 정책, 제품 설명서 등) - 정확도가 높음 - RAG (Retrieval-Augmented Generation)와 함께 사용

활용 예: 기업 KB, 제품 매뉴얼, 회의록

Open-Domain QA (개방형 QA)

인터넷이나 LLM의 학습 데이터를 기반으로 광범위한 주제에 답변합니다.

특징: - 어떤 주제도 답변 가능 - 정확도 검증 어려움 - "hallucination" 위험

활용 예: 일반 상식, 역사, 과학 지식

Reading Comprehension QA

주어진 지문을 읽고 그 안에서 답을 찾습니다.

특징: - 지문 내에서만 답변 - 매우 높은 정확도 - 학생 평가, 시험

2. QA 시스템의 구조

질문 입력
질문 이해 & 분류
검색 (Retrieval)
이해 (Comprehension)
답변 생성
답변 출력

3. 좋은 답변의 조건

  • 정확성: 사실에 기반한 정보
  • 완전성: 질문의 모든 측면 다룸
  • 명확성: 쉽고 이해하기 쉬운 표현
  • 간결성: 불필요한 정보 제외
  • 출처 제시: 어디서 나온 정보인지 명시

실무 활용 예제

예제 1: 폐쇄형 QA - 회사 정책 문답

상황

신입 사원이 회사 정책에 대해 자주 묻는 질문들을 자동으로 답변해야 합니다.

프롬프트

당신은 회사 HR 담당자입니다.

다음 회사 정책에 따라 사원의 질문에 정확하게 답변해주세요.

【회사 정책】
휴가 정책:
- 연차: 신입 15일 (1년 후 20일로 증가)
- 병가: 월 2일 (진단서 필요)
- 경조사휴가: 범위에 따라 3-7일
- 휴가 신청: 최소 1주일 전 신청 필수

복리후생:
- 건강보험: 회사가 50% 부담
- 퇴직금: 월급의 8.33% 적립
- 교육비: 연 300만원 한도

질문: "제 아버지가 수술을 받으신데 경조사휴가를 받을 수 있나요?"

답변 형식:
- 답변: [정책에 따른 답변]
- 신청 방법: [구체적인 절차]
- 필요 서류: [첨부해야 할 서류]
- 추가 정보: [도움이 될 만한 정보]

예상 응답

답변:
네, 가족 수술의 경우 경조사휴가를 받을 수 있습니다.
부모님의 질병/수술은 3일의 경조사휴가 대상입니다.

신청 방법:
1. HR시스템에 로그인
2. "휴가 신청" → "경조사휴가"
3. 사유 설명 및 서류 첨부
4. 팀장 승인
5. HR 최종 승인

필요 서류:
- 진단서 또는 입원/수술 증명서
- 관계증명서 (가족관계증명서)

추가 정보:
- 휴가 기간 동안 급여는 정상 지급됩니다
- 수술 후 간병 필요 시 간병휴가 별도 신청 가능
- 담당자: HR팀 이순신 (내선 2345)

예제 2: 개방형 QA - 교육용 Q&A

프롬프트

당신은 고등학교 세계사 선생님입니다.

학생의 질문에 정확하고 교육적으로 답변해주세요.

질문: "제2차 세계대전이 왜 일어났나요?"

답변 요구사항:
1. 핵심 원인 3-4개 (명확하게)
2. 시간 순서대로 설명
3. 고등학생 수준의 쉬운 언어
4. 구체적인 예시 포함
5. 마지막에 핵심 정리

답변을 작성해주세요.

예상 응답

제2차 세계대전의 원인은 여러 가지가 복합적으로 작용했습니다.

【핵심 원인】

1. 베르사유 조약의 불공정함 (1919년)
   - 독일이 전쟁 책임을 모두 뒤짚어썼습니다
   - 과도한 배상금 (1,320억 마르크)을 지불해야 했어요
   - 영토의 13%를 잃었습니다
   - 독일 국민들의 깊은 불만과 복수심이 생겼어요

2. 대공황의 경제 위기 (1929년)
   - 미국 주식시장 붕괴로 세계 경제가 어려워졌어요
   - 독일의 실업률이 40%까지 올라갔습니다
   - 사람들은 강한 지도자를 원하게 되었어요

3. 히틀러와 나치의 등장 (1933년)
   - 히틀러는 "독일의 영광을 되찾자"고 약속했어요
   - 유대인을 포함한 다른 민족을 핍박했습니다
   - 독일 재무장을 추진하면서 침략 준비를 했어요

4. 군국주의 국가들의 팽창 (1930년대)
   - 독일: 라인란드 재진주 (1936), 오스트리아 병합 (1938)
   - 이탈리아: 에티오피아 침략 (1935)
   - 일본: 중국 침략 (1937)
   - 영국과 프랑스는 이를 막지 못했어요

【시간 순서】
1919년 (조약) → 1929년 (대공황) → 1933년 (히틀러 집권) →
1939년 (전쟁 시작)

【핵심 정리】
경제 위기 + 정치적 불만족 + 강한 독재자 + 국제사회의 약함
= 제2차 세계대전의 발발

이것을 역사적 교훈으로 삼으면, 경제와 정치의 안정,
국제협력의 중요성을 알 수 있습니다.

예제 3: Reading Comprehension QA

프롬프트

다음 지문을 읽고 질문에 답변해주세요.

지문은 오직 제시된 내용 범위 내에서만 답변하세요.
지문에 없는 정보는 "지문에 언급되지 않았습니다"라고 답하세요.

【지문】
"한국의 전자상거래 시장은 2020년 이후 급속도로 성장하고 있습니다.
2023년 기준 온라인 쇼핑 거래액은 236조 원에 달했으며, 이는
전년도 대비 12% 증가한 수치입니다. 특히 모바일 쇼핑의 비중이
72%를 차지하면서 PC 쇼핑 (28%)을 크게 앞질렀습니다.
소비자들은 평균적으로 월 5-6회 온라인 쇼핑을 이용하며,
주로 패션(28%), 생활용품(22%), 전자기기(18%)를 구매합니다."

【질문】
1. 2023년 한국 온라인 쇼핑 거래액은 얼마인가요?
2. 모바일 쇼핑의 비중은?
3. 가장 많이 구매하는 상품 카테고리는?
4. 소비자들은 배송비를 얼마나 지불하나요?

【답변】
1. 236조 원

2. 72%

3. 패션 (28%)

4. 지문에 언급되지 않았습니다.

예제 4: 기술 문서 Q&A

프롬프트

당신은 API 기술 지원 담당자입니다.

다음 API 문서를 바탕으로 개발자의 질문에 답변해주세요.

【API 문서: 사용자 인증 API】

엔드포인트: POST /api/v1/auth/login
요청:
{
  "email": "user@example.com",
  "password": "password123"
}

응답 (성공 200):
{
  "token": "eyJhbGc...",
  "expires_in": 3600,
  "user_id": "123"
}

오류 응답:
- 401: 인증 실패 (이메일 또는 비밀번호 오류)
- 429: 너무 많은 요청 (1분에 5회 제한)
- 500: 서버 오류

【개발자 질문】
"로그인 API를 호출했는데 429 오류가 계속 나옵니다.
어떻게 해야 하나요?"

답변 형식:
- 문제: [문제 진단]
- 해결책: [구체적인 해결 방법]
- 코드 예시: [개선된 코드]

예상 응답

문제:
429 오류는 Rate Limiting 초과로, 1분 동안 5회 이상
API를 호출했을 때 발생합니다. 로그인을 여러 번 시도한 것
같습니다.

해결책:
1. 로그인 시도 횟수 제한 구현
2. 실패 후 지수 백오프 (exponential backoff) 적용
3. 로컬 캐시에 토큰 저장하여 불필요한 재로그인 방지

코드 예시:
```python
import time

def login_with_retry(email, password, max_retries=3):
    for attempt in range(max_retries):
        try:
            response = requests.post(
                'https://api.example.com/api/v1/auth/login',
                json={"email": email, "password": password}
            )

            if response.status_code == 200:
                return response.json()['token']
            elif response.status_code == 429:
                # 지수 백오프: 2^attempt 초 대기
                wait_time = 2 ** attempt
                print(f"{wait_time}초 대기...")
                time.sleep(wait_time)
            else:
                raise Exception(f"인증 실패: {response.status_code}")

        except Exception as e:
            print(f"시도 {attempt+1} 실패: {e}")

    raise Exception("로그인 실패")

추가 팁: - 로그인 성공 후 "expires_in"(3600초)까지 토큰 재사용 - 로컬 저장소에 토큰 저장하여 불필요한 로그인 방지

### 예제 5: 과학 문제 해결 Q&A

#### 프롬프트
당신은 물리학 과외 선생님입니다.

학생이 물리 문제를 풀 수 없어하고 있습니다. 단계별로 풀이 과정을 설명해주세요.

문제: "질량 2kg인 물체가 10m/s의 속도로 움직이다가 5초 동안 일정한 힘을 받아 20m/s로 가속됩니다. 이때 작용한 힘의 크기를 구하시오."

풀이 요구사항: 1. 주어진 정보 정리 2. 사용할 공식 설명 3. 단계별 계산 4. 답변 5. 실생활 예시

풀이를 작성해주세요.

#### 예상 응답
【문제 해결 과정】

1️⃣ 주어진 정보 정리 - 질량 (m) = 2 kg - 초기 속도 (v₀) = 10 m/s - 최종 속도 (v) = 20 m/s - 시간 (t) = 5 초 - 구하는 것: 힘 (F) = ?

2️⃣ 사용할 공식 먼저 가속도를 구해야 합니다. 공식: 가속도 (a) = (v - v₀) / t

뉴턴의 제2법칙: F = m × a

3️⃣ 단계별 계산

Step 1: 가속도 계산 a = (20 - 10) / 5 a = 10 / 5 a = 2 m/s²

Step 2: 힘 계산 F = m × a F = 2 × 2 F = 4 N (뉴턴)

4️⃣ 답변 작용한 힘의 크기는 4 뉴턴 (N)입니다.

5️⃣ 실생활 예시 스포츠카가 0-100km/h를 5초에 가속할 때, 엔진이 바퀴를 통해 도로에 작용하는 힘이 바로 이런 식으로 계산됩니다! ```

💡 실전 팁

정확한 QA 시스템 구축

  1. 폐쇄형 QA: 신뢰할 수 있는 문서 DB 구축이 필수
  2. 정기적인 문서 업데이트
  3. 문서 버전 관리
  4. "정보 제공 날짜" 명시

  5. 개방형 QA: 출처 제시와 불확실성 표현

  6. "입니다/인 것 같습니다" 구분
  7. 여러 관점 제시
  8. "최신 정보는 확인이 필요합니다" 주의 문구

  9. RAG 활용: 문서 기반 정보로 hallucination 감소

  10. 먼저 문서 검색 후 답변
  11. 출처 자동 표시

  12. 다국어 QA: 답변 전에 질문 언어 감지

  13. 질문과 동일 언어로 답변
  14. 용어 일관성 유지

  15. 평가 지표: 정확도, 불확실도, 응답성 모니터링

hallucination 방지

``` 잘못된 프롬프트: "Claude 4.6이 출시된 정확한 날짜는?"

올바른 프롬프트: "Claude 4.6에 대해 당신이 알고 있는 정보를 불확실성과 함께 설명해주세요. 정확하지 않을 수 있는 정보는 'I'm not sure' 라고 표시해주세요." ```

성능 비교

모델 정확도 속도 가격 추천
Claude 4.6 Sonnet 높음 빠름 일반 QA, 한글
GPT-5.4 매우 높음 빠름 복잡한 추론
Gemini 2.5 Pro 높음 매우 빠름 대량 처리

📝 핵심 정리

항목 내용
핵심 기능 폐쇄형/개방형 QA, Reading Comprehension
장점 정확한 답변, 사용자 경험 향상, 지원비용 감소
주의사항 hallucination 방지, 출처 제시, 주기적 검증
프롬프트 팁 문맥 제공, 범위 제한, 형식 지정
최적화 방법 RAG, Fine-tuning, Ensemble
활용 분야 고객 지원, 교육, 기술 문서, 법률 자문