■ 소개
목표: 419 (4업으로 1달러 벌기 시작해서 9달러까지 벌어보기)
https://www.gpters.org/dev/post/260202-improving-quality-answers-727Wn4suGCuE9XK
엊그제 이 글을 쓰고, 로즈님께 댓글로 RAG에 대해 (처음) 들었습니다.
RAG는 Retrieval-Augmented Generation의 줄인 말인데
AI 모델이 제공된 정보를 검색으로 찾아서, 그 내용이 보강된 답변을 만들어내는 방식이라고 합니다.
.
.
어차피 저같은 바이브 코더에게 이론적 배경은 중요하지 않죠.
무턱대고 적용해봅니다.
(물론 겁나니까 GIT 커밋 푸쉬 한번 하구요 ㅎㅎ)
.
컨택스트도 엄청 잡아먹고, 플랜 한도도 바닥나버렸지만,
그 결과물이 정말 대박!!!!!!!!!이었습니다.
.
■ 진행 및 결과
1.커서로 plan하기
오늘도 PLAN으로 시작합니다.
.
실행계획을 짜줬는데,
혹시 앱이 너무 무거워질까 싶어서 뭔저 커서의 ASK기능으로 추가 질문을 합니다.
.
.
눈치를 보니 뭔가 사람 말하듯이 말안하고,
논문 쓰듯이 답변할 것 같아서 불안합니다.
.
그래서 출처를 사람말하듯이 제공하라고 했습니다.
.
.
최종적으로 완성된 MD파일입니다.
(업데이트) 필요할 때만 인용 + 사람 말투 출처로 RAG 답변 질 제고
목표(정확도·근거 + 로딩 체감)
전문성/신뢰: 핵심 주장(Claim)이 근거(Chunk)로 뒷받침되고, 사용자가 이해하기 쉬운 사람 말투 출처로 설명됨.
로딩 체감: 기본은 빠르게 답하고, 리스크/팩트 질문에만 retrieval·인용을 수행(2-path).
안전한 유보: 근거가 부족하거나 민감 주제면 단정 대신 추가 질문/유보/공식 출처 안내.
권장 KPI(초기 가이드):
TTFB(첫 토큰): p95 1초 내(스트리밍 기준)
p95 완성(짧은 답): 3–6초 내(grounded path는 더 길 수 있음)
인용 모드 비율: 토픽/정책에 따라 관리(불필요한 retrieval 최소화)
아키텍처 개요(2-path 라우팅)
flowchart LR
userQuery[UserQuery] --> router[AnswerRouter]
router -->|fast_path| fastGen[FastGenerator]
fastGen --> fastAnswer[Answer]
router -->|grounded_path| retriever[HybridRetriever]
retriever --> reranker[Reranker_Conditional]
reranker --> packer[ContextPacker]
packer --> citeGen[NarrativeCiteGenerator]
citeGen --> verifier[ClaimVerifier]
verifier --> groundedAnswer[AnswerWithSources]
groundedAnswer --> ux[UX_Render]
fastAnswer --> ux
ux -->|on_demand| evidence[EvidenceDrawer]
evidence --> sourceView[QuotesAndLinks]
AnswerRouter(핵심 변경): 질의 유형/리스크/사용자 요구에 따라 fast vs grounded 분기.
FastGenerator: 짧은 답, 스트리밍 중심. ‘근거 보기’ CTA만 제공 가능.
Grounded pipeline: Hybrid retrieval + (필요 시) rerank + 내러티브 출처 생성 + Claim 검증.
EvidenceDrawer(온디맨드): 상세 발췌/원문 링크는 사용자 액션 시 로드(대화 흐름/로딩 최적화).
“필요할 때만 인용” 정책(AnswerRouter 룰)
1) grounded_path 트리거(권장)
팩트/수치/날짜/정책: “얼마/언제/가능/규정/근거/링크”
건강·안전·법/재무 등 고위험
사용자가 출처를 직접 요구
모호/불확실: 답을 내기 전 조건 질문이 필요한 케이스
2) fast_path 기본
일반 조언/정서적 공감/간단한 정리/앱 사용법 등
단, fast 답변에도 “필요하면 근거를 열람할 수 있다”는 근거 보기를 제공
출처(지식원) 전략: 검증 웹자료 + UGC
Tier A: 정부/공공기관/학회/대형 의료기관/공식 가이드
Tier B: 전문 매체/검증된 기관 블로그
Tier C(UGC): 경험담(사실 근거로 단정 금지)
운영 원칙:
의료/안전/정책/수치 관련 Claim은 Tier A/B 우선.
UGC는 반드시 “경험 공유”로 라벨링하고, 사실 주장 근거로 쓰지 않음.
‘사람 말투 출처’(내러티브 인용) UX
1) 기본 추천: 혼합(hybrid)
인라인(최대 1–2회): 중요한/민감/팩트 항목에만 1줄로 자연스럽게
예: “OO기관 안내에서 이렇게 설명해요.”
하단 출처 요약(1–3줄): 나머지 출처를 대화체로 묶어 제시
예: “참고로 위 내용은 보건복지부/OO병원 자료를 바탕으로 정리했어요.”
상세 근거는 온디맨드: ‘근거 보기’에서 발췌/원문 링크/문장 위치 제공
2) 내부 추적(중요)
겉은 내러티브지만, 내부적으로는 chunk-id/url/문장 위치 포인터를 유지해
ClaimVerifier
인용 정확도 평가
클릭/추적/캐시
를 가능하게 함.
검색/재랭킹/컨텍스트 구성(로딩 최적화 포함)
Hybrid retrieval 기본: BM25 + dense 후보 union
rerank는 조건부: (a) 검색 결과가 애매하거나 (b) 고위험/팩트 질문일 때만
top-k 최소화: 답변에 필요한 범위로만(컨텍스트 길이=LLM 지연의 핵심 요인)
ContextPacker: 중복 제거 + Tier 우선순위 + lost-in-the-middle 완화
생성 + 검증
NarrativeCiteGenerator: Claim마다 ‘사람 말투 출처’로 매핑(필요한 Claim에만)
ClaimVerifier: 근거 없는 Claim은 삭제/완화/유보 + 추가 질문 생성
평가/모니터링(인용이 “가끔”인 환경)
라우팅 지표: grounded_path 비율, 트리거별 성공/실패
Retrieval: precision@k, recall@k, nDCG@k(가능하면)
Groundedness: faithfulness, answer relevancy, context precision/recall
출처 품질: 내러티브 출처가 실제로 해당 Claim을 지지하는지(Claim→Evidence 매칭)
로딩 지표: TTFB, p95 응답시간, 스트리밍 시작까지
참고자료(근거)
RAG 모듈별 베스트 프랙티스 실험: Searching for Best Practices in Retrieval-Augmented Generation
RAG 평가 실무 가이드: Evidently AI: RAG evaluation guide
2단 검색+재랭킹 개념: OpenAI Cookbook: Search reranking with cross-encoders
인용/근거 기반 생성(내러티브/인라인/quote 등) 지형: Attribution, Citation, and Quotation survey
.
2.firebase remote config에 넣기
매개변수 추가를 눌러서 커서가 알려준 값을 넣어줍니다.
.
추가적으로,
답변 소스가 될 웹사이트들을 본인이 알아봐준다고 합니다. ㅎㅎ
.
커서는 정말 좋은 직원입니다.
.
.
한국어로 된 소스를 더 모아준다네요.
하지말라고 할 이유가 없죠.
.
이 과정에서 플랜이 엥꼬나버렷습니다 ㅎㅎ
.
다행히 JSON은 다 완성되었으니
REMOTE CONFIG에 넣고,
AUTO 모드로 바꿔서 GIT커밋과 APK 릴리스를 합니다.
.
3.결과물 확인하기
아 이제 진짜 소름돋게 대답을 잘해줍니다.
Rose 님 RAG 정말 대박입니다.
.
뭔가 소스가 다양해졌고, 대답하는 패턴이 틀에 박힌게 싹 사라졌습니다.
API 값이 얼마나 더 나올지가 함정일 수 있지만,
우선 매우 만족스럽습니다!!!
.
■ 느낀점 및 향후 계획
지피터스는 용어 배우는 맛에 다니고,
용어를 커서에 던지면,
정말 많은 변화가 있는 것 같습니다.
.
우선 내일 APK 파일을 스터디 내에 공유할까 싶습니다.
.
반응과 피드백 반영해서 지피터스 전체에도 공유해보겠습니다.