Skip to content

翻译 Agent

🎯 学习目标

  • 完成 PDF → 段落 → 分块翻译 → 导出 Markdown 全链路
  • 维护全局术语表保证译名一致
  • 用 LangChain LCEL 串联 Loader 与 LLM

引言

本课从零搭建文档翻译助手,是企业最常见的 LLM 落地形态之一。按步骤做,2 小时内可跑通 MVP。

章节正文

第 1 步:第 1 步:项目初始化

bash
mkdir translate-assistant && cd translate-assistant
python -m venv .venv && source .venv/bin/activate
pip install langchain langchain-openai pypdf gradio python-docx

目录结构:

translate-assistant/
├── app.py           # Gradio 入口
├── chain.py         # LangChain 翻译链
├── glossary.json    # 术语表
└── uploads/         # 临时 PDF

第 2 步:第 2 步:PDF 加载与分块

python
from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter

def load_pdf(path: str):
    docs = PyPDFLoader(path).load()
    splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100)
    return splitter.split_documents(docs)

overlap 避免句子在 chunk 边界被截断。metadata 保留 page 便于对照原文。

第 3 步:第 3 步:术语表注入 Prompt

python
import json
from langchain_core.prompts import ChatPromptTemplate

with open("glossary.json") as f:
    glossary = json.load(f)  # {"Transformer": "Transformer", "Embedding": "嵌入"}

prompt = ChatPromptTemplate.from_messages([
    ("system", """你是专业译员。英译中。
术语表(必须遵守):{glossary}
保留 Markdown 标题层级。只输出译文。"""),
    ("human", "{text}"),
])
translate_chain = prompt | llm | StrOutputParser()

第 4 步:第 4 步:批量翻译与导出

python
def translate_document(chunks):
    results = []
    for i, doc in enumerate(chunks):
        zh = translate_chain.invoke({"text": doc.page_content, "glossary": glossary})
        results.append(f"<!-- page {doc.metadata.get('page', i)} -->\n{zh}")
    return "\n\n".join(results)

长 PDF 用 batch 或异步限流;记录每 chunk 耗时日志(7.3)。

第 5 步:第 5 步:Gradio UI

python
import gradio as gr

def on_upload(file, target_lang):
    chunks = load_pdf(file.name)
    md = translate_document(chunks)
    return md, md  # preview + download text

gr.Interface(
    fn=on_upload,
    inputs=[gr.File(file_types=[".pdf"]), gr.Dropdown(["中文", "英文"], value="中文")],
    outputs=[gr.Markdown(), gr.File()],
    title="智能翻译助手",
).launch()

动手练习

  1. 翻译一份 10 页以内 PDF,检查术语一致性
  2. 增加「保留原文对照」双栏输出
  3. 为翻译链添加 stream 进度条

本节小结

翻译助手 = Loader + Splitter + 术语 Prompt + 分块 LLM + Gradio;注意 overlap 与 glossary。