目次
この記事は全3回にわたり連載します。
これまでの記事
2022年11月、OpenAIが発表したChatGPTは、私たちの生活に新たな可能性をもたらしました。ChatGPTは会話能力を持ち、自然な言葉で指示を出すと、適切な応答を返すことができます。例えば、情報の検索から質問の回答、さらには創造的な内容の生成まで、多くのタスクを効率的に行えます。ChatGPTの能力は、まるで人間が思考し、感じ、理解するかのように見えます。これは、AIが人間のように「思考」するという新たな可能性を示しています。現在、ChatGPTの活用方法がビジネスのあらゆる現場で試されています。今回の記事では、ChatGPTが翻訳業界にどのような影響をもたらすのかを一緒に考えてみましょう。
AIと共存する翻訳業界
大規模言語モデルは翻訳業界にどのような影響を与えるでしょうか。そして、翻訳業界はどのような未来を迎えるのでしょうか。
AIライティングツール(例:Paperpal[1]、Writeful[2]、Trinka[3]、Grammarly[4]、Linguix[5]、QuillBot[6]など)は、既に多くのユーザーを得ているものの、ChatGPTの性能を目の当たりにしたユーザーの中にはこれらの利用を中止し、ChatGPTに乗り換えた人もいるようです[7]。これは、大規模言語モデルが提供する高度な読解能力と自然な文章生成能力が、ユーザーのニーズをより良く満たすことができるからだと思われます。
現在のライティングツールは、ユーザーの特殊な条件やコンテキストを完全に理解することが難しく、時には余計な指摘や訂正をしてしまうという課題があります。例えば、専門的な内容を含む文書を編集する際、専門用語に対する誤ったスペルチェックの指摘は邪魔に感じることがあります。この原因は、ツールがユーザーのコンテキストを考慮できず、そのために適切な判断が下されないからです。一方、大規模言語モデルは、ユーザーのコンテキストをより深く理解することができるため、大規模言語モデルベースのライティングツールはユーザーの意図を汲んで、より効率的に支援するようになります。つまり生産性のカギはAIと人間の協働にあり、この形は必然だと言えます。
大規模言語モデルは発展途上であり、その精度や速度、コスト効率は今後ますます向上します。現在、経済的な合理性については人間に分があったとしても、それがいつまで続くかは分かりません。AIが人間との差を徐々に詰めていき、AIが人間を超える言語能力を持ったとき、翻訳者・ネイティブチェッカー・校正者はAIに代替されます。その実現可能性は今後10年で50%とも言われています。
この記事の実験でも明らかになったように、従来型のニューラル機械翻訳であっても、コンテキストを与えれば精度を上げることができます。そして、大規模言語モデルは従来型のニューラル機械翻訳よりもコンテキストをよりうまく活用することができます。機械翻訳の精度を押し上げる秘密はコンテキスト情報を取り込めるかどうかにかかっています。
デジタルトランスフォーメーション(DX)と呼ばれるデジタル技術による変革があらゆる業界で進んでおり、ビジネスプロセスのみならず企業文化や顧客体験までもが変わり始めています。DX化とは高度に整備されたITインフラを持つことと同義であり、ここに大規模言語モデルをはじめとするAIを組み込むことは容易です。AIがビジネスプロセスの一部として統合されるということは、詳細なコンテキストをAIに与えて高度な判断をさせることが可能になるということを意味します。つまり、DX化が進めば、より効率的かつ高品質な翻訳作業が可能になります。すると、どのような未来が待ち受けることになるのでしょうか。DX化が進んだビジネスインフラの外に、あえて翻訳の仕事のみを取り出して翻訳会社に依頼する機会自体が減るのではないのでしょうか。
たとえそうであったとしても人間の役割は消えることはありません。なぜなら、AIはあくまでツールであり、その使用方法や結果の評価は人間が行うからです。人間の役割は、より高度な翻訳や校正、AIの監視や管理などへシフトしていくと考えられます。また、人間の持つ創造性や感性は、AIがまだ到達できていない領域です。これが人間が必要とされる大きな所以です。
AIと人間が共存し、相互に補完しあうことで、翻訳業界は新たな価値を生み出し続けるはずです。そして、その中心には常に人間が存在し続けます。AIは人間の助けとなり、人間はAIの使い方を最適化し、その結果を評価します。このような協働関係が、翻訳業界における新たな価値を生み出すのです。
付録
記事中で使ったPythonスクリプトを以下に掲載します。
''' DeepLとGoogle翻訳とOpenAIのLLMでテキストを翻訳するPythonスクリプト mt.py
スクリプト実行前に以下のコマンドを実行してライブラリのインストールが必要です。
pip install --upgrade deepl
pip install --upgrade google-cloud-translate
pip install --upgrade openai python-dotenv '''
from google.cloud import translate
from tqdm import tqdm
import csv
import deepl
import openai
import os
import sys
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
load_dotenv('./api-key.env')
client = openai.OpenAI(
api_key = os.getenv('OPENAI_KEY')
)
INPUT_FILE = sys.argv[1]
filename = os.path.splitext(os.path.basename(INPUT_FILE))[0]
def deepl_translate(
text: str = '',
auth_key: str = '{your-auth-key}',
source_language_code: str = 'JA',
target_language_code: str = 'EN-US'
) -> str:
'''
DeepLを使ってテキストを翻訳します。
:param text: 翻訳するテキスト (str)
:param auth_key: DeepL APIの認証キー (str)
:param source_language_code: 翻訳元の言語コード (str)
:param target_language_code: 翻訳先の言語コード (str)
:return: 翻訳されたテキスト (str)
Reference:
https://www.deepl.com/docs-api/translate-text/translate-text
'''
translator = deepl.Translator(auth_key)
lines = text.split('\n')
translated_lines = []
for i in range(0, len(lines), 50):
batch = lines[i:i+50]
if len(batch) > 0:
response = translator.translate_text(batch, source_lang=source_language_code, target_lang=target_language_code)
translated_lines.extend([x.text for x in response])
translated_text = '\n'.join(translated_lines)
return translated_text
def google_translate(
text: str = '',
project_id: str = '{your-project-id}',
source_language_code: str = 'ja-JP',
target_language_code: str = 'en'
) -> str:
'''
Google Cloud Translation - Advanced (v3) APIを使ってテキストを翻訳します。
:param text: 翻訳するテキスト (str)
:param project_id: Google CloudプロジェクトのID (str)
:param source_language_code: 翻訳元の言語コード (str)
:param target_language_code: 翻訳先の言語コード (str)
:return: 翻訳されたテキスト (str)
Reference:
https://cloud.google.com/python/docs/reference/translate/latest/google.cloud.translate_v3.services.translation_service#translationserviceclient
Language support:
https://cloud.google.com/translate/docs/languages
'''
client = translate.TranslationServiceClient()
location = 'global'
parent = f'projects/{project_id}/locations/{location}'
lines = text.split('\n')
lines = [x if x else ' ' for x in lines]
# 各行が1024文字を超えているかチェックし、超えていたらその行を####Skipped####に置き換える。
for i, line in enumerate(lines):
if len(line) > 1024:
print(f'Line {i+1} in the contents exceed the limit: {len(line)} > 1024. Skipping this line.', file=sys.stderr)
lines[i] = '####Skipped####'
response = client.translate_text(
request={
'parent': parent,
'contents': lines,
'mime_type': 'text/plain', # mime types: text/plain, text/html
'source_language_code': source_language_code,
'target_language_code': target_language_code,
}
)
translated_lines = [x.translated_text for x in response.translations]
translated_text = '\n'.join(translated_lines)
return translated_text
def translation_prompt(text):
return f'''\
Translate the following text to English.
Output only the translated text.\n
#########\n{text}'''
def openai_translate(
text: str = '',
model_name: str = 'gpt-4-turbo-preview',
prompt: str = ''
) -> str:
'''
OpenAIのLLMを使ってテキストを翻訳します。
:param text: 翻訳するテキスト (str)
:param model_name: 使用するOpenAIのモデル名 (str)
:param prompt: 翻訳のためのプロンプト (str)
:return: 翻訳されたテキスト (str)
Reference:
https://platform.openai.com/docs/api-reference/introduction
'''
prompt = translation_prompt(text)
messages = [
{'role': 'system', 'content': 'You are a professional translator.'},
{'role': 'user', 'content': prompt}
]
try:
response = client.chat.completions.create(
model = model_name,
messages = messages,
temperature = 0
)
except Exception as e:
sys.stderr.write(f'An error occurred: {e}\n')
return ""
return response.choices[0].message.content
gpt35turbo0613 = lambda x: openai_translate(x, model_name='gpt-3.5-turbo-0613')
gpt35turbo0125 = lambda x: openai_translate(x, model_name='gpt-3.5-turbo-0125')
gpt40613 = lambda x: openai_translate(x, model_name='gpt-4-0613')
gpt4turbo1106 = lambda x: openai_translate(x, model_name='gpt-4-1106-preview')
gpt4turbo0125 = lambda x: openai_translate(x, model_name='gpt-4-0125-preview')
gpt4turbo = lambda x: openai_translate(x, prompt=prompt)
translators = {
'deepl': deepl_translate,
'google': google_translate,
'gpt-3.5-turbo-0613': gpt35turbo0613,
'gpt-3.5-turbo-0125': gpt35turbo0125,
'gpt-4-0613': gpt40613,
'gpt-4-1106-preview': gpt4turbo1106,
'gpt-4-0125-preview': gpt4turbo0125,
'gpt-4-turbo-preview': gpt4turbo,
}
for name, translator in tqdm(translators.items(), desc='Translating with different translators'):
output_file = f'{filename}.{name}_output.csv'
if os.path.exists(output_file):
print(f'File {output_file} already exists. Skipping translation with {name}.')
continue
with open(output_file, 'a', encoding='utf-8', newline='') as out_file:
writer = csv.writer(out_file, lineterminator='\r\n')
with open(INPUT_FILE, 'r') as f:
reader = csv.reader(f)
next(reader) # ヘッダー行をスキップ
for row in tqdm(reader, desc=f'Translating with {name}'):
source = row[0]
translated = translator(source)
writer.writerow([translated])
出典
- https://paperpal.com/ja
- https://www.writefull.com/
- https://www.trinka.ai/jp/
- https://www.grammarly.com/blog/engineering/under-the-hood-at-grammarly-leveraging-transformer-language-models-for-grammatical-error-correction/
- https://linguix.com/
- https://quillbot.com/premium
- https://www.reddit.com/r/ChatGPT/comments/zqrwnl/is_chatgpt_going_to_kill_grammarly/
この記事を書いた人
亀谷 展
株式会社サン・フレアのリサーチサイエンティスト。
深層学習による自然言語処理やビッグデータ処理を担当。