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>
4.8 KiB
4.8 KiB
tags, type, last_updated
| tags | type | last_updated | |||||
|---|---|---|---|---|---|---|---|
|
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())
user_id에서team_id를 조회한다 (get_user_team_id()).team_id != COMPANYX_TEAM_ID이면 진입하지 않는다.- LLM 의도 분류가
companyx_rag이외의 확정 intent를 confidence >= 0.7로 반환했으면 진입하지 않는다. companyx_rag으로 분류된 경우(confidence >= 0.5) 진입한다.- 위 두 경우 모두 아닐 때, 하위 호환성을 위해 마커 기반 판단(
_looks_like_companyx_grounding_question())으로 진입 여부를 결정한다.- 마커: intent 마커(근거, 내부 문서, MOU, 계약서, 투자조합, 재무제표 등) 또는 domain 마커(오늘전통, 옐로펀치, 컴퍼니엑스 등)
처리 순서 (try_companyx_grounding())
- 진입 조건 확인 (위 참조).
- 질문 유형 분류 (
_classify_question_type()): explanatory / fact_check / quantitative / recap. - 멀티쿼리 생성 (
_build_query_candidates()): 원문 + 키워드 조합 + 문서 힌트 결합으로 중복 제거 후 다수 변형 생성. - 하이브리드 검색 (
_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키로 병합, 최고 점수만 유지.
- 각 쿼리를
- 상위 결과 선택 (
_select_top_results()): RRF 정규화 점수 기준 정렬, 문서 다양성(같은 document_id 중복 제거), 최대 5건(MAX_EVIDENCE_CHUNKS). - LLM 근거 답변 생성 (
_call_llm_companyx_grounding()):- 프롬프트:
prompts/rag/companyx_grounding.md(render_prompt). - 모델:
settings.DEFAULT_LLM_MODEL, temperature=0.1, JSON 응답 형식. - 응답을
CompanyXRAGOutput으로 Pydantic 검증.
- 프롬프트:
- 최종 응답 조립 (
_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 실응답과 테스트 응답이 같은 기준을 따라야 한다.