BigQuery에서 SQL 내 프롬프트 설계의 요령 — 출력을 안정화하는 작성 방법
요약
본 기사는 BigQuery의 AI 함수를 활용하여 SQL 내에서 프롬프트를 설계하는 방법을 다룹니다. 일반 채팅 AI와 달리 대량의 행을 일괄 처리해야 하므로, 출력 안정성이 매우 중요합니다. 출력을 안정화하기 위한 5가지 패턴(출력 형식 명시, 선택지 폐집합 구성, JSON 강제 스키마 사용, 입력 전처리, 출력 후처리)을 제시합니다.
핵심 포인트
- SQL 내 AI 함수는 대량의 행 병렬 처리가 핵심입니다.
- 불필요한 서론 문구 제거 등 출력 형식을 명시해야 합니다.
- JSON 파싱 대신 `AI.GENERATE_TABLE`로 스키마를 강제하는 것이 안정적입니다.
- 입력 텍스트 전처리와 후처리(TRIM, LOWER)를 통해 흔들림을 흡수하세요.
서론
시리즈 제16회입니다.
지난번(제15회)에서는 ObjectRef를 사용하여 이미지나 PDF 같은 비정형 데이터를 SQL에서 다루는 방법을 설명했습니다. 이번에는 SQL 내 프롬프트 설계를 깊이 있게 파헤쳐 보겠습니다.
BigQuery의 AI 함수(AI.GENERATE, AI.CLASSIFY, AI.GENERATE_TABLE 등)는 SQL 안에 프롬프트를 직접 작성합니다. 일반적인 채팅 AI와 달리, 대량의 행을 일괄 처리하고 결과를 그대로 테이블에 저장하는 특성이 있기 때문에, 출력이 안정적이지 않으면 후속 집계나 조인이 무너질 수 있습니다.
본 기사에서는 '출력이 불안정할 때'의 원인과 SQL 내 프롬프트 설계에서 사용할 수 있는 패턴들을 정리했습니다.
왜 SQL 내 프롬프트는 어려울까
일반적인 채팅 AI와 가장 큰 차이점은 다음 3가지입니다.
| 비교 항목 | 채팅 AI | SQL 내 AI 함수 |
|---|---|---|
| 실행 단위 | 1 요청 | 수천~수백만 행을 병렬 처리 |
| ... | ||
| 채팅에서는 다소 흔들리는 출력이라도 문제가 없지만, SQL에서는 '카테고리 분류가 행마다 『의류』였다가 『의류・패션』이었다'는 것만으로도 GROUP BY가 망가집니다. |
출력을 안정화하는 5가지 설계 패턴
패턴 1: 출력 형식을 명시하기
나쁜 예 (흔들림이 발생하기 쉬움)
SELECT
AI.GENERATE(
MODEL `your-project.ai_lab.gemini_model`,
...
좋은 예 (형식을 고정)
SELECT
review_id,
AI.GENERATE(
...
'하나만 출력', '설명문 불필요'와 같은 제약을 추가함으로써, 불필요한 서론 문구가 들어가는 것을 막을 수 있습니다.
패턴 2: 선택지를 나열하여 폐집합 만들기
분류 작업에서는 AI.CLASSIFY나 AI.GENERATE에 선택지를 전달하는 방식을 사용합니다.
SELECT
product_id,
inquiry_text,
...
AI.CLASSIFY는 내부적으로 선택지에 대한 스코어링을 수행하기 때문에, AI.GENERATE보다 분류의 안정성이 높습니다.
패턴 3: JSON 출력을 강제하여 AI.GENERATE_TABLE로 전환하기
여러 필드를 반환할 경우, 문자열 파싱보다는 AI.GENERATE_TABLE의 output_schema에서 타입을 강제하는 것이 더 안정적입니다.
나쁜 예: AI.GENERATE로 JSON을 직접 파싱
SELECT
product_id,
JSON_VALUE(
...
모델의 응답에 json ... 같은 코드펜스가 붙거나 여분의 텍스트가 섞이면 파싱이 망가집니다.
좋은 예: AI.GENERATE_TABLE로 스키마를 강제
SELECT *
FROM
AI.GENERATE_TABLE(
...
output_schema를 지정함으로써, 출력이 자동으로 지정된 타입으로 변환됩니다.
패턴 4: 입력을 전처리하여 컨텍스트 좁히기
길게 작성된 텍스트를 그대로 전달하면 출력이 불안정해집니다. 입력 단계에서 필요한 정보로 좁히는 것이 중요합니다.
WITH trimmed_reviews AS (
SELECT
review_id,
...
패턴 5: 출력 후처리로 NULL과 흔들림 흡수하기
아무리 프롬프트를 다듬어도 일정 수준의 흔들림은 남습니다. 후처리를 통해 흡수하는 설계로 만들어 놓으면, 분석 쿼리 전체가 망가지지 않습니다.
WITH raw_sentiment AS (
SELECT
review_id,
...
LOWER(TRIM(...))으로 대소문자/공백의 흔들림을 정규화하고, LIKE로 부분 일치를 허용함으로써 예상치 못한 출력을 unknown으로 처리합니다.
GA4 데이터와의 조합 예시
감성 분석 결과와 GA4의 구매 행동을 결합하여 '부정적 리뷰가 많은 상품은 CVR이 떨어지는지'를 검증하는 예시입니다.
WITH review_sentiment AS (
SELECT
product_id,
...
자주 하는 실수와 대처법
⚠️ [IMG:N] 형식 토큰은 이미지 placeholder 입니다. 번역하지 말고 원래 위치에 그대로 유지하세요.
| 실패 패턴 | 원인 | 대처법 |
|---|---|---|
| 출력에 설명문이 섞임 | 프롬프트에 출력 형식을 명시하지 않음 | '〜만 출력', '설명문 불필요' 추가 |
| JSON의 코드펜스가 붙음 | 모델이 Markdown 형식으로 반환함 | AI.GENERATE_TABLE로 전환하거나 REGEXP_EXTRACT로 추출 |
| NULL 행이 많음 | 입력 텍스트가 비어 있거나 너무 짧음 | 사전에 CHAR_LENGTH >= N으로 필터링 |
| 분류가 세분화됨 | 라벨의 입자도가 너무 세거나 유사한 라벨이 있음 | 라벨을 5~7개 정도로 좁히고 설명문을 추가 |
| 같은 내용이라도 행마다 출력이 다름 | temperature가 높음 | temperature = 0을 옵션으로 지정함 |
temperature를 0에 고정하기
재현성을 높이고 싶은 분류/추출 작업에서는 temperature = 0을 지정합니다.
SELECT
product_id,
AI.GENERATE(
...
요약
- SQL 내 프롬프트는 '대량 행의 병렬 처리'와 '결과를 SQL로 활용한다'는 제약이 있기 때문에, 출력 안정화가 최우선입니다.
- 출력 형식 명시・선택지 나열・
AI.GENERATE_TABLE활용・입력 전처리・후처리를 통한 흔들림 흡수 등 5가지 패턴을 조합합니다. temperature = 0으로 재현성을 높이고 - 실패를 예상한 설계(unknown로의 폴백)가 후속 쿼리의 품질을 지킵니다.
다음 회차(제17회)에서는 AI 함수의 비용 최적화 — 토큰 과금을 늘리지 않는 설계에 대해 설명하겠습니다.
참고
- AI.GENERATE function | BigQuery | Google Cloud Documentation
- AI.CLASSIFY function | BigQuery | Google Cloud Documentation
- AI.GENERATE_TABLE function | BigQuery | Google Cloud Documentation
코코나라(Coconala)로부터의 의뢰는 여기 → GA4×BigQuery 기반 구축 서비스
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기