내 AI 사이드 프로젝트가 EU AI Act 감사를 통과하지 못했어요 — 해결 방법
Source: Dev.to
저는 작은 AI 앱을 만들고 있었습니다 — LangChain 기반 도구로 법률 문서를 요약하는 앱이죠. 별다른 것이 아니라 주말에 만지작거리던 사이드 프로젝트였습니다.
그때 GitHub 토론에서 누군가가 저에게 물었습니다: “당신의 앱은 EU AI 법규를 준수하나요?”
솔직히 “내가 너무 작아서 신경 쓸 필요 없어.” 라고 답했죠. 그런데 제가 틀렸다는 걸 알게 되었습니다.
EU AI 법은 귀사의 규모에 신경 쓰지 않습니다
2025년 2월에 적용이 시작된(2026년 8월에 전면 시행) 규정은 EU 시장에 제공되는 any AI system을 포괄합니다. 여기에는 다음이 포함됩니다:
- 사용자 10명인 귀사의 SaaS
- GitHub에 있는 귀사의 open‑source tool
- EU‑citizen 데이터를 처리하는 경우 귀사의 internal tool
핵심 투명성 요구사항에 대해 **no “small developer exemption”**는 없습니다. 프로덕션에서 AI 모델을 사용하고 있다면, 귀하는 의무를 지게 됩니다.
저는 실제 규정 텍스트(전체 144페이지)를 읽어봤기 때문에 압니다(금요일 저녁에 읽는 것은 권장하지 않습니다).
내 프로젝트를 스캔했습니다
내 레포지토리에 컴플라이언스 스캐너를 실행했습니다. 프로젝트 구조는 다음과 같습니다:
├── app.py # LangChain 파이프라인
├── requirements.txt # langchain, openai
├── prompts/
│ └── summarizer.py # 시스템 프롬프트
└── README.md # "요약 도구"
스캔 결과:
- LangChain 프레임워크 (
requirements.txt통해 감지) - OpenAI API 사용 (
app.py의 import 통해 감지)- 위험 카테고리: 제한됨 (텍스트‑생성 시스템)
그리고 제가 놓쳤던 점은 총 35 분이 걸린 세 가지였습니다.
1. 투명성 공개 없음
EU AI 법령 제 50조는 사용자가 AI‑생성 콘텐츠와 상호작용하고 있다는 사실을 알 수 있도록 요구합니다. 내 앱은 요약을 반환할 때 기계가 만든 것이라는 표시가 전혀 없었습니다.
Before
def summarize(document: str) -> str:
return chain.invoke({"document": document})
After
from datetime import datetime
def summarize(document: str) -> dict:
result = chain.invoke({"document": document})
return {
"summary": result,
"ai_disclosure": (
"This summary was generated by an AI system "
"(OpenAI GPT‑4 via LangChain)."
),
"model": "gpt-4",
"generated_at": datetime.utcnow().isoformat(),
}
소요 시간: 5 분. 이제 API 응답에 콘텐츠를 생성한 시스템에 대한 정보가 명시됩니다.
2. 기술 문서 부재
제한 위험 시스템이라 할지라도, 문서가 있느냐 없느냐가 “우리는 컴플라이언스를 진지하게 생각한다”와 “감사관이 나타났을 때 급히 대처한다” 사이의 차이를 만듭니다.
나는 세 줄짜리 README만 가지고 있었습니다. AI_COMPLIANCE.md에 추가한 내용은 다음과 같습니다:
# AI Compliance Documentation
시스템 개요
- 목적: LangChain + OpenAI GPT‑4를 사용하여 법률 문서를 요약합니다.
- 아키텍처: 문서를 받아 LangChain 체인에 전달하고 요약 및 공개 메타데이터가 포함된 JSON 페이로드를 반환하는 간단한 FastAPI 엔드포인트.
데이터 흐름
- 사용자가 문서(일반 텍스트 또는 PDF)를 업로드합니다.
- 문서는 HTTPS를 통해 백엔드로 전송됩니다.
- 백엔드가 OpenAI API를 호출합니다.
- 응답은 disclosure fields와 함께 래핑되어 사용자에게 반환됩니다.
위험 평가
- 위험 수준: 제한됨 (텍스트 생성).
- 완화 조치:
- 투명성 공개 (
app.py참조). - 요청 수명 주기 외에 원시 사용자 데이터를 저장하지 않음.
- 남용 방지를 위한 속도 제한.
- 투명성 공개 (
투명성 조치
- 모든 응답에는
ai_disclosure,model,generated_at필드가 포함됩니다. - UI에 배너가 표시됩니다: “이 요약은 AI에 의해 생성되었습니다.”
유지보수 및 업데이트
- 의존성은
requirements.txt에 고정됩니다. - 보안 패치는 릴리스 후 7 일 이내에 적용됩니다.
- 컴플라이언스 스캔은 CI를 통해 매주 실행됩니다.
연락처
- 개발자: Arkforge (@arkforge‑ceo)
- 이메일: security@example.com
### 3. (Placeholder for the third fix)
*You can continue adding the remaining two items in the same structured format.*
AI 시스템 문서화
- 목적: 빠른 검토를 위한 법률 문서 요약
- 모델: LangChain을 통한 OpenAI GPT‑4
- 학습 데이터: 없음 (API를 통해 사전 학습된 모델 사용)
- 위험 카테고리: 제한됨 (AI‑생성 텍스트, 제 50조)
- 투명성: 모든 출력에 AI 공개 포함
- 제한 사항: 복잡한 법률 언어의 뉘앙스를 놓칠 수 있음. 법률 자문으로 사용하기에 적합하지 않음.
- 인간 감독: 요약은 검토 보조용으로만 사용
- 데이터 보관: 세션 종료 후 사용자 데이터는 저장되지 않음
입력/출력 감사
import logging
import uuid
logger = logging.getLogger("ai_audit")
def summarize_with_audit(document: str) -> dict:
request_id = uuid.uuid4().hex[:8]
logger.info(f"[{request_id}] Input length: {len(document)} chars")
result = chain.invoke({"document": document})
logger.info(f"[{request_id}] Output length: {len(result)} chars")
return {
"summary": result,
"request_id": request_id,
"ai_disclosure": "Generated by AI (OpenAI GPT‑4)"
}
소요 시간: 10 분 – 이제 모든 요청에 추적이 기록됩니다.
나를 놀라게 한 점
- 수정 작업이 쉽게 진행됨 – 총 노력 시간 약 35 분.
- 어려웠던 부분은 인식: 무엇을 해야 하는지 알았음.
- 내 프로젝트는 제한‑위험으로 판정되었으며, 고위험이 아니었습니다. 대부분의 개발자 도구는 이 카테고리에 속하며, 주된 의무는 투명성과 문서화에 국한됩니다.
자동화된 컴플라이언스 체크 (GitHub Action)
# .github/workflows/ai-compliance.yml
name: EU AI Act Compliance Check
on: [push, pull_request]
jobs:
compliance:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Detect AI frameworks
run: |
echo "=== Scanning for AI frameworks ==="
FOUND=$(grep -rl "import openai\|from langchain\|import anthropic\|import transformers" \
--include="*.py" . 2>/dev/null | wc -l)
echo "Files with AI imports: $FOUND"
if [ "$FOUND" -gt 0 ]; then
echo "AI frameworks detected — checking compliance..."
fi
- name: Verify transparency disclosure
run: |
DISCLOSURES=$(grep -rl "ai_disclosure\|AI-generated\|generated by AI" \
--include="*.py" . 2>/dev/null | wc -l)
if [ "$DISCLOSURES" -eq 0 ]; then
echo "::warning::No AI transparency disclosure found in code"
else
echo "Transparency disclosures found in $DISCLOSURES files"
fi
- name: Check compliance documentation
run: |
if [ ! -f "AI_COMPLIANCE.md" ]; then
echo "::warning::No AI_COMPLIANCE.md found"
echo "Consider adding AI system documentation"
else
echo "AI compliance documentation found"
fi
소요 시간: 10 분 – 명백한 컴플라이언스 항목을 잡아냅니다.
보다 깊은 스캔(16개의 AI 프레임워크를 감지하고 EU AI Act 의무와 매핑)에는 무료 MCP compliance scanner를 사용합니다.
과거의 나에게 주는 조언
- 첫 날부터
AI_COMPLIANCE.md추가 – 약 20 분 소요, 시스템에 대해 생각하게 함. - 모든 AI 출력에 태그 달기 – 응답 스키마에
ai_disclosure필드를 넣으면 가장 쉬운 의무를 충족. - 위험 카테고리 파악 – 대부분의 사이드 프로젝트는 “제한” 또는 “최소” 위험으로, 의무가 가벼움.
- 요청 ID 로그 – 컴플라이언스와 LLM 출력 디버깅 모두에 필수.
EU AI Act는 인디 프로젝트를 죽이려는 것이 아니라, 사람들이 AI가 관여한 결정을 인식하도록 하는 데 목적이 있습니다. 2026년 8월 시행 마감일을 앞두고 지금 시작하면 나중에 급하게 대응할 필요가 없습니다.
