Synaplan
기업을 위한 오픈소스 AI 플랫폼
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
AI 기반 국민신문고 민원·제안·청원 자동 처리 플랫폼
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
LLM 멀티에이전트 기반 국민신문고 민원·제안·청원 자동 구조화 및 정책 제안서 생성 플랫폼 시민이 자연어(텍스트·음성·첨부파일)로 문제를 입력하면, 에이전트가 민원/제안/청원을 분류하고 처리에 필요한 누락 정보를 되묻습니다. 이후 관련 법령을 검색해 정책 제안서 초안을 만들고, 자체 검토 결과에 따라 재검색·재작성한 뒤 가결 확률과 소관 위원회 등 분석 결과와 함께 DOCX 문서로 제공합니다. 같은 방향의 제안이 누적되면 클러스터로 묶어 집단 의견으로 집계합니다.README 전문 보기 ↗
LLM 멀티에이전트 기반 국민신문고 민원·제안·청원 자동 구조화 및 정책 제안서 생성 플랫폼
시민이 자연어(텍스트·음성·첨부파일)로 문제를 입력하면, 에이전트가 민원/제안/청원을 분류하고 처리에 필요한 누락 정보를 되묻습니다. 이후 관련 법령을 검색해 정책 제안서 초안을 만들고, 자체 검토 결과에 따라 재검색·재작성한 뒤 가결 확률과 소관 위원회 등 분석 결과와 함께 DOCX 문서로 제공합니다. 같은 방향의 제안이 누적되면 클러스터로 묶어 집단 의견으로 집계합니다.
backend/app/graph/pipeline.py
flowchart LR
A[route<br/>분류·담당부처] --> B[structure<br/>문제 구조화]
B --> C[search<br/>법령·유사사례 검색]
C --> D[generate<br/>제안서 생성]
D --> E[review<br/>타당성 검토]
E -- needs_revision<br/>최대 1회 --> F[inc_rev]
F --> C
E -- done --> G[visualize<br/>가결확률·분석]
G --> H((END))
각 노드의 진행 상태는 GET /api/chat/stream(SSE)으로 프론트엔드에 실시간 전달됩니다.
backend/app/api/routes_conversation.py — 컨텍스트를 요청/응답 페이로드로 주고받는 stateless 설계로 서버리스 환경에서도 동작합니다.
| 단계 | 엔드포인트 | 처리 |
|---|---|---|
| start | POST /api/conversation/start | 분류, 소관 위원회 추천, 명확화 질문 생성 |
| answer | POST /api/conversation/answer | 답변 반영 초안 제안서, 가결 확률을 높이는 개선안 제시 |
| finalize | POST /api/conversation/finalize | 최종 제안서 및 DOCX 생성 |
| 에이전트 | 파일 | 역할 |
|---|---|---|
| Router | agents/router.py | 민원/제안/청원 분류, 담당 부처·주제·키워드 추출 |
| Questioner | agents/llm_questioner.py | 누락된 필수 정보에 대한 맞춤형 명확화 질문 생성 |
| Structurer | agents/llm1_structurer.py | 원인·대상·해결 방향으로 문제 구조화, 제안서 생성 |
| Searcher | agents/llm2_searcher.py | 관련 법령·판례·유사 사례 검색 |
| Reviewer | agents/llm3_reviewer.py | 제안서 타당성 점수, 강점·약점, 수정 필요 여부 판단 |
| Visualizer | agents/llm4_visualizer.py | 가결 확률·소요 기간 등 분석 결과 구성 |
| Improver | agents/llm_improver.py | 통과 가능성을 높이는 구체적 개선안 3~4개 제시 |
| Bill Generator | agents/llm_bill_generator.py | 정책 제안서를 정식 법안 형식으로 변환 |
| 모델 | 구성 | 용도 |
|---|---|---|
| 가결 확률 | KoBERT 임베딩 + Logistic Regression | 법안 텍스트의 국회 가결 확률 |
| 소요 기간 | KoBERT 768d → PCA 128d + 메타 피처 10d → LightGBM | 가결까지 예상 일수 (log1p 회귀) |
| 위원회 추천 | TF-IDF + Logistic Regression | 소관 상임위원회 후보 |
| 접수 유형 분류 | TF-IDF + Logistic Regression | 민원/제안/청원 분류 (LLM 분류의 보조) |
OPENAI_MODEL_NAME 환경변수로 지정backend/app/
├── agents/ # LLM 에이전트
├── graph/ # LangGraph 파이프라인
├── api/ # FastAPI 라우터 (chat, conversation, cluster, bill, upload, voice, admin)
├── rag/ # 법령 API 연동, Chroma 인덱서·검색기
├── ml/ # ML 모델 어댑터 및 싱글턴 레지스트리
├── aggregator/ # 제안 클러스터링, 임계치 트리거
├── stt/ # Whisper 음성 인식
├── utils/ # DOCX 생성, 첨부파일 텍스트 추출
└── storage/ # DB 모델, 시드 데이터
frontend/
├── app/ # 홈, 접수 결과, 클러스터, 제안 목록, 관리자 페이지
└── components/ # ChatBox, ConversationBox, ClusterStatus
cd backend
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8001
cd frontend
npm install
npm run dev # http://localhost:3000
backend/.env)OPENAI_API_KEY= # 필수
OPENAI_MODEL_NAME=gpt-4o-mini
LAW_API_KEY= # 선택, https://open.law.go.kr 발급 (미설정 시 샘플 법령 데이터)
TAVILY_API_KEY= # 선택, 웹 검색
ENABLE_CHROMA=false # true 시 Chroma 벡터 검색 활성화
ML_ENABLE_KOBERT=true # false 시 KoBERT 기반 모델 로딩 생략 (메모리 절약)
DATABASE_URL= # 미설정 시 SQLite
프론트엔드는 frontend/.env.local에 NEXT_PUBLIC_API_URL을 지정합니다.
| Method | Endpoint | 설명 |
|---|---|---|
| POST | /api/conversation/start · /answer · /finalize | 대화형 접수 3단계 |
| POST | /api/chat | 분석 파이프라인 일괄 실행 |
| GET | /api/chat/stream | 분석 파이프라인 SSE 스트리밍 |
| POST | /api/session/{id}/bill | 정식 법안 형식 변환 |
| GET | /api/session/{id}/download/docx | 제안서 DOCX 다운로드 |
| GET | /api/clusters · /api/cluster/{id} | 집단 의견 클러스터 조회 |
| POST | /api/upload | 첨부파일 업로드 및 텍스트 추출 |
| POST | /api/voice/transcribe | 음성 → 텍스트 |