ChatGPT开发实战|实现英文字幕翻译为中文双语的小工具

介绍如何使用ChatGPT开发一个小工具,它能够将英文字幕翻译为中英双语。我们将详细介绍开发过程中的每个步骤,并提供实用的代码示例,帮助您快速掌握如何使用ChatGPT进行自然语言处理。

d8ff590da32c03252508c41b017c2c7a.png

01

缘起

在完成《教程|使用免费GPU 资源搭建专属知识库 ChatGLM2-6B + LangChain》后,我开始研究这个业界热门的开源框架:LangChain。

LangChain 是一个框架,目的是简化使用大型语言模型(LLMs)创建应用程序的过程。作为一种大语言模型集成框架,LangChain 的用例与语言模型的用例大致重叠,包括文档分析和摘要、聊天机器人和代码分析。

简单来说,LangChain 可以帮助开发人员更快地构建基于语言模型的应用程序,并提供了许多现成的工具和组件来简化开发过程。

当我开始学习吴恩达和LangChain创始人联合发布的课程《》后,发现是英文的,还没字幕,啃起来有点吃力。‍‍

于是把课程视频都下载了下来,用剪映的功能,从视频里识别出英文字幕,导出成字幕文件,再提交给ChatGPT翻译。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

但是这样,就有点费事,想能不能试试用ChatGPT的API功能,把英文字幕变成中英双语。正好实践一下ChatGPT开发。

打开谷歌的Colab,Colab(Colaboratory)是Google提供免费的在线 Jupyter 笔记本环境。

可以直接在浏览器中编写和执行Python代码,无需安装任何软件或配置环境。而且提供了免费的GPU和TPU资源,可以加速深度学习任务的运算。‍‍‍‍‍‍‍‍‍

访问地址:‍‍‍‍‍

https://colab.research.google.com/

剪映导出的字幕文件实际上是一个文本文件,打开后,它类似如下格式的四行文本,按顺序为:序号、字幕开始时间-结束、字幕、空行。

1
00:00:06,200 --> 00:00:07,733
in order to create an application

开发思路:逐行读入文本,从第三行开始,每四行的内容,送给 ChatGPT 去翻译,取回翻译的结果,再写到新文件中。

新字幕文件按顺序为:序号、字幕开始-结束、英文字幕、中文字幕、空行。‍‍‍‍‍‍‍‍‍‍‍‍‍

先检验一下调用 API 翻译是否可行,只发送一、两行字幕。开头很顺利,返回了“in order to create an application” 这句字幕翻译后的中文:“为了创建一个应用程序”。‍‍‍

然后我就把代码改成根据文件逐行循环的代码。不出意外,出了意外:ChatGPT 返回了错误提示,大意是你是免费的 ChatGPT-3.5 的API用户,调用有次数限制,显示是 3次/每分钟。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

我看了一下字幕文本,序号最大182,每分钟只能调用3次,玩啥。如果翻译长一点字幕,还不等到人花儿都谢了。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

官方建议的解决方案: 批量提交Prompt。‍‍‍‍‍‍

也就是说,在下面这个调用ChatGPT函数中,prompt 赋值为一个字符串数组,而不是之前的一行字符串。‍‍‍‍‍‍‍

def get_response(prompt):
    completions = openai.Completion.create (
        engine=COMPLETION_MODEL,
        prompt=prompt,
        max_tokens=512,
        n=1,
        stop=None,
        temperature=0,
    )
    message = completions
    return message

吭哧吭哧,一顿改代码。把要翻译的182行英文,都塞到prompt数组里,然后提交给ChatGPT API。‍‍

不出意外,果然报了另外一个错:一次只能处理 4096 个 tokens 的上下文。数组里这么多文本,早就超过了4096 个 token。‍‍‍‍‍‍‍‍‍‍


‍‍

也就是说,即使是批量提交,总的token长度也是有限制的。

02

再战

目前的限制:每分钟内限制了3次请求,每次请求限制了4096长的token。

开始思考:能不能把字幕合并后,按token上限长度提交给ChatGPT。但是这样做,返回的中文,无法对应上英文。程序不清楚应该在哪里短句,分行。简单翻译可以,但是没办法逐行对应上英文,写回字幕文件中。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

按以前调用函数的开发思路,我想:能不能英文用分割词拼接起来,然后希望得到分割词拼接起来的中文。

先在ChatGPT的聊天界面试试,把多行英文字幕,用三个竖线“|||”拼在一起,然后让GPT给我翻译,期望它能按分割的竖线返回翻译的中文。

但是ChatGPT还是比较智能,直接忽略英文里的竖线分隔符,翻译成没有分隔符的中文。这个方案失败了。‍‍‍‍‍‍‍‍‍‍‍‍‍‍

b66cf3c3192b3b7cdaf1328fc12a15fb.png

苦思冥想了比较久,也没有好的办法。

后来一想,咱是干啥开发的,有现成的人工智能,我为啥不试试告诉它,逐行翻译呢?‍‍‍‍

于是,我设计了这么一段提示词:“你是一名出色的中英文同声传译员。我会一行一行地给你提供英文,你会一行行地把它翻译成中文。中文和英文的行数相同。你明白吗?”‍‍‍

又因为ChatGPT对英文提示词比较智能,具体可以见这篇文章:《为什么你在用 ChatGPT 的提示词 Prompt 似乎效果不如人意?》‍‍‍‍

我把这段提示词变为英文给了ChatGPT:“You are an excellent simultaneous translator in both Chinese and English. I will provide you with English line by line, and you will translate it into Chinese line by line. The number of lines in both Chinese and English is the same. Do you understand?”‍‍‍‍

果然,哈,这个方法奏效了。

第一版提示词‍

f4f49b991708984683dfbcaba8c5e1ca.png

最终版英文提示词‍

9b13e8fca3d7d0c5935cc664a49a3908.png

开始翻译‍

ff49f287c4575c342f365cc03c7f28e8.png

03

成功‍‍

提示词的方案奏效,那就来解决频次和token长度的限制。

首先因为ChatGPT这样的大模型是没有记忆功能的,也就是常说的上下文。

我们之所以有“模型有记忆”这种错觉,因为OpenAI公司开放给用户的ChatGPT聊天页面后面做了很多工程化的工作,其中就包括让模型有记忆的功能:简单来说,就是每次把之前的聊天对话都发给模型,模型就知道接着该说什么。‍‍‍‍‍‍‍

我一开始也犯了这个错误,调用接口发送提示词过去后,再发送英文字幕,仍然还是完整的中文,而不是刚才验证成功的逐行中文。‍‍‍‍‍‍‍‍‍‍‍

为了解决这个问题,写了一个和ChatGPT对话的类。

class Conversation:
    def __init__(self, prompt, num_of_round):
        self.prompt = prompt
        self.num_of_round = num_of_round
        self.messages = []
        self.messages.append({"role": "system", "content": self.prompt})


    def ask(self, question):
        try:
            self.messages.append({"role": "user", "content": question})
            response = openai.ChatCompletion.create(
                model="gpt-3.5-turbo",
                messages=self.messages,
                temperature=0.1,
                max_tokens=2048,
                top_p=1,
            )
        except Exception as e:
            print(e)
            return e


        message = response["choices"][0]["message"]["content"]
        num_of_tokens = response['usage']['total_tokens']
        self.messages.append({"role": "assistant", "content": message})


        if len(self.messages) > 3:
            del self.messages[1: len(self.messages) - 2] #Remove the first round conversation left.
        return message, num_of_tokens

每次对话会把之前的对话和模型的回答,都拼接在提示词prompt变量中,同时为了防止超过token限制,对话超过3次后,会把后面几次对话记录删除。保留最开始起作用的提示词。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

再写一个计算token的方法,使用ChatGTP 提供的计算token接口。‍

COMPLETION_MODEL = "text-davinci-003"


def num_tokens_from_string(string: str, encoding_name: str) -> int:
    """Returns the number of tokens in a text string."""
    encoding = tiktoken.get_encoding(encoding_name)
    num_tokens = len(encoding.encode(string))
    return num_tokens

接口比较简单,需要注意 COMPLETION_MODEL 模型和 encoding_name 编码对应上。‍‍‍‍‍‍

整个代码思路就从开始的方案改为:

读入全部文本到字符串数组;

  • 对数组逐行循环,从第三行开始,每四行的内容-英文字幕,放到prompt变量中,检查再拼接一行是否超过 token 限制;

  • 如果未超过,继续拼接;‍

  • 否则调用聊天类去翻译;

  • 取回的翻译结果,写到中文字符串数组中;‍‍‍‍‍‍‍‍

  • 循环写中英文字幕。

‍‍‍‍‍‍‍‍‍‍‍‍

这次顺利的返回了正确结果,182行字幕分成6次,逐行翻译,中英文一一对应。‍‍‍‍‍‍

in order to create an application
where you can chat with your data
you first have to load your data
into a format where it can be worked with
that's where Ling Jane document loaders come into play
we have over 80 different types of document loaders
and in this lesson
we'll cover a few of the most important ones
and get you comfortable with the concept in general
let's jump in
document loaders deal with the specifics of accessing
and converting data
from a variety of different
formats and sources into a standardized format
there can be
different places that we want to load data from
like websites different databases YouTube
and these documents can come in different data types
like Pdfs HTML JSON
and so the whole purpose of document loaders is to take
this variety of data sources and load them
into a standard document object
which consists of content and then associated metadata
there are a lot of different type of document loaders
in link chain
and we won't have time to cover them all
but here is a rough categorization of the 80
that we have
there are a lot that deal with loading
unstructured data


为了创建一个应用程序
可以与您的数据进行聊天
您首先需要加载您的数据
到一个可以处理的格式中
这就是Ling Jane文档加载器发挥作用的地方
我们有超过80种不同类型的文档加载器
在这节课中
我们将涵盖一些最重要的加载器
并让您对这个概念感到舒适
让我们开始吧
文档加载器处理访问和转换数据的具体细节
从各种不同的格式和来源中
加载数据到标准化格式中
我们可能希望从不同的地方加载数据
比如网站、不同的数据库、YouTube
这些文档可以是不同的数据类型
比如Pdf、HTML、JSON
因此,文档加载器的整个目的是将
这种多样化的数据源加载到一个标准的文档对象中
该对象由内容和相关元数据组成
在链环中有很多不同类型的文档加载器
我们没有时间来涵盖所有的加载器
但是这里是我们拥有的80个加载器的大致分类
有很多处理加载非结构化数据的加载器

至此,这个小工具就此完成。‍‍‍

最后放上吴大佬和LangChain创始人Nemo Yang的Langchain学习课程地址,有兴趣的朋友可以开始学习。‍‍‍‍

https://learn.deeplearning.ai/langchain/lesson/1/introduction


‍‍‍‍‍

参考资料:

OpenAI Document

https://platform.openai.com/docs/guides/rate-limits/overview

阅读推荐:

ChatGPT 官方安卓版正式发布!两种下载安装详细教程

ChatGLM 更新:LongBench—评测长文本理解能力的数据集,支持 32k 上下文的 ChatGLM2-6B-32K

教程|使用免费GPU 资源搭建专属知识库 ChatGLM2-6B + LangChain

Claude 2 解读 ChatGPT 4 的技术秘密:细节:参数数量、架构、基础设施、训练数据集、成本

没有硬件资源?免费使用Colab搭建你自己的Stable Diffiusion在线模型!保姆级教程

拥抱未来,学习 AI 技能!关注我,免费领取 AI 学习资源。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
非常抱歉,由于我是一个语言模型AI,我无法提供您所需的具体代码,但是我可以为您提供一些实现双语翻译的参考资料和思路。 双语翻译是一种涉及到两种不同语言之间的翻译问题。使用深度学习方法,特别是Transformer模型,已经被广泛应用于解决该问题。Transformer是一种强大的神经网络模型,允许输入序列和输出序列之间的相互作用,实现了端到端的神经机器翻译。以下是一些常见的技术,可用于实现双语翻译的Transformer模型: 1. Seq2Seq模型:Seq2Seq模型是一种如今广泛用于双语翻译的网络结构。Seq2Seq模型基于编码器-解码器框架,其编码器将源语言句子映射到一个隐藏向量,这个隐藏向量包含源语言句子的所有信息。解码器通过这个隐藏向量来生成目标语言句子。 2. Attention机制:Attention机制是Seq2Seq模型的重要组成部分,它允许模型对输入序列的不同部分进行加权。具体而言,这种加权机制使得模型能够将注意力集在源序列的不同部分上,从而提高翻译的准确性。 3. Transformer模型:Transformer是一种基于注意力机制的神经机器翻译模型。与Seq2Seq模型相比,Transformer的效率更高,训练速度更快。它通过堆叠多层自注意力和全连接层来实现端到端的翻译。 在实现双语翻译的代码,您需要实现一个编码器网络和一个解码器网络。编码器网络将源语言句子转换为一个隐藏向量。解码器网络使用上下向量和前一个已输出单词来生成目标语言句子。对于Transformer模型,您需要实现自注意力机制和残差连接。 最后,值得注意的是,实现双语翻译需要大量的训练数据。在训练模型之前,您需要收集大规模的双语语料库,并对数据进行预处理。这包括标记化、划分训练集和测试集、进行词汇化等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值