前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ChatGPT开发实战|实现英文字幕翻译为中文双语的小工具

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

作者头像
技术人生黄勇
发布2024-07-19 18:26:57
380
发布2024-07-19 18:26:57
举报
文章被收录于专栏:技术人生黄勇

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

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/

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

代码语言:javascript
复制
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 赋值为一个字符串数组,而不是之前的一行字符串。‍‍‍‍‍‍‍

代码语言:javascript
复制
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还是比较智能,直接忽略英文里的竖线分隔符,翻译成没有分隔符的中文。这个方案失败了。‍‍‍‍‍‍‍‍‍‍‍‍‍‍

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

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

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

又因为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?”‍‍‍‍

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

第一版提示词‍

最终版英文提示词‍

开始翻译‍

03

成功‍‍

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

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

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

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

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

代码语言:javascript
复制
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接口。‍

代码语言:javascript
复制
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次,逐行翻译,中英文一一对应。‍‍‍‍‍‍

代码语言:javascript
复制
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在线模型!保姆级教程

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术人生黄勇 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
NLP 服务
NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档