--- status: closed closed_date: 2026-03-21 closed_reason: 260320 다형식문서 RAG 계획으로 흡수 또는 구현 완료 tags: [worklog, companyx, rag, code-review, docs] --- status: closed closed_date: 2026-03-21 closed_reason: 260320 다형식문서 RAG 계획으로 흡수 또는 구현 완료 # Company X Grounding 코드 검토 및 문서 현행화 **작성일**: 2026-03-17 **작업자**: Claude Code (코드 수정 없음, 문서 업데이트만) ## 관련 문서 - [Company X RAG 답변합성 시나리오·트러블 동시종결 계획](../plans/260315_companyx_rag_답변합성_시나리오동시종결_계획.md) - [Company X RAG 답변합성 시나리오·트러블 동시종결 리서치](../research/260315_companyx_rag_답변합성_시나리오동시종결_리서치.md) - [Company X 내부 문서 근거응답 사용자 시나리오](../scenarios/260312_companyx_내부문서_근거응답_사용자시나리오.md) - [Company X RAG 답변 합성 회귀](../troubleshooting/260312_companyx_rag_answer_composition_regression.md) ## 작업 목적 - 계획 문서 상태가 `planned`인 채로 방치된 상황에서, 실제 코드를 직접 검토해 현재 구현 상태를 확인 - 리서치 문서의 사실 섹션이 outdated된 부분을 문서에 반영 ## 검토 대상 파일 - `rb8001/app/services/companyx_grounding_service.py` (전체) - `rb8001/app/services/message_service.py` (grounding 진입 경로 확인) - `DOCS/skills/companyx-rag/SKILL.md` ## 코드 검토 결과 ### 계획 대비 구현 완료 항목 계획 문서(260315)의 Phase 1~4 핵심이 이미 구현되어 있음. #### Phase 2 (질문 유형 계약) - 구현됨 ```python # _classify_question_type() 존재 (line 137) # 4개 유형: QUESTION_EXPLANATORY, QUESTION_FACT, QUESTION_QUANTITATIVE, QUESTION_RECAP QUESTION_EXPLANATORY = "explanatory" QUESTION_FACT = "fact_check" QUESTION_QUANTITATIVE = "quantitative" QUESTION_RECAP = "recap" ``` 재오픈 기준 질문 매핑 (코드 기준): - `컴퍼니엑스의 투자사는 몇개야?` → `몇개` 키워드 → `QUESTION_QUANTITATIVE` - `내부 규정 상 휴가는 얼마나 쓸 수 있어?` → `휴가` 키워드 → `QUESTION_FACT` - `오늘전통 프로그램을 옐로펀치랑 같이 운영한다는 근거 있어?` → 기본값 → `QUESTION_FACT` #### Phase 3 (근거 채택 판정) - 구현됨 ```python # _score_result_relevance() 존재 (line 278) # _select_relevant_results() 존재 (line 326): relevance_score <= 0이면 제외 # _supports_quantitative_focus() 존재 (line 251): count marker 패턴 판정 ``` - `투자사` 질문에 투자/포트폴리오/실적 관련 없는 청크 → score=0으로 필터링됨 - `휴가` 질문에 휴가/연차/반차 없는 청크 → score=0으로 필터링됨 - 수치형 질문은 `_COUNT_MARKER_PATTERN`으로 실제 숫자 존재 여부까지 판정 #### Phase 4 (direct/failure 응답 계약) - 구현됨 ```python # _build_direct_answer(): 유형별 다른 응답 (line 398) # _build_failure_answer(): 유형별 다른 실패 메시지 (line 376) # _build_grounded_response(): relevant_results가 없으면 failure 경로 (line 425) ``` `QUESTION_QUANTITATIVE` 실패 경로 예시: - 관련 결과 있으나 count marker 없음 → `수치를 단정할 수 없습니다. ... 단정 불가` - 관련 결과 자체 없음 → `뒷받침할 문서를 찾지 못했습니다` #### Phase 1 (구조 분리) - 구현됨 - 함수 분리: `_classify_question_type`, `_build_query_candidates`, `_search_companyx_documents`, `_score_result_relevance`, `_select_relevant_results`, `_select_evidence_results`, `_build_direct_answer`, `_build_failure_answer` - 질문별 특례 분기 (`if 오늘전통 in message`) 제거됨 ### 미완료 항목 #### Phase 5 (테스트 고정) - 미완료 - 재오픈 기준 질문 3개에 대한 자동화 테스트 없음 - 코드 경로 구현은 됐지만 실제 Slack 실응답 검증 미완료 #### 문서 불일치 - 트러블슈팅 문서 `260312_companyx_rag_answer_composition_regression.md`가 `닫힘` 표기 - 종결 근거로 참조하는 `260315_companyx_정확표기_slack_근거응답_경로종결.md`가 존재하지 않음 - 시나리오 문서는 여전히 `재오픈` 상태 #### SKILL.md vs 코드 정합성 - SKILL.md 요구 형식: `direct answer → evidence documents → short evidence summary` - 현재 코드 출력 형식: `direct answer\n\n근거 문서:\n- filename: chunk_summary (chunk N, score X.XX)` - 대체로 일치하나, `short evidence summary` 부분이 chunk 앞부분 180자 잘라내기로 처리됨 (개선 가능) ### 진입 조건 현황 (변경 없음) ```python # _looks_like_companyx_grounding_question() (line 102) # intent_markers: 근거, 내부 문서, 내부 자료, 자료 기준, 문서 기준, 근거 있어, 확인해줘, 같이 운영, 공동 운영, 협력, mou # domain_markers: 오늘전통, 옐로펀치, yellowpunch, x-course, x course, 컴퍼니엑스, company x, companyx ``` - 여전히 marker 기반. `컴퍼니엑스`만 들어가도 grounding 경로 진입 가능 ## 업데이트한 문서 목록 1. `DOCS/journey/plans/260315_companyx_rag_답변합성_시나리오동시종결_계획.md` - 상태: `planned` → `구현완료_미검증` - 검토일 추가 2. `DOCS/journey/research/260315_companyx_rag_답변합성_시나리오동시종결_리서치.md` - 코드 검토 섹션 추가 (outdated 사실 목록, 여전히 사실인 항목, 미완료 항목) 3. 본 문서 신규 작성 ## 남은 작업 (이 worklog 범위 밖) - Phase 5: 재오픈 기준 질문 3개 자동화 테스트 작성 - Slack 실응답 검증 후 시나리오/트러블슈팅 문서 종결 - 종결 worklog 작성 (`260315_companyx_정확표기_slack_근거응답_경로종결.md` 또는 신규)