LangGraph 기반 대한민국 국회의원 의정활동 추적 AI 에이전트
LangGraph 기반 국회의원 의정활동 분석 웹으로, 열린국회정보 API 등을 주로 활용해 발의법안, 표결, 정당 일치도, 공동발의 네트워크, 최근 이슈를 분석합니다.
복잡하고 산재된 국회 의정 활동 데이터를 통합 수집 및 분석하여 시민들이 의정 활동을 감시하고, 최근 이슈를 쉽게 알 수 있도록 하였습니다. 또한, 언론인에게는 감시 저널리즘(Watchdog Journalism)을 효과적으로 수행할 수 있는 데이터 기반의 취재 단서와 객관적 검증 도구를 제공합니다.
🌐 URL: https://national-assembly.streamlit.app/
- 의원 프로필 관리: 국회의원 이름, 사진, 정당, 지역 등 기본 정보를 열린국회정보 API에서 조회
- 의원 목록 브라우저: 카드 형식의 대수별 의원 목록 브라우저
- 대수별 필터링 (2대~22대)
- 정당·지역·위원회별 다중 필터
- 이름·지역·위원회 검색
- 정렬 옵션 (이름순·정당순·지역순·위원회순)
- 재임 기간 분석: 의원의 재임 대수 및 연임 여부 확인
- 위원회 정보: 현재 소속 위원회 및 직책 정보
- 대표발의 및 공동발의 조회: 대한민국 국회 열린데이터광장 API를 통한 의원별 발의법안 통합 조회
- 발의 역할 구성: 대표발의 vs 공동발의 비중을 시각화하여 입법 활동 수준 파악
- 소관위원회별 분석:
- 위원회별 발의건수를 Treemap 차트로 시각화
- 주요 소관위원회 통계
- 발의법안 통계:
- 처리결과별 통계 (폐기·상정중·통과·부결 등)
- 시간대별 추이 분석
- 입법 관심 분야 분석: LLM을 활용한 발의법안 주제 자동 분류 및 의정 활동 특성 해석
- 발의법안 상세 원자료: CSV 다운로드 가능한 완전한 발의법안 데이터 테이블
- 1차 Ego-Network 시각화: vis.js 기반 대화형 네트워크 그래프
- 대상 의원을 중심으로 공동발의 파트너를 연결
- 공동발의 빈도에 따른 노드 크기 동적 조정
- 협업 건수에 따른 엣지 두께 조정
- 협업 유형 분류:
- 당내 협업 (초록색): 같은 정당 의원들과의 협업
- 당외 협업 (주황색): 다른 정당 의원들과의 협업
- 초당성 지수로 교차-정당 협업 패턴 분석
- 협업 통계:
- 협업 파트너 수 및 협업 연결 건수
- 당내/당외 협업 비율
- 소관위원회별 네트워크 필터링: 특정 위원회에서의 협업 파트너만 표시
- 반복 협업 분석:
- Top 10 협업 의원 순위 막대 차트
- 최근 공동발의 일시 추적
- 협업 소관위원회 통계
- 협업 해석: LLM 분석을 통한 협업 패턴의 정치적·정책적 의미 해석
- 표결 기록 통합 조회: 의원별 본회의 표결 기록을 대수별로 수집
- 표결 결과 분류:
- 찬성 표결 분석
- 반대 표결 분석
- 기권 표결 분석
- 불참 표결 분석
- 표결 요약 차트:
- 대수별 표결 통계 (찬성·반대·기권·불참 분포)
- 시간대 추이 분석
- 표결 상세 조회 범위 설정:
- 최근 N건 조회 (기본값: 200건)
- 전체 재임 대수 표결 조회 옵션
- 추가 대수 선택적 조회 기능
- 표결 상세 원자료:
- 의안명, 투표일, 위원회, 정책명, 표결값 등 완전한 정보
- CSV 다운로드 가능
- 표결 통계 해석: 조회 범위 및 불참 비중을 고려한 주의사항 자동 생성
- 당파성 분석: 의원의 표결이 같은 정당의 다수 입장과 얼마나 일치하는지 분석
- 일치도 계산:
- 각 표결에서 같은 정당 의원들의 찬성·반대 비율 계산
- 해당 의원의 표결이 다수 입장과 일치/이탈 판정
- 일치도 요약 차트:
- 전체 일치도 구성 (일치·이탈·불참·판정제외) 파이 차트
- 대수별 정당 일치도 추이 스택 차트
- 이탈 표결 상세 분석: 정당 다수 입장에 반대한 표결 리스트
- 표결일, 의안명, 정당 다수 입장 vs 개인 표결 비교
- 범위 재분석 기능:
- 초기 조회된 표결 범위 내에서 최근 N건으로 재계산
- 동적 임계값 조정 (50~500건)
- 재분석 결과 실시간 비교
- 정당 일치도 상태: 캐시 적중 현황 및 추가 API 호출 현황 추적
- Google News RSS 기반 검색: 의원명 + 정당명으로 최근 공개 뉴스 자동 수집
- 뉴스 요약:
- LLM을 활용한 최근 이슈 분석 및 요약
- 검색 결과 기반 자동 맥락 파악
- 뉴스 타임라인 시각화: 발행일 기준 뉴스 타임라인 표시
- 뉴스 테이블 필터링:
- 제목·언론사·날짜 기반 검색 필터
- 원문 링크 (새 탭 오픈)
- 뉴스 원자료: 완전한 기사 메타데이터 CSV 다운로드
- 핵심 브리핑: 발의법안·표결·정당 일치도·최근 뉴스 수를 바탕으로 한 3~5문장 요약
- KPI 대시보드:
- 발의법안 총 건수
- 표결 참여 총 건수
- 정당 일치율
- 최근 뉴스 수
- 의원 프로필 요약: 정당·지역·위원회·재임 기간 등 상세 프로필 정보
- 조회 범위 명시:
- 의원 기본정보 조회 대수
- 발의법안 조회 대수
- 표결정보 초기 조회 대수
- 표결정보 추가 선택 가능 대수
- 다중 탭 인터페이스:
- 요약 탭: 종합 지표 및 분석 결과
- 발의 법안 탭: 법안 분석 및 네트워크
- 표결 탭: 투표 기록 및 상세 분석
- 정당 일치도 탭: 당파성 분석 및 이탈 추적
- 최근 이슈 탭: 뉴스 검색 결과 및 분석
- 원자료 탭: JSON 데이터 및 오류 메시지
- 조회 범위 제어:
- 발의법안: 최근 재임 대수 vs 전체 재임 대수
- 표결: 최근 N건 (50~1000건)
- 정당 일치도: 최근 N건 (50~500건)
- 분석 모듈 토글:
- 발의법안 조회 활성화/비활성화
- 초기 표결 상세 조회 활성화/비활성화
- 정당 일치도 분석 활성화/비활성화
- 최근 뉴스 검색 활성화/비활성화
- LLM 분석 활성화/비활성화
- 세부 설정: 고급 옵션으로 세밀한 조회 범위 조정
- 개인 Gemini API 키 관리: 사용자 브라우저에만 저장되는 보안 입력
- 자동화된 11단계 분석 파이프라인:
- 입력값 정리 (사용자 요청 및 옵션 정규화)
- 의원 기본정보 조회 (재임 대수, 정당, 선거구 확인)
- 발의법안 조회 (대표발의 및 공동발의 수집)
- 입법 관심 분야 분석 (발의법안 통계 요약)
- 공동발의 네트워크 분석 (파트너 및 협업 패턴 계산)
- 표결 상세 조회 (찬성·반대·기권·불참 분류)
- 정당 다수 입장 일치도 분석 (일치율 계산)
- 표결 해석 메모 생성 (분석 범위·불참 비중 고려)
- 최근 이슈 검색 (Google News RSS 기반 수집)
- 핵심 브리핑 생성 (주요 활동 요약)
- 최종 결과 정리 (화면 표시 형태로 정렬)
- 진행상황 추적: 각 단계별 진행률 및 상태 메시지 실시간 표시
- 오류 처리: 단계별 오류 발생 시 상세 메시지 기록
- CSV 다운로드: 모든 데이터 테이블에서 CSV 형식으로 다운로드 가능
- 발의법안 데이터
- 표결 기록 (찬성·반대·기권·불참별)
- 공동발의자 정보
- 최근 뉴스 목록
- 캐시 시스템: 의원 목록 24시간 캐시로 빠른 조회
- JSON 원자료: 전체 분석 결과를 JSON으로 조회 및 검증
본 시스템은 3개의 데이터 수집 레이어와 LangGraph 기반의 AI 추론 레이어로 구성되어 있습니다.
┌────────────────────────────────────────────────────────────────────────────────┐
│ 🔹 데이터 수집 레이어 (Data Collection Layer) │
├────────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐ │
│ │ 의원 기본정보 API │ │ 발의법안 API │ │ 표결정보 API │ │
│ │ │ │ │ │ │ │
│ │ 열린국회정보 │ │ 열린국회정보 │ │ 열린국회정보 │ │
│ │ - 의원정보 │ │ - 대표발의 │ │ - 본회의 표결 │ │
│ │ - 정당, 지역 │ │ - 공동발의 │ │ - 표결결과 │ │
│ │ - 위원회 │ │ - 처리결과 │ │ - 표결자세정보 │ │
│ └───────────────────┘ └───────────────────┘ └───────────────────┘ │
│ │ │ │ │
│ └────────────────────────┼────────────────────────┘ │
│ │ │
│ ┌───────▼───────┐ │
│ │ 뉴스 검색 API │ │
│ │ │ │
│ │Google News RSS│ │
│ │- 의원명 검색 │ │
│ │- 정당명 검색 │ │
│ │- 최근 기사 │ │
│ └───────┬───────┘ │
│ │ │
└───────────────────────────────────────┼────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────────────────────────┐
│ 🟡 데이터 정규화 & 캐싱 레이어 │
│ (Data Normalization & Caching Layer) │
├────────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────────────────────────────────────────────────────────────┐ │
│ │ • 데이터 전처리 및 정규화 │ │
│ │ • 의원 정보 / 법안 정보 / 표결 정보 통합 │ │
│ │ • 24시간 캐시 시스템 (의원 목록) │ │
│ │ • 병렬 처리 (표결 상세 조회) │ │
│ └────────────────────────────────────────────────────────────────────────┘ │
│ │
└───────────────────────────────────────┬────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────────────────────────┐
│ 🟢 LangGraph 기반 AI 추론 & 분석 레이어 │
│ (LangGraph AI Inference & Analysis Layer) │
├────────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─ 단계 1 ──────────────────────┐ │
│ │ 입력값 정리 │ │
│ │ normalize_user_request │ │
│ └──────────────┬────────────────┘ │
│ │ │
│ ┌─ 단계 2 ──────────────────────┐ │
│ │ 의원 기본정보 조회 │ │
│ │ get_member_info │ │
│ └──────────────┬────────────────┘ │
│ │ │
│ ┌─ 단계 3 ──────────────────────┐ │
│ │ 발의법안 조회 │ │
│ │ search_member_bills │ │
│ └──────────────┬────────────────┘ │
│ │ │
│ ┌─ 단계 4 ──────────────────────┐ │
│ │ 입법 관심 분야 분석 (LLM) │ ◀── Gemini LLM │
│ │ analyze_legislative_inter │ (선택사항) │
│ └──────────────┬────────────────┘ │
│ │ │
│ ┌─ 단계 5 ──────────────────────┐ │
│ │ 공동발의 네트워크 분석 │ │
│ │ analyze_cosponsor_network │ │
│ └──────────────┬────────────────┘ │
│ │ │
│ ┌─ 단계 6 ──────────────────────┐ │
│ │ 표결 상세 조회 │ │
│ │ get_all_member_votes │ │
│ └──────────────┬────────────────┘ │
│ │ │
│ ┌─ 단계 7 ──────────────────────┐ │
│ │ 정당 일치도 분석 │ │
│ │ analyze_party_alignment │ │
│ └──────────────┬────────────────┘ │
│ │ │
│ ┌─ 단계 8 ──────────────────────┐ │
│ │ 표결 해석 메모 생성 (LLM) │ ◀── Gemini LLM │
│ │ interpret_vote_stats │ (선택사항) │
│ └──────────────┬────────────────┘ │
│ │ │
│ ┌─ 단계 9 ──────────────────────┐ │
│ │ 최근 이슈 검색 │ │
│ │ search_recent_news │ │
│ └──────────────┬────────────────┘ │
│ │ │
│ ┌─ 단계 10 ─────────────────────┐ │
│ │ 핵심 브리핑 생성 (LLM) │ ◀── Gemini LLM │
│ │ generate_activity_briefing │ (선택사항) │
│ └──────────────┬────────────────┘ │
│ │ │
│ ┌─ 단계 11 ─────────────────────┐ │
│ │ 최종 결과 정리 │ │
│ │ summarize_member_activities │ │
│ └──────────────┬────────────────┘ │
│ │ │
└───────────────────────────────────────┼────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────────────────────────┐
│ 🔵 결과 렌더링 레이어 (Rendering Layer) │
├────────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐ │
│ │ Streamlit │ │ ECharts 차트 │ │ Vis.js 네트워크 │ │
│ │ 웹 인터페이스 │ │ 시각화 │ │ 그래프 시각화 │ │
│ │ │ │ │ │ │ │
│ │ • 대시보드 │ │ • 막대/파이차트 │ │ • Ego-Network │ │
│ │ • 탭 인터페이스 │ │ • 시계열 차트 │ │ • 협업 관계 │ │
│ │ • 필터링 UI │ │ • Treemap │ │ • 동적 레이아웃 │ │
│ └───────────────────┘ └───────────────────┘ └───────────────────┘ │
│ │ │ │ │
│ └────────────────────────┼────────────────────────┘ │
│ │ │
│ ┌───────▼───────┐ │
│ │ 사용자 │ │
│ └───────────────┘ │
│ │
└────────────────────────────────────────────────────────────────────────────────┘
| 단계 | 노드명 | 역할 | 입력 | 출력 |
|---|---|---|---|---|
| 1️⃣ | normalize_user_request |
사용자 요청 정규화 | 의원명, 분석 옵션 | 정규화된 상태 |
| 2️⃣ | get_member_info |
의원 정보 조회 | 의원명 | 재임 대수, 정당, 위원회 |
| 3️⃣ | search_member_bills |
발의법안 수집 | 의원명, 대수 범위 | 대표/공동발의 법안 목록 |
| 4️⃣ | analyze_legislative_interests |
입법 관심 분야 분석 (LLM) | 발의법안 목록 | 입법 관심사 분석 보고서 |
| 5️⃣ | analyze_cosponsor_network |
공동발의 네트워크 분석 | 발의법안 목록 | 협업 파트너, 네트워크 구조 |
| 6️⃣ | get_all_member_votes |
표결 기록 조회 | 의원명, 조회 범위 | 찬성/반대/기권/불참 분류 |
| 7️⃣ | analyze_party_alignment |
정당 일치도 분석 | 표결 기록, 정당 정보 | 일치도, 이탈 표결 목록 |
| 8️⃣ | interpret_vote_statistics |
표결 해석 (LLM) | 표결 통계 | 주의사항, 해석 메모 |
| 9️⃣ | search_recent_member_news |
최근 이슈 검색 | 의원명, 정당명 | 뉴스 기사 목록 |
| 🔟 | generate_activity_briefing |
핵심 브리핑 (LLM) | 전체 분석 결과 | 3~5문장 요약 |
| 1️⃣1️⃣ | summarize_member_activity |
최종 결과 정리 | 전체 분석 결과 | 화면 표시 형식의 정렬된 결과 |
📂
├── 의원_활동_추적_랭그래프_워크플로우.ipynb
├── app.py (Streamlit 메인 애플리케이션)
├── src/
│ ├── member_activity_workflow.py
│ ├── member_directory.py
│ └── streamlit_runtime.py
├── requirements.txt
└── README.md
- Language: Python 3.10+
- Frameworks: LangGraph, LangChain
- Data Source: 대한민국 국회 열린데이터광장(Open API) 및 실시간 Google News 수집
- Streamlit: 수집된 의정 활동 데이터 및 LLM 추론 결과를 직관적인 웹 인터페이스로 시각화