tags: [robeing, companyx, rag, research, internal-documents, grounding]

# 260312 Company X 내부문서 RAG 근거응답 현황 리서치

## 상위 원칙
- [Writing Principles](https://github.com/happybell80/0_VALUE/blob/main/02_Governance/writing-principles.md)
- [Company X 내부 문서 RAG 응답 아이디어](../ideas/260312_companyx_내부문서_rag_응답_아이디어.md)
- [Company X 내부 문서 근거응답 사용자 시나리오](../scenarios/260312_companyx_내부문서_근거응답_사용자시나리오.md)

## 목적
- Company X 소속 사용자가 `오늘전통 프로그램을 Company X가 옐로펀치랑 같이 운영한다는 근거 있어?`라고 물었을 때,
  현재 실제 로빙이 어떤 답을 하는지 확인한다.
- 현재 로빙이 Company X 내부 NAS 문서를 근거로 답할 수 있는 구조인지 확인한다.
- NAS 원본에는 실제 근거가 있는지 확인해, 문제를 `근거 부재`와 `근거 연결 부재`로 구분한다.
- 이 문서 하나로 기존 `ideas`와 `scenarios`를 `plans`로 넘길 수 있는 사실 기준을 고정한다.

## 조사 범위
- 런타임 서비스: `rb8001`, `skill-rag-file`
- 저장 상태: `team_document`, Chroma 컬렉션 검색 결과
- 원본 데이터: 내부 NAS `/mnt/nas/workspace/6.Company X`
- 대표 질문: `오늘전통 프로그램을 Company X가 옐로펀치랑 같이 운영한다는 근거 있어?`

## Facts

### 1. 현재 실제 로빙 답변은 내부 문서 근거답변이 아니다

- 2026-03-12 21:24 KST 기준 `rb8001` 테스트 엔드포인트에 대표 질문을 직접 넣어 확인했다.
- 호출 경로:
  - `POST /api/test/router-message`
- 입력:
  - `오늘전통 프로그램을 Company X가 옐로펀치랑 같이 운영한다는 근거 있어?`
- 실제 응답:

```json
{
  "user_id": "53529291-5050-4daa-89fb-008b546feb63",
  "user_message": "오늘전통 프로그램을 Company X가 옐로펀치랑 같이 운영한다는 근거 있어?",
  "bot_response": "CTO님, Company X가 옐로펀치와 함께 전통 프로그램을 운영한다는 근거를 찾아보겠습니다. 관련 정보를 확인해 보고 말씀드리겠습니다.",
  "intent": null,
  "skill_sequence": null,
  "status": "success"
}
```

- 이 응답은 문서명, 문단 요약, 파일 위치를 전혀 제시하지 않는다.
- 즉 현재 시나리오가 기대하는 `직접 답변 + 근거 문서` 형식과 다르다.

### 2. 현재 질문은 라우터에서 `UNKNOWN`으로 떨어지고 내부 문서 검색으로 연결되지 않는다

- 같은 시각 `rb8001` 로그에서 아래 사실을 확인했다.
  - DecisionEngine이 해당 질문에 대해 `의도 매칭 실패 - UNKNOWN`을 기록했다.
  - 이후 응답은 내부 LLM 경로로 생성됐다.
- 확인된 로그 핵심:
  - `Loaded 0 recent conversations`
  - `[DecisionEngine] 의도 매칭 실패 - UNKNOWN으로 처리`
  - 이후 Gemini 호출 발생
- 따라서 현재 로빙은 이 질문을 `Company X 내부 문서 근거 확인` 작업으로 해석하지 못한다.

### 3. 현재 `skill-rag-file` 인덱스에는 관련 Company X 문서가 없다

- `skill-rag-file` DB(`team_document`)를 직접 확인한 결과 총 문서 수는 `136`건이었다.
- 최근 적재 문서들은 `/mnt/51123data/documents/...` 또는 `/mnt/nas/documents/...` 아래의 일반 업로드 문서였고, 대표 예시는 아래와 같았다.
  - `06_릴라이 와이어프레임.pdf`
  - `01_후인터 사업계획서 ppt버전.pdf`
  - `에이징랩(주)_IR_20260309_v1.pdf`
- 같은 DB에서 아래 조건으로 조회했을 때 결과가 `0건`이었다.
  - `filename ilike '%오늘전통%'`
  - `filename ilike '%옐로%'`
  - `storage_path ilike '%오늘전통%'`
  - `storage_path ilike '%옐로%'`
- 따라서 현재 RAG 인덱스에는 적어도 `오늘전통`, `옐로펀치` 관련 Company X 문서가 들어가 있지 않다.

### 4. 현재 `skill-rag-file` 검색으로도 관련 결과를 찾지 못했다

- `skill-rag-file` 검색 API에 대표 질문을 그대로 넣어 테스트했다.
- 호출 경로:
  - `POST /api/search`
- 사용한 team 식별자는 테스트 사용자 UUID였고, 결과는 아래와 같았다.

```json
{
  "query": "오늘전통 프로그램을 Company X가 옐로펀치랑 같이 운영한다는 근거",
  "results": [],
  "total_results": 0
}
```

- 위 결과만으로 `모든 team_id에서 절대 검색 불가`를 단정할 수는 없다.
- 그러나 바로 위 3번 사실 때문에, 현재 인덱스 DB 전체에 관련 문서가 없다는 점은 별도로 확인됐다.

### 5. 내부 NAS 원본에는 질문과 직접 관련된 근거 문서가 실제로 존재한다

- 내부 NAS에서 `오늘전통`, `옐로펀치` 키워드로 파일명을 조사한 결과 관련 문서가 다수 존재했다.
- 대표 경로 예시:
  - `/mnt/nas/workspace/6.Company X/2. 신규운영사 및 펀드 운용사, 용역 프로그램 제안 등/2025년/05. [한국공예·디자인문화진흥원] 오늘전통 5기 초기창업기업 창업기획자(액셀러레이터) 공모/01. 제출서류/01. 사업계획서_컴퍼니엑스.pdf`
  - `/mnt/nas/workspace/6.Company X/10. MOU&인증/옐로펀치/TalkFile_MOU_옐로펀치X컴퍼니엑스- 25.01.23.pdf.pdf`

### 6. `오늘전통 5기 사업계획서`에는 옐로펀치가 협력기관으로 명시돼 있다

- 위 `사업계획서_컴퍼니엑스.pdf`를 텍스트 추출해 확인했다.
- 확인된 핵심 구절:
  - `프렉클컴퍼니, 스몰브랜더, 옐로펀치 등 브랜드 기업의 성장 지원이 가능한 외부 협력체계를 기반으로`
  - `㈜옐로펀치`
  - `공동 및 후속투자`
- 해석상 이 문서는 최소한 `오늘전통 사업계획서 안에서 옐로펀치가 Company X의 대외 협력체계/협력기관 중 하나로 제시된다`는 근거가 된다.

### 7. `옐로펀치X컴퍼니엑스 MOU`에는 공동 컨소시엄 협력과 프로그램 운영 참여가 명시돼 있다

- `TalkFile_MOU_옐로펀치X컴퍼니엑스- 25.01.23.pdf.pdf`를 텍스트 추출해 확인했다.
- 확인된 핵심 구절:
  - `주식회사옐로펀치와 주식회사컴퍼니엑스는 우수 창업기업 발굴, 투자·육성 업무 활성화를 위해 아래의 협약을 체결`
  - `교육, 멘토링, 세미나, IR 등 기업 육성 프로그램 운영 참여`
  - `예비창업자 및 초기 창업기업 대상 지원사업 공동 컨소시엄 협력`
- 이 문서는 `Company X와 옐로펀치 간 공식 협력 관계`를 뒷받침한다.

### 8. 따라서 현재 문제는 `근거 없음`이 아니라 `근거 연결 부재`다

- NAS 원본에는 관련 근거가 있다.
- 그러나 현재 로빙 런타임은 이 질문을 문서 근거 확인으로 해석하지 못한다.
- 또한 관련 원본 문서가 `skill-rag-file` 인덱스에 들어가 있지 않다.
- 즉 현재 실패 원인은 `Company X 문서가 실제로 없어서`가 아니라, `있지만 로빙 답변 경로와 연결되지 않아서`다.

### 9. 현재 로빙 임베딩 경로 기준 실제 문서 인덱싱 시간은 수초~수십초가 아니라 수초 단위다

- `skill-rag-file` 실제 `/api/upload` 경로로 Company X 문서 2개를 직접 인덱싱해 시간을 확인했다.
- 유효한 기존 team_id를 사용해 `업로드 -> 텍스트 추출 -> 청킹 -> 임베딩 -> Chroma 저장`까지 포함한 전체 시간을 측정했다.
- 측정 결과:
  - `옐로펀치X컴퍼니엑스 MOU` PDF `130,944B`: `0.608초`, `5 chunks`
  - `오늘전통 사업계획서_컴퍼니엑스` PDF `12,937,755B`: `8.371초`, `104 chunks`
- 인덱싱 후 검색 시간도 확인했다.
  - 질의 `공동 컨소시엄 협력`
  - 검색 응답 시간: `0.059초`
  - 결과: MOU 문서 청크 1건 반환

### 10. 현재 로빙 임베딩 모델은 384차원이고, StarsAndI가 쓰는 OpenAI 임베딩은 1536차원이다

- 현재 로빙 `skill-embedding` 런타임 설정은 아래와 같다.
  - 모델: `multilingual-MiniLM-L12-v2`
  - 차원: `384`
- 확인 근거:
  - `skill-embedding/.env`
  - `rb8001` 런타임 로그의 `Collection expecting embedding with dimension of 768, got 384`
- 비교 대상으로 본 StarsAndI 코드의 OpenAI 임베딩 경로는 아래와 같다.
  - 모델: `text-embedding-3-small`
  - 차원: `1536`
- 확인 근거:
  - `starsandi/apps/apps/api-py/app/services/recommend.py`
  - 실제 OpenAI 임베딩 API 호출 결과 `dim=1536`

### 11. OpenAI 임베딩 단건 호출 시간은 현재 환경에서 대략 0.2초~3초, 평균 1.8초 수준이다

- StarsAndI가 쓰는 실제 모델 `text-embedding-3-small`로 대표 질문 1건을 3회 호출해 시간을 측정했다.
- 측정 결과:
  - 1회: `2966.1ms`
  - 2회: `2226.3ms`
  - 3회: `234.3ms`
  - 평균: `1808.9ms`
- 따라서 OpenAI 임베딩은 현재 환경에서 단건 기준 대략 `0.2초 ~ 3초`, 보통 `약 2초` 안팎으로 보는 것이 맞다.

### 12. 2,000개 쉬운 문서 기준 인덱싱 시간은 로컬 모델이 더 짧고, OpenAI 모델도 절대 시간이 과도하지는 않다

- 현재 로빙 로컬 임베딩 경로(`384d`) 기준 현실 추정:
  - 쉬운 문서 평균 `0.6초 ~ 2초/문서`
  - `2,000개` 문서: 약 `20분 ~ 67분`
- OpenAI 임베딩 경로(`1536d`) 기준 현실 추정:
  - 네트워크 왕복 포함 평균 `2.5초 ~ 4초/문서`
  - `2,000개` 문서: 약 `83분 ~ 133분`
- 따라서 `2,000개 쉬운 문서` 범위는 두 경로 모두 `몇 시간 이내`에 검증 가능하다.

### 13. OpenAI 임베딩 비용은 2,000개 문서 규모에서는 병목이 아니다

- `text-embedding-3-small`의 현재 공식 가격은 `1M tokens당 $0.02`다.
- 문서당 평균 토큰 수를 가정한 대략 비용:
  - `1,000 tokens x 2,000문서 = 2M tokens` -> 약 `$0.04`
  - `2,000 tokens x 2,000문서 = 4M tokens` -> 약 `$0.08`
  - `5,000 tokens x 2,000문서 = 10M tokens` -> 약 `$0.20`
- 따라서 이번 주제에서 OpenAI 임베딩 선택의 핵심 기준은 비용보다 `품질`, `속도`, `운영 단순성`이다.

### 14. 품질 비교 테스트는 지금 바로 설계 가능한 상태다

- 현재 단계에서 가능한 최소 품질 테스트는 아래 구조다.
  - Company X 질문 `20~50개`를 고정한다.
  - 각 질문에 대해 사람이 `정답 근거 문서`를 1차 지정한다.
  - 같은 문서셋을 `384d 로컬 모델`과 `1536d OpenAI 모델`로 각각 인덱싱한다.
  - 같은 질문셋을 돌려 `정답 문서가 상위 결과에 들어오는지`를 비교한다.
- 이 비교는 아직 답변 생성 LLM 품질이 아니라, `검색 근거 품질`을 먼저 비교하는 테스트다.
- 현재 문제의 본질이 `근거 연결`인 점을 고려하면, 이 단계에서는 생성 답변보다 `retrieval quality`를 먼저 보는 것이 맞다.

### 15. 품질 비교에서 바로 쓸 수 있는 지표는 이미 정리할 수 있다

- `Recall@5`
  - 정답 근거 문서가 상위 5개 안에 들어오는지
- `MRR`
  - 정답 근거 문서가 평균 몇 위에 오는지
- `근거 문단 사용 가능성`
  - 사람이 봤을 때 바로 답변 근거로 쓸 수 있는 청크인지
- `응답 시간`
  - 인덱싱 시간, 검색 시간
- 현재 단계에서 가장 중요한 지표는 `정답률`보다 `근거 일관성`과 `상위 검색 적중률`이다

### 16. 소규모 retrieval 품질 비교 결과, 로컬 384d와 OpenAI 1536d는 현재 표본에서 동률이었다

- 비교 조건:
  - 문서: `옐로펀치X컴퍼니엑스 MOU` 1건, `오늘전통 사업계획서_컴퍼니엑스` 1건
  - 청킹: `skill-rag-file`과 같은 문자 기반 청킹(`1000`, overlap `200`)
  - 총 청크 수:
    - `mou`: `3`
    - `todaytradition`: `38`
  - 질문: `6개`
  - 평가 단위: `문서 수준 top1/top3`, `MRR`
- 비교 모델:
  - 로컬: `multilingual-MiniLM-L12-v2` `384d`
  - OpenAI: `text-embedding-3-small` `1536d`
- 결과 요약:
  - 로컬 `384d`
    - `Top1 = 4/6`
    - `Top3 = 6/6`
    - `MRR = 0.8333`
  - OpenAI `1536d`
    - `Top1 = 4/6`
    - `Top3 = 6/6`
    - `MRR = 0.8333`
- 즉 이 표본에서는 두 모델이 문서 수준 retrieval 성능에서 사실상 동률이었다.

### 17. 질문 유형별로는 두 모델의 강점이 조금 다르게 나타났다

- 로컬 `384d`가 더 잘 맞힌 질문:
  - `오늘전통 사업계획서에서 옐로펀치가 협력기관으로 제시되는 근거`
  - 이 질문에서 로컬은 `todaytradition`을 `Top1`로 올렸고, OpenAI는 `mou`를 `Top1`로 올렸다.
- OpenAI `1536d`가 더 잘 맞힌 질문:
  - `예비창업자 및 초기 창업기업 대상 지원사업 공동 컨소시엄 협력`
  - 이 질문에서 OpenAI는 `mou`를 `Top1`로 올렸고, 로컬은 `todaytradition`을 `Top1`로 올렸다.
- 공통적으로 둘 다 헷갈린 질문:
  - `교육 멘토링 세미나 IR 등 기업 육성 프로그램 운영 참여`
  - 두 모델 모두 `todaytradition`을 `Top1`로 올리고 `mou`를 `2위`로 두었다.

### 18. 현재 표본 기준으로는 차원 수가 곧바로 품질 우위를 보장하지 않았다

- `1536d` OpenAI 모델이 `384d` 로컬 모델보다 무조건 더 낫다는 결과는 나오지 않았다.
- 현재 표본에서는 두 모델이 같은 점수를 냈고, 질문별로 서로 다른 실수를 보였다.
- 따라서 다음 단계에서 모델 선택은 `차원 수`만으로 결정하면 안 된다.

### 19. 현재 단계에서 더 필요한 것은 큰 모델 교체보다 질문셋 확대와 문서군 확대다

- 지금 비교는 `2문서`, `6질문`의 매우 작은 샘플이다.
- 이 표본만으로 최종 모델 결론을 내리기에는 부족하다.
- 그러나 최소한 아래 두 사실은 확인됐다.
  - 로컬 `384d`도 Company X 근거 검색에 충분히 경쟁력 있는 초기 후보다.
  - OpenAI `1536d`는 비용이 낮고 품질 비교 가치가 있지만, 현재 표본에서 압도적 우위를 보이지는 않았다.
- 따라서 다음 계획에서는 먼저 `2,000개 쉬운 문서`와 `20~50개 질문셋`으로 비교 범위를 넓히는 것이 맞다.

## Interpretation

### 1. 아이디어 문서는 유효한 가설이다

- `Company X 내부 문서를 우선 근거로 삼아 답하는 로빙`이라는 아이디어는 헛가설이 아니다.
- 실제 NAS에는 답변 근거가 될 문서가 있고, 그 문서에는 질문과 관련된 표현도 존재한다.
- 따라서 이 아이디어는 `근거를 만들자`가 아니라 `이미 있는 근거를 로빙 답변 경로에 연결하자`로 해석하는 것이 맞다.

### 2. 시나리오 문서의 현재/기대 대비도 실제 상태와 맞는다

- 현재 실제 응답은 `찾아보겠습니다` 수준의 일반 답변이다.
- 기대 시나리오는 `직접 답변 + 근거 문서 + 문단 요약 + 위치 정보`다.
- 이번 조사 결과는 시나리오 문서가 상상적 요구가 아니라, 실제 현재 상태와 분명히 대비되는 목표 상태임을 확인한다.

### 3. 다음 단계의 핵심은 RAG 품질보다 먼저 `색인 경로 + 질문 해석 경로`다

- 지금 부족한 것은 답변 문체가 아니라 연결 구조다.
- 최소한 아래 두 경로가 동시에 생겨야 한다.
  - NAS 원본 -> Company X 전용 RAG 인덱스
  - Company X 질문 -> Company X 전용 문서 검색 의도/실행 경로
- 둘 중 하나라도 빠지면 기대 시나리오는 닫히지 않는다.

### 4. `오늘전통 공동 운영` 답변은 문서 충돌/표현 차이까지 다뤄야 한다

- 사업계획서에는 `협력기관`, `외부 협력체계` 표현이 있고, MOU에는 `프로그램 운영 참여`, `공동 컨소시엄 협력` 표현이 있다.
- 따라서 미래 로빙은 무조건 `같이 운영한다`고 단정하기보다,
  - `오늘전통 사업계획서에서 옐로펀치가 협력기관으로 제시된다`
  - `Company X-옐로펀치 MOU에는 프로그램 운영 참여와 공동 컨소시엄 협력이 명시된다`
  - `문서 표현은 공동 운영/협력 운영/협력기관으로 조금씩 다르다`
  를 함께 답하는 편이 더 정확하다.

### 5. 현재 단계에서 전체 5만여 개를 먼저 넣는 것보다 2천 개 샘플 품질 비교가 더 맞다

- 전체 `52,833개` 경로를 한 번에 인덱싱하는 것은 가능하더라도, 지금 필요한 질문은 `될 수 있는가`보다 `어떤 모델/경로가 더 낫고 실제 근거 검색이 맞는가`다.
- 이미 시간 측정상 `2,000개 쉬운 문서` 범위는 현실적으로 `1~2시간대` 안에서 비교 가능하다.
- 따라서 다음 `plans`는 먼저 `대표 문서군 2,000개 내외 샘플 인덱싱 + 20~50개 질문셋 품질 비교`를 우선 고정하는 것이 맞다.

### 6. 임베딩 모델 선택 기준은 비용보다 검색 품질과 운영 복잡도다

- 비용 차이는 `2,000개` 규모에서는 매우 작다.
- 실제 선택 기준은 아래가 된다.
  - `384d 로컬`: 빠름, 외부 의존 적음, 운영 단순
  - `1536d OpenAI`: 네트워크 의존, 약간 느림, 그러나 품질 우위 가능성 존재
- 즉 다음 계획 단계에서 해야 할 것은 `이론 비교`가 아니라 `같은 질문셋으로 실제 retrieval quality를 비교하는 실험`이다.

### 7. 현재 작은 표본에서는 로컬 384d를 버릴 이유가 없다

- 작은 표본이지만 `Top1`, `Top3`, `MRR`이 OpenAI와 동률이었다.
- 따라서 현재 단계에서 바로 OpenAI 임베딩으로 전면 전환할 근거는 없다.
- 오히려 운영 단순성과 속도를 고려하면, 로컬 `384d`를 기본 후보로 유지한 채 OpenAI `1536d`를 비교군으로 계속 두는 편이 합리적이다.

## Unresolved

1. Company X 소속 사용자 판별 기준
- 어떤 인증 신호로 `Company X 내부 문서 검색 허용 사용자`를 확정할지 아직 정해지지 않았다.

2. Company X 문서의 색인 단위
- 원본 PDF/DOC/HWP를 그대로 청킹할지, 사람이 읽기 쉬운 중간 RAG 포맷으로 정제할지 아직 미정이다.

3. Company X 전용 team/collection 경계
- 현재 `skill-rag-file`은 `team_id` 기반 컬렉션 구조를 쓴다.
- Company X 내부 문서를 어떤 식별자와 어떤 권한 경계로 넣을지 아직 고정되지 않았다.

4. 답변 근거 노출 수준
- 문서명, 문단 요약, 파일 경로, 페이지 위치 중 어디까지 사용자에게 노출할지 아직 정해지지 않았다.

5. 질문 해석 규칙
- `근거 있어?`, `자료 기준으로`, `내부 문서 기준으로` 같은 표현을 별도 의도로 볼지, 일반 질문에 Company X 컨텍스트를 자동 적용할지 아직 미정이다.

6. 샘플 문서셋 구성
- `2,000개 쉬운 문서`를 어떤 기준으로 뽑을지 아직 정해지지 않았다.
- 오늘전통, MOU, 프로그램 소개, 운영안, 보도자료 초안 같은 문서군 우선순위를 먼저 고정해야 한다.

7. OpenAI 1536d와 로컬 384d의 실제 검색 품질 비교 결과
- 현재는 `2문서`, `6질문` 기준 소규모 retrieval quality 비교 결과만 있다.
- 더 큰 문서군과 질문셋에서 같은 경향이 유지되는지는 아직 확인되지 않았다.

## 현재 결론

- 대표 질문에 대한 현재 실제 로빙 답변은 기대 시나리오를 만족하지 못한다.
- 그러나 내부 NAS 원본에는 관련 근거 문서가 실제로 존재한다.
- 현재 실패 원인은 `Company X 근거 없음`이 아니라 `Company X 근거 문서가 런타임 RAG 경로와 연결되지 않음`이다.
- 시간과 비용 조사 결과, `2,000개 쉬운 문서` 규모는 실험 가능한 범위이며 비용도 병목이 아니다.
- 소규모 품질 비교에서는 `384d 로컬`과 `1536d OpenAI`가 동률이었으므로, 현 시점에서 모델 교체 결론을 먼저 내릴 필요는 없다.
- 따라서 다음 단계 `plans`는 `2,000개 샘플 문서셋`, `20~50개 질문셋`, `384d vs 1536d 확장 비교`, `문서 색인`, `권한 경계`, `질문 해석`, `근거답변 형식`을 한 번에 고정하는 계획 문서여야 한다.

## 관련 문서
- [Company X 내부 문서 RAG 응답 아이디어](../ideas/260312_companyx_내부문서_rag_응답_아이디어.md)
- [Company X 내부 문서 근거응답 사용자 시나리오](../scenarios/260312_companyx_내부문서_근거응답_사용자시나리오.md)
- [컴퍼니엑스(Company X) 개요](../../book/500_business/560_컴퍼니엑스_개요.md)
