내 AI 사이드 프로젝트가 EU AI Act 감사를 통과하지 못했어요 — 해결 방법

발행: (2026년 2월 20일 오전 12:36 GMT+9)
10 분 소요
원문: Dev.to

Source: Dev.to

Arkforge

저는 작은 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 엔드포인트.

데이터 흐름

  1. 사용자가 문서(일반 텍스트 또는 PDF)를 업로드합니다.
  2. 문서는 HTTPS를 통해 백엔드로 전송됩니다.
  3. 백엔드가 OpenAI API를 호출합니다.
  4. 응답은 disclosure fields와 함께 래핑되어 사용자에게 반환됩니다.

위험 평가

  • 위험 수준: 제한됨 (텍스트 생성).
  • 완화 조치:
    • 투명성 공개 (app.py 참조).
    • 요청 수명 주기 외에 원시 사용자 데이터를 저장하지 않음.
    • 남용 방지를 위한 속도 제한.

투명성 조치

  • 모든 응답에는 ai_disclosure, model, generated_at 필드가 포함됩니다.
  • UI에 배너가 표시됩니다: “이 요약은 AI에 의해 생성되었습니다.”

유지보수 및 업데이트

  • 의존성은 requirements.txt에 고정됩니다.
  • 보안 패치는 릴리스 후 7 일 이내에 적용됩니다.
  • 컴플라이언스 스캔은 CI를 통해 매주 실행됩니다.

연락처

### 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월 시행 마감일을 앞두고 지금 시작하면 나중에 급하게 대응할 필요가 없습니다.

0 조회
Back to Blog

관련 글

더 보기 »

Apex B. OpenClaw, 로컬 임베딩

Local Embeddings for Private Memory Search 기본적으로 OpenClaw의 memory search는 텍스트를 일반적으로 Anthropic 또는 OpenAI와 같은 외부 embedding API에 전송합니다.

Apex 1. OpenClaw, Providers 히스토리

ChatGPT, Anthropic 및 Google Gemini에서 채팅 기록 가져오기 OpenClaw로 할 수 있는 가장 강력한 기능 중 하나는 메모리를 bootstrap 하는 것입니다...