RAG 서비스 구현
RAG 서비스 구현
섹션 제목: “RAG 서비스 구현”1. 개요
섹션 제목: “1. 개요”1.1 목적
섹션 제목: “1.1 목적”- Elasticsearch 메타데이터를 활용한 RAG(Retrieval-Augmented Generation) 컨텍스트 생성
- OpenAI 키워드 확장 품질 향상
- 도메인 특화 키워드 추천
1.2 구현 파일
섹션 제목: “1.2 구현 파일”| 파일 | 설명 |
|---|---|
app/services/rag_service.py | RAG 서비스 메인 클래스 |
app/data/context/service_categories.json | 서비스 카테고리 메타데이터 |
app/data/context/field_mappings.json | ES 필드 매핑 정보 |
2. 아키텍처
섹션 제목: “2. 아키텍처”2.1 RAG 컨텍스트 구성
섹션 제목: “2.1 RAG 컨텍스트 구성”┌─────────────────────────────────────────────────────────────┐│ RAG Context │├─────────────────────────────────────────────────────────────┤│ 1. 서비스 카테고리 정보 ││ - 지도로 본 서울 (196건) ││ - 통계로 본 서울 (73건) ││ - ... │├─────────────────────────────────────────────────────────────┤│ 2. 감지된 데이터 카테고리 ││ - 인구/가구: 인구, 출산, 고령화... ││ - 경제/산업: 일자리, 소득, 물가... │├─────────────────────────────────────────────────────────────┤│ 3. 지역 정보 (감지 시) ││ - 강남구, 송파구 등 25개 자치구 │├─────────────────────────────────────────────────────────────┤│ 4. 시간 컨텍스트 ││ - 최근/현재, 역사적 변화, 비교/증감 │├─────────────────────────────────────────────────────────────┤│ 5. ES 샘플 데이터 (선택적) ││ - 관련 콘텐츠 제목, 서비스명, 연도 │└─────────────────────────────────────────────────────────────┘2.2 확장 RAG 흐름
섹션 제목: “2.2 확장 RAG 흐름”검색어 입력 │ ▼┌───────────────────┐│ 카테고리 감지 │ → 인구/경제/환경/교통...├───────────────────┤│ 지역 감지 │ → 강남구, 송파구...├───────────────────┤│ 시간 컨텍스트 감지 │ → 최근/역사/추세└───────────────────┘ │ ▼┌───────────────────┐│ ES 샘플 조회 │ → 관련 콘텐츠 5건└───────────────────┘ │ ▼┌───────────────────┐│ 컨텍스트 조합 │ → 전체 RAG 컨텍스트 생성└───────────────────┘ │ ▼┌───────────────────┐│ OpenAI 호출 │ → 컨텍스트 포함 키워드 확장└───────────────────┘ │ ▼확장 키워드 반환3. 컨텍스트 데이터
섹션 제목: “3. 컨텍스트 데이터”3.1 서비스 카테고리 (service_categories.json)
섹션 제목: “3.1 서비스 카테고리 (service_categories.json)”{ "service_categories": { "지도로 본 서울": { "count": 196, "description": "서울의 공간 데이터를 지도로 시각화한 콘텐츠", "keywords": ["지도", "공간", "분포", "위치", "지역"] }, ... }, "data_categories": { "인구/가구": { "keywords": ["인구", "가구", "세대", "출산", ...], "related_fields": ["field_category_data:인구"] }, ... }, "seoul_districts": ["종로구", "중구", "용산구", ...], "time_keywords": { "recent": ["최근", "현재", "올해", ...], "historical": ["과거", "역사", "변천", ...], "comparison": ["비교", "증가", "감소", ...] }}3.2 필드 매핑 (field_mappings.json)
섹션 제목: “3.2 필드 매핑 (field_mappings.json)”{ "elasticsearch_index_datasi_new_si": { "description": "데이터로 본 서울 인덱스", "total_documents": 519, "fields": { "title": {"type": "text", "searchable": true}, "body": {"type": "text", "searchable": true}, "service_title": {"type": "keyword", "searchable": true} } }}4. 주요 기능
섹션 제목: “4. 주요 기능”4.1 기본 RAG 키워드 확장
섹션 제목: “4.1 기본 RAG 키워드 확장”from app.services import get_rag_service
rag = get_rag_service()result = await rag.expand_keywords_with_rag( query="인구", max_keywords=5)출력:
{ "original_query": "인구", "expanded_keywords": ["인구변화", "출생률", "고령화율", "인구밀도", "세대수"], "source": "openai_rag", "context_used": true, "detected_categories": ["인구/가구"], "detected_district": null, "usage": {...}}4.2 확장 RAG (ES 샘플 포함)
섹션 제목: “4.2 확장 RAG (ES 샘플 포함)”result = await rag.expand_keywords_with_samples( query="강남구 아파트", max_keywords=5)출력:
{ "original_query": "강남구 아파트", "expanded_keywords": ["강남구 부동산", "아파트 가격", "주택 시세", "재건축", "분양"], "source": "openai_rag_extended", "context_used": true, "sample_count": 5, "detected_categories": ["주거/부동산"], "usage": {...}}4.3 컨텍스트 미리보기
섹션 제목: “4.3 컨텍스트 미리보기”context = rag.build_context("인구 고령화")print(context)출력:
## 서울연구데이터서비스 콘텐츠 유형- 지도로 본 서울 (196건): 서울의 공간 데이터를 지도로 시각화한 콘텐츠...- 통계로 본 서울 (73건): 서울시 각종 통계 데이터 분석......
## 검색어 관련 카테고리: 인구/가구- 인구/가구 관련 키워드: 인구, 가구, 세대, 출산, 사망, 고령화...
## 키워드 확장 가이드- 서울 통계 데이터에 특화된 키워드를 추천하세요...5. Provider 비교
섹션 제목: “5. Provider 비교”| Provider | 컨텍스트 | ES 샘플 | 특징 |
|---|---|---|---|
ollama | X | X | 기본 키워드 확장 |
openai | X | X | 빠른 응답, 일반적 품질 |
openai_rag | O | X | 도메인 특화 키워드 |
openai_rag_extended | O | O | 최고 품질, 실제 데이터 반영 |
6. 카테고리 감지
섹션 제목: “6. 카테고리 감지”6.1 데이터 카테고리
섹션 제목: “6.1 데이터 카테고리”| 카테고리 | 감지 키워드 예시 |
|---|---|
| 인구/가구 | 인구, 출산, 고령화, 1인가구 |
| 경제/산업 | 경제, 일자리, 소득, 물가 |
| 주거/부동산 | 주택, 아파트, 전세, 재개발 |
| 환경/에너지 | 환경, 미세먼지, 녹지, 에너지 |
| 교통 | 지하철, 버스, 교통사고, 주차 |
| 문화/관광 | 문화, 관광, 축제, 도서관 |
| 복지/보건 | 복지, 의료, 건강, 노인 |
| 안전 | 안전, 범죄, 화재, 재난 |
| 교육 | 교육, 학교, 학생, 대학 |
6.2 지역 감지
섹션 제목: “6.2 지역 감지”서울시 25개 자치구 자동 감지:
- 종로구, 중구, 용산구, 성동구, 광진구…
6.3 시간 컨텍스트
섹션 제목: “6.3 시간 컨텍스트”| 유형 | 감지 키워드 |
|---|---|
| recent | 최근, 현재, 올해, 2024, 최신 |
| historical | 과거, 역사, 변천, 추이, 변화 |
| comparison | 비교, 증가, 감소, 변동, 추세 |
7. 성능 고려사항
섹션 제목: “7. 성능 고려사항”7.1 ES 샘플 조회
섹션 제목: “7.1 ES 샘플 조회”- 타임아웃: 10초
- 최대 샘플: 5건
- 실패 시 graceful degradation (샘플 없이 진행)
7.2 컨텍스트 크기
섹션 제목: “7.2 컨텍스트 크기”- 평균 컨텍스트 크기: ~1,500자
- 샘플 포함 시: ~2,000자
- 토큰 증가량: ~500 tokens
8. 관련 문서
섹션 제목: “8. 관련 문서”- 02_OpenAI_클라이언트.md - OpenAI 클라이언트 상세
- 05_API_엔드포인트.md - API 명세
- 06_벤치마크_테스트.md - RAG 효과 측정