본문으로 건너뛰기
QA-Lab
중급20

환각 API 찾아내기: 존재하지 않는 함수를 그럴듯하게 호출하는 코드

AI는 실제로는 존재하지 않는 라이브러리 함수나 파라미터를, 있는 것처럼 자연스럽게 코드에 써넣는다. 코드 읽기 능력으로 이걸 잡아내는 구체적인 방법을 익힌다.

  • #환각API
  • #AI코드검증
  • #코드리뷰

개념

환각 API란

모듈 18b(레슨 2)에서 배운 환각(Hallucination)이, 코드 영역에서는 **"실제로 존재하지 않는 함수·메서드·라이브러리를 마치 존재하는 것처럼 자연스럽게 호출하는 코드"**로 나타난다.

// AI가 생성한 코드
import { validateEmailStrict } from "@company/validators"
 
test("이메일 형식 검증", () => {
  expect(validateEmailStrict("test@example.com")).toBe(true)
})

validateEmailStrict라는 함수가 실제 @company/validators 라이브러리에 없는데도, AI는 "이런 이름의 함수가 있을 법하다"는 그럴듯함만으로 만들어낼 수 있다.

왜 이런 일이 생기는가

모듈 18b(레슨 2)에서 배운 것처럼, AI는 사실을 조회하는 게 아니라 가장 그럴듯한 패턴을 생성한다. 많은 라이브러리들이 비슷한 네이밍 관습(validateX, isX, parseX)을 따르기 때문에, AI는 실제로 존재하지 않아도 "있을 법한" 함수 이름을 매우 자연스럽게 만들어낼 수 있다.

환각 API가 위험한 이유 — 조용히 실패한다

- 실행하면 즉시 "함수를 찾을 수 없음" 에러로 바로 드러나는 경우: 그나마 안전
- 비슷한 이름의 실제 함수가 있어서, 다른 동작을 하는 함수가
  대신 실행되는 경우: 훨씬 위험함(모듈 9 레슨 1에서 배운 코드
  읽기가 없으면 알아채기 어려움)

찾아내는 방법 1 — 실제로 실행해보기

가장 기본적인 검증이다. 모듈 10에서 배운 테스트 실행 자체가 1차 검증이 된다 — 환각 API는 실행하면 대부분 즉시 에러로 드러난다. 다만 "실행이 된다"는 것과 "제대로 된다"는 것은 다르다는 점(레슨 3에서 이어진다)을 주의해야 한다.

찾아내는 방법 2 — 공식 문서와 대조하기

호출된 함수·메서드가 실제로 그 라이브러리의 공식 문서나 타입 정의에 있는지 확인한다.

확인 절차:
1. import된 라이브러리 이름을 확인한다
2. 그 라이브러리의 공식 문서(또는 타입 정의 파일)를 연다
3. 코드에서 호출한 함수·메서드·파라미터가 실제로 존재하는지 대조한다

모듈 9(레슨 1)에서 배운 "모르는 문법을 만났을 때 검색해서 확인한다"는 습관이, 여기서는 "AI가 만든 코드의 모든 외부 호출을 확인한다"는 구체적인 절차로 이어진다.

찾아내는 방법 3 — 낯선 파라미터·옵션 의심하기

함수 자체는 실제로 존재하지만, AI가 존재하지 않는 파라미터나 옵션을 지어내는 경우도 있다 — 이건 더 찾기 어렵다.

// fetchOrders 함수는 실제로 있지만, strictMode 옵션은 존재하지 않을 수 있다
fetchOrders({ userId: 123, strictMode: true })

낯선 옵션이나 평소 안 쓰던 파라미터가 보이면, "이게 정말 이 함수의 실제 옵션인가?"를 한 번 더 의심하는 습관이 필요하다.

타입 검사 도구의 도움

TypeScript 같은 정적 타입 언어를 쓰는 프로젝트라면, 존재하지 않는 함수나 잘못된 파라미터 타입을 컴파일 시점에 자동으로 잡아낼 수 있다 — 모듈 14(레슨 6)에서 배운 CI 파이프라인에 타입 검사 단계를 포함시켜두면, 환각 API의 상당수를 사람이 일일이 찾지 않아도 기계적으로 걸러낼 수 있다.

실무에서 왜 필요한가

"AI가 짜준 테스트 코드가 실행은 되는데 왠지 이상하게 느리다"고 느꼈던 상황이, 알고 보면 존재하지 않는 함수 대신 우연히 이름이 비슷한 다른 함수가 호출되고 있었던 경우가 실무에서 보고된다. 공식 문서와 대조하는 습관을 가진 QA는, 이런 조용한 오류를 코드 리뷰 단계에서 미리 잡아낼 수 있다.

실습 과제

과제 1 — 환각 API 찾아보기 (10분)

다음 코드에서, 실제로 존재할 가능성이 낮아 보이는 함수·파라미터를 찾아 표시하고, 왜 의심스러운지 설명한다(실제 라이브러리 이름은 가상이라고 가정).

import { deepValidateSchema } from "zod"
 
const result = deepValidateSchema(userSchema, data, { autoFix: true })

과제 2 — 검증 절차 적용하기 (10분)

담당하고 있는(또는 익숙한) 프로젝트에서 실제로 쓰는 라이브러리 하나를 골라, 그 라이브러리의 공식 문서에서 함수 하나를 찾아보고 "내가 알고 있던 사용법이 실제 문서와 정확히 일치하는지" 확인해본다.

자가 체크리스트

  • 환각 API가 무엇이고 왜 코드에서 자연스럽게 나타날 수 있는지 설명할 수 있다
  • 환각 API가 조용히 실패할 수 있는 두 가지 경우를 설명할 수 있다
  • 실행·문서 대조·낯선 파라미터 의심이라는 세 가지 찾아내는 방법을 설명할 수 있다
  • 타입 검사 도구가 환각 API의 일부를 자동으로 걸러줄 수 있는 이유를 설명할 수 있다

흔한 실수

  • 코드가 실행되면 함수가 실제로 존재한다고 안심한다. 비슷한 이름의 다른 함수가 우연히 호출됐을 가능성을 놓친다.
  • AI가 제안한 파라미터·옵션을 공식 문서 확인 없이 그대로 받아들인다. 존재하지 않는 옵션이 조용히 무시되고 있을 수 있다.
  • 타입 검사 도구가 있으니 사람이 확인할 필요 없다고 생각한다. 타입 검사는 형식적 오류만 잡을 뿐, 의미적으로 맞는 함수를 썼는지는 여전히 사람이 봐야 할 수 있다.

참고 자료

  • Anthropic — Reducing Hallucinations — 환각 현상 일반에 대한 공식 자료(모듈 18b 레슨 2와 동일한 참고 자료)
  • TypeScript 공식 문서 — 정적 타입 검사가 코드 오류를 잡는 방식에 대한 공식 가이드