ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 페이지마다 이긴 엔진이 달랐다
    AI Agent 2026. 7. 16. 21:00
    728x90
    반응형

    키보드에 올린 손과 흐릿한 창 사진
    페이지마다 이긴 엔진이 달랐다

    스캔본 더미를 텍스트로 뽑는 작업을 맡았습니다.
    한 권이 아니라 수천 건이었고, 페이지마다 표가 박혀 있었습니다.
    추출 엔진은 후보가 여럿 있었는데, 첫 묶음부터 답이 안 나왔습니다.
    어느 게 제일 좋냐고 물으면 대답을 못 했거든요.
    A가 깔끔하게 뽑은 페이지를 B는 글자를 뭉갰고, 바로 다음 페이지에선 정반대였습니다.

    처음엔 그냥 제일 잘하는 놈 하나만 고르려고 했습니다.
    표본 몇 장 돌려서 평균 점수 높은 쪽을 채택하고 끝내려고요.
    그게 보통 하는 방식이니까요.
    엔진 하나 정하고, 파이프라인에 박고, 나머지는 버리고.
    그래야 처리도 빠르고 관리할 것도 하나니까요.

    평균을 냈더니 둘 다 애매했습니다

    표본 점수를 뽑아보니 A랑 B가 거의 비등했습니다.
    0.0몇 차이.
    이럴 때 평균만 보면 "둘이 비슷하네, 아무거나" 하고 넘어가게 되는데, 그 평균이 거짓말을 하고 있었습니다.

    페이지별로 풀어보니까 비등한 게 아니었습니다.
    둘이 번갈아 이기고 있었습니다.
    A가 0.83을 받은 페이지에서 B는 0.36을 받았고, 다음 페이지에선 그게 그대로 뒤집혔습니다.
    0.83이 0.36으로, 0.36이 0.83으로.
    평균을 내니까 둘 다 0.6 언저리로 수렴해서 차이가 안 보였던 겁니다.

    한 페이지에선 A가 표 제목 입금일을 살렸는데 금액 칸을 통째로 오른쪽으로 밀었고, B는 제목을 임금일로 틀렸지만 금액 칸은 제자리에 뒀습니다.
    다음 페이지에선 반대였어요.
    A가 손글씨 메모를 거의 못 읽고, B가 흐린 메모를 살렸습니다.
    평균 점수 한 줄로는 이 차이가 안 보였습니다.

    같은 묶음 안에서도 승자가 계속 갈렸습니다.
    한참을 들여다보고서야 규칙이 보였습니다.
    표가 빽빽한 페이지는 한쪽이 강했고, 잉크가 번지거나 손글씨가 섞인 페이지는 다른 쪽이 강했습니다.
    페이지마다 성격이 다르니까, 잘 먹는 엔진도 페이지마다 달랐던 겁니다.

    여기서 손이 멈췄습니다.
    엔진을 고르는 단위가 잘못됐다는 걸 그제야 알았거든요.
    저는 "이 작업에 어느 엔진"을 고르고 있었는데, 점수가 실제로 갈리는 단위는 작업이 아니라 페이지였습니다.
    작업 단위로 하나 고르는 순간, 그 엔진이 못 먹는 페이지를 절반쯤 손해 보고 시작하는 셈이었습니다.
    평균 0.6짜리 엔진을 고르는 게 아니라, 페이지마다 0.83을 골라 쓸 수 있는데 그걸 버리고 있었던 거죠.

    고르는 걸 그만뒀습니다

    그래서 고르는 걸 그만뒀습니다.
    대신 후보를 페이지마다 전부 돌리고, 페이지 단위로 점수를 매겨서 그 페이지의 승자만 채택했습니다.
    1쪽은 A, 2쪽은 B, 3쪽은 다시 A.
    누가 봐도 지저분한 구성인데, 결과물 정확도는 단일 엔진 어느 쪽보다 높았습니다.

    공짜는 아니었습니다.
    엔진을 매 페이지 다 돌리니까 처리 시간이 몇 배로 늘었습니다.
    한 놈만 돌리면 끝날 걸, 다 돌리고 점수까지 매기니까요.
    근데 이 작업은 정확도가 시간보다 비쌌습니다.
    틀린 글자 하나 사람이 잡으러 가는 비용이, 페이지당 몇 초 더 쓰는 것보다 훨씬 컸거든요.
    반대였으면 당연히 하나만 골랐겠죠.
    이건 작업 성격이 정해준 거지, 항상 섞으라는 얘기는 아닙니다.

    자동 점수를 못 믿겠더라

    여기까지가 깔끔한 부분입니다.
    진짜 문제는 그다음이었습니다.

    점수를 매기는 채점기 자체를 못 믿겠더라고요.
    어떤 페이지는 엔진이 0.83을 받아놓고, 막상 결과를 열어보니 숫자 한 칸이 통째로 옆으로 밀려 있었습니다.
    점수는 높은데 답은 틀린 겁니다.
    점수가 높다고 자동으로 채택하던 걸 거기서 멈췄습니다.
    채택하기 전에, 뽑힌 값이 페이지 안에서 앞뒤가 맞는지 따로 한 번 더 확인하는 단계를 끼웠습니다.
    그게 통과 못 하면 점수가 아무리 높아도 자동으로 넘기지 않았습니다.

    확인 단계를 못 통과한 페이지가 생각보다 많았습니다.
    표가 아예 이미지로만 박혀 있어서 어느 엔진도 칸을 못 읽는 페이지, 같은 칸이 두 번 나와서 어느 쪽이 진짜인지 모를 페이지, 접근 자체가 막힌 페이지.
    이런 건 승자를 뽑을 수가 없었습니다.
    뽑을 게 아예 없으니까요.
    셋을 다 돌려도 셋 다 빈칸이 나오는 페이지가 있다는 걸, 그제야 받아들였습니다.

    못 푼 걸 못 풀었다고 적어두기

    여기서 두 번째로 고르는 걸 그만뒀습니다.
    이번엔 억지로 답을 만드는 걸 그만뒀습니다.

    처음엔 못 읽은 페이지도 어떻게든 값을 채워 넣고 싶었습니다.
    빈칸이 보기 싫었거든요.
    셋 중에 그나마 덜 틀린 걸 골라서라도 메우면, 적어도 표는 다 채워지니까요.
    근데 그렇게 억지로 채운 값이 깨끗한 값들 사이에 섞이면, 나중에 그게 진짠지 가짠지 구분이 안 됩니다.
    멀쩡한 값 옆에 가짜가 숨는 거죠.
    그게 더 무섭습니다.

    그래서 못 푼 페이지는 못 풀었다고 명시적으로 적어뒀습니다.
    "이미지뿐이라 못 읽음", "칸이 겹쳐서 보류", "접근 막힘" — 이유까지 같이요.
    이걸 실패 더미에 버린 게 아니라, 따로 추적하는 목록으로 관리했습니다.
    그래야 다음에 같은 페이지를 또 붙잡고 똑같이 헛고생을 안 하거든요.
    한 번 "이건 지금 도구로는 안 된다"고 판정한 건 그 판정째로 남겨뒀습니다.

    그래서 이 작업은 "다 뽑았습니다"로 끝나지 않았습니다.
    깨끗하게 뽑힌 묶음, 사람이 다시 봐야 하는 묶음, 지금 도구로는 못 푸는 걸로 표시해둔 묶음.
    이렇게 셋으로 갈라서 넘겼습니다.
    못 푼 칸을 자동으로 메우는 채점기는 아직 안 만들었습니다.
    그건 "나중에 별도로 붙인다"고 적어만 뒀습니다.

    지금도 그 보류 목록은 줄지 않고 그대로 있습니다.
    다음 묶음을 받으면 또 거기에 몇 줄이 더 쌓일 것 같습니다.

    728x90
    반응형
Designed by Tistory.