目录
介绍
本文介绍了如何使用大模型批量地翻译大量文本,包括论文、书籍、文章等。并实验性的使用余弦相似度对其进行质量评估。
本文不提供完整的工程代码,只提供一个思路,具体的实现需要根据实际情况进行调整。
支持的论文格式
持的论文格式包括:
- arxiv的源代码格式
其他的暂不支持,由于pdf的格式比较复杂,需要进行解析和格式转换,转换后的效果可能会比较差,需要进行二次的人工校对,建议使用arxiv的源代码格式。
预处理
arxiv的源码下载下来之后,需要进行预处理,将源码中的latex代码转换为markdown格式。这里选择使用pandoc进行转换,具体的命令如下:
# 解压
tar -zxvf source.tar.gz
# 进入目录
cd source
# 转换为markdown格式,不进行换行
pandoc -s main.tex -o output.md --wrap=none
使用mistune进行解析并加载
使用mistune将markdown格式的论文解析成AST(抽象语法树),然后使用bs4进行解析。具体的代码如下:
import mistune
from bs4 import BeautifulSoup
# 创建Markdown解析器实例
markdown_parser = mistune.create_markdown()
# 读取Markdown文件
with open(r"origin\2304.03442v1.md", "r", encoding="utf-8") as f:
md_content = f.read()
# 解析Markdown内容
html_output = markdown_parser(md_content)
soup = BeautifulSoup(html_output, 'html.parser')
paragraphs = soup.find_all('p') # 获取所有<p>标签
这样操作之后,我们就可以得到一个包含所有段落的列表,每个段落都是一个字符串。
逐段翻译整个论文
得到所有段落之后,就可以逐段翻译整个论文了。
提示词
首先,需要定义一个提示词,告诉大模型我们需要翻译的内容。和输出的格式。
system_prompt = """
请将以下学术论文/章节从英语精准翻译为中文,具体要求如下:
# 术语规范
专业术语需参照《计算机科学术语规范》,保持领域内通用译法。
生僻术语请附原文(括号标注),例:"量子纠缠(Quantum Entanglement)"。
# 风格要求
学术化书面语,避免口语化表达。
保留原文逻辑结构,长句可合理切分为中文短句,但需确保语义连贯。
# 格式保留
图表标题、公式变量、参考文献等需与原文格式一致。
如原文有特殊排版(如代码块、数学符号),请用等宽字体或LaTeX格式标注。
# 补充说明
遇到文化差异表述时,建议直译+脚注说明(例:"此处‘liberal arts’译为‘博雅教育’,指西方通识教育体系")。
如对原文内容存疑(如数据/引用疑误),请用[译注]标出。
# 格式要求
输出格式为JSON,包含以下字段:
- sentence_Id:句子ID,从0开始
- translation:译文
- original:原文
- translation_process:翻译过程
- comments:注释
当句子中遇到双引号等json特殊字符时,需要进行转义。
例如:
## 用户输入
lily ask lilei : "what's your name?"
## 输出
[{
"sentence_Id": 0,
“translation”: "莉莉问李雷\:\"你叫什么名字?\"",
"original": "lily ask lilei \: \"what's your name?\"",
"translation_process": "",
"comments": ""
}]
"""
访问大模型API进行翻译
首先,构造一个LLMAdapter类和一个LLMTranslator类,用于访问大模型API进行翻译。
from openai import OpenAI
from config import * # 导入配置文件中的常量,包括 API 密钥、BASE_URL 和模型名称
import json
# 定义 LLMAdapter 类,用于与 OpenAI 模型进行交互
class LLMAdapter:
def __init__(self, api_key, base_url, model_name):
print("api_key:", api_key) # 打印 API 密钥,用于调试
print("base_url:", base_url) # 打印 BASE_URL,用于调试
print("model_name:", model_name) # 打印模型名称,用于调试
self.model_name = model_name # 存储模型名称
self.client = OpenAI(
api_key=api_key, # 使用环境变量中的 API 密钥
base_url=base_url, # 使用环境变量中的 BASE_URL
)
# 定义 LLMTranslator 类,继承自 LLMAdapter,用于翻译文本
class LLMTranslator(LLMAdapter):
def __init__(self, api_key, base_url, model_name):
super().__init__(api_key, base_url, model_name) # 调用父类的初始化方法
self.system_prompt = """
请将以下学术论文/章节从英语精准翻译为中文,具体要求如下:
# 术语规范
专业术语需参照《计算机科学术语规范》,保持领域内通用译法。
生僻术语请附原文(括号标注),例:"量子纠缠(Quantum Entanglement)"。
# 风格要求
学术化书面语,避免口语化表达。
保留原文逻辑结构,长句可合理切分为中文短句,但需确保语义连贯。
# 格式保留
图表标题、公式变量、参考文献等需与原文格式一致。
如原文有特殊排版(如代码块、数学符号),请用等宽字体或LaTeX格式标注。
# 补充说明
遇到文化差异表述时,建议直译+脚注说明(例:"此处‘liberal arts’译为‘博雅教育’,指西方通识教育体系")。
如对原文内容存疑(如数据/引用疑误),请用[译注]标出。
# 格式要求
输出格式为JSON,包含以下字段:
- sentence_Id:句子ID,从0开始
- translation:译文
- original:原文
- translation_process:翻译过程
- comments:注释
当句子中遇到双引号等json特殊字符时,需要进行转义。
例如:
## 用户输入
lily ask lilei : "what's your name?"
## 输出
[{
"sentence_Id": 0,
“translation”: "莉莉问李雷:\"你叫什么名字?\"",
"original": "lily ask lilei : \"what's your name?\"",
"translation_process": "",
"comments": ""
}]
"""
def translate(self, query):
message = [
{"role": "system", "content": self.system_prompt},
{"role": "user", "content": query},
]
res = self.client.chat.completions.create(
model=self.model_name, # 使用指定的模型名称,
messages=message,
temperature=0.4, # 模型输出的随机性,0 表示随机性最小
)
res_content = res.choices[0].message.content.strip("```json").strip('```')
return json.loads(res_content)
测试代码:
translator = LLMTranslator(**translator_args)
query = """
Figure4:Atthebeginningofthesimulation,oneagentisini
tialized with an intent to organize a Valentine’s Day party.
Despite many possible points of failure in the ensuring
chain of events—agents might not act on that intent, might
not remember to tell others, might not remember to show
up—theValentine’sDaypartydoesinfactoccur,withanum
ber of agents gathering and interacting.
this is test : "test test test."
"""
res = translator.translate(query)
print(res)
输出:
[{'sentence_Id': 0,
'translation': '图4:在模拟开始时,一个智能体(agent)被初始化为具有组织情人节派对的意图。',
'original': 'Figure4:At the beginning of the simulation, one agent is initialized with an intent to organize a Valentine’s Day party.',
'translation_process': "1. 保留'Figure4'作为图表标题直接引用\n2. 'agent'采用计算机科学术语规范译法,首次出现标注原文\n3. 'Valentine’s Day party'译为通用译名'情人节派对'",
'comments': '智能体(agent)为人工智能领域术语,指具有自主决策能力的虚拟实体'},
{'sentence_Id': 1,
'translation': '尽管在后续事件链中存在多个可能的失败点——智能体可能不执行该意图、可能忘记告知他人、可能忘记出席——情人节派对最终确实成功举办,多个智能体聚集并进行了交互。',
'original': 'Despite many possible points of failure in the ensuring chain of events—agents might not act on that intent, might not remember to tell others, might not remember to show up—the Valentine’s Day party does in fact occur, with a number of agents gathering and interacting.',
'translation_process': "1. 将英文破折号转换为中文全角形式\n2. 长句切分为三个短句,通过破折号保持逻辑关联\n3. 'ensuring chain of events'译为'后续事件链'以符合中文表达习惯",
'comments': "此处采用'智能体'而非'代理'以强调其自主性特征"},
{'sentence_Id': 2,
'translation': '这是测试:"测试测试测试。"',
'original': 'this is test : "test test test."',
'translation_process': '1. 保留测试文本的原始功能定位\n2. 对双引号进行JSON格式转义处理',
'comments': '测试用例无需特别注释'}]
对翻译结果进行质量评估
对翻译结果进行质量评估的方法有很多,例如BLEU、ROUGE、METEOR、CIDEr等指标。但是这里实验性的使用Embedding模型计算相似度来进行评估。
- 首先,需要定义一个EmbeddingLLM类和一个cosine_similarity函数,用于计算两个向量的余弦相似度。
# 定义 EmbeddingLLM 类,继承自 LLMAdapter,用于获取文本的嵌入表示
class EmbeddingLLM(LLMAdapter):
def get_embeddings(self, text):
response = self.client.embeddings.create(
model=self.model_name,
input=text,
dimensions=1536
)
return response.data[0].embedding
import numpy as np
# 计算余弦相似度的函数
def cosine_similarity(a, b):
dot_product = np.dot(a, b)
# 不需要计算模长,因为余弦相似度只关心向量的方向,而且归一化操作已经在模型中完成,
# 如果这里计算模长,可能会导致结果不准确。
# norm_a = np.linalg.norm(a)
# norm_b = np.linalg.norm(b)
# # return dot_product / (norm_a * norm_b)
return dot_product
- 然后,使用EmbeddingLLM类和cosine_similarity函数对翻译结果进行评估。
# 定义一个函数,用于评估翻译结果的质量,并输出翻译错误的句子
# 输入参数为翻译结果的JSON格式,输出为一个布尔值,表示是否所有句子的翻译质量都高于0.6
def trans_res_eval(res_json):
for trans in res_json:
trans_ebd = ebd_llm.get_embeddings(trans["translation"])
ori_ebd = ebd_llm.get_embeddings(trans["original"])
similarity = cosine_similarity(trans_ebd, ori_ebd)
print(f"译文与原文的余弦相似度: {similarity:.4f}")
if similarity < 0.6:
print(f"译文:\n‘{trans['translation']}’\n与原文:\n{trans['original']}\n相似度较低,可能存在翻译错误。")
return False
return True
- 最后,使用最开始的代码,将所有的段落翻译出来,然后对翻译结果进行评估。
import mistune
from bs4 import BeautifulSoup
# 创建Markdown解析器实例
markdown_parser = mistune.create_markdown()
# 读取Markdown文件
with open(r"origin\2304.03442v1.md", "r", encoding="utf-8") as f:
md_content = f.read()
# 解析Markdown内容
html_output = markdown_parser(md_content)
soup = BeautifulSoup(html_output, 'html.parser')
paragraphs = soup.find_all('p') # 获取所有<p>标签
ebd_llm = EmbeddingLLM(**embedding_args)
import os
output_dir = "translated"
segments_dir = os.path.join(output_dir, "segments")
os.makedirs(output_dir, exist_ok=True)
os.makedirs(segments_dir, exist_ok=True)
for index, item in enumerate(paragraphs):
item_text = item.get_text()
translated = translator.translate(query=item_text)
eval = trans_res_eval(translated)
if eval:
translated = "".join([item["translation"] for item in translated])
with open(os.path.join(segments_dir,f"{index}.txt"), "a", encoding="utf-8") as f:
f.write(translated + "\n")
print(translated) # 打印翻译后的文本结果
合并翻译结果
import os
# 定义源文件夹、目标文件夹和合并后的文件名
source_folder = "translated/segments"
target_folder = "translated"
merged_file_name = "merged_file.txt"
target_file_path = os.path.join(target_folder, merged_file_name)
# 检查源文件夹是否存在
if os.path.exists(source_folder):
# 打开目标文件以写入合并后的内容
with open(target_file_path, 'w', encoding='utf-8') as outfile:
# 遍历源文件夹中的所有文件
for root, dirs, files in os.walk(source_folder):
for file in files:
source_file_path = os.path.join(root, file)
# 打开源文件并读取内容
with open(source_file_path, 'r', encoding='utf-8') as infile:
outfile.write(infile.read())
# 在每个文件内容后添加换行符
outfile.write('\n')
print("文件合并完成")
else:
print("源文件夹不存在")
翻译结果
翻译结果如下(摘取部分):
摘要:人类行为的可信代理能够赋能各类交互应用,包括从沉浸式环境到人际沟通演练空间,再到原型设计工具。本文提出生成式智能体(generative agents):一种能模拟可信人类行为的计算软件代理。这些智能体会醒来做早餐、去上班;艺术家进行绘画创作,作家从事写作;他们形成观点、关注彼此并发起对话;在规划次日活动时,会回忆并反思过往经历。为实现生成式智能体,我们提出一种扩展大语言模型的架构:使用自然语言存储智能体完整经历记录,随时间推移将这些记忆综合为更高层次的反思,并动态检索记忆以规划行为。我们将生成式智能体实例化于受《模拟人生》启发的交互沙盒环境中,终端用户可通过自然语言与25个智能体构成的小镇互动。评估表明,这些生成式智能体能够产生可信的个体行为与涌现社会行为。例如,仅需用户指定一个智能体想举办情人节派对,这些智能体便能在随后两天内自主传播派对邀请、结识新朋友、相互约会参加派对,并协调时间共同准时出席。消融实验证明,我们的智能体架构组件——观察、规划和反思——各自对行为可信度具有关键贡献。通过将大语言模型与计算交互智能体相融合,本研究提出了实现人类行为可信模拟的架构模式与交互范式。作者:
如何构建一个能反映可信人类行为的交互式人工社会?从《模拟人生》等沙盒游戏到认知模型#和虚拟环境#应用,四十余年来,研究者与实践者一直致力于开发能作为人类行为可信代理的计算智能体。在这些构想中,由计算驱动的智能体既能保持与过往经验的一致性,又能对环境做出可信的反应。此类人类行为模拟可实现以下应用:为虚拟空间和社区填充真实社会现象#,训练人们处理罕见但棘手的人际关系场景#,验证社会科学理论#,构建用于理论和可用性测试的人类处理器模型#,驱动普适计算应用#与社会机器人#,以及支撑开放世界中能处理复杂人际关系的非玩家角色#。
然而,人类行为空间既广袤又复杂尽管大型语言模型已取得显著进展——能够模拟单时间点的人类行为但要构建完全通用的智能体(agent),仍需采用能管理持续增长记忆的架构这些架构需能处理随时间推移而出现及消退的新交互、冲突和事件同时应对多个智能体间展开的级联社会动态(cascading social dynamics)成功的实现需要满足以下要求:长期检索相关事件与交互基于这些记忆进行反思以形成泛化认知和更高层次的推理并运用该推理能力制定行为计划与反应使智能体的即时行为与长期行为轨迹都具有合理性
本文提出生成式智能体(generative agents)——一种基于生成模型来模拟可信人类行为的智能体,并证明其能够生成个体与群体涌现行为的可信模拟。生成式智能体能够对自身、其他智能体及环境进行广泛推理;它们根据自身特征与经历制定日常计划,执行这些计划并在适当时做出反应与重新规划;当终端用户改变环境或用自然语言发出指令时,它们会做出响应。例如:当发现早餐烧焦时,生成式智能体会关闭炉灶;若浴室被占用,它们会在外等候;当遇到想交谈的其他智能体时,会停下来聊天。由生成式智能体构成的社会会涌现出新的社交动态:包括新关系的形成、信息传播以及智能体间的协同行为[^1]。
为实现生成式智能体,我们提出一种代理架构,该架构利用大型语言模型存储、综合并应用相关记忆以生成可信行为。该架构包含三个核心组件:第一是记忆流(Memory Stream),即长期记忆模块,以自然语言全面记录代理的经历。记忆检索模型通过相关性、时效性与重要性三重维度,提取影响代理即时行为所需的记录。第二是反思(Reflection)机制,随时间推移将记忆综合为更高层次的推理,使代理能形成关于自身与他者的结论,从而更好地引导其行为。第三是规划(Planning)模块,将这些结论与当前环境转化为高层行动计划,并递归细化为具体的行动与反应行为。这些反思与规划将反馈至记忆流,持续影响代理的后续行为。
总结
本文主要介绍了如何使用大模型进行论文翻译,包括预处理、解析、翻译和质量评估等步骤。通过使用大模型进行翻译,我们可以快速地将大量的文本进行翻译,并且可以进行质量评估。