편집자동화 등(Vrew.Gas 등)

구글 API 이미지 인식 자동화 중 마주친 에러와 해결 과정

boyne 2026. 9. 18. 23:20

1. 들어가며: 반복 노동을 줄이기 위한 자동화 도전

회사에서 나오는 문서(이미지)들이 꽤 있다. 그걸 인쇄물로 주면 좋으련만 카톡으로 이미지만 전달한다. 그럼 좁은 휴대폰 화면에서 그 내용을 읽기란 여간 고역스러운 일이 아닐 수 없었다.
그나마 제미나이나 챗지피티를 이용해서 문자를 인식시켜서 읽으면 내용을 확인하는데 훨씬 편해졌다. 
이미지를 하나씩 채팅창에 넣고 결과가 나오면 복사해 게시판에 붙여넣는 수동 방식을 썼는데, 이미지 개수가 많아질수록 이 반복 노동이 꽤나 번거로웠다.
그래서 여러 장의 이미지에 담긴 텍스트를 읽어(OCR) 게시판에 공유하는 작업을 자동화하려고 했다. 

여러 장의 이미지를 업로드하면 API 스크립트로 묶어 한 번에 처리하려 했다. 하지만 막상 코드를 짜고 실행해 보니, 채팅창에서는 겪지 못했던 복병을 만났다. 바로 특정 모델을 지정해 호출하면 에러가 나며 작업 자체가 멈추는 문제였다.


2. 문제 상황: 특정 모델을 지정했을 때의 에러

처음엔 공식 문서나 예시 코드를 참고하여 특정 모델명을 코드에 직접 박아두고 시작했다. 대략 다음과 같은 형태의 코드였다.

[기존 코드 예시]
# 에러가 나던 기존 방식: 특정 모델을 직접 지정

model = genai.GenerativeModel('gemini-1.5-pro-latest')




response = model.generate_content([image_file, "이미지 속 텍스트를 읽어줘"])


print(response.text) |

 

그런데 이 코드를 실행하면 이미지를 넘기든 텍스트를 넘기든 에러가 발생하며 문서 인식 작업 자체가 진행되지 않았다.

처음엔 내 코드의 요청 구조나 파라미터, 인코딩 방식을 의심하며 수정해 보았지만 소용이 없었다. 몇 번의 수정과정에서 모델 이름을 다른 것으로 바꾸면 정상 작동하는 경우가 있었다. 문제는 코드가 아니라 "그 모델을 지금 이 순간 내 계정과 API 키로 호출할 수 있느냐"에 달려 있다는 것을 깨달았다. 정확한 원인은 모델별 지원 여부의 차이인지, 버전 교체 시점의 문제인지 끝내 명확히 알 수는 없었다.


3. 해결책: "되는 모델을 찾아서 쓰게 한다"

원인을 하나로 특정할 수 없으니 접근법을 바꿔야 했다. 코드에 특정 모델 하나를 고정해 두는 대신, 사용 가능한 모델 후보들을 나열해 두고 앞에서부터 순서대로 시도하다가 처음 성공하는 모델을 쓰는 방식으로 우회했다.

이를 구현한 로직의 예시는 대략 다음과 같다.

[우회(동적 탐색) 코드 예시]

# 시도해볼 모델 후보군 리스트


candidate_models = [


'gemini-1.5-pro',


'gemini-1.5-flash',


'gemini-pro-vision'


]




def generate_text_from_image(image, prompt):


for model_name in candidate_models:


try:


model = genai.GenerativeModel(model_name)


response = model.generate_content([image, prompt])


return response.text # 성공하면 결과 반환하고 종료


except Exception as e:


print(f"모델 {model_name} 실패, 다음 모델 시도 중... (에러: {e})")<br> continue<br> raise Exception("사용 가능한 모델이 없습니다.")` |

 

 

특히 여러 장의 이미지를 연속으로 처리해야 하는 게시판 작업에서는 이 모델 변동성이 더 크게 다가왔다. 첫 번째 이미지는 잘 되다가 두 번째 이미지에서 갑자기 같은 모델이 에러를 뱉어내는 식이었기 때문이다.

결국 이미지 하나를 처리할 때마다 위와 같은 '되는 모델 찾기' 로직을 태우도록 구조를 변경했다. 매번 모델을 탐색하느라 전체 처리 속도는 다소 느려졌지만, 중간에 작업이 멈춰버리는 최악의 상황은 피할 수 있었다.


4. 여전히 남겨진 과제

  • 불투명한 원인: 특정 모델이 특정 시점에 왜 차단되거나 에러를 내는지 근본적인 원인은 아직 풀지 못했다.
  • 임시방편적 구조: '되는 모델 찾기'는 어디까지나 우회로일 뿐, 매번 재탐색을 거치느라 느려지는 속도 문제는 그대로 남아 있다.
  • 인식률의 변동: 이미지별로 인식률이 들쭉날쭉한 것이 화질 문제인지 모델 불안정성 때문인지 아직 명확히 구분하지 못했다.

5. 맺음말

구글 API 문서에는 "이 모델을 이렇게 호출하면 된다"는 정답만 가득하지만, 실제 현업에서는 '지금 내 상황에서 이 모델이 실제로 작동하는가'가 훨씬 큰 변수였다. 하나를 굳게 믿고 매달리기보다, 여러 후보를 열어두고 유연하게 대처하는 방식으로 설계해야 한다는 것을 뼈저리게 배운 작업이었다.