---
tags: [worklog, companyx, rag, code-review, docs]
---

# 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` 또는 신규)
