SEC 기구 설계 표준 체크리스트를 기반으로 한 AI 설계 어시스턴트 챗봇. 설계 항목을 자연어로 질문하면 RAG(검색 증강 생성) 방식으로 관련 설계 표준 가이드를 검색하여 핵심 수치 중심으로 답변합니다. NX 캐드 작업 중 빠르게 설계 표준을 확인하는 용도로 설계되었습니다.
- 다중 분야 지원 — 설계수순서, DFC, 공정 표준 등 분야별 최적화된 모델·프롬프트 적용
- 자연어 설계 질의응답 — 설계 항목·치수·조건을 자연어로 질문
- RAG 기반 검색 — ChromaDB 벡터 검색으로 관련 표준 가이드 추출
- 계층형 Title — 폴더 구조를
"A > B > C"형식으로 Title에 반영하여 검색 정확도 향상 - 다중 지식베이스 — 분야별·DB별 ChromaDB를 분리 구축, 챗봇에서 복수 선택 검색 가능
- 대화 문맥 유지 — 최근 3턴의 대화 기록을 문맥으로 활용 (후속 질문 지원)
- 스트리밍 출력 — 토큰 생성 즉시 화면에 출력하여 빠른 응답 체감
- 대화 로그 저장 — 질문·답변·타임스탬프를 JSONL 형식으로 누적 저장
- Thinking 모드 선택 — 특정 분야(DFC 등)에서 사이드바 토글로 추론 모드 전환
- 비밀번호 인증 — Streamlit 세션 기반 접근 제어
| 분류 | 기술 |
|---|---|
| UI | Streamlit |
| LLM (생성) | Ollama — 분야별 모델 상이 (기본: qwen3:8b) |
| LLM (전처리) | Ollama (기본: qwen3:8b) |
| 임베딩 | OllamaEmbeddings (기본: qwen3-embedding:4b) |
| 벡터 DB | ChromaDB (분야별·DB별 분리 구축) |
| LLM 프레임워크 | LangChain |
| 데이터 처리 | pandas, openpyxl |
- Python 3.9+
- Ollama 설치 및 사용 모델 pull
- 전처리·챗봇 실행 모두 크로스플랫폼 가능
pip install streamlit pandas openpyxl langchain langchain-community langchain-ollama langchain-chroma chromadb tqdmollama pull qwen3:8b # 전처리 + 설계수순서·공정표준 생성 모델
ollama pull qwen3:14b # DFC 생성 모델
ollama pull qwen3-embedding:4b # 임베딩 모델
ollama serve # 서버 실행 (http://localhost:11434)src/domain_registry.json — 분야별 설정 관리 (db_keys 없이 사용):
{
"MEG_STANDARD": {
"display_name": "설계수순서",
"model": "qwen3:8b",
"prompt_file": "MEG_STANDARD.txt",
"allow_think_toggle": false,
"default_use_think": false
}
}data/<DOMAIN_KEY>/db_registry_<DOMAIN_KEY>.json — DB 목록 (단일 진실 공급원):
{
"mobile": { "display_name": "Mobile", "description": "SEC Mobile 설계수순서" },
"foldable": { "display_name": "폴더블 특화구조", "description": "..." }
}원본 Excel 파일을 data/<DOMAIN_KEY>/raw_data/<db_key>/ 폴더에 배치 후:
# 전처리만 먼저 실행 (선택적)
python src/preprocess_meg.py
# LLM 변환 + ChromaDB 구축
python src/table_parser.py도메인 키 입력 > MEG_STANDARD
처리할 DB 키를 입력하세요 (단일 입력, 쉼표로 복수 입력, 또는 all)
입력 > all
[공통] Thinking 모드를 사용할까요? (y/n) > n
[공통] ChromaDB 를 새로 구축할까요? (y/n) > y
streamlit run src/chatbot_meg.pyMEG_ChatBot/
├── src/
│ ├── chatbot_meg.py # 메인 Streamlit 챗봇 앱
│ ├── rag_engine.py # RAG 엔진 — 생성 모델 + 답변 생성
│ ├── vector_store.py # 임베딩 모델 + ChromaDB 구축/로드
│ ├── preprocess_meg.py # MEG_STANDARD 전용 전처리 (단독 실행 가능)
│ ├── table_parser.py # 통합 실행 진입점
│ ├── domain_registry.json # 분야(도메인) 목록 정의
│ └── prompts/
│ ├── MEG_STANDARD.txt # 설계수순서 프롬프트
│ ├── DFC.txt # DFC 프롬프트
│ └── MECHA.txt # 공정 표준 프롬프트
│
└── data/ # git 제외 폴더
├── MEG_STANDARD/
│ ├── db_registry_MEG_STANDARD.json # DB 목록 (단일 진실 공급원)
│ ├── raw_data/
│ │ └── <db_key>/ # 폴더 계층 구조 허용
│ ├── result/ # 자동 생성
│ │ └── <db_key>/
│ │ ├── preprocessed_data_final.xlsx
│ │ ├── footnote_review.xlsx
│ │ └── final_text_data_*.xlsx
│ ├── chroma_db/ # 자동 생성
│ └── error/ # 자동 생성
├── DFC/
│ ├── db_registry_DFC.json
│ └── raw_data/
├── MECHA/
│ ├── db_registry_MECHA.json
│ └── raw_data/
└── logs/
└── chat_log.jsonl
원본 Excel (data/<DOMAIN_KEY>/raw_data/<db_key>/ — 폴더 계층 구조 허용)
└─► preprocess_meg.py 실행 (단독 실행 가능)
├─ xlsx 직접 읽기 (openpyxl, 첫 번째 시트만)
├─ Title = 폴더 계층 + 파일명 ("A > B > C" 형식)
├─ Guide 서브헤더 감지 → "서브헤더 : 값" 형태 조합
├─ Guide 실제 값 2개 → " : " / 3개+ → ", "
├─ 주석 번호 자동 제거 (footnote_review.xlsx 별도 생성)
└─ preprocessed_data_final.xlsx 생성
└─► table_parser.py 실행
├─ preprocessed_data_final.xlsx 있으면 → 전처리 스킵
├─ 없으면 → 도메인별 전처리 모듈 자동 실행
├─ LLM으로 자연어 서술형 변환 (계층 Title 포함)
│ → final_text_data_*.xlsx
└─ OllamaEmbeddings → ChromaDB 구축
└─► chatbot_meg.py (앱 구동 시)
├─ db_registry_<DOMAIN>.json 에서 DB 목록 로드
├─ 선택된 DB들 로드 → 질문 → 벡터 검색 → 중복 제거
├─ 대화 히스토리(최근 3턴) + 검색 결과 → LLM 답변
└─ 스트리밍 출력 + 로그 저장
src/domain_registry.json에 항목 추가 (db_keys없이)src/prompts/<DOMAIN_KEY>.txt프롬프트 작성data/<DOMAIN_KEY>/db_registry_<DOMAIN_KEY>.json생성src/preprocess_<DOMAIN_KEY>.py작성 (run_preprocess인터페이스 준수)table_parser.py의PREPROCESS_MODULE_MAP에 추가data/<DOMAIN_KEY>/raw_data/<db_key>/에 Excel 배치python src/table_parser.py실행
data/<DOMAIN_KEY>/db_registry_<DOMAIN_KEY>.json에 DB 항목 추가data/<DOMAIN_KEY>/raw_data/<db_key>/에 Excel 배치python src/preprocess_meg.py또는python src/table_parser.py실행
Reason컬럼 데이터 보강 후 프롬프트에 설계 근거 포함- 비밀번호 하드코딩 제거 (환경변수로 교체)
- DFC, MECHA 전용 전처리 모듈 작성
- 로그 기반 Q&A 데이터 ChromaDB 누적 반영 (2-B 단계)