시맨틱 태그란? 시맨틱 태그(Semantic Tag)는 태그 이름만으로 문서의 구조나 콘텐츠의 역할을 알 수 있는 HTML 요소 입니다. <header> , <nav> , <main> , <article> , <section> , <footer> 등이 대표적입니다. 반면 <div> 와 <span> 은 그 자체로 특정한 콘텐츠 역할을 뜻하지 않는 일반 컨테이너입니다. 적절한 의미를 가진 태그가 있을 때는 시맨틱 태그를 사용하고, 의미를 부여할 필요가 없는 단순한 그룹에는 <div> 나 <span> 을 사용할 수 있습니다. <header> <nav aria-label="주 메뉴"> <!-- 메뉴 링크 --> </nav> </header> <main> <article> <h1>시맨틱 태그란?</h1> <p>태그의 의미를 활용해 문서 구조를 표현합니다.</p> </article> </main> <footer> <!-- 저작권 정보 --> </footer> 시맨틱 태그를 사용하면 좋은 점 1. 문서 구조와 코드의 의미가 분명해집니다 <div> 만 여러 겹 사용하는 것보다 <header> , <main> , <footer> 처럼 역할에 맞는 태그를 쓰면 각 영역이 무엇을 담당하는지 코드만 보고도 파악하기 쉽습니다. 태그 이름이 구조를 설명하므로 코드 가독성이 좋아지고, 불필요한 컨테이너 중첩을 줄이는 데도 도움이 됩니다. 이런 구조는 다른 개발자와 협업할 때도 유용합니다. 페이지의 영역과 역할을 빠르게 파악할 수 있어 코드를 수정하거나 기능을 추가하기가 수월해집니다. 2. 보조 기술을 통한 탐색에 도움이 됩니다 스크린 리더와 같은 보조 기술은 시맨틱 태그를 바탕으로 페이지의 랜드마크와 콘텐츠 구조를 파악할 수 있습니다. 사용자는 이를 활용해 페이지의 주요 영역을 알아보고, <nav> 나 <main> 같은 랜드마크 사이를 탐색할 수 있습니다. 다만 시맨틱 태그가 모든 환경에서 키보드 점프 기능을 자동으로 만들어 주는 것은 아닙니다. 실제 탐색 방식은 브라우저와 보조 기술에 따라 다를 수 있으며, 올바른 제목 구조와 폼 레이블, 이미지 대체 텍스트 등도 함께 갖춰야 접근성이 좋아집니다. 3. 검색 엔진이 문서 구조를 이해하는 데 도움이 됩니다 시맨틱 마크업은 검색 엔진을 포함한 기계가 페이지의 주요 콘텐츠와 영역을 이해하는 데 유용한 단서를 제공합니다. 하지만 시맨틱 태그를 사용했다고 검색 결과 순위나 노출이 자동으로 올라가는 것은 아닙니다. 태그는 콘텐츠의 의미와 구조를 올바르게 표현하는 데 사용해야 합니다. 자주 사용하는 시맨틱 태그 태그 주된 역할 <header> 페이지나 특정 영역의 머리말 <nav> 주요 탐색 링크 모음 <main> 페이지의 핵심 콘텐츠 <article> 독립적으로 배포하거나 재사용할 수 있는 콘텐츠 <section> 주제별 콘텐츠 영역. 보통 제목과 함께 사용 <aside> 본문과 간접적으로 관련된 보조 콘텐츠 <footer> 페이지나 특정 영역의 바닥글 모든 콘텐츠를 시맨틱 태그로 감쌀 필요는 없습니다. 적절한 의미를 표현할 요소가 없을 때는 <div> 나 <span> 을 사용하면 됩니다. 중요한 것은 태그를 단순히 모양 때문에 선택하지 않고, 콘텐츠의 역할에 맞게 사용하는 것입니다. 정리 시맨틱 태그는 HTML 문서의 구조와 콘텐츠의 역할을 명확하게 전달합니다. 이를 사용하면 코드를 읽고 유지보수하기 쉬워지고, 보조 기술과 검색 엔진이 문서 구조를 파악하는 데도 도움이 됩니다. 다만 접근성은 시맨틱 태그만으로 완성되지 않으며, SEO 효과도 검색 순위 상승을 보장하지 않습니다. 페이지를 만들 때는 먼저 각 콘텐츠가 어떤 역할을 하는지 생각하고, 그 역할에 맞는 태그를 선택하는 습관을 들여야겠습니다. 시맨틱 문서 구조 한눈에 보기
아이템의 수가 인간의 탐색 능력을 넘어선 지 오래 된 정보 과잉의 시대가 도래했다. 하지만 아이템이 기하급수적으로 늘어나면 실제 취향을 우연히 만날 확률이 0으로 수렴하게 된다. 탐색 비용 증가 검색에 실패하지 않도록 유도하는 과정이 필요로 되어졌고, 누군가 대신 골라줘야 하는 상황이 생겼다. 선택의 역설 선택이 많아질 수록 결정을 포기하게 된다. (Schwartz, 2004) 좋은 추천은 선택지를 늘리는게 아니라 줄여주는 것이다. 사진 출처 따라서 추천시스템은 search에 초점을 둔 것이 아니라 filtering에 초점을 둔 분야이다. 1. Recommendation System Overview 추천 시스템의 수학적 정의 효용 함수 $f$는 아래와 같이 설계되어야 한다. 서비스마다 다르게 설정 한 사람만을 위한 것이 아니기에 일반화 필요 (다중 이해 관계자) 효용 함수 $f$가 고려해야 하는 challenge $f$를 직접 관찰할 수 없음 $U \times I$ 가 큼 data문제로 인해, 행동의 일부만 보임 시스템 문제로 인해, 모든 쌍을 평가 불가 추천 시스템의 단계 추천 시스템은 3가지 process로 세분화 된다. 모두에게 같은 model로 출발하여, 한 사람만의 비개인화 model로 만든다. 단계가 진행되면 진행 될 수록 비용이 높아진다. 실제 서비스는 세 단계를 섞어서 사용하며, 신규 유저에게는 step1, 데이터가 쌓이면 step3를 사용한다. step 1. 비개인화 인기 차트 & 베스트 셀러 모두에게 동일하게 보여줌 (cold start의 표준 해법) = 본인의 data를 제공하지만 추천을 하는 상태는 아님 step 2. 세그먼트 개인화 '20대에게 인기', '지역별'과 같은 집단 단위 맞춤 data에 존재하는 edge로 route 만들 수 있음 (추천 경로) (Problem) data가 많아지면 많아질 수록 경로가 많아짐 step 3. 완전 개인화 Segment (or Grouping) 행동 이력 기반 1:1 (이 분야의 주제) 위의 문제를 해결하기 위해 data를 model로 학습 Search vs Recommendation Search는 의도를 해석하지만, Recommendation은 의도를 발명해야되기에 Recommendation이 더 어렵다. (ex. Search=Google / Recommendation=Netflix) 그리고 최근 자동완성 / 피드 랭킹과 같은 것 때문에 Search와 Recommendation의 경계가 흐려지는 중이다. 2. Challenges of Recommendation System 2-1. 미니 MovieLens 추천 시스템 문제의 분류 Rating Prediction (평점 예측) 빈칸의 값 자체를 맞추는 Regression 문제 Ranking (Top-K 랭킹) 각 유저에게 길이 K의 목록을 만드는 문제(틀려도 순서만 맞으면 됨) 평점을 잘 맞추는 model이 랭킹 목록을 잘 만든다는 보장이 없기에, 두 문제를 분류한다. Explicit vs Implicit Feedback 둘 다 중요하지만 Implicit Feedback이 현대 서비스에서 더 중요하다. Explicit Feedback : 조작이 가능한 data (ex. 네이버 리뷰 이벤트) Implicit Feedback : 조작이 어려움 추천 data의 Challenges Sparsity (희소성) : User들이 같은 영화를 평가할 확률 조차 희박 → 유사도 계산부터 흔들림 Cold Start (콜드 스타트) : 신규 user 행과 신규 item 열은 통째로 빈칸 Long-tail (롱테일) : 상위 소수 item에 집중되고, 대부분은 거의 노출되지 않음 → 추천의 존재 이유가 사라짐 이 3가지의 공통 해결책은 '행렬 바깥의 정보를 끌어오기'이다. Context 함수 $f$의 모든 가정은 '취향은 고정되어 있다' 라는 것이다. 하지만 현실의 취향은 두 시간 축에서 움직인다. $f(u,i) → f(u,i,t)$ (시간 t, 세 번째 인자) drift (장기 변화) : 나이&생애 단계에 따른 취향 이동 (오래된 data의 weight를 낮춰야 한다) session (단기 맥락) : 방금 본 것이 다음 선택을 강하게 결정 (직전 행동이 최고의 신호로 여겨질 수 있게 weight를 높여야 한다) 3. System (=Pipeline) 규모의 문제 / Candidate Generation(후보 생성) / Ranking(랭킹) / Re-ranking(리랭킹) / 순환 구조 하나의 거대한 model이 아니라, 역할이 다른 단계들의 깔대기(funnel)가 답이다. 정밀한 model은 느려서 전체에 못 쓰고, 빠른 model은 거칠어서 최종 선택을 못 맡김 (하나의 model만으로는 만족시킬 수 없음) solution : 먼저 후보를 좁히고, 좁혀진 후보만 평가 (funnel의 각 단계는 서로 다른 알고리즘, 목표를 가짐) 4.
Longest Common Subsequence (LCS) 개념 Longest Common Subsequence (최장 공통 부분 수열) 두 문자열에서 문자의 상대적인 순서를 유지하면서 공통으로 만들 수 있는 가장 긴 Subsequence (부분 수열) 의 길이를 구한다. Subsequence (부분 수열) : 일부 문자를 삭제할 수 있지만 순서는 변경할 수 없음 연속할 필요는 없음 → Substring (부분 문자열) 과 차이 길이 n 인 문자열은 총 2^n 개의 부분 수열을 가짐 예: s1 = "AGGTAB" s2 = "GXTXAYB" LCS = "GTAB" length = 4 핵심 아이디어 두 문자열의 길이를 각각 m , n 이라 하고 마지막 문자를 비교한다. 1. 마지막 문자가 같음 s1[m-1] == s2[n-1] 해당 문자는 LCS에 포함시킬 수 있으므로 LCS(m, n) = 1 + LCS(m-1, n-1) 2. 마지막 문자가 다름 둘 중 하나는 버려야 한다. LCS(m, n) = max( LCS(m-1, n), LCS(m, n-1) ) Base Case (기저 조건) 둘 중 하나가 빈 문자열이면: LCS(0, n) = 0 LCS(m, 0) = 0 이 Recurrence Relation (점화식) 이 모든 풀이의 핵심이다. Naive Recursion (단순 재귀) 점화식을 그대로 재귀로 구현한다. 문자가 다를 때마다 (m-1, n) (m, n-1) 두 갈래로 분기한다. 같은 (m, n) 상태를 여러 번 계산하는 Overlapping Subproblems (중복 부분 문제) 가 발생한다. Time: 지수 시간 Space: 재귀 호출 스택 필요 따라서 입력이 커지면 비효율적이다. Memoization / Top-Down DP (메모이제이션 / 하향식 DP) 재귀 결과 LCS(m, n) 을 memo[m][n] 에 저장한다. 이미 계산됨 → 바로 반환 아직 없음 → 계산 후 저장 가능한 상태는 0 <= i <= m 0 <= j <= n 이므로 최대 (m+1)(n+1) 개. Time: O(mn) Space: O(mn) + 재귀 스택 핵심은 중복 계산 제거 . Bottom-Up DP / Tabulation (상향식 DP / 테이블화) dp[i][j] 를 다음과 같이 정의한다. s1 의 처음 i 개 문자와 s2 의 처음 j 개 문자의 LCS 길이 초기값 dp[0][j] = 0 dp[i][0] = 0 빈 문자열과의 LCS는 항상 0 . Transition (상태 전이) if s1[i-1] == s2[j-1]: dp[i][j] = dp[i-1][j-1] + 1 else: dp[i][j] = max(dp[i-1][j], dp[i][j-1]) 최종 답: dp[m][n] Time: O(mn) Space: O(mn) Space Optimized DP (공간 최적화 DP) dp[i][j] 계산에 필요한 값은 사실 세 개뿐이다. dp[i-1][j] // 위 dp[i][j-1] // 왼쪽 dp[i-1][j-1] // 왼쪽 위 따라서 모든 행을 저장할 필요가 없다. 1차원 DP dp[j] 를 갱신하기 전: dp 0 1 2 3 4 5 .. 0 i-1,j-1 i-1,j 1 i, j-1 i,j 2 3 4 5 dp[j] = 이전 행의 dp[i-1][j] dp[j-1] = 현재 행의 dp[i][j-1] prev = 이전 행의 dp[i-1][j-1] 그러므로: if match: dp[j] = prev + 1 else: dp[j] = max(dp[j], dp[j-1]) 단, dp[j] 를 덮어쓰기 전에 기존 값을 temp 에 보관하고 다음 반복의 prev 로 넘겨야 한다. temp = dp[j] 현재 dp[j] 계산 prev = temp Time: O(mn) Space: O(n) 더 짧은 문자열을 DP 배열로 잡으면 O(min(m,n)) 핵심 정리 dp[i][j] = s1[0..i-1], s2[0..j-1]의 LCS 길이 같으면: dp[i][j] = dp[i-1][j-1] + 1 다르면: dp[i][j] = max(dp[i-1][j], dp[i][j-1]) LCS는 대표적인 Dynamic Programming (동적 계획법) 문제이며, 2개의 문자열 Prefix (접두 구간)를 상태로 만들고, 마지막 문자의 일치 여부에 따라 상태를 줄인다. 라는 관점이 핵심이다. 복잡도 방법 Time Space Naive Recursion (단순 재귀) Exponential 재귀 스택 Memoization (메모이제이션) O(mn) O(mn) Bottom-Up DP (상향식 DP) O(mn) O(mn) Space Optimized DP (공간 최적화) O(mn) O(min(m,n)) Applications (활용) Diff Utility (차이 비교 도구) 파일 간 공통 부분 및 변경 내용 탐색 Version Control System (버전 관리 시스템) 에서 변경 사항 비교 GeeksforGeeks
면접 스크립 인공지능, 머신러닝, 딥러닝은 무엇인가요? 인공지능은 인간의 지능을 인공적으로 만드는 것으로 인식, 학습, 추론, 문제해결 등 지능적인 작업을 컴퓨터나 시스템을 통해 수행하는 가장 큰 상위 개념의 기술입니다. 머신러닝은 데이터를 기반으로 컴퓨터가 스스로 패턴을 학습하여 이를 바탕으로 예측된 값을 도출하는 분야입니다. 딥러닝은 딥뉴런 네트워크로 인간뇌의 신경구조망을 모방한 인공신경망 기반으로 학습하는 방법입니다. 1-1. 딥러닝이 기존 머신러닝보다 항상 좋은가요? 아닙니다. 데이터의 규모와 형태, 연산 비용, 해석 가능성에 따라 적합한 방법이 달라집니다. 데이터가 적거나 정형 데이터 중심인 문제에서는 머신러닝 방법이 더 적합할 수 있습니다. 지도학습, 비지도학습, 강화학습의 차이는 무엇인가요? 지도학습은 문제인 데이터와 라벨인 정답을 함께 알려주고 관계를 학습시키는 방법입니다. 비지도학습은 정답없이 데이터만 주고 학습시키는 방법입니다. 강화학습은 데이터 대신 환경과 상호작용하며 얻은 경험을 바탕으로, 누적 보상이 커지는 행동 방식을 학습이라고 합니다. 2-1. 강화학습의 보상과 지도학습의 정답은 어떻게 다른가요? 강화학습의 보상은 행동의 결과를 평가하며, 여러 행동 중 무엇이 결과에 기여했는지 판단해야합니다. 지도학습의 정답은 문제에 대해 원하는 출력을 직접 알려주는 것입니다. 분류인 클레스피케이션과 회귀의 레그레이션의 차이는 무엇인가요? 분류는 정상, 불량처럼 범주형 데이터를 예측하는 것입니다. 회귀는 판매량이나 온도처럼 연속적인 수치를 예측하는 것 입니다. 문제를 어떻게 정의하고 데이터를 어떻게 다루냐에 따라 달라집니다. 로지스틱 회귀란 무엇인가요? 로지스틱 회귀는 주로 이진분류에서 사용하는 모델로, 특정 클래스에 속할 확률을 예측하는 방법입니다. 기본적으로 여러값들에 각각의 가중치를 곱해 더하고, 편향을 더한 뒤, 시그모이드 함수를 적용하여 확률을 구하는 방식으로 작동합니다. 로직스틱 회귀는 이진분류를 위해 로짓을 선형회귀함으로써 분류를 수행하는 것입니다. 여기서 로짓이란 로그 오즈인데, 오즈는 승산을 뜻하고, 만약 이길 확률을 Q라고 했을떄, 1마이너스 Q분의 Q로 나타낸것이 오즈입니다. 이 오즈에 로그를 취한것이 바로 로짓입니다. 결과적으로 로지스틱회귀는 이 로짓을 바탕으로 도출된 입력의 관계를 선형적으로 모델링하고, 이 로짓의 역함수인 시그모이드 함수를 통해 최종 확률을 구하는 방식입니다. 4-1. 로지스틱회귀는 회귀인가요? 분류인가요? 이름에는 회귀가 들어가지만 분류알고리즘입니다. 내부적으로 선형 회귀 방식을 사용하여 확률 또는 수치를 예측하지만 최종 목적이 클래스를 구분하는 이진 분류로 0 또는 1이기 때문에 분류 알고리즘으로 정의합니다. 4.2. 로지스틱 회귀에서 로스는 무엇을 사용하고, 학습은 어떻게 되는가요? 로지스틱 회귀에서 이진분류를 할때는 바이너리 크로스엔트로피를 손실함수로 사용합니다. 학습은 어떻게 되나면 이 로스인 손실함수를 각 가중치인 웨이트에 대해 편미분한 기울기인 그라디언트를 구하는 것으로 시작합니다. 구한 그라디언트의 반대 방향에 학습률을 곱해서 가중치를 업데이트합니다. 왜냐면 그라디언트는 무조건 가장 가파른 방향을 향하기 때문에 손실이 가장 빠르게 증가하는 방향을 나타내기 때문입니다. 따라서 그 반대 방향으로 이동함으로 손실을 효과적으로 줄여나갈 수 있습니다. 이때 그라디언트의 크기가 너무 클 수 있으므로, 학습률을 곱해 가중치가 업데이트되는 보폭을 조절합니다. 가중치를 업데이트 할때는 경사하강법외에서 발전된 SGD, 아담과 같은 최적화 옵티미제이션 알고리즘을 사용할 수 있습니다. 4-3. 그라디언트는 무엇인가요? 그라디언트란 손실을 가중치와 편향에 대해 편미분한 결과를 하나의 벡터로 모은 기울기 벡터입니다. 수학적으로 그라디언트는 손실이 가장 빠르게 증가하는 방향을 가르키기 때문에, 현재 파라미터 값에서 그라디언트를 구한 뒤, 그 반대 방향으로 학습률을 곱해 업데이트하며 손실을 줄여나가는 방식이 경상하강법의 원리입니다. 하지만 경사하강법은 글로벌 미니멈이 아닌 로컬 미니멈에 빠질 수 있고, 모든 데이터를 고려하기 때문에 업데이트가 오래 걸리는 단점들이 있습니다. 이를 보완하기 위해 등장한 SGD는 단 하나의 데이터만 가지고 그라디언트를 구하므로 속도가 훨씬 빠르고, 노이즈 덕분에 로컬 미니멈에서 탈출할 기회도 가질 수 있습니다.
전에 FMS 파일 목록을 매번 직접 검색하지 않고 한 번 인덱싱해서 H2에서 검색하게 바꿨다. 근데 실제 연결 쪽에서 또 문제가 있었다. /api/drive/list 요청이 정상적으로 끝나지 않는 경우가 있었다. 코드만 보면 요청도 보내고 있었고 URL이나 세션 설정도 들어가 있었다. 근데 어디에서 막히는지 알기가 애매했다. 그래서 이번에는 기능을 더 만드는 것보다 FMS 요청이 어느 단계에서 실패하는지 확인할 수 있게 만드는 작업 을 먼저 했다. 오류를 그냥 FMS 실패 하나로 두지 않았다 기존에는 연결이 안 되면 대부분 FMS 연결 설정과 서버 상태를 확인하세요. 정도로 끝났다. 이러면 설정 문제인지 연결 자체가 안 되는 건지 timeout인지 HTTP 오류인지 응답 형식이 이상한 건지 구분하기 어려웠다. 그래서 오류에 단계랑 종류를 따로 넣었다. Stage CONFIG LIST PERMISSION DOWNLOAD INDEX_WRITE VALIDATION 그리고 실패 종류도 나눴다. INVALID_CONFIG TIMEOUT CONNECTION_REFUSED HTTP_ERROR INVALID_RESPONSE INVALID_ROOT IO_ERROR 이제 로그를 보면 최소한 어디에서 실패했는지는 알 수 있게 했다. 그렇다고 경로나 세션을 로그에 찍지는 않았다 진단 정보가 필요하다고 해서 FMS 경로나 세션 값을 그대로 남길 수는 없었다. 그래서 로그에는 이런 정보만 남겼다. scheme host port HTTP status 요청 시간 HTTP version proxy 사용 여부 세션 존재 여부 세션 값 자체는 안 찍고 sessionPresent=true 정도로만 남긴다. 파일 경로나 요청 query도 로그에는 넣지 않았다. 그러다 HTTP 버전 쪽을 보게 됐다 로그를 추가해서 확인하다 보니까 배포된 HTTP reverse proxy 환경에서 Java HttpClient 의 cleartext HTTP/2 upgrade가 걸리는 부분을 보게 됐다. 그래서 FMS 목록 조회 요청만 builder.version(HttpClient.Version.HTTP_1_1); 로 고정했다. /api/drive/list 는 HTTP/1.1로 보내도록 바꿨다. 처음에는 FMS API 문제인가 싶었는데 실제로는 요청을 보내는 방식 쪽도 같이 봐야 했다. 이래서 로그가 필요했던 거였다. 인덱스 갱신 실패도 단계별로 남겼다 Drive 인덱스 갱신은 설정 확인 ↓ FMS 목록 조회 ↓ 파일 수집 ↓ H2 인덱스 저장 순서로 간다. 그래서 실패했을 때도 LIST에서 실패한 건지 INDEX_WRITE에서 실패한 건지 구분해서 로그를 남기게 했다. 화면에는 여전히 상세한 내부 오류를 보여주지 않는다. 사용자 화면에는 FAILED 정도만 보여주고 원인 확인은 서버 로그에서 하는 방식이다. 이번에는 기능보다 진단 가능하게 만드는 게 먼저였다 처음에는 인덱스만 만들면 FMS 검색 문제는 어느 정도 끝날 줄 알았다. 근데 실제 서버 연결까지 가니까 “왜 안 되는지 알 수 있는 구조”가 없으면 수정도 어렵다는 걸 바로 느꼈다. 이번 작업은 결국 FMS 실패 하나로 뭉뚱그리던 걸 어느 단계에서 어떤 종류로 왜 실패했는지 확인할 수 있게 바꾼 작업이었다. 그리고 그 과정에서 FMS 목록 요청은 HTTP/1.1로 보내도록 수정했다.
도구를 사용하는 LLM의 안전성을 평가하려면 허용된 작업의 완료 여부, 실제 실행한 행동, 권한 준수, 재현 조건 을 함께 확인해야 한다. 최종 답변이 정확해도 실행 과정에서 요청 범위를 벗어났다면 업무 전체를 성공으로 보기 어렵다. 비드래프트의 AX-RAY 관련 보도는 이 문제를 생각할 출발점이다. 이 글은 발표 수치를 짧게 정리한 뒤, 개발자가 평가 결과를 업무 환경에 적용할 때 필요한 질문을 다룬다. 직접 실행한 벤치마크나 AX-RAY 내부 구현 분석은 아니다. AI 생성 개념 이미지. 실제 AX-RAY 평가 화면이나 실험 결과가 아니다. 먼저 고정할 것: 날짜와 분모 2026년 10월 6일 IT조선 보도 에 따르면, 비드래프트는 공개 언어모델 40종을 대상으로 에이전트 안전성을 평가하고 10월 2일 측정을 마친 25종의 결과를 발표했다. 이 가운데 23종이 회사 기준에서 위험 판정을 받았다. 23/25는 92%다. 이 비율을 해석할 때에는 세 가지 범위를 유지해야 한다. 평가 대상은 40종이지만 발표 당시 완료된 표본은 25종이다. 위험은 해당 평가 체계의 판정이며 실제 침해 사고의 발생률이 아니다. 발표 시점의 결과를 개별 모델의 영구 등급이나 현재 순위로 사용할 수 없다. 기사에는 평균 점수가 높더라도 치명적인 항목을 통과하지 못하면 위험으로 분류한다는 규칙도 나온다. 총점과 치명 실패 여부를 함께 봐야 하는 구조다. 1. 성공의 정의에 실행 범위를 포함하기 도구를 쓰는 에이전트의 성공을 최종 답변만으로 판정하면 놓치는 부분이 생긴다. 결과 문서가 정확하더라도 그 과정에서 요청 범위 밖의 자료를 변경했다면, 업무 전체를 성공으로 간주하기 어렵다. 예를 들어 문서 목록을 분류하는 작업을 생각해 보자. 분류 결과가 맞는지와 원본이 변경되지 않았는지는 별개의 확인 대상이다. 사용자가 목록 정리만 요청했다면 결과의 유용성과 원본 보존을 함께 만족해야 한다. 이는 특정 AX-RAY 시나리오를 재현한 예가 아니라 평가 설계상의 가정이다. 이런 관점에서는 평가 사례마다 최소한 다음 정보가 필요하다. 사용자가 요청한 목표와 허용한 행동 접근 가능한 자료와 도구의 범위 완료 후 기대하는 결과 및 유지돼야 할 상태 추가 확인이나 중단이 필요한 조건 실제 실행 내용과 최종 상태를 판단할 근거 이 목록은 이 글의 제안이며 AX-RAY의 공개 스키마를 옮긴 것이 아니다. 평가의 성공 조건을 명시해야 결과를 구현이나 운영 환경과 연결할 수 있다는 취지다. 2. 입력의 내용과 입력의 권한 구분하기 에이전트가 읽는 텍스트에는 여러 역할이 섞일 수 있다. 사용자의 요청, 참고 문서, 검색 결과, 도구의 응답이 모두 문장으로 들어오더라도 같은 권한을 가진 지시는 아니다. 회의록에 “자료를 수정한다”는 문장이 있다고 해서 그 문장을 읽는 에이전트가 즉시 원본을 바꿔도 된다는 뜻은 아니다. 그 문장은 회의에서 논의한 계획일 수도 있다. 에이전트는 자료의 내용을 이해하면서도 현재 작업의 승인 범위를 유지해야 한다. 기사에 소개된 권한 초과와 외부 자료의 악의적 지시 수용 같은 시험 항목은 이 경계를 살펴보게 한다. 개발자가 결과를 읽을 때에는 에이전트가 어떤 자료를 읽었는지만큼 그 자료가 실행 판단에 어떤 영향을 미쳤는지도 확인할 필요가 있다. 단순히 최종 답변에서 문제 문장이 사라졌다는 사실만으로 실행 과정까지 안전했다고 결론 내리기는 어렵다. 반대로 관련 용어를 답변에 언급했다는 이유만으로 위험 행동이 있었다고 볼 수도 없다. 답변의 표현과 실제 행동은 각각의 근거로 판단해야 한다. 3. 안전한 거절과 정상 업무 완료를 함께 측정하기 위험한 행동을 줄이는 지표만 최적화하면 허용된 요청까지 거절하는 시스템을 높게 평가할 수 있다. 업무 도입에서는 잘못된 실행뿐 아니라 불필요한 중단도 비용이 된다. 따라서 정상적으로 허용된 요청, 권한이 부족한 요청, 추가 정보가 필요한 요청을 구분해 평가하는 접근이 유용하다. 각 경우의 기대 행동을 먼저 정하고 결과를 비교하는 것이다. 허용된 작업에는 완료가, 승인이 부족한 작업에는 확인이, 허용되지 않은 행동에는 중단이 적절할 수 있다. 맥락을 비교할 때에는 변경한 조건도 분명해야 한다. 사용자의 승인 여부가 바뀐 것인지, 참고 자료의 내용만 달라진 것인지가 불명확하면 모델이 무엇에 반응했는지 해석하기 어렵다. 모든 시험에서 무조건 같은 답을 내는지보다, 정당한 조건의 변화에 맞게 행동을 조절하는지 살펴볼 이유다. 다만 이 논의는 도입팀의 평가 설계 제안이다. 공개 기사와 소개 문서만으로 AX-RAY가 정상 업무 완료율이나 과잉 거절을 어떤 방식으로 측정하는지 확인했다고 주장할 수는 없다. 4. 총점과 치명 실패를 함께 읽기 평균 점수는 전반적인 성과를 압축하는 데 유용하다. 그러나 실패의 비용은 항목마다 다르다. 결과 표현이 어색한 경우와 승인되지 않은 변경이 발생한 경우를 동일한 단위로 평균 내면 운영상 중요한 차이가 가려질 수 있다. 기사에서 설명한 치명 항목 기준은 이 문제를 드러낸다. 다만 치명 실패 여부가 유용한 지표가 되려면 판정 기준과 근거도 읽을 수 있어야 한다. 개발자가 확인할 질문은 다음과 같다. 어떤 결과나 행동을 치명 실패로 정의했는가? 판정에 사용한 관측 정보는 무엇인가? 시도 횟수와 실행 조건은 어떻게 정했는가? 실패한 사례를 같은 조건에서 다시 확인할 수 있는가? 한 번의 결과만 보아도 중요한 결함을 발견할 수 있다. 동시에 실패가 얼마나 반복되는지와 어떤 조건에서 달라지는지를 알면 개선 우선순위를 정하기가 쉬워진다. 발표된 수치를 해석하는 일과 실서비스 위험을 추정하는 일 사이에는 이러한 추가 근거가 필요하다. 5. 모델 이름만으로 재현 조건을 대신하지 않기 에이전트 평가를 재현하려면 모델 외의 조건도 중요하다. 같은 모델이라도 지시문, 연결 도구, 허용 권한, 작업 자료가 다르면 수행할 수 있는 행동이 달라진다. 버전과 설정, 평가 시점을 함께 기록해야 결과가 무엇을 설명하는지 좁힐 수 있다. 도입 검증에서도 “이 모델이 통과했는가”라는 질문에 “어떤 구성에서 어떤 업무를 통과했는가”를 덧붙이는 편이 낫다. 초안만 만드는 구성에서 얻은 근거를 실제 변경 권한이 있는 구성에 그대로 적용하기는 어렵다. 도구나 권한이 바뀌면 재점검의 범위도 검토해야 한다. AX-Ray 공개 README 는 전체 진단 체계를 3개 축, 11개 범주, 117개 항목으로 소개한다. 이 전체 목록의 규모가 기사 속 25종에 적용된 시험 범위와 같다고 단정해서는 안 된다. 체계의 소개와 개별 실행의 조건을 따로 확인하는 것이 출발점이다. 개발팀에 남는 질문 AX-RAY 보도를 통해 가져갈 만한 것은 특정 순위보다 평가의 관점이다. 에이전트의 유용성을 판단하려면 허용된 업무를 완료했는지 확인해야 하고, 안전성을 판단하려면 그 과정의 행동이 허용 범위를 지켰는지도 확인해야 한다. 도입 검토 문서에 총점 하나를 추가하는 것으로 끝내기보다 작업별 성공 조건, 중요한 실패의 정의, 관측 근거, 재평가 조건을 함께 적어 보자. 점수가 어떤 결정을 뒷받침할 수 있는지 분명해지고, 아직 근거가 부족한 부분도 드러난다. 안전성 평가는 모델에 붙이는 한 줄짜리 수식어보다 구체적이어야 한다. 실제로 맡길 업무와 권한, 실패 후 대응까지 설명할 때 개발자가 사용할 수 있는 판단 근거가 된다. 자주 묻는 질문 AX-RAY의 위험 판정은 실제 사고율인가? 해당 평가 조건에서 나온 진단 결과다. 기사에 소개된 23/25는 10월 2일 발표 당시 측정이 끝난 모델의 분모이며, 실제 고객 환경의 사고율이나 현재 모델 순위로 해석할 수 없다. 에이전트 평가를 재현하려면 무엇을 기록해야 하나? 모델 버전과 실행 설정, 사용자 목표, 연결 도구와 권한, 입력 자료, 시도 횟수, 판정 기준과 실행 기록이 필요하다. 이는 도입팀을 위한 기록 제안이며 AX-RAY의 공개 스키마를 옮긴 목록은 아니다. 참고 자료 IT조선: 비드래프트 “AI 모델 25종 중 23종서 위험 행동 확인” , 2026년 10월 6일 AX-Ray 공개 Space 발표 사실과 이 글의 평가 설계 제안을 구분해 작성했다. 현재 리더보드의 개별 등급이나 실제 침해 사례를 독립 검증한 글은 아니다.
Por Lawrence Dauchy, fundador de VP0 Publicado el 7 de octubre de 2026 La mejor inspiración para diseño web combina galerías de páginas reales, ejemplos del mismo tipo de proyecto y una selección de patrones que puedas adaptar a tu contenido. Si también estás diseñando una app iOS, VP0 aporta un punto de partida gratuito con interfaces preparadas para trabajar con herramientas de IA. Para una web, conviene explorar Awwwards, Landbook, Siteinspire, One Page Love y Lapa Ninja según lo que necesites resolver: composición, páginas de presentación, portfolios o secciones concretas. La clave está en salir de la búsqueda con decisiones claras sobre estructura, tipografía, navegación y contenido. ¿Dónde encontrar inspiración de diseño web que puedas utilizar? Empieza por referencias que resuelvan un problema parecido al tuyo. Una tienda, un portfolio y una página para presentar un software necesitan estructuras distintas, aunque compartan colores o tipografías. Antes de abrir una galería, escribe una frase que describa el objetivo de tu página. Por ejemplo: «Quiero que una persona entienda mi servicio y solicite una consulta». Esa frase te ayudará a descartar diseños atractivos que complican la acción principal. Después, separa tu búsqueda en tres niveles: Estructura: qué aparece primero y cómo se organiza el recorrido. Componentes: cómo funcionan la navegación, las tarjetas, los formularios y los botones. Dirección visual: qué transmiten la tipografía, las imágenes, los colores y los espacios. Una referencia puede servirte únicamente para uno de esos niveles. No necesitas adoptar toda la página porque te guste su cabecera. Si tu proyecto incluye una app iOS, VP0 puede ayudarte a estudiar pantallas y flujos con una base de implementación. Su biblioteca se centra en interfaces móviles; para decidir la estructura de una web, utiliza también ejemplos de páginas reales. Guarda cada referencia con una nota concreta. «Me gusta» aporta poco cuando vuelves a revisarla. «El formulario aparece después de explicar el servicio y pide pocos datos» ya es una decisión que puedes evaluar. Limita la primera selección a cinco o seis ejemplos. Con demasiadas referencias, resulta difícil distinguir qué necesita tu proyecto y qué simplemente te llamó la atención. ¿Cuáles son las mejores galerías de inspiración web para 2026? Estas galerías sirven para búsquedas distintas. Elige según el problema que estás resolviendo, sin tratar sus ejemplos como una clasificación universal de calidad. Awwwards: explorar dirección artística e interacción Awwwards reúne referencias de diseño web y proyectos reconocidos por su propuesta visual. Yo lo abriría para estudiar composiciones expresivas, transiciones y formas de presentar una marca. Observa cómo se relacionan el texto, la imagen y el movimiento. Después, visita la página real para comprobar si esa propuesta sigue siendo cómoda al navegar. Un ejemplo con animaciones elaboradas puede darte una buena idea para una transición. Eso no significa que debas reproducir toda su complejidad en una web pequeña. Landbook: comparar composiciones y secciones Landbook es una galería de diseño web con filtros por industria, estilo y tipo de proyecto. También permite explorar referencias de secciones. Puede ayudarte cuando ya conoces el formato que necesitas: una presentación de producto, una web de servicios o un portfolio. Mi criterio sería comparar cómo varios ejemplos organizan el mismo contenido. Fíjate en la relación entre titular, descripción, imagen y botón, y en cómo cambia esa composición cuando el texto ocupa más espacio. Siteinspire: estudiar tipografía y organización Siteinspire presenta proyectos clasificados por estilos, tipos y temas. Lo utilizaría para buscar referencias de jerarquía tipográfica, retículas y páginas editoriales. Examina cómo se distinguen los niveles de información. Una página puede parecer sencilla y, aun así, estar cuidadosamente construida mediante tamaños, alineaciones y espacios. La pregunta útil es: «¿Qué decisiones hacen que este contenido resulte fácil de recorrer?». One Page Love: organizar una página única One Page Love se centra en webs de una sola página y ejemplos de secciones. Es una referencia práctica para presentar un servicio, un evento, una app o un proyecto personal. Estudia el orden del recorrido: presentación, detalles, pruebas, preguntas y acción final. Ese orden puede darte más ideas que los efectos visuales. Antes de elegir este formato, comprueba si tu contenido cabe en una página sin dificultar la navegación. Lapa Ninja: comparar páginas de presentación Lapa Ninja reúne ejemplos de landing pages. Yo lo utilizaría para comparar cómo distintas propuestas presentan un producto y conducen hacia una acción. Observa especialmente la primera pantalla, las demostraciones y las explicaciones de beneficios. Después, comprueba si la referencia sirve para tu cantidad de contenido. Ninguna galería garantiza que un diseño vaya a funcionar para tu negocio. Sus ejemplos son material de estudio; la decisión depende de tu público y de lo que necesita hacer. ¿Cómo analizar una web sin copiarla? Analiza la lógica del diseño y exprésala con tus propios recursos. Puedes aprender de una composición sin reproducir sus textos, fotografías, ilustraciones o identidad. Empieza por la primera pantalla. Pregúntate qué entiendes antes de desplazarte: qué ofrece la página, a quién se dirige y cuál es el siguiente paso. Después, recorre el contenido y anota cómo responde a las dudas del visitante. Quizá muestra el producto antes de explicar sus funciones. Quizá presenta casos concretos antes del formulario. Lo útil es comprender por qué ese orden tiene sentido. Convierte la referencia en reglas En lugar de escribir «quiero una web como esta», define decisiones observables: Un titular que explique el resultado principal. Una imagen que muestre el producto en uso. Un botón principal con una acción concreta. Secciones diferenciadas mediante espacio y encabezados. Una navegación breve con nombres comprensibles. Esas reglas pueden producir una página propia, aunque procedan del análisis de varias referencias. Comprueba el diseño con tu contenido Una composición elegante puede depender de un titular corto, fotografías excepcionales o muy pocos elementos. Introduce tus textos e imágenes antes de decidir si te sirve. Si el diseño deja de funcionar cuando añades una descripción real, necesita adaptación. No recortes información importante únicamente para conservar el aspecto de la captura. Revisa también la versión móvil y las interacciones. Abre el menú, utiliza los botones y prueba el formulario. Las capturas muestran una parte del diseño; el comportamiento revela si puedes aprender algo útil de él. ¿Qué ideas de diseño web merece la pena probar en 2026? Prueba ideas que ayuden a explicar tu propuesta y organiza cada experimento alrededor de una necesidad concreta. El año del proyecto no obliga a incorporar todos los estilos que aparecen en las galerías. Tipografía con una función clara Un titular grande puede aportar personalidad si explica algo específico. «Organiza las reservas de tu estudio» comunica más que una frase abstracta sobre transformar experiencias. Prueba los tamaños con palabras largas y en pantallas pequeñas. Mantén suficiente diferencia entre títulos, subtítulos y texto para que el recorrido sea visible. Retículas de tarjetas con prioridades Las tarjetas permiten agrupar información distinta, pero necesitan una jerarquía. Dale más espacio a la idea principal y reduce el protagonismo de los detalles secundarios. Para presentar una herramienta de planificación, podrías mostrar primero una vista del calendario y después tarjetas de tareas, recordatorios y organización semanal. En móvil, revisa el orden de lectura. Una composición equilibrada en escritorio puede convertirse en una secuencia confusa al apilarse. Imágenes que expliquen el producto Una captura con contenido comprensible suele aportar más información que una interfaz decorativa llena de datos ficticios. Si muestras un panel, utiliza nombres, estados y acciones que el visitante pueda interpretar. Si vendes un producto físico, combina una vista general con detalles que ayuden a evaluar su uso. Movimiento que acompañe una acción Reserva las animaciones para indicar cambios, confirmar acciones o explicar relaciones entre elementos. Como criterio de diseño, evitaría que el movimiento retrase el acceso al contenido. Comprueba también la experiencia con movimiento reducido. Una página debe seguir siendo comprensible cuando desaparecen los efectos decorativos. Espacios que agrupen información El espacio permite distinguir qué elementos pertenecen al mismo bloque. Ajusta las separaciones según esa relación. Un subtítulo debería quedar cerca del texto que introduce. Un botón debería relacionarse visualmente con la acción que propone. Esa coherencia suele aportar más que añadir otra sombra o degradado. ¿Cómo pasar de las referencias a un diseño propio? Construye primero una versión sencilla con contenido real. Después, utiliza las referencias para resolver decisiones que siguen abiertas. Puedes seguir este recorrido sin diseñar todas las páginas a la vez. 1. Define la acción principal Elige una acción prioritaria: pedir información, reservar, comprar, descargar o consultar proyectos. Puedes ofrecer alternativas, pero la página necesita una dirección reconocible. Escribe también qué necesita saber una persona antes de realizar esa acción. Esa lista será la base del contenido. 2. Ordena las secciones Para una página de servicios, un primer esquema podría ser: Qué haces y para quién. Qué problema resuelves. Cómo funciona el servicio. Ejemplos o pruebas disponibles. Condiciones y preguntas habituales. Formulario de contacto. Cambia el orden si tu público necesita otra explicación. Una estructura es un punto de partida que debes contrastar con el contenido. 3. Elige pocas referencias Selecciona una para la estructura, otra para la t
1. 캐스케이드 (Cascade) CSS를 작성하다 보면 하나의 HTML 요소에 서로 다른 스타일 규칙이 동시에 적용될 수 있습니다. 이때 브라우저는 정해진 우선순위에 따라 어떤 값을 화면에 적용할지 결정합니다. 이 과정을 캐스케이드(Cascade) 라고 합니다. 예를 들어 같은 문단에 다음 두 규칙이 적용되면, 두 규칙의 다른 우선순위 조건이 같을 때 나중에 작성한 값이 적용됩니다. p { color: red; } p { color: blue; } 이 경우 문단 글자색은 파란색입니다. 캐스케이드의 주요 판별 기준 기초적으로 캐스케이드의 우선순위를 중요도와 출처, 명시도(특수성), 코드 순서 로 나누어 이해할 수 있습니다. 실제 브라우저는 캐스케이드 레이어와 같은 기준도 함께 확인하므로, 코드 순서는 앞의 우선순위 조건이 같을 때 최종적으로 비교됩니다. 1. 중요도와 스타일 출처 CSS 규칙에는 브라우저 기본 스타일(User Agent), 사용자 스타일, 개발자가 작성한 스타일이 있습니다. 일반 선언끼리는 보통 개발자 스타일이 사용자 스타일보다 우선하고, 사용자 스타일은 브라우저 기본 스타일보다 우선합니다. 속성값 뒤에 !important 를 붙이면 일반 선언보다 우선합니다. 하지만 !important 가 출처와 관계없이 무조건 가장 강한 것은 아닙니다. 중요 선언끼리는 우선순위가 다시 출처에 따라 달라지며, 브라우저의 중요 선언이나 사용자의 중요 선언은 개발자의 중요 선언보다 우선할 수 있습니다. CSS 전환 중인 값처럼 별도로 높은 우선순위를 갖는 경우도 있습니다. p { color: blue; } p { color: red !important; } 위 예시에서는 !important 가 붙은 red 가 적용됩니다. 다만 !important 를 자주 사용하면 스타일의 우선순위를 추적하기 어려워지므로 꼭 필요한 경우에만 사용하는 편이 좋습니다. 인라인 스타일( style="..." )은 일반적인 스타일시트의 일반 선언보다 우선하지만, 이것도 모든 CSS 선언을 무조건 이기는 것은 아닙니다. 특히 !important 가 붙은 선언과의 우선순위도 함께 따져야 합니다. 2. 명시도(특수성, Specificity) 중요도 조건이 같으면 선택자가 얼마나 구체적인지 비교합니다. 특수성은 보통 다음 세 항목의 묶음으로 나타냅니다. 선택자 종류 특수성 항목 예시 ID 선택자 ID 개수 #header → (1, 0, 0) 클래스·속성·의사 클래스 해당 개수 .btn , [type="text"] , :hover → (0, 1, 0) 태그·의사 요소 해당 개수 div , ::before → (0, 0, 1) 세 항목은 왼쪽부터 차례로 비교합니다. 따라서 ID 항목이 더 큰 선택자는 클래스나 태그 개수가 많더라도 우선합니다. 조합자( , > , + , ~ )와 전체 선택자( * )는 특수성을 더하지 않습니다. 선택자 계산 특수성 h1 태그 1개 (0, 0, 1) .box .title 클래스 2개 (0, 2, 0) #nav ul li ID 1개, 태그 2개 (1, 0, 2) a.btn:hover 클래스 2개, 태그 1개 (0, 2, 1) 예를 들어 다음 규칙은 같은 요소에 적용될 때 ID 선택자를 포함한 #title 쪽이 더 높은 특수성을 갖습니다. .title { color: blue; } #title { color: green; } 특수성은 흔히 점수라고 부르지만, (1, 0, 0) 을 (0, 100, 0) 처럼 단순 합산해 비교하지 않습니다. 각 자릿수를 왼쪽부터 비교합니다. 인라인 스타일은 이 선택자 특수성 표에 단순히 (1, 0, 0, 0) 으로 더하는 방식이 아니라 별도의 우선순위로 다룹니다. !important 도 특수성 점수가 아니라 중요도를 나타냅니다. 3. 코드 순서 (Source Order) 중요도와 출처, 레이어, 특수성이 모두 같으면 나중에 작성된 선언이 적용됩니다. h1 { color: red; } h1 { color: blue; } 두 선택자는 모두 h1 이라 특수성이 같습니다. 따라서 아래쪽에 나중에 작성된 color: blue 가 최종 적용됩니다. 2. 캐스케이드 우선순위 규칙 (Specificity) 선택자끼리 명시도를 비교할 때는 (ID, 클래스·속성·의사 클래스, 태그·의사 요소) 순서로 셉니다. 왼쪽 항목부터 비교하고, 앞 항목이 같을 때 다음 항목을 비교합니다. 계산 예시 h1 → 태그 1개: (0, 0, 1) .box .title → 클래스 2개: (0, 2, 0) #nav ul li → ID 1개, 태그 2개: (1, 0, 2) a.btn:hover → 클래스 2개, 태그 1개: (0, 2, 1) 예를 들어 (1, 0, 0) 은 (0, 99, 99) 보다 우선합니다. ID 항목이 클래스와 태그 항목보다 왼쪽에 있기 때문입니다. 반대로 같은 항목의 개수가 같으면 다음 항목과 코드 순서를 차례로 비교합니다. 종합 예시 <h1 id="title" class="main-title" style="color: purple;"> CSS 캐스케이드 테스트 </h1> h1 { color: gray; } .main-title { color: blue; } #title { color: green; } .main-title { color: orange; } 위 코드에서 인라인 스타일은 일반적인 스타일시트의 일반 선언보다 우선하므로 글자색은 보라색입니다. 인라인 스타일을 제거하면 ID 선택자인 #title 의 초록색이 적용됩니다. ID 규칙도 제거하면 클래스 선택자가 태그 선택자보다 우선하며, 두 .main-title 규칙끼리는 나중에 작성된 주황색이 적용됩니다. 정리 캐스케이드는 여러 CSS 선언 중 최종 스타일을 결정하는 과정입니다. 먼저 출처와 중요도 같은 상위 조건을 비교하고, 선택자의 특수성을 확인합니다. 이 조건들이 같을 때 소스 순서가 마지막 판단 기준이 됩니다. 따라서 스타일이 예상과 다르게 적용되면 무조건 !important 를 추가하기보다, 어떤 선언들이 충돌하는지 확인하고 우선순위를 차례로 비교하는 것이 좋습니다. 참고 자료 W3C CSS Cascading and Inheritance MDN: Specificity
파이썬 예외처리 제대로 이해하기 코드를 짜다 보면 생각지도 못한 곳에서 프로그램이 멈추는 일이 생긴다. 숫자가 들어올 줄 알았던 자리에 문자열이 들어오기도 하고, 있어야 할 파일이 없기도 하다. 예외처리는 이런 상황에서 프로그램이 그냥 죽어버리지 않고 내가 정한 방식대로 대응하게 만드는 장치다. 이번 글에서는 기본 문법부터 예외 계층, 사용자 정의 예외, 그리고 3.11 이후에 추가된 기능까지 순서대로 정리해 봤다. 1. 예외와 문법 오류는 다르다 먼저 헷갈리기 쉬운 부분부터 짚고 넘어가자. 문법 오류(SyntaxError)는 코드를 해석하는 단계에서 걸린다. 실행 자체가 안 되기 때문에 예외처리로 잡을 수 없다. 예외는 문법은 맞는데 실행 중에 문제가 생기는 경우다. 10 / 0 을 하면 ZeroDivisionError, int("abc") 를 하면 ValueError, 없는 파일을 열면 FileNotFoundError가 난다. 예외가 발생하면 파이썬은 호출 스택을 거슬러 올라가면서 이걸 처리해 줄 except 를 찾는다. 끝까지 못 찾으면 프로그램이 종료되고 우리가 흔히 보는 Traceback이 찍힌다. 2. 기본 구조와 실행 흐름 try: value = int(user_input) # 예외가 날 수 있는 코드 except ValueError as e: print(f"숫자가 아닙니다: {e}") # 해당 예외가 났을 때 else: print(f"변환 성공: {value}") # 예외가 없을 때만 실행 finally: print("항상 실행") # 성공이든 실패든 실행 블록별로 하는 일은 이렇다. try : 감시할 코드. 범위는 최대한 좁게 잡는 게 좋다. except : 특정 예외를 처리한다. 여러 개를 둘 수 있고 위에서부터 차례로 검사한다. else : try가 성공했을 때만 실행된다. 성공 이후의 작업을 try 밖으로 빼두면, 원래 잡으려던 게 아닌 예외까지 같이 잡히는 걸 막을 수 있다. finally : 파일 닫기나 DB 연결 해제 같은 정리 작업을 둔다. 중간에 return 이 있어도 실행된다. 여러 예외를 한 번에 잡고 싶으면 튜플로 묶으면 된다. except (ValueError, TypeError) as e: ... 3. 예외 계층 구조를 알아야 하는 이유 파이썬의 예외는 클래스 상속 구조로 되어 있다. BaseException ├── SystemExit, KeyboardInterrupt, GeneratorExit └── Exception ├── ArithmeticError → ZeroDivisionError ├── LookupError → KeyError, IndexError ├── OSError → FileNotFoundError, PermissionError └── ValueError, TypeError ... 이 구조를 알면 자연스럽게 따라오는 원칙이 몇 가지 있다. 첫째, 구체적인 예외를 위에 쓴다. except Exception 을 먼저 써버리면 그 아래에 있는 except KeyError 는 영원히 실행되지 않는다. 둘째, 아무것도 지정하지 않은 except: 는 쓰지 않는다. 이렇게 하면 KeyboardInterrupt 까지 잡혀서 Ctrl+C로도 프로그램이 안 꺼지는 상황이 생긴다. 셋째, except Exception: pass 처럼 예외를 그냥 삼키지 않는다. 당장은 조용해서 좋아 보여도, 나중에 버그가 어디서 났는지 찾을 방법이 사라진다. 4. 예외를 직접 발생시키기: raise와 예외 체이닝 조건에 맞지 않을 때 직접 예외를 던질 수도 있다. def withdraw(balance, amount): if amount > balance: raise ValueError("잔액이 부족합니다") return balance - amount 어떤 예외를 잡아서 더 의미 있는 예외로 바꿔 던지고 싶을 때는 raise ... from ... 을 쓴다. try: price = float(row["close"]) except (KeyError, ValueError) as e: raise DataParseError(f"종가 파싱 실패: {row}") from e from e 를 붙여두면 원래 원인이 Traceback에 같이 남기 때문에 왜 실패했는지 추적하기가 훨씬 쉽다. 원인을 일부러 숨기고 싶다면 from None 을 쓰면 된다. 잡은 예외를 손대지 않고 그대로 다시 던질 때는 인자 없이 raise 만 쓴다. 5. 사용자 정의 예외 내 코드의 상황에 맞는 예외를 직접 만들어 두면 코드가 무슨 의도로 쓰였는지 훨씬 잘 드러난다. class DataPipelineError(Exception): """파이프라인 공통 상위 예외""" class DataParseError(DataPipelineError): pass class MissingDataError(DataPipelineError): pass 공통 상위 클래스를 하나 두는 게 포인트다. 이렇게 하면 호출하는 쪽에서 except DataPipelineError 로 한꺼번에 잡을 수도 있고, 필요하면 세부 예외만 골라서 잡을 수도 있다. 라이브러리들이 많이 쓰는 방식이기도 하다. 6. with문으로 정리 작업 맡기기 try/finally 로 직접 자원을 닫는 대신 with 를 쓰면 예외가 나더라도 알아서 정리된다. with open("prices.csv", encoding="utf-8") as f: data = f.read() # 블록을 빠져나오면 예외가 났든 안 났든 파일은 닫혀 있다 내부적으로는 __exit__ 메서드가 예외 정보를 넘겨받아 정리를 처리한다. 직접 만들어 쓰고 싶다면 contextlib.contextmanager 데코레이터가 편하다. 특정 예외는 그냥 무시해도 되는 상황이라면 contextlib.suppress(FileNotFoundError) 처럼 쓰는 것도 깔끔하다. 7. EAFP vs LBYL 예외를 다루는 스타일에는 크게 두 가지가 있다. 방식 의미 예시 LBYL (Look Before You Leap) 먼저 확인하고 실행 if key in d: x = d[key] EAFP (Easier to Ask Forgiveness than Permission) 일단 해보고 실패하면 처리 try: x = d[key] / except KeyError: 파이썬에서는 전통적으로 EAFP를 더 선호한다. 확인하고 실행하는 사이에 상태가 바뀌는 문제를 피할 수 있기 때문이다. 예를 들어 파일이 있는지 확인한 직후에 다른 프로세스가 그 파일을 지워버리면 확인한 의미가 없어진다. 다만 예외가 아주 자주 발생하는 상황이라면 예외 처리 비용이 쌓이기 때문에 LBYL이 오히려 빠를 수 있다. 결국 상황을 보고 고르면 된다. 8. Python 3.11부터 추가된 기능 ExceptionGroup과 except* 비동기 작업처럼 여러 예외가 동시에 터질 수 있는 상황을 위해 생겼다. try: raise ExceptionGroup("여러 오류", [ValueError("a"), KeyError("b")]) except* ValueError as eg: print("ValueError 처리:", eg.exceptions) except* KeyError as eg: print("KeyError 처리:", eg.exceptions) 일반 except 와 달리 except* 는 그룹 안에서 해당하는 예외만 골라서 처리하고, 나머지는 다음 except* 로 넘긴다. add_note() 예외에 맥락 정보를 덧붙일 수 있다. Traceback을 볼 때 어느 데이터에서 문제가 났는지 바로 알 수 있어서 꽤 유용하다. except ValueError as e: e.add_note(f"문제 행 번호: {i}") raise 9. 실무에서 기억해 둘 것들 마지막으로 실제로 코드를 짤 때 챙기면 좋은 것들을 모아봤다. try 블록에는 예외가 날 만한 줄만 넣는다. 처리할 수 있는 예외만 잡고, 처리할 수 없으면 다시 던진다. 로그는 logging.exception("메시지") 로 남기면 Traceback까지 같이 기록된다. 데이터를 반복 처리할 때는 한 행의 실패 때문에 전체가 멈추지 않도록 행 단위로 잡고, 실패한 건 따로 모아둔다. 정리 작업은 finally 보다 with 를 먼저 떠올린다. 4번은 결측치나 이상값이 섞인 대량 데이터를 다룰 때 특히 쓸모가 많다. errors = [] for i, row in enumerate(rows): try: process(row) except DataPipelineError as e: errors.append((i, str(e))) print(f"실패 {len(errors)}건") 마치며 예외처리는 단순히 에러 메시지를 숨기는 기술이 아니라, 실패했을 때 프로그램이 어떻게 행동할지를 설계하는 일이다. 어떤 예외를 잡고 어떤 예외는 위로 올려보낼지, 실패한 정보를 어떻게 남길지를 고민하다 보면 코드가 한결 단단해진다. 참고 자료 Python 공식 튜토리얼 - Errors and Exceptions Python 공식 문서 - Built-in Exceptions PEP 654 - Exception Groups and except* PEP 3134 - Exception Chaining and Embedded Tracebacks
웹사이트는 HTML로 뼈대 를 세우고, CSS로 옷 을 입히며, JavaScript로 생명력(기능/동작) 을 불어넣습니다. HTML (HyperText Markup Language) 뼈대와 구조 — 웹사이트의 '내용' 담당 "여기는 제목", "여기는 버튼이야", "여기는 이미지 자리야" CSS (Cascading Style Sheets) 꾸미기와 디자인 — 웹사이트의 '겉모습' 담당 "제목은 빨간색", "버튼은 둥글게", "이미지는 오른쪽에 배치해줘" JavaScript (JS) * 상호작용과 동작 * — 웹사이트의 '행동' 담당 "클릭하면 로그인 창을 띄워줘", "데이터를 서버로 보내줘"
렌더링 (Rendering)은 웹 브라우저의 본질과 브라우저가 일하는 과정을 의미하며, 서버로부터 브라우저가 받은 코드(텍스트)를 화면으로 그리는 과정 을 말한다. 웹 브라우저의 본질 · Browse (가볍게 둘러보다, 훑어보다): 전 세계에 흩어진 정보를 편하게 둘러보게 해 주는 도구 · 번역기: 서버가 주는 코드(텍스트)를 해석해서 이해 가능 하도록 우리가 보는 화면으로 번역 브라우저가 일하는 과정 (Rendering 구조) 브라우저 주소창에 www.naver.com 을 치면 요청 (Request) — "네이버 메인 페이지 좀 보여줘!" 전달 — 서버가 HTML·CSS·JS 파일을 보냄 해석 및 렌더링 (Rendering) — 코드를 위에서부터 한 줄씩 읽으며 그림을 그림 완성 (Completion) — 익숙한 네이버 화면이 나타남
양자 하드웨어에 새 백엔드를 추가할 때는 문제·평가 지표·허용 오차·측정 예산·후처리 범위 를 먼저 정해야 한다. 동일한 문제를 풀었다고 해도 컴파일 결과, 측정 횟수, 후처리가 다르면 성능 차이의 원인을 설명하기 어렵다. 2026년 10월 6일 한국경제가 전한 회사 발표에 따르면 비드래프트는 퀀티넘 Nexus 이용 기업으로 선정돼 평가용 할당량 안에서 H-Series를 활용하고 기술지원·온보딩을 받게 된다. 후속 협업은 초기 이용 이후 논의할 예정이다. 발표 내용 아래 절차는 재현 가능한 실기 실험을 위한 제안이다. 비드래프트의 내부 구현이나 실제 수행 결과를 설명한 것이 아니다. AI 생성 개념 이미지. 실제 H-Series 장비 사진 또는 실험 데이터 시각화가 아니다. 1. 백엔드를 바꾸기 전에 무엇을 고정할 것인가 같은 소스 회로를 두 환경에 제출했다는 사실만으로 비교 조건이 같아지는 것은 아니다. 회로가 각 장비에 맞게 변환되면 연산 구성과 비용이 달라질 수 있다. 실험자는 최소한 다음 항목을 먼저 정해야 한다. 문제의 입력과 크기: 동일한 사례를 사용하는지 확인한다. 평가 지표: 성공 확률, 관측량의 오차 등 목표에 맞는 지표를 정한다. 허용 오차: 어느 정도의 차이를 의미 있는 결과로 볼지 정한다. 자원 예산: 총 측정 횟수 또는 사용 가능한 자원 기준을 정한다. 비교 범위: 양자 실행 외에 전처리와 후처리를 어디까지 포함할지 정한다. 공정한 비교의 기준은 연구 질문에 따라 달라질 수 있다. 같은 측정 예산에서 정확도를 비교할 수도 있고, 같은 목표 정확도에 도달하는 데 필요한 자원을 비교할 수도 있다. 어느 쪽이든 결과를 본 뒤 유리한 기준을 고르는 일을 피하려면 사전에 정의하는 편이 좋다. 2. 이상적 계산과 잡음 모형과 실기를 연결하기 검증 경로는 세 단계로 나눠 설계할 수 있다. 첫째, 다룰 수 있는 작은 문제에서 이상적 계산 결과를 확보한다. 알고리즘이 의도한 값을 내는지 먼저 점검하는 단계다. 문제를 선택할 때는 고전 계산으로 기준값을 구할 수 있는 범위를 택하면 초기 오류를 찾기 쉽다. 둘째, 잡음을 반영한 에뮬레이터 결과를 비교한다. 퀀티넘 공식 문서는 에뮬레이터가 장비의 물리·오차 모형을 사용하며 잡음 설정을 조정할 수 있다고 설명한다. 따라서 ‘시뮬레이션 결과’라는 표지만으로 이상적 계산인지, 잡음을 포함한 계산인지 판단하면 안 된다. 공식 에뮬레이터 설명 셋째, 실제 장비에 실행한 결과를 앞의 두 결과와 비교한다. 모형의 예측과 실기 측정의 간격이 크다면 원인을 분해해야 한다. 회로 변환, 측정량, 오차 모형의 설정을 차례로 검토하고 한 번에 여러 조건을 바꾸지 않는 편이 해석에 유리하다. 이 경로의 목적은 세 결과가 항상 같아야 한다고 요구하는 데 있지 않다. 어느 단계에서 차이가 생겼는지 관찰하고, 다음 실험으로 확인할 가설을 줄여 가는 데 있다. 실기 접근의 가치는 이 피드백을 얻을 수 있다는 점에 있다. 3. 결과 파일보다 먼저 정할 실험 기록 Nexus는 여러 계산 백엔드의 작업 관리와 실험 데이터 보관을 지원한다. 공식 소개에는 백엔드 정보, 설정, 변수를 함께 저장하는 기능도 설명돼 있다. 이런 기능은 기록을 남기는 기반이며, 비교에 필요한 항목을 선택하는 작업은 실험 설계의 일부다. Nexus 공식 소개 개발 관점에서는 실험 하나를 다음 정보가 연결된 단위로 관리할 수 있다. 입력: 문제 식별자, 데이터 버전, 생성에 사용한 난수 시드 회로: 원본 회로, 컴파일 결과, 변환 옵션 환경: 백엔드 식별자, 사용한 SDK와 컴파일러 버전 실행: 작업 식별자, 제출·완료 시각, 요청·완료된 측정 횟수 분석: 원시 측정값, 후처리 코드 버전, 제외한 데이터와 이유 결과: 중심값, 변동 범위, 기준값과의 차이 이 목록은 Nexus API의 필드 명세가 아니라 연구팀이 관리할 기록의 예시다. 플랫폼에서 자동으로 얻는 항목과 직접 남겨야 하는 항목을 구분해서 구현해야 한다. 장비 제공자가 공개하지 않는 정보는 비워 두고, 알 수 없는 상태 자체를 표시하는 편이 추정값을 채우는 것보다 낫다. 원시 측정값을 보존하면 분석 코드를 바꿨을 때 같은 데이터를 다시 계산할 수 있다. 최종 평균값만으로는 후처리 변경의 영향을 검토하기 어렵다. 4. 제한된 할당량을 실험 질문에 배분하기 평가용 접근에서는 사용할 수 있는 자원을 먼저 확인해야 한다. Nexus 자체의 CPU·저장 공간 할당량과 외부 하드웨어 제공자의 실행 제한은 구분되는 개념이다. 플랫폼 화면의 사용량 하나만 보고 모든 실험 비용을 판단하기 어렵다. Nexus 할당량 문서 작은 진단 실험으로 컴파일과 결과 수집 경로를 확인한 뒤, 다음 실행을 결정하는 데 필요한 측정을 한다. 이때 초기 데이터를 본 뒤 지표나 제외 기준을 바꾸었다면 그 변경도 기록해야 한다. 탐색 실험과 최종 평가를 구분하면 결과 해석이 명확해진다. 또한 자원 일부를 반복 검증에 남겨 두는 편이 좋다. 한 설정에 예산을 모두 사용하면 결과가 예상 밖일 때 원인을 확인할 여지가 줄어든다. 배분 비율은 회로와 연구 목표에 따라 달라지므로 보편적인 숫자를 정하기보다, 어떤 결과가 나오면 다음 실험을 실행할지 기준을 마련해야 한다. 5. 성공을 보고할 때 함께 공개할 정보 좋은 결과를 얻었을 때는 개선 폭을 보여 주는 그림과 함께 비교의 범위를 설명해야 한다. 기준 방법이 충분히 최적화됐는지, 각 방법의 목표 정확도가 같았는지, 성공한 실행만 골라 보여 주지는 않았는지 확인할 수 있어야 한다. 측정 횟수가 다르면 관측된 차이에 포함된 통계적 불확실성도 달라질 수 있다. 반복 결과와 불확실성을 같이 제시하고, 사용한 계산 방법을 밝혀야 숫자의 의미를 판단하기 쉽다. 실험 중 실패한 작업이나 제외한 측정이 있다면 그 처리 방식도 남길 필요가 있다. 속도를 주장할 때는 시간의 정의가 특히 중요하다. 장치에서 실제 계산한 시간과 사용자가 결과를 받기까지의 시간은 측정 범위가 다르다. 후자에는 대기, 데이터 이동, 고전 연산이 포함될 수 있다. 어떤 시간을 비교했는지 명시하면 후속 연구가 같은 기준으로 결과를 해석할 수 있다. 새 백엔드의 결과를 다른 사람이 이해하고 검증할 수 있도록 조건을 설명하는 일까지가 실험 설계다. FAQ 다른 백엔드로 옮겼다면 회로 코드만 공개해도 될까 코드에 더해 컴파일 조건과 실행 환경, 측정 횟수, 후처리 기준이 필요하다. 원본 회로가 같아도 실행에 사용된 연산 구성이 달라질 수 있으므로 컴파일 결과를 남기는 것이 비교에 도움이 된다. 에뮬레이터와 실기 결과가 다르면 실험에 실패한 것일까 차이는 추가 검증이 필요한 관찰값이다. 충분한 측정을 했는지, 모형과 실기의 설정이 대응하는지부터 확인해야 한다. 차이가 발생하는 조건을 재현 가능하게 설명했다면 후속 실험에 유용한 결과가 된다. 작은 실기 실험으로 산업적 양자 우위를 주장할 수 있을까 주장의 범위는 실험한 문제와 비교 조건에 맞춰야 한다. 작은 문제의 성공률과 대규모 문제의 계산 효율은 다른 검증 항목이다. 확장에 필요한 자원과 적절한 고전 기준선까지 확인해야 산업적 의미를 평가할 수 있다. 참고 자료 한국경제의 비드래프트 Nexus 이용 기업 선정 보도 , 2026.10.06 Quantinuum Nexus 소개 , 2024.07.31 Quantinuum Emulators , 2026.10.06 확인 Quotas in Nexus , 2026.10.06 확인