【OpenAI-Translator】AI翻译助手开发分享

背景

最近我在极客时间学习了《AI 大模型应用开发实战营》,并且边学边开发了一个进阶版本的 OpenAI-Translator。在这篇文章中,我将简要记录一下我的开发过程和一些心得体会,供对此感兴趣的同学参考。

目标

老师提供的代码实现了V1.0的版本,功能清单如下:
• 支持 PDF 文件格式解析
• 支持英文翻译成中文。
• 支持 OpenAI 和 ChatGLM 模型。
• 通过 YAML 文件或命令行参数灵活配置。
• 模块化和面向对象的设计,易于定制和扩展。
有兴趣的同学也可以去看看源代码:V1.0版本代码

本次目标就是基于老师的代码,实现V2.0版本,功能清单如下:
• 支持图形用户界面 (GUI), 提升易用性。
• 添加对保留源 PDF 的原始布局的支持。
• 服务化:以API形式提供翻译服务支持。
• 添加对其他语言的支持。

任务分析

按照功能清单,GUI和API只要功能完善,最后对外提供就行,所以把这两项排在最后。而由于GUI又需要依赖API的接口,因此API先于GUI。

开发过程

由于本人只对Java的技术栈了解,所以开发过程中需要寻求AI助手(自行联想)的帮忙。

报错解决

一开始跑项目,就遇到了一个报错信息:

2023-08-03 17:48:42.134 | ERROR    | book.content:set_translation:59 - An error occurred during table translation: 4 columns passed, passed data had 3 columns

但是实际是哪一行代码报错从日志是看不出来的,所以就问AI助手python有没有类似java可以打印异常堆栈的工具,因项目中已经使用了loguru,接着就了解到可以在方法定义上加上注解@logger.catch。改造后再跑,不幸的是后面就没再出现这个错误了。没关系,自己写个错误测试下:

Traceback (most recent call last):
  File "D:\github\openai-translator\ai_translator\book\content.py", line 56, in set_translation
    num = 1 * 2 / 0
ZeroDivisionError: division by zero
2023-08-04 17:16:41.773 | ERROR    | book.content:set_translation:64 - An error occurred during table translation: division by zero

OK,后面有错误就能定位代码位置了,继续

保留原始布局

先看看目前项目翻译后的结果:
在这里插入图片描述
差异还是挺大的,带上小助手开工。开发过程下来发现无论是助手还是网上的文章,这块的处理都是比较难的,并没有找到好的实现方式。这是目前的一些思路(经过助手帮忙优化):

  1. 文字替换而不改变布局:在进行PDF翻译时,确保被翻译的文本内容与原始文本保持相同的长度和格式。这样能够保持原有布局的完整性,避免文字溢出或错位的问题。
  2. 字体和字号匹配:在进行翻译后,尽可能使用与原始文本相似的字体和字号,以确保翻译后的文本与原始文本在页面上的呈现一致。
  3. 图片和表格处理:对于包含图片和表格的PDF文件,在翻译过程中需要注意保留原有的图片和表格结构。可以通过将图片和表格作为整体进行处理,确保其在翻译后的文档中位置和大小与原始文档保持一致。
  4. 特殊排版元素处理:如果原始PDF包含特殊的排版元素,如页眉、页脚、章节标题等,需要注意在翻译后保持它们的位置和格式。可以采用固定位置的方式,将翻译后的内容嵌入到相应的位置,以确保排版的一致性。
  5. 结构和分栏保持:对于分栏排版的PDF文件,需要确保翻译后的文本也按照相应的分栏进行排版,以保持页面结构的连贯性和整体的美观。
  6. 使用专业工具和软件:为了更好地处理PDF翻译后的布局,可以借助专业的PDF编辑工具或OCR工具,如Adobe Acrobat、ABBYY FineReader等,这些工具提供了一系列功能来处理文本和图像元素,有助于保持原有布局的完整性。

支持其他语言

先看目前的功能,是支持中文的,调试下:

2023-08-04 18:32:11.079 | INFO     | __main__:<module>:10 - 提示语为:翻译为中文:This dataset contains two test samples provided by ChatGPT, an AI language model by OpenAI.These samples include a markdown table and an English text passage, which can be used to test anEnglish-to-Chinese translation software supporting both text and table formats.
2023-08-04 18:32:15.740 | INFO     | __main__:<module>:12 - 翻译后为:该数据集包含由OpenAI的AI语言模型ChatGPT提供的两个测试样本。这些样本包括一个Markdown表格和一段英文文本,可用于测试支持文本和表格格式的英译中翻译软件。

没问题,改为翻译日文再来:

2023-08-04 18:35:33.075 | INFO     | __main__:<module>:10 - 提示语为:翻译为日文:This dataset contains two test samples provided by ChatGPT, an AI language model by OpenAI.These samples include a markdown table and an English text passage, which can be used to test anEnglish-to-Chinese translation software supporting both text and table formats.
2023-08-04 18:35:41.328 | INFO     | __main__:<module>:12 - 翻译后为:このデータセットには、OpenAIのAI言語モデルChatGPTによって提供された2つのテストサンプルが含まれています。これらのサンプルには、マークダウンテーブルと英文のテキストパッセージが含まれており、テキストとテーブルの形式の両方をサポートする英中翻訳ソフトウェアのテストに使用することができます。

实际上也是支持的,这功能就当是让我们测试了,花多点时间在提高准确性上。

翻译准确性提高

先抽取前5页内容翻译看看结果,让AI助手写一个方法处理前5页:

假设你是一名资深的python研发人员,请编写一段代码可以立刻执行的,从一个PDF文件读取前5页内容写入另一个新的PDF文件。请提供相应的完整代码,并附上必要的注释。

代码有错误,扔回给它继续处理

执行报了这个错误:PyPDF2.errors.DeprecationError: PdfFileReader is deprecated and was removed in PyPDF2 3.0.0. Use PdfReader instead.
请调整代码

调整3次后程序正常执行了,并且在tests目录下生成了新的PDF文件first_5_page.pdf
从下面的翻译结果来看,其实效果并不算太差,当然有不通顺和瑕疵的地方:
在这里插入图片描述
老师给的代码中,调用OpenAI接口时只是使用了user,没有使用system。因此我们先从这个着手

messages=[
    {"role": "user", "content": prompt}
]

借助提供的调试工具playgroud在上面不断优化提示词和角色预设,测试好后再拿到代码中。

# TODO:保存上一次的对话信息提高翻译准确性
{"role": "system", "content": "你是一名文学家,对世界的文学都很有研究。请按要求翻译发送给你的文章原文,翻译前你可以先判断文章是否世界名著,参考已有的一些翻译。请使用简洁通顺的语言输出,不要出现语义不通的情况,多联系上下文。"},
{"role": "user", "content": prompt}

在这里插入图片描述
当然为了进一步提高翻译准确性,可考虑把上一次的对话一起带回再调用接口,解决分页后上下文不通顺的情况。但是要考虑是否超限制,这个留待后面迭代。

支持API调用

借助AI助手,不断优化提示语,最终如下:

假设你是一名资深的python研发人员,请使用python编写一个对外提供API的接口,要求如下:接收三个参数,第一个是翻译输出的语言,默认是中文,第二个是翻译输出的文件格式,只能是pdf或者markdown,默认是pdf,第三个是需要翻译的PDF文件;结果输出为翻译后的PDF文件。PDF处理库请使用pdfplumber,接收的PDF文件先保存到本地,文件名不变,然后再调用已写好的翻译方法,请提供相应的完整代码,并附上必要的注释。

生成的代码默认是调用谷歌翻译的,稍微改下使用现有的翻译接口

from flask import Flask, request, send_file
from translator import PDFTranslator
from model import GLMModel, OpenAIModel
from utils import ArgumentParser, ConfigLoader, LOG

app = Flask(__name__)


# 定义 API 路由,使用 POST 方法接收文件和请求参数
@app.route('/translate_pdf', methods=['POST'])
def translate_pdf():
    # 获取语言参数,默认为中文
    target_language = request.form.get('language', '中文')

    # 获取文件格式参数,默认为pdf
    output_format = request.form.get('format', 'pdf')

    # 获取上传的 PDF 文件
    pdf_file = request.files['file']
    print(pdf_file)
    # 保存上传的文件到本地
    uploaded_file_path = 'D:\\github\\openai-translator\\temp\\api_file.pdf'
    pdf_file.save(uploaded_file_path)

    # 翻译后的文件保存路径
    output_file_path = uploaded_file_path.replace('.pdf', f'_translated.pdf')

    # 调用已有翻译接口
    argument_parser = ArgumentParser()
    args = argument_parser.parse_arguments()
    config_loader = ConfigLoader(args.config)
    config = config_loader.load_config()
    model_name = config['OpenAIModel']['model']
    api_key = config['OpenAIModel']['api_key']
    model = OpenAIModel(model=model_name, api_key=api_key)
    # 实例化 PDFTranslator 类,并调用 translate_pdf() 方法
    translator = PDFTranslator(model)
    translator.translate_pdf(uploaded_file_path, output_format, target_language, output_file_path)
    
    # 返回翻译后文件
    return send_file(output_file_path)


if __name__ == '__main__':
    app.run()

把程序跑起来,使用ApiFox调用,功能正常,翻译后的内容也符合在这里插入图片描述
在这里插入图片描述

支持GUI图形界面

本来对这块也没了解很多,看了群里同学的推荐,直接使用:streamlit,官方文档:需要魔法
借助AI助手,不断优化提示语,最终如下:

假设你是一名资深的python研发人员,请使用streamlit库完成一个图形界面,要求如下:
1.一个文本框供用户可以输入OpenAI Key,一个文本框供用户输入翻译语言,一个上传文件控件,限制只能上传PDF文件
2.提交前需要校验参数是否完整
3.提交时调用的接口是http://127.0.0.1:5000/translate_pdf,POST方法,OpenAI Key对应的参数是openai_key,翻译语言对应的参数是language,文件控件对应的参数是file
请提供相应的完整代码,并附上必要的注释。

安装库后启动:streamlit run .\ai_translator\streamlit_gui.py
在这里插入图片描述
可以看到界面是符合要求并且有相应的提示,最后再把之前的API跑起来调用看看:
在这里插入图片描述
看日志是翻译成功了,因为我之前的API接口是返回文件的,所以界面显示乱码了,这个放到后续优化了。

代码优化

使用下面的提示语把代码一段一段的发给AI助手进行优化:

你是一名资深的python研发人员,我接下来会分段发代码给你,请优化代码的逻辑,并添加上必要的注释,让人更容易地读懂代码。

过程发现两个比较有趣的现象:
1、一开始能很好地工作,但当我发多几个代码片段后,AI助手变为了解释代码,而不是优化代码和添加注释,需要再重新和它说明才能继续工作
2、把课程老师的一些代码发过去,发现基本是没有改变的,说明老师应该也是用了助手,哈哈

结语

在作业过程中,我取得了很大的收获和成长。通过这个项目,我深入了解了AI大模型的应用和开发流程。
首先,我学会了如何使用GPT-3.5接口来构建一个强大的AI机器人。通过与机器人的交互,我可以进行文本、表格的翻译工作,能大大提高了工作效率。
其次,我学到了一些优化和调试技巧。使用loguru库,我可以轻松记录和跟踪代码中的日志信息,方便排查错误和改进代码。同时,对代码进行优化,比如添加异常处理和检查输入类型,能够提升代码的可靠性和稳定性。最重要是学会通过chatGPT来帮助我完成大部分的工作,学会了怎么更好的和它聊天。
最后,我在这个过程中更加深刻地认识到了人工智能对人类生活和工作的巨大影响。AI大模型的应用潜力无限,不仅可以提高工作效率,还可以拓展人类的想象力和创造力。
总的来说,通过学习和开发OpenAI-Translator,我不仅掌握了实际的应用开发技能,还深入理解了人工智能的前沿技术和发展趋势。这将对我未来的学习和职业发展带来巨大的帮助。我会继续努力深入学习和探索,为人工智能的发展贡献自己的力量。

最后附上自己的作业仓库地址

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenAI Translator是一款强大的翻译软件,可用于翻译文本、语音和图片。其桌面版可以安装在电脑上,随时随地进行语言翻译,无需连接互联网。 桌面版的OpenAI Translator有非常简洁的界面,在使用时非常方便。用户只需将需要翻译的文本或上传图片或录制音频,并选择目标语言,OpenAI Translator即可自动进行翻译。 与其他翻译软件相比,OpenAI Translator具有更高的翻译质量和准确性。它使用了强大的机器学习和人工智能技术,能够更好的理解语言中的语意和表达方式,从而实现更加精准地翻译。此外,桌面版还支持多种语言,用户可以根据自己的需求进行选择。 总体来说,OpenAI Translator是一款功能强大的翻译软件,其桌面版更是提供了更加便捷的使用体验。如果您需要进行跨语言的交流和沟通,OpenAI Translator绝对是您不可或缺的助手。 ### 回答2: OpenAI Translator 桌面版是一种集成了机器翻译技术的桌面应用程序,它采用了最新的深度学习技术,通过卷积神经网络(CNN)和循环神经网络(RNN)实现了高质量的翻译效果。它支持多种语言之间的翻译,包括但不限于英语、中文、法语、德语、西班牙语、俄语、日语、韩语等等。用户可以通过直接输入文字、上传文档或选择网页链接的方式进行翻译OpenAI Translator 桌面版还可以对翻译结果进行实时修改和优化,并提供了相应的注释功能。除此之外,它还支持离线翻译,用户可以在没有网络的条件下进行翻译,大大增加了应用的灵活性和适用范围。总的来说,OpenAI Translator 桌面版是一款功能强大、易于使用、翻译效果优秀的机器翻译应用程序,为用户提供了全方位的翻译服务,将语言之间的交流变得更加便捷和高效。 ### 回答3: OpenAI Translator桌面版是一款强大的机器翻译软件,它使用人工智能技术,能够翻译多种语言,并提供语音翻译功能。这款软件可以帮助用户更加轻松地沟通交流,帮助用户在不同语言环境下更好地工作和生活。 OpenAI Translator桌面版的特点在于使用了最先进的机器翻译技术,这使得翻译结果更加准确和流畅。用户可以选择多种语言和语音,包括中文、英文、日文、法语、德语等多种语言,帮助用户轻松实现多语言交流。 除了语言和语音功能外,OpenAI Translator桌面版还提供了多种翻译工具,帮助用户更好地管理翻译内容。用户可以自由设置翻译颜色、字体、格式等,以满足不同需求。此外,这款软件还提供了多种翻译搜索功能,帮助用户快速查找需要翻译的内容。 总之,OpenAI Translator桌面版是一款优秀的机器翻译软件,它可以帮助用户更加轻松地进行多语言交流,并提供了许多实用的翻译工具,让翻译变得更加简单和高效。无论是学习、工作还是旅游,这款软件都能为用户提供极大的帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值