AI LLM翻译实践

大语言模型(LLM)的语义识别能力使之成为翻译的必用工具。如果我在互联网上看到一篇不错的英文文章,如何翻译呢?
我能想到如下的方法:

  • 可以将手动内容复制下来,作为提示词输入到LLM对话界面,得到翻译的内容。
  • 可以开发自动脚本:爬取网页的内容,调用LLM的接口,获得翻译的内容。

使用LLM 生成自动脚本

使用自动脚本显得自己更厉害一点,所以我计划使用LLM对话产品,得到一个Python脚本来自动化这件事情。
这次帮我编写自动脚本的LLM对话产品是Google Bard。我之前一直使用免费的ChatGPT+GPT3.5,Bard也免费,这次试一下Bard将如何表现。

最后生成的自动脚本将调用某一个LLM的接口完成翻译工作。这里使用OpenAI Chat API。

最初提示词

在Google Bard上输入我的提示词:

帮我完成一个Python脚本,用以爬取网页上的一篇文章并使用AI进行翻译:
1. 输入为一个网页地址。
2. 爬取网页上的文章内容。
3. 使用LLM比如GPT来翻译文章内容从英文到中文。要考虑token的限制问题。

我实际上使用英文与Google的LLM进行的沟通。日常工作中,技术问题需要用英文,所以比较习惯。
按照我之前使用ChatGPT的经验,用英文或者中文区别不大。

这里是Google Bard的第一次回答:
AI LLM翻译实践_第1张图片
Bard表现非常不错,从这次回答中可以看到:

  • 结构不错也很有条理,分成4部分:依赖,代码,关键点,提示。
  • 代码整体质量很好,尤其是分块的代码很高级。function定义也有。注释非常详细。后来我在自己的机器上调试和运行代码时,只进行了小小的改动,证明代码质量确实不错。
  • 在我明确要求用LLM的接口进行翻译情况下,Bard还是推荐了自家的Google Translate API;但注释起来了。我后来追问Google Translate API后台是否LLM,Bard回答说不是LLM。
  • 对于GPT的API没有具体的代码,Bard建议自己查相关文档。

多轮对话做调整

在后续进行的多轮对话过程中,我继续做了以下的要求:

  • 使用openai.chat.completions.create API
  • 从.env文件读取API key
  • 保留Google Translate的代码作为可选项
  • 生成完整的代码,包括import语句
  • 把爬取的原文和翻译后的内容分别放入一个文件

Bard 都很好完成了相应的代码修改。

除了技术方面,我自己在多轮对话中的感受:

  • Bard对使用GPT相关的问题,只有在你提示的特别清楚时才会做出相应的修改。我考虑是竞争对手的关系?
  • GPT相比Bard而言,可能更让人感觉是良师益友。一是经常使用Yes, certainly, my apologise,另外GPT的回答通常比你期待的内容更多。
    Google Bard在态度上会稍微生硬和傲娇一点,比如我得一遍遍的告诉它,请输出完整代码;而Google Bard也不太会套近乎,有时候直接甩给你代码,让我感受到那么一点点压力。
    AI LLM翻译实践_第2张图片

最终代码调用LLM接口

在Bard生成的代码基础上,我自己只有三处小的改动:

  1. 拷贝到本地调试时,发现生成的代码中缺少 import os
  2. 修改LLM API的模型名称和参数。这次使用的是gpt-4-turbo-preview
  3. 自己手工分析了想要翻译的源网页,找到了文章的所在的element为div/w3-row-padding
    AI LLM翻译实践_第3张图片

最终代码如下,如果有GPT的API key,可以写在.env文件中。
注:我没有测试Google Translate那部分代码。


import requests
from bs4 import BeautifulSoup
import openai
from dotenv import load_dotenv, find_dotenv
import os

# Load API key from .env file
_ = load_dotenv(find_dotenv())

def crawl_and_translate(url, target_lang="zh-CN"):
    """
    Crawls an article from a web page, saves the original text, translates it,
    and saves the translated text to separate files.

    Args:
        url (str): The URL of the web page to crawl.
        target_lang (str, optional): The target language code (e.g., "zh-CN" for Chinese).
        Defaults to "zh-CN".

    Returns:
        None
    """

    # Fetch and parse the HTML content
    response = requests.get(url)
    response.raise_for_status()
    soup = BeautifulSoup(response.content, "html.parser")

    # Extract the article content
    article_text = soup.find("div", class_="w3-row-padding").get_text()  # Adjust selector as needed

    # Save the original text to a file
    with open("original_text.txt", "w", encoding="utf-8") as f:
        f.write(article_text)

    # Split the text into chunks for translation
    chunks = [article_text[i:i+10000] for i in range(0, len(article_text), 10000)]
    translated_chunks = []

    # Translate each chunk using GPT-4 chat.completions (if API key is available)
    openai_api_key = os.getenv("OPENAI_API_KEY")
    if openai_api_key:
        for chunk in chunks:
            response = openai.chat.completions.create(
                model="gpt-4-turbo-preview",
                messages=[
                    {"role": "system", "content": "Translate this text from English to " + target_lang},
                    {"role": "user", "content": chunk},
                ]
            )
            translated_chunks.append(response.choices[0].message.content)
    else:
        # Use Google Translate as an alternative (uncomment if needed)
        from googletrans import Translator
        translator = Translator()
        for chunk in chunks:
            translated_chunk = translator.translate(chunk, dest=target_lang).text
            translated_chunks.append(translated_chunk)

    # Combine translated chunks and save to a file
    translated_article = "\n".join(translated_chunks)
    with open("translated_text.txt", "w", encoding="utf-8") as f:
        f.write(translated_article)

# Example usage
url = "https://dugas.ch/artificial_curiosity/GPT_architecture.html"
target_lang = "zh-CN"
crawl_and_translate(url, target_lang)

翻译完成

执行完这段脚本,就可以得到LLM的中文翻译了。再根据翻译进行进一步的编辑,比如拷贝图片,调整格式。

编辑后的文章,我发布在了这里:
【翻译】GPT-3架构,简述于“餐巾纸”上

后续

这只是一个基本的爬取和翻译脚本,我可以得到一个不错的文本翻译,但是如果想发布一篇翻译文章,除了稍微做些文字的修改外,还有大量的排版工作需要做。后续考虑需要改进的地方:

  • 如何自动得到文章内容在某个网页中的element?
  • 如何处理文字之外的内容,比如图片。如何智能的排版翻译的文字和原本的图片,减少的工作量。

欢迎留言建议或者讨论。

你可能感兴趣的:(AI人工智能,人工智能)