Snowflake AI_TRANSLATE関数入門|SQLだけで多言語翻訳する方法・コスト・エラー処理まで解説

SnowflakeのAI_TRANSLATE関数入門記事のアイキャッチ図解で、SQLクエリだけで多言語翻訳を実現する仕組みや利用コスト、エラー処理の要点をまとめたタイトルビジュアル Snowflake
この記事をシェアする𝕏B!FacebookLINEPocket

はじめに:SQLだけで多言語翻訳できるAI_TRANSLATE

Snowflakeの AI_TRANSLATE は、SQLだけでテキストを別の言語に翻訳できるCortex AI関数です。以前は SNOWFLAKE.CORTEX.TRANSLATE を使う例も多くありましたが、現在は AI_TRANSLATE が更新版として案内されています。これから新しく翻訳処理を作る場合は、AI_TRANSLATE を中心に覚えるのがおすすめです。

本記事では、最小例から自動言語判定、エラー処理、テーブル列との組み合わせ、結果の保存、差分翻訳、権限、コスト管理までを初心者向けに整理します。Cortex全体の位置づけはSnowflake Cortex入門もあわせてご覧ください。

AI_TRANSLATEとは?

AI_TRANSLATE は、テキスト・翻訳元言語・翻訳先言語の3つを渡すだけで翻訳結果を返す関数です。SQLの関数として呼べるため、ETL処理や分析パイプラインに自然に組み込めるのが特徴です。

  • SQLからLLMベースの翻訳を呼び出せる
  • 翻訳元言語が分からない場合は自動判定もできる
  • テーブル列をそのまま翻訳できる
  • エラー詳細を返すオプションがある

旧SNOWFLAKE.CORTEX.TRANSLATEとの違い

SNOWFLAKE.CORTEX.TRANSLATE は既存SQLや過去記事で見かけることがあります。ただし、Snowflake公式では新規用途では AI_TRANSLATE を使う方針が示されています。既存SQLを保守する場合は旧関数の仕様を理解しつつ、新しく書くSQLでは AI_TRANSLATE に寄せるのが安全です。

比較項目AI_TRANSLATESNOWFLAKE.CORTEX.TRANSLATE
位置づけ現在のAI翻訳関数旧Cortex関数として既存SQLで見かけることがある
新規実装推奨基本的にはAI_TRANSLATEへ寄せる
構文AI_TRANSLATE(text, source_language, target_language [, return_error_details])SNOWFLAKE.CORTEX.TRANSLATE(text, source_language, target_language)
エラー詳細return_error_details が使える基本的に旧仕様を確認
自動言語判定source_language に空文字 '' を指定同様の使い方を見かける場合がある
使い分け新しく書くSQL既存SQLの保守・読み替え

旧TRANSLATEの非推奨化の正確な期限など、公式で明確にされていない情報は本記事では断定しません。最新の状態はSnowflake公式ドキュメントで確認してください。

AI_TRANSLATEの改善ポイント

  • 旧TRANSLATEよりも多言語翻訳品質が改善されています。
  • 英語を含まない言語ペア(例:日本語 ⇄ スペイン語)でも品質改善が期待できます。
  • 対応言語が拡張されています。
  • 翻訳元がすでに翻訳先言語の場合の認識が改善されています(無駄な再翻訳を避けやすい)。
  • 短文では入力トークン削減によりコスト面でも有利になる場合があります。
  • ただし、対応言語や仕様は変わる可能性があるため、最新情報は公式ドキュメントで確認してください。

いちばんシンプルなSQL例

まずは英語のテキストを日本語に翻訳する最小例です。

SELECT AI_TRANSLATE(
  'Snowflake makes data warehousing simple.',
  'en',
  'ja'
) AS translated_text;

逆方向に、日本語から英語に翻訳する例も同じ形で書けます。

SELECT AI_TRANSLATE(
  'SnowflakeはSQLだけでAI関数を使えるのが便利です。',
  'ja',
  'en'
) AS translated_text;

言語コードの指定方法

翻訳元・翻訳先言語は、ISO 639-1の言語コードで指定するのが基本です。代表的な言語コードを以下にまとめます。

言語コード
日本語ja
英語en
中国語(簡体字)zh
韓国語ko
フランス語fr
ドイツ語de
スペイン語es
イタリア語it
ポルトガル語pt
ロシア語ru

対応言語は拡張される可能性があります。一方で、すべてのISO 639-1コードが必ず使えるとは限らないため、最新の対応言語はSnowflake公式のAI_TRANSLATEリファレンスで確認してください。

source_languageに空文字を指定した自動言語判定

source_language に空文字 '' を指定すると、翻訳元言語を自動判定できます。多言語の問い合わせやレビューが混在している場合は便利です。ただし、業務データで元言語が分かっている場合は、明示的に言語コードを指定した方が安定しやすくなります。

SELECT AI_TRANSLATE(
  'Voy a likear tus fotos en Insta.',
  '',
  'en'
) AS translated_text;

自動判定は便利ですが、不要に多用するとトークン消費が増えやすくなります。元言語が分かっている行は明示的に渡すのがおすすめです。

return_error_detailsでエラー詳細を確認する

通常、AI_TRANSLATEが入力を処理できない場合はNULLが返ります。複数行クエリでは、一部の行でエラーが出てもクエリ全体は止まらず、その行だけNULLになる場合があります。本番では、エラー行を別テーブルに保存して後から再処理できる仕組みがあると安心です。

SELECT AI_TRANSLATE(
  comment_text,
  'ja',
  'en',
  TRUE
) AS translation_result
FROM user_comments
LIMIT 10;

第4引数に TRUE を渡すと、成功時は value、失敗時は error を含むOBJECTが返ります。中身を列に展開する例:

WITH translated AS (
  SELECT
    comment_id,
    AI_TRANSLATE(
      comment_text,
      'ja',
      'en',
      TRUE
    ) AS result
  FROM user_comments
  LIMIT 10
)
SELECT
  comment_id,
  result:value::string AS translated_text,
  result:error::string AS error_message
FROM translated;
  • 通常、AI_TRANSLATEが入力を処理できない場合はNULLが返ります。
  • 複数行クエリでは、一部の行でエラーが出てもクエリ全体は止まらないことがあります。
  • return_error_details => TRUE を指定すると、成功時は value、失敗時は error を確認できます。
  • 本番では、エラー行を別テーブルに保存して後から再処理できる設計にしておきましょう。

テーブル列と組み合わせる実用例

実務では、テーブル列をそのまま翻訳するパターンが多くなります。日本語コメントを英語化する例:

SELECT
  comment_id,
  comment_text,
  AI_TRANSLATE(
    comment_text,
    'ja',
    'en'
  ) AS comment_en
FROM user_comments
WHERE comment_text IS NOT NULL
LIMIT 10;
  • まずは LIMIT を付けて少量で試す
  • WHERE 条件でNULLや空文字を除外する
  • 大量データにいきなり実行しない
  • 本番前に対象件数、文字数、言語の分布を確認する

多言語レビューを日本語に統一する例:

SELECT
  review_id,
  source_language,
  review_text,
  AI_TRANSLATE(
    review_text,
    source_language,
    'ja'
  ) AS review_ja
FROM product_reviews
WHERE review_text IS NOT NULL
  AND source_language IS NOT NULL
LIMIT 10;

翻訳結果をテーブルに保存する

毎回AI_TRANSLATEを呼ぶとそのたびにコストが発生します。翻訳結果はテーブルに保存し、後続クエリでは保存済みの値を参照するのが基本です。

CREATE OR REPLACE TABLE product_reviews_translated AS
SELECT
  review_id,
  review_text,
  source_language,
  AI_TRANSLATE(
    review_text,
    source_language,
    'ja'
  ) AS review_ja,
  CURRENT_TIMESTAMP() AS translated_at
FROM product_reviews
WHERE review_text IS NOT NULL
LIMIT 10;
  • 毎回AI_TRANSLATEを実行すると、そのたびにコストが発生します。
  • 翻訳結果はテーブルに保存して使い回します。
  • 元テキスト、元言語、翻訳先言語、翻訳日時を保存しておくと、後で再現・分析しやすくなります。
  • 本番では CREATE OR REPLACE ではなく、履歴管理や差分更新を考えます。

差分翻訳で再実行コストを抑える

すでに翻訳済みのレビューは再翻訳せず、未翻訳の行だけを対象にすると、翻訳コストを抑えられます。

INSERT INTO product_reviews_translated (
  review_id,
  review_text,
  source_language,
  target_language,
  translated_text,
  translated_at
)
SELECT
  r.review_id,
  r.review_text,
  r.source_language,
  'ja' AS target_language,
  AI_TRANSLATE(
    r.review_text,
    r.source_language,
    'ja'
  ) AS translated_text,
  CURRENT_TIMESTAMP() AS translated_at
FROM product_reviews r
LEFT JOIN product_reviews_translated t
  ON r.review_id = t.review_id
 AND t.target_language = 'ja'
WHERE r.review_text IS NOT NULL
  AND t.review_id IS NULL
LIMIT 100;
  • まだ翻訳していない行だけを対象にします。
  • 同じレビューを毎回翻訳しないようにします。
  • 更新日時やハッシュ値を使うと、本文が変わった行だけ再翻訳できます。
  • 大量翻訳ではバッチ単位で実行します。

AI_TRANSLATEを使うための権限

AI_TRANSLATEを使うには、利用ロールにAI関数の利用権限と、必要なデータベースロールが必要です。検証環境では広めの権限、本番環境では必要な関数だけに絞る設計を検討します。

検証用ロール例(AI関数全体を許可):

USE ROLE ACCOUNTADMIN;

CREATE ROLE IF NOT EXISTS ai_translate_user_role;

GRANT USE AI FUNCTIONS ON ACCOUNT TO ROLE ai_translate_user_role;
GRANT DATABASE ROLE SNOWFLAKE.AI_FUNCTIONS_USER TO ROLE ai_translate_user_role;

GRANT ROLE ai_translate_user_role TO USER <USER_NAME>;

個別関数だけ許可する例(AI_TRANSLATEのみ):

USE ROLE ACCOUNTADMIN;

CREATE ROLE IF NOT EXISTS ai_translate_only_role;

GRANT USE AI FUNCTION AI_TRANSLATE
  ON ACCOUNT TO ROLE ai_translate_only_role;

GRANT DATABASE ROLE SNOWFLAKE.AI_FUNCTIONS_USER
  TO ROLE ai_translate_only_role;

GRANT ROLE ai_translate_only_role TO USER <USER_NAME>;
  • USE AI FUNCTIONS はAI関数全体を許可する権限です。
  • USE AI FUNCTION AI_TRANSLATE はAI_TRANSLATEだけを許可する個別権限です。
  • SNOWFLAKE.CORTEX_USER または SNOWFLAKE.AI_FUNCTIONS_USER のデータベースロールが必要になる場合があります。
  • 本番では必要な関数だけに絞ります。
  • PUBLIC に広く付与しすぎないようにしてください。

コスト・トークン・ウェアハウスの考え方

  • AI_TRANSLATEは翻訳するテキスト量に応じてコストが増えます。
  • 入力トークン数がコストに影響します。
  • 翻訳対象の行数が多いほどコストが増えます。
  • すでに翻訳済みの行に再実行しないようにします。
  • 翻訳結果はテーブルに保存します。
  • 元言語が分かっている場合は明示的に指定します。
  • 自動判定は便利ですが、不要に使いすぎないようにします。
  • AI関数を呼び出すクエリでは、通常のウェアハウス稼働コストも発生します。
  • 必要以上に大きなウェアハウスを使わないようにします。
  • まずは LIMIT 10 で少量検証してから本番投入しましょう。

料金体系の全体像はSnowflakeの料金体系をやさしく解説、急増時の対処はSnowflakeのクレジット急増の原因調査と削減方法もご覧ください。

使用量を確認するSQL

AI_TRANSLATEの利用状況は、Account Usageの専用ビューで確認できます。まずは列構成を確認してから集計するのがおすすめです。

DESC VIEW SNOWFLAKE.ACCOUNT_USAGE.CORTEX_AI_FUNCTIONS_USAGE_HISTORY;

日別・関数別の消費(AI_TRANSLATEのみ抽出):

SELECT
  DATE_TRUNC('day', START_TIME) AS usage_date,
  FUNCTION_NAME,
  SUM(CREDITS) AS total_credits,
  COUNT(DISTINCT QUERY_ID) AS query_count
FROM SNOWFLAKE.ACCOUNT_USAGE.CORTEX_AI_FUNCTIONS_USAGE_HISTORY
WHERE START_TIME >= DATEADD('day', -30, CURRENT_TIMESTAMP())
  AND FUNCTION_NAME = 'AI_TRANSLATE'
GROUP BY 1, 2
ORDER BY usage_date DESC, total_credits DESC;

ユーザー別の消費(直近3か月、AI_TRANSLATEのみ):

SELECT
  DATE_TRUNC('month', h.START_TIME) AS usage_month,
  u.NAME AS user_name,
  u.EMAIL,
  SUM(h.CREDITS) AS total_credits,
  COUNT(DISTINCT h.QUERY_ID) AS query_count
FROM SNOWFLAKE.ACCOUNT_USAGE.CORTEX_AI_FUNCTIONS_USAGE_HISTORY h
JOIN SNOWFLAKE.ACCOUNT_USAGE.USERS u
  ON h.USER_ID = u.USER_ID
WHERE h.START_TIME >= DATEADD('month', -3, CURRENT_TIMESTAMP())
  AND h.FUNCTION_NAME = 'AI_TRANSLATE'
GROUP BY 1, 2, 3
ORDER BY usage_month DESC, total_credits DESC;
  • CORTEX_AI_FUNCTIONS_USAGE_HISTORY はCortex AI関数の使用状況確認に使います。
  • ビューの列名や利用可否はSnowflakeの仕様変更で変わる可能性があります。
  • まずは DESC VIEW で列名を確認してください。
  • 古い記事や環境では CORTEX_FUNCTIONS_USAGE_HISTORY などのビュー名を見かける場合があるため、最新の公式ドキュメントで確認してください。

AI_TRANSLATEに向いている用途・注意が必要な用途

向いている用途

  • 多言語カスタマーレビューの日本語化
  • 海外SNS投稿の社内確認用翻訳
  • 多言語FAQの下訳作成
  • 商品説明文の多言語展開
  • 問い合わせ履歴の一次翻訳
  • 分析前のテキスト標準化
  • 海外拠点から届くコメントの社内共有用翻訳

注意が必要な用途

  • 法務文書や契約書の最終訳
  • 医療・金融など高リスク領域の最終判断
  • ニュアンスが重要な広告コピー
  • 外部公開する正式な翻訳文
  • 個人情報や機密情報を含む大量翻訳
  • 翻訳ミスが重大な影響を与える業務

AI翻訳は下訳・社内確認・分析前処理にはとても便利ですが、正式な公開文書や高リスク文書では必ず人手レビューを入れてください。

他のCortex AI関数との組み合わせ

AI_TRANSLATEは、ほかのCortex AI関数と組み合わせると、多言語テキストの分析パイプラインをSQLだけで構築できます。

やりたいこと組み合わせ
多言語レビューを日本語化して要約AI_TRANSLATE → AI_SUMMARIZE_AGG
翻訳後に感情分析AI_TRANSLATE → AI_SENTIMENT
問い合わせ内容をカテゴリ分類AI_TRANSLATE → AI_CLASSIFY
翻訳文を自然な日本語に整えるAI_TRANSLATE → AI_COMPLETE
PIIを隠してから翻訳AI_REDACT → AI_TRANSLATE
翻訳後に構造化抽出AI_TRANSLATE → AI_EXTRACT
多言語レビューから傾向抽出AI_TRANSLATE → AI_AGG

各関数の詳細はSnowflake Cortex AI関数まとめAI_COMPLETE関数入門AI_EXTRACT入門SUMMARIZE / AI_SUMMARIZE_AGG入門もご覧ください。

よくあるエラーと確認ポイント

症状確認ポイント
権限エラーになるUSE AI FUNCTIONS または USE AI FUNCTION AI_TRANSLATEAI_FUNCTIONS_USER / CORTEX_USER を確認
NULLが返る入力が空、長すぎる、未対応言語、リージョン制限、エラー詳細を確認
期待した言語に翻訳されないsource_language / target_language のコードを確認
自動判定が不安定元言語が分かる場合は明示的に指定
コストが増えるLIMIT、WHERE、対象件数、再翻訳、Usage Historyを確認
翻訳品質が低い入力文の前処理、文脈の追加、必要に応じてAI_COMPLETEで整える
機密情報が心配ロール、リージョン、社内ポリシー、データ分類を確認

コスト超過を防ぐ仕組みはSnowflake Resource Monitor入門も参考になります。

まとめ

Snowflakeの AI_TRANSLATE を使えば、SQLだけで多言語テキストを翻訳できます。旧 SNOWFLAKE.CORTEX.TRANSLATE を既存SQLで見かけることはありますが、新規実装では AI_TRANSLATE を使うのがおすすめです。実務利用では、言語コード、自動言語判定、return_error_details、翻訳結果の保存、差分翻訳、Usage Historyでのコスト確認を押さえることが重要です。多言語レビューや問い合わせを翻訳したうえで、AI_SENTIMENTAI_SUMMARIZE_AGGAI_CLASSIFY などと組み合わせると、Snowflake上で多言語テキスト分析の流れをSQLだけで作れます。

参考リンク

※リンク先のパスはSnowflake側の構成変更で変わる可能性があります。最新URLは公式ドキュメントのトップから検索してください。

関連記事

この記事をシェアする𝕏B!FacebookLINEPocket