乐于分享
好东西不私藏

使用RAG把英文论文PDF翻译成中文示例代码解析

使用RAG把英文论文PDF翻译成中文示例代码解析
下面示例实现一个需求:上传一篇英文论文,系统能把相关段落翻译成中文,以便读者快速理解论文核心内容。代码实现流程是:PDF → 切片 → 向量化 → 检索 → Prompt → LLM → 回答 → 翻译。

示例代码如下:

import osfrom dotenv import load_dotenvfrom langchain_community.document_loaders import PyPDFLoaderfrom langchain_text_splitters import RecursiveCharacterTextSplitterfrom langchain_community.embeddings import DashScopeEmbeddingsfrom langchain_chroma import Chromafrom langchain_openai import ChatOpenAIfrom langchain.chains import create_retrieval_chainfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.runnables import RunnablePassthrough# ======================# 1. 加载环境变量# ======================load_dotenv()DASHSCOPE_API_KEY = os.getenv("DASHSCOPE_API_KEY")if not DASHSCOPE_API_KEY :    raise ValueError("请在 .env 文件中设置 DASHSCOPE_API_KEY ")# ======================# 2. 加载 PDF,读者可以随便找一个PDF格式的英文论文# ======================file_path = "example_data/2401.03568v2.pdf"if not os.path.exists(file_path):    raise FileNotFoundError(f"PDF 文件不存在: {file_path}")loader = PyPDFLoader(file_path)docs = loader.load()print("页数:"len(docs))# ======================# 3. 文本切分 + 向量化# ======================text_splitter = RecursiveCharacterTextSplitter(    chunk_size=1000,    chunk_overlap=200)splits = text_splitter.split_documents(docs)embeddings = DashScopeEmbeddings(    model="text-embedding-v2",    dashscope_api_key=DASHSCOPE_API_KEY)vectorstore = Chroma.from_documents(    documents=splits,    embedding=embeddings,    persist_directory="./chroma_db")retriever = vectorstore.as_retriever(search_kwargs={"k"4})# ======================# 4. LLM(通义千问)# ======================llm = ChatOpenAI(    model="qwen-plus",    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",    api_key=os.getenv("DASHSCOPE_API_KEY"),    temperature=0)# ======================# 5. RAG Prompt & Chain# ======================system_prompt = (    "你是用于问答任务的助手。"    "请仅使用以下检索到的上下文回答问题。"    "如果你不知道答案,请直接说“我不知道”。"    "最多使用三句话,保持回答简洁。"    "\n\n{context}")prompt = ChatPromptTemplate.from_messages([    ("system", system_prompt),    ("human""{input}")])question_answer_chain = (    RunnablePassthrough.assign(        context=lambda x: retriever.invoke(x["input"])    )    | prompt    | llm    | StrOutputParser())rag_chain = create_retrieval_chain(retriever, question_answer_chain)# ======================# 6. 执行问答# ======================query = "What is AGENT AI?"result = rag_chain.invoke({"input": query})print("\n=== 回答 ===")print(result["answer"])# ======================# 7. 翻译检索到的上下文# ======================def translate_to_chinese(text: str) -> str:    translation_prompt = f"请将以下英文内容翻译成中文:\n{text}"    return llm.invoke(translation_prompt).content.strip()if result.get("context"):    first_doc = result["context"][0]    print("\n=== 原文片段 ===")    print(first_doc.page_content[:500])    print("\n=== 中文翻译 ===")    translated = translate_to_chinese(first_doc.page_content)    print(translated)

示例运行结果:

C:\Users\xiayu\miniconda3\envs\langchain03\python.exe C:\Users\xiayu\PyCharmMiscProject\LangChain官方示例代码学习\RAG\构建一个PDF摄取和问答系统.py 页数: 80=== 回答 ===AGENT AI is an emerging paradigm toward Artificial General Intelligence (AGI) that enables systems to perceive and act across different domains and applications. It emphasizes multimodal understanding—integrating text, vision, and other modalities—and supports embodied interaction in both physical and virtual worlds. AGENT AI leverages large foundation models trained on cross-reality data to enable capabilities like planning, problem-solving, and learning in complex environments.=== 原文片段 ===AGENT AI:SURVEYING THE HORIZONS OF MULTIMODAL INTERACTIONZane Durante1†*, Qiuyuan Huang2‡∗, Naoki Wake2∗,Ran Gong3†, Jae Sung Park4†, Bidipta Sarkar1†, Rohan Taori1†, Yusuke Noda5,Demetri Terzopoulos3, Yejin Choi4, Katsushi Ikeuchi2, Hoi Vo5, Li Fei-Fei1, Jianfeng Gao21Stanford University; 2Microsoft Research, Redmond;3University of California, Los Angeles; 4University of Washington; 5Microsoft GamingFigure 1: Overview of an Agent AI system that can perceive and act in different domains a=== 中文翻译 ===智能体人工智能(Agent AI):  多模态交互前沿探索  扎恩·杜兰特¹†*,黄秋媛²‡∗,直树·若江²∗,  龚然³†,朴在成⁴†,比迪普塔·萨卡尔¹†,罗汉·塔奥里¹†,野田祐介⁵,  德米特里·特尔佐普洛斯³,崔世英⁴,池内克之²,何浩⁵,李飞飞¹,高剑峰²  ¹斯坦福大学;²微软研究院(雷德蒙德);  ³加州大学洛杉矶分校;⁴华盛顿大学;⁵微软游戏部门  1:一种可感知并作用于不同领域与应用场景的智能体人工智能(Agent AI)系统概览。智能体AI正日益成为通向通用人工智能(AGI)的一条极具前景的路径。面向智能体的训练已展现出对物理世界进行多模态理解的能力。该范式通过融合生成式人工智能与多个独立的数据源,构建起一种“现实无关”(reality-agnostic)的训练框架。当大型基础模型在跨现实(cross-reality)数据上完成针对智能体行为与动作任务的训练后,即可同时适用于物理世界与虚拟世界。本文将阐述……Process finished with exit code 0

示例代码流程

环境与安全配置

from dotenv import load_dotenvload_dotenv()
  • 从 .env文件加载环境变量
  • 避免 API Key 硬编码:DASHSCOPE_API_KEY=sk-xxx、OPENAI_API_KEY=sk-xxx
  • 虽然用的是 Qwen,但 LangChain 的 ChatOpenAI接口仍需要 api_key

PDF 文档加载

loader = PyPDFLoader("example_data/2401.03568v2.pdf")docs = loader.load()

概念

说明

PyPDFLoader

按页读取 PDF

docs

List[Document]

Document

包含 page_contentmetadata


文本切分(非常关键)

text_splitter = RecursiveCharacterTextSplitter(    chunk_size=1000,    chunk_overlap=200)splits = text_splitter.split_documents(docs)
  • Embedding 模型有 token 长度限制
  • 检索精度更高
  • 减少幻觉

参数

含义

chunk_size

每个文本块最大字符数

chunk_overlap

相邻块重叠,防止切断语义


向量化(Embedding)

embeddings = DashScopeEmbeddings(    model="text-embedding-v2",    dashscope_api_key=DASHSCOPE_API_KEY)
  • 把文本 → 高维向量
  • 用于 语义相似度搜索,等价于 OpenAI 的:text-embedding-ada-002、text-embedding-3-large

向量数据库(Chroma)

vectorstore = Chroma.from_documents(    documents=splits,    embedding=embeddings,    persist_directory="./chroma_db")

步骤

说明

对每个 chunk

生成 embedding

存入 Chroma

本地向量数据库

持久化

下次不用重新建


Retriever(检索器)

retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
  • 用户输入问题
  • 把问题转成向量
  • 找 最相似的 4 个 chunk,k=4是经验值,可调整

LLM(通义千问)

llm = ChatOpenAI(    model="qwen-plus",    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",    api_key=OPENAI_API_KEY,    temperature=0)

使用temperature=0能做到RAG 场景 稳定、确定,避免“自由发挥”


Prompt 设计(RAG 的灵魂)

system_prompt = (    "你是用于问答任务的助手。"    "请仅使用以下检索到的上下文回答问题。"    "如果你不知道答案,请直接说“我不知道”。"    "最多使用三句话,保持回答简洁。"    "\n\n{context}")

Prompt 的核心约束:限制知识来源、限制回答长度、抑制幻觉


RAG Chain(LCEL 写法)

question_answer_chain = (    RunnablePassthrough.assign(        context=lambda x: retriever.invoke(x["input"])    )    | prompt    | llm    | StrOutputParser())

执行流程拆解(这是 LangChain 官方推荐的 LCEL 写法)

输入 {"input": "..."}   ↓RunnablePassthrough.assign   ↓retriever.invoke → context   ↓prompt.format(context=..., input=...)   ↓llm.generate   ↓StrOutputParser → 字符串

create_retrieval_chain

rag_chain = create_retrieval_chain(retriever, question_answer_chain)

这行代码完成:检索、拼接上下文、调用 QA Chain、返回结构化结果。返回结构如下:

{  "input": "...",  "context": [Document, ...],  "answer": "..."}

执行问答

result = rag_chain.invoke({"input": "What is AGENT AI?"})print(result["answer"])

回答来自 PDF 内容,不是 LLM 的“记忆”


翻译模块解析

def translate_to_chinese(text: str) -> str:    translation_prompt = f"请将以下英文内容翻译成中文:\n{text}"    return llm.invoke(translation_prompt).content.strip()

为什么用 LLM 翻译?学术术语更准确、上下文感知、比传统翻译 API 更适合论文