백엔드(backend/app)
main.py
-fastapi앱 생성
-cors 설정
-라우터 연결 : routers.ingest,routers.analytics,routers.llm,routers.agent
-routers/
- ingest.py : 파일 업로드 엔드포인트
- analytics.py : 집계 차트용 데이터 API
- llm을 이용한 차트 스펙 생성, 요약 API
- agent.py : 멀티 에이전트(툴 호출) 관련 에이전트
- qa.py : RAG 질의 응답 엔드포인트
- services/
- etl.py : 업로드된 csv => dataframe으로 읽고 전처리
- repo.py : DB 또는 in-memory 저장소에 데이터 저장 조회 담당
- kpi.py : 집계로직 (일자별 합계, 파이차트용 합계 등)
- agent_tools.py : LLM이 호출하는 툴 함수 (KPI_TOOL, REPORT_TOOL, RETRIEVE_TOOL 등) 정의
- RAG 검색, KPI 조회, 리포트 생성 등 실제 액션
-rag/
-ingest.docs.py : documents/폴더를 읽어 백터 DB에 임베딩하는 스크립트
-eval/
- eval_rag.py : RAG 품질 평가 스크립트
- documents : RAG에 사용되는 로보틱스/디지털 트윈 도메인 문서
프론트엔드
-app/page.tsx : 메인 페이지
-components/
- charts/chartRender.tsx : 백엔드에서 받은 result 구조를 받아 ECharts로 차트 랜더링
- charts/DailyCombochart.tsx, DonutShareChart.tsx : 특화된 차트 컴포넌트
- AgentPanel.tsx : 에이전트 탭 UI
- RagChat.tsx : RAG채팅 UI
- lib/api.ts
- uploadBulk(files) : 여러 파일/ZIP 업로드 => /ingest/... 로 요청
- analyze(prompt) : 자연어 차트 질의 => /llm/ 또는 /analytics/llm 호출
- getSummaryDeep(start,end) : 기간별 LLM 요약 => llm/summary-deep 같은 엔드포인트 호출
플로우
1. 프론트 => page.tsx 업로드 트리거
사용자가 <input type = "file" mutiple ..>에 파일 선택
onchange 이벤트 => onUpload(e.target.files) 호출
=> 여기서 사용되는 파일:
frontend/app/page.tsx
frontend/lib/api.ts
2.프론트 => 백엔드 : uploadbulk => routers/ingest.py
uploadBulk 함수가 fetch/axios로 백엔드 /ingest/... 엔드포인트들에 파일을 전송
→ 백엔드에서 동작하는 파일:
- backend/app/main.py (라우터 등록)
- backend/app/routers/ingest.py
- backend/app/services/etl.py
- backend/app/services/repo.py
- routers/ingest.py 내부 동작(추론):
- 파일 확장자(xlsx/csv/zip) 확인
- _read_any() 같은 헬퍼로 pandas.read_excel/read_csv 호출 → DataFrame 생성
- etl.py를 호출해 컬럼 이름 표준화, 타입 변환 등 전처리
- repo.py를 호출해 입고/출고/상품 테이블에 저장
3. 자동 차트 1 – runAutoCharts → /llm + kpi.py
- 업로드 후 runAutoCharts() 실행
→ 사용 파일:- frontend/app/page.tsx
- frontend/lib/api.ts
- backend/app/routers/llm.py
- backend/app/services/llm_service.py
- backend/app/services/kpi.py
- backend/app/services/repo.py
- 프론트가 analyze("...") 호출 → 백엔드 /llm/analyze (혹은 유사 주소)로 요청
- routers/llm.py:
- 요청을 받아 llm_service.to_chart_spec(...) 같은 함수를 호출
- llm_service.py:
- SYSTEM 프롬프트 기반으로 LLM(or rule) 호출 → ChartSpec JSON 생성
(예: { chart:"bar", x:"date", y:"qty", agg:"sum", filters:{direction:"IN"} }) - 이 스펙을 kpi.py에 넘겨서 실제 집계 데이터를 가져옴
- repo.py가 DB에서 범위/필터에 맞는 행들을 로딩
- 결과를 { spec, result } 형태로 응답
- SYSTEM 프롬프트 기반으로 LLM(or rule) 호출 → ChartSpec JSON 생성
- 프론트 page.tsx에서:
- resIn.result.series[0].data / resOut... 데이터를 날짜별로 합쳐 autoCombined 상태에 저장
- ReactECharts(dynamic import)로 “일자별 입·출고 + 증감률” 콤보 차트 렌더링
4. 자동 차트 2 – runSharePies → /llm + kpi.py
- runSharePies()에서 다시 analyze(...) 두 번 호출
- 백엔드 동작은 위와 동일:
- llm_service가 ChartSpec 생성 (x: partner, y: qty, agg: sum, chart: pie)
- kpi.py가 거래처별 합계 계산
- 프론트 page.tsx에서 toPie() 로직으로 상위 20개 + 기타 묶음 만들어
- pieIn, pieOut 상태에 저장
- ReactECharts로 도넛 파이 차트 렌더링
5. 요약 – getSummaryDeep → /llm 요약 엔드포인트
자동 차트 중 하나라도 성공하면 refreshSummary() 호출
- 백엔드:
- routers/llm.py의 다른 엔드포인트(예: /llm/summary-deep)에서
- llm_service.build_summary_text 또는 유사 함수 호출
- repo.py로 기간별 데이터 조회
- 그 결과를 LLM에 넘겨 “지난 5일간 입·출고 패턴” 같은 자연어 요약 생성
- 이 텍스트가 summaryText로 프론트에 표시됨
→ “LLM 기반 데이터 분석” 섹션
python -m venv venv