- はじめに:SQLだけで多言語翻訳できるAI_TRANSLATE
- AI_TRANSLATEとは?
- 旧SNOWFLAKE.CORTEX.TRANSLATEとの違い
- AI_TRANSLATEの改善ポイント
- いちばんシンプルなSQL例
- 言語コードの指定方法
- source_languageに空文字を指定した自動言語判定
- return_error_detailsでエラー詳細を確認する
- テーブル列と組み合わせる実用例
- 翻訳結果をテーブルに保存する
- 差分翻訳で再実行コストを抑える
- AI_TRANSLATEを使うための権限
- コスト・トークン・ウェアハウスの考え方
- 使用量を確認するSQL
- AI_TRANSLATEに向いている用途・注意が必要な用途
- 他のCortex AI関数との組み合わせ
- よくあるエラーと確認ポイント
- まとめ
- 参考リンク
- 関連記事
はじめに: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_TRANSLATE | SNOWFLAKE.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_TRANSLATE、AI_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_SENTIMENT、AI_SUMMARIZE_AGG、AI_CLASSIFY などと組み合わせると、Snowflake上で多言語テキスト分析の流れをSQLだけで作れます。
参考リンク
- Snowflake公式:AI_TRANSLATE
- Snowflake公式:SNOWFLAKE.CORTEX.TRANSLATE
- Snowflake公式:Cortex AISQL functions
- Snowflake公式:Cortex functions usage history
- Snowflake公式:Service Consumption Table (PDF)
※リンク先のパスはSnowflake側の構成変更で変わる可能性があります。最新URLは公式ドキュメントのトップから検索してください。


