DOCS/workflow/03_rag/companyx_grounding_pipeline.md
happybell80 f078b28ced docs: 03_rag + 04_scheduler + 05_admin 워크플로우 현행화
03_rag:
- companyx_grounding_pipeline.md: 코드 SSOT 섹션 추가, 진입 조건 3단계(IC→마커 폴백) 정확히 기술, 환경변수 참조로 IP 하드코딩 제거
- companyx_incremental_indexing_workflow.md: frontmatter 표준 적용 (type, last_updated)
- rag_upload_indexing_pipeline.md: 코드 SSOT·재인덱싱·업로드 경로별 진입점 테이블 추가, 환경변수 참조

04_scheduler:
- scheduled_daily_briefing.md: n8n cron 전제 제거, APScheduler DB 기반 + LangGraph 워크플로우 기준 재작성
- scheduled_healthcheck_alert.md: n8n cron 전제 제거, /health 엔드포인트 + SKILL.md registry 기반 재작성
- scheduled_rag_reindex_retry.md: 현행 코드에 해당 잡 없음 → _archive 이동

05_admin:
- diary_reflection_pipeline.md: n8n 전제 제거, APScheduler + diary_generator.py 기준 재작성, /api/diary/generate(존재하지 않는 엔드포인트) 제거

Refs: DOCS#8

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 07:52:29 +09:00

4.8 KiB

tags, type, last_updated
tags type last_updated
workflow
rag
companyx
grounding
answer
workflow 2026-04-06

Company X Grounding 파이프라인

목적

  • Company X 소속 사용자의 내부 문서 질문에 대해 로빙이 근거를 붙여 답하게 한다.
  • 직접 답과 근거 문서를 함께 반환하는 기준을 고정한다.

상위 원칙

코드 SSOT

  • rb8001/app/services/companyx_grounding_service.py

입력

  • 사용자 질문 (message)
  • 사용자 ID (user_id)
  • (선택) 의도 분류 결과 (classified_intent, classified_confidence)

출력

  • CompanyXRAGOutput (Pydantic 모델):
    • direct_answer — 질문에 대한 직접 답변 (근거 부족 시 빈 문자열)
    • evidence_docs — 근거 문서 파일명 목록
    • failure_reason — 답변 불가 사유 (문서 없음, 단정 불가 등)

진입 조건 (should_handle_companyx_grounding())

  1. user_id에서 team_id를 조회한다 (get_user_team_id()).
  2. team_id != COMPANYX_TEAM_ID이면 진입하지 않는다.
  3. LLM 의도 분류가 companyx_rag 이외의 확정 intent를 confidence >= 0.7로 반환했으면 진입하지 않는다.
  4. companyx_rag으로 분류된 경우(confidence >= 0.5) 진입한다.
  5. 위 두 경우 모두 아닐 때, 하위 호환성을 위해 마커 기반 판단(_looks_like_companyx_grounding_question())으로 진입 여부를 결정한다.
    • 마커: intent 마커(근거, 내부 문서, MOU, 계약서, 투자조합, 재무제표 등) 또는 domain 마커(오늘전통, 옐로펀치, 컴퍼니엑스 등)

처리 순서 (try_companyx_grounding())

  1. 진입 조건 확인 (위 참조).
  2. 질문 유형 분류 (_classify_question_type()): explanatory / fact_check / quantitative / recap.
  3. 멀티쿼리 생성 (_build_query_candidates()): 원문 + 키워드 조합 + 문서 힌트 결합으로 중복 제거 후 다수 변형 생성.
  4. 하이브리드 검색 (_search_companyx_documents()):
    • 각 쿼리를 $SKILL_RAG_FILE_URL/api/search에 병렬 호출 (asyncio.gather).
    • 페이로드: team_id=COMPANYX_TEAM_ID, limit=5, threshold=0.35, search_mode=hybrid.
    • 결과를 document_id:chunk_index 키로 병합, 최고 점수만 유지.
  5. 상위 결과 선택 (_select_top_results()): RRF 정규화 점수 기준 정렬, 문서 다양성(같은 document_id 중복 제거), 최대 5건(MAX_EVIDENCE_CHUNKS).
  6. LLM 근거 답변 생성 (_call_llm_companyx_grounding()):
    • 프롬프트: prompts/rag/companyx_grounding.md (render_prompt).
    • 모델: settings.DEFAULT_LLM_MODEL, temperature=0.1, JSON 응답 형식.
    • 응답을 CompanyXRAGOutput으로 Pydantic 검증.
  7. 최종 응답 조립 (_build_grounded_response()): LLM 성공 시 direct_answer + 참고 문서, 실패 시 question_type별 실패 메시지.

검색 모드

  • 기본 검색 모드: hybrid (벡터 + 키워드 RRF 합산).
  • 벡터 검색: PGVector cosine similarity (Gemini Embedding 2, 768d).
  • 키워드 검색: PostgreSQL tsvector + GIN 인덱스, prefix 매칭(:*).
  • 점수 합산: RRF (Reciprocal Rank Fusion, k=60), 정규화 0~1.
  • Apache AGE 그래프 점수: hook으로 가산 가능 (보조적 위치).

근거 선별 원칙

  • 키워드 기반 룰로 검색 결과를 필터링하지 않는다 (룰베이스 절제 원칙 — 헌장.md 참조).
  • 하이브리드 검색 RRF 정규화 점수 순서를 신뢰하고, LLM이 컨텍스트를 보고 적합도를 재판단한다.
  • 근거 선별 책임은 LLM에 있으며, 코드 레벨에서는 점수 상위 결과를 문서 다양성 기준으로 선택만 한다.

실패 분기

  • 검색 결과가 0건이면 try_companyx_grounding()None을 반환 → message_service가 일반 의도 분류 경로로 fallback.
  • LLM이 컨텍스트만으로 답변 불가로 판단하면 failure_reason을 채우고, 성공처럼 반환하지 않는다.
  • 수치형 질문에서 값이 없으면 추정하지 않는다.
  • 내부 규정이나 최신 집계가 없으면 문서 없음, 미확인, 불일치 중 하나로 명시한다.
  • 메타 대화로 회피하지 않는다.

환경변수

  • SKILL_RAG_FILE_URL — skill-rag-file 서비스 베이스 URL (필수).

검증 기준

  • 기준 질문(오늘전통, 옐로펀치 등)에서 직접 답 + 근거 문서가 함께 나와야 한다.
  • 근거 부족 질문(투자사 수, 휴가 규정 등)은 추정 없이 실패해야 한다.
  • Slack 실응답과 테스트 응답이 같은 기준을 따라야 한다.

관련 문서