CPA가 제약 바이오 연구개발비 자산화 공시를 확인할 수 있도록 돕는 RAG 챗봇. K-IFRS 회계기준 · DART 전자공시 · 삼일회계법인 KAM 자료를 근거로, 제약·바이오 32개 상장사의 연구개발지 자산화 공시 질문에 출처를 인용하며 답변한다.
다크 테마 · 좌우 말풍선 채팅 · 문장별 [S#] 출처 인용
| 정량 데이터 추출 (DART 주석 표) | 기준서 ↔ 공시 연결 (K-IFRS 1038호) |
|---|---|
![]() |
![]() |
| 연구개발비 자산화 금액을 원화 전액으로 추출 + 출처 원문 링크 | 자산화 요건을 설명하고 실제 공시 사례를 DART에서 연결 |
| 회계처리·감사 관점 분석 | 정성 사업 분석 (파이프라인·기술이전) |
|---|---|
![]() |
![]() |
| 회계기준 근거와 함께 회계처리 쟁점을 해설 | 신약 파이프라인·라이선스 계약을 수익인식 관점으로 해석 |
- 3-Source RAG: 한 질문에 K-IFRS 기준 근거 + 실제 DART 공시 사례 + KAM 감사 관점을 동시 검색
- 하이브리드 검색 + RRF 융합: BM25(키워드) + 벡터(의미) 검색을 RRF로 통합
- 질의 이해: 질문에서 기업명 인식 → 메타데이터 필터링, 다중 기업 비교·부정("~가 아닌") 질의 처리
- 근거 인용: 답변 문장마다
[S#]출처 표기로 할루시네이션 억제 - 정형화 레이어: 공시마다 다른 연구개발비 표(천원·백만원·억원)를 표준 스키마로 추출·저장해 기업 간 비교를 가능하게 함. 단위 환산은 LLM이 아닌 코드가 수행 → 상세 문서
사용자 질문
│
┌─────────▼──────────┐
│ 질의 이해 (기업명·필터) │
└─────────┬──────────┘
▼
┌──────────── 하이브리드 검색 ────────────┐
│ BM25(키워드) 벡터 검색(의미) │
│ └───── RRF 융합 ─────┘ │
└──────────────────┬───────────────────────┘
K-IFRS / DART / KAM (ChromaDB · HNSW)
▼
2단계 리랭킹 (FlashRank)
▼
GPT-4o (근거 기반 생성 + 인용)
▼
답변 + 핵심 출처 [S#]
- GIGO 진단·해결: 챗봇이 정량 데이터를 못 가져오던 원인을 벡터DB를 직접 열어 검증해 수집 단계가 질문과 무관한 섹션만 저장하던 문제로 규명 → 질문 의도와 정렬된 화이트리스트 기반 수집으로 재설계
- 목차 파서 버그: 보고서 목차 149개 중 3개만 읽던 버그 수정
- 검색 품질: BM25 + 벡터 하이브리드 + RRF 융합으로 기업명·정량 데이터 검색 보강
- 벡터DB 인프라 디버깅: ChromaDB가 한글 경로에서 HNSW 인덱스를 못 읽는 문제를 통제 실험으로 규명 → ASCII 경로로 이전해 해결
- 다중 기업 검색: 비교 질문에서 한 기업만 검색되던 한계를 다중 기업 균형 검색으로 개선
- 연구개발비 자산화 공시에 적용하는 등식 총액 = 자산화 + 비용화 뿐일 때, 정부보조금 필드가 등장 시 오류가 발생하는 문제 발견 -> 정부보조금 필드 추가
5개 고정 문항(정량추출·기준연결·기업비교·감사관점·정성분석)으로 개선 전후를 정량 측정.
| 항목 | 결과 |
|---|---|
| 종합 점수 | 4/5 → 5/5 |
| 예시 | "연구개발비 자산화 금액"을 정확한 수치로 답변, "셀트리온 vs 한미약품 자산화 정책 비교" 등 |
회차별 추적:
Notes/Benchmarks/
| 분류 | 기술 |
|---|---|
| UI | Streamlit |
| RAG 프레임워크 | LangChain |
| 벡터 DB | ChromaDB (HNSW 인덱스) |
| 임베딩 | OpenAI text-embedding-3-small |
| LLM | GPT-4o |
| 검색 | BM25(rank-bm25) + 벡터 + RRF 융합, 2단계 리랭킹(FlashRank) |
| 질의 이해 | 기업명 엔티티 인식 + 메타데이터 필터링 |
| DART 수집 | DART Open API + BeautifulSoup (HTML 표 → 마크다운) |
pip install -r requirements.txt프로젝트 루트에 .env 생성:
OPENAI_API_KEY=sk-...
DART_API_KEY=...
python dart_ingest.pyDART 공시 HTML을 파싱해 회계 주제별 청크를 추출·임베딩한다.
⚠️ 벡터 DB는 ASCII 경로(~/rag_chroma_data) 에 생성된다 — 한글 경로에서 ChromaDB HNSW 로딩이 실패하는 이슈를 회피하기 위함.
streamlit run app.pyRAG-Accounting-ChatBot/
├── app.py # Streamlit UI (다크 테마 채팅)
├── rag_engine.py # 검색 엔진 (하이브리드·RRF·질의이해·ChromaDB)
├── dart_ingest.py # DART 공시 수집 → ChromaDB
├── extract_facts.py # 정형화 레이어 (연구개발비 표준 스키마 추출)
├── prompts.py # 시스템/유저 프롬프트, 출처 포맷
├── run_benchmark.py # 고정 벤치마크 측정
├── finalize_db.py # 벡터 DB 구축
├── rebuild_dart_index.py # 인덱스 복구
├── requirements.txt
├── .streamlit/config.toml # 다크 테마
└── Notes/Benchmarks/ # 벤치마크 결과
본 프로젝트 팀은 2명으로 구성되었으며, 중점적으로 담당한 파트는 다음과 같다.
- DART 수집 파이프라인 재설계: 목차 파서 버그 수정, 화이트리스트 기반 섹션 선택, HTML 표 파싱
- 검색 엔진: BM25+벡터 하이브리드, RRF 융합, 다중 기업·부정 질의 이해
- ChromaDB 안정화: 한글 경로 HNSW 이슈·런타임 안정성 디버깅
- 평가 체계: 고정 5문항 벤치마크 설계 및 회귀 추적
- UI: 다크 테마 채팅 인터페이스




