现在好多人还在坚持用网页版的对话式AI来完成任务,它主打一个免费,但其实很麻烦。我拿一件事来对比一下。
你手里有一篇英文版的PDF文件,读起来挺吃力,想要把它翻译成中文版,然后在本地保存一份。就说最简单的情况吧,不需要什么复杂的排版,但确实得在本地存好。
先用网页版AI来做这件事
如果你用网页版AI来处理这个PDF,流程大概是这样的:先把PDF拖上传,然后等它翻译。翻译完复制粘贴下来存好。如果PDF特别长,它一次翻不完,你还得在对话框里不停说"继续继续",让它接着翻。翻完之后存成什么格式、怎么排版,这些还得你自己动手调。每一篇PDF都要走一遍这个流程,没有例外。
而且还有个问题,网页版的翻译过程是不存中间产物的。翻译完了,原文怎么说的、哪些地方你让它重点翻了,换个对话框它就不记得了。
换本地化AI试试
换本地化AI处理同一个PDF,流程就不一样了。它先帮你把PDF转成一份Markdown的英文文本存下来,以后你要引用原文就不用再重新解析一遍PDF了。然后它开始全文翻译,一直翻到结尾,你全程不用动手。翻完存成什么格式,你说一声就行,想存Markdown、想存Word还是什么别的格式,它都能帮你办了。
翻译完之后,PDF原件其实可以删掉,但英文Markdown和翻译后的中文版我会都存着。后面要回看原文、检索某个关键词、或者让AI帮我从原文里找支撑论证,直接读这两份文本就行,不用再去解析PDF了。
而且你存的位置固定之后,本地化AI还有一个网页版完全做不到的事——全文检索。比如说我手头有一整个文件夹的英文文献,都转成了.en.md和.zh.md存在那儿。哪天我写东西需要找一个具体的论点支撑,我直接跟 AI 说"帮我在那个文件夹里搜一下哪些文章提到了 X 理论",AI 就会用 Grep 工具扫一遍所有 md,把命中的行和出处列给我。网页版这事儿根本办不到,它看不到你本地的文件,最多只能在当前对话里翻聊天记录,翻完了还经常失忆,上下文一长就乱了。
两个流程摆在一起看
把两个流程画成一张图,差别更直观。网页版是一次性流程,每篇都要从头走一遍。本地化第一次稍微费劲,但中间产物和规则都沉淀下来了,后面越用越省劲。
图 1 网页版AI vs 本地化AI 处理PDF翻译的工作流程对比
为什么体验差这么多
核心原因就叠了两层,表格里列得很清楚。
| 对比项 | 网页版AI | 本地化AI |
|---|---|---|
| 是否需要手动上传 | 必须,一篇传一次 | 不需要,直接扫你本地文件夹 |
| 翻译过程是否需要手动介入 | 需要,长文得不停说"继续" | 不需要,一口气翻到结尾 |
| 能否对本地文件全文检索 | 不能,看不到本地文件,只能翻聊天记录还容易失忆 | 能,AI 用 Grep 扫整个文件夹,秒出结果 |
| 是否便于事后回看原文 | 很麻烦,上下文一长就找不到 | 英文 Markdown 留着,随时精准读 |
| 输出格式是否灵活 | 不灵活,复制粘贴后自己调格式 | 说一声就行,想存什么格式都能办 |
| 多文件批量处理 | 不现实,N篇就要N次手动循环 | 文件夹一丢,一次搞定 |
这张表其实就是本地化AI优于网页版AI的全部理由。核心就叠了两个东西,一是能看见你本地的文件,不用你一个个传上去。二是能跑代码批量处理,一件事说定了规则,后面自动走。光会跑代码看不见文件没用,光看得见文件跑不起来也没用,两个点缺一不可。
彩蛋:沉淀成一个skill反复用
因为我自己常用这个功能,隔三差五就往一个文件夹里塞新的英文PDF,每篇都要走一遍转Markdown、翻译的流程。我干脆把整个过程沉淀成了一个skill,方便后面复用。
我拿刚才自己跑的一次来举例子。这个 skill 文件夹里已经有pdf2md.py脚本和一份写好流程的SKILL.md文件。同级目录下放了一个叫sample_jokes.pdf的文件,就是五个关于程序员和 AI 的小笑话。
我跟 AI 说:“读一下那个 SKILL.md,帮我处理一下这个 PDF。”
然后它先跑pdf2md.py,扫了一眼文件夹,输出了这么一行:
发现 1 个 PDF,开始转 Markdown ... [完成] sample_jokes.pdf → sample_jokes.en.md 全部处理完毕。它不会重复解析已经转好的文件,下次再加新的 PDF 只会处理新增的。跑完脚本,它读了一下那个.en.md,五个笑话的全文就在对话里展开了。然后直接翻成中文,存成sample_jokes.zh.md。
翻译这步没调任何外部 API,就是对话 AI 在对话里自己翻的。格式整理也一样,原文怎么分段它就怎么分段,专业术语像 rubber duck(编程调试的经典道具)保留英文,必要时在括号里补一下中文译法。
所以这个 skill 文件夹里其实就两个东西:
pdf-translate-skill/ ├── SKILL.md ← 告诉 AI 按什么步骤做事 └── pdf2md.py ← PDF 转 Markdown 的脚本你也可以自己建一个
我相信上述场景你可能常常会遇到,为了便于你去复用,我把上面完整的文件夹文件给你写出来,你可以照搬上面的文件结构,复制粘贴到你本地,配合你安装的本地化AI使用。
先在项目的.trae/skills/下面建一个文件夹,比如叫pdf-translate-skill,然后在里面放下面三个文件。
文件 1:pdf2md.py(PDF 转英文 Markdown)
依赖 pdfplumber,先装一下:pip install pdfplumber
""" pdf2md.py —— 扫描指定文件夹里的所有 PDF,逐个转成同目录下的英文 Markdown 文件。 依赖:pdfplumber(pip install pdfplumber) 用法:python pdf2md.py <pdf_folder> """importsysfrompathlibimportPathimportpdfplumberdefpdf_to_markdown(pdf_path:Path)->str:"""单个 PDF → Markdown 文本,尽量保留段落结构。"""lines=[]withpdfplumber.open(pdf_path)aspdf:forpage_num,pageinenumerate(pdf.pages,1):text=page.extract_text()or""lines.append(f"## Page{page_num}\n")lines.append(text)lines.append("\n")return"\n".join(lines)defmain():iflen(sys.argv)<2:print("用法: python pdf2md.py <pdf_folder>")sys.exit(1)folder=Path(sys.argv[1])ifnotfolder.is_dir():print(f"目录不存在:{folder}")sys.exit(1)pdfs=sorted(folder.glob("*.pdf"))ifnotpdfs:print(f"{folder}里没有 PDF 文件")sys.exit(0)print(f"发现{len(pdfs)}个 PDF,开始转 Markdown ...")forpdfinpdfs:md_path=pdf.with_suffix(".en.md")ifmd_path.exists():print(f" [跳过]{md_path.name}已存在")continuetry:md_content=pdf_to_markdown(pdf)md_path.write_text(md_content,encoding="utf-8")print(f" [完成]{pdf.name}→{md_path.name}")exceptExceptionase:print(f" [失败]{pdf.name}:{e}")print("全部处理完毕。")if__name__=="__main__":main()文件 2:format.py(中文 Markdown 转 Word,可选)
依赖 python-docx,先装一下:pip install python-docx。如果你只需要 Markdown 格式,这个文件可以不放。
""" format.py —— 把已有的中文 Markdown 转存成指定格式(目前支持 md / docx)。 依赖:python-docx(pip install python-docx) 用法:python format.py <folder> <md_suffix> <output_format> md_suffix 用于识别哪个是"翻译好的中文 md",比如 ".zh.md" output_format 可选: md, docx """importsysfrompathlibimportPathtry:fromdocximportDocumentexceptImportError:Document=Nonedefmd_to_docx(md_path:Path,docx_path:Path):"""简单的 md → docx:每行当一个段落,# 开头的设标题。"""ifDocumentisNone:raiseRuntimeError("python-docx 未安装,先 pip install python-docx")doc=Document()forraw_lineinmd_path.read_text(encoding="utf-8").splitlines():line=raw_line.rstrip()ifnotline:doc.add_paragraph("")continueifline.startswith("### "):doc.add_heading(line[4:],level=3)elifline.startswith("## "):doc.add_heading(line[3:],level=2)elifline.startswith("# "):doc.add_heading(line[2:],level=1)elifline.startswith("- ")orline.startswith("* "):doc.add_paragraph(line[2:],style="List Bullet")else:doc.add_paragraph(line)doc.save(docx_path)defmain():iflen(sys.argv)<4:print("用法: python format.py <folder> <md_suffix> <output_format>")print("示例: python format.py D:/papers .zh.md docx")sys.exit(1)folder=Path(sys.argv[1])suffix=sys.argv[2]# 如 ".zh.md"out_fmt=sys.argv[3].lower()ifout_fmtnotin("md","docx"):print(f"output_format 只支持 md / docx,你写了{out_fmt}")sys.exit(1)mds=sorted(folder.glob(f"*{suffix}"))ifnotmds:print(f"{folder}里没有 *{suffix}文件")sys.exit(0)print(f"发现{len(mds)}个 *{suffix},开始转{out_fmt}...")formdinmds:ifout_fmt=="md":print(f" [已是 md]{md.name}")continuedocx_path=md.with_suffix("").with_suffix(".docx")try:md_to_docx(md,docx_path)print(f" [完成]{md.name}→{docx_path.name}")exceptExceptionase:print(f" [失败]{md.name}:{e}")print("全部处理完毕。")if__name__=="__main__":main()文件 3:SKILL.md(告诉 AI 怎么干活的操作手册)
这个就是写给 AI 看的,写得清楚就行。直接把下面这份复制过去:
# pdf-translate skill ## 是什么 扫描一个文件夹里的英文 PDF,自动完成三步: 1. PDF → 英文 Markdown(用 pdf2md.py) 2. AI 在对话里读英文 md,逐篇翻成中文 md(不用独立脚本、不用外部翻译 API) 3. 按用户指定格式落回同文件夹(用 format.py) ## 目录结构 ``` pdf-translate-skill/ ← 把整个文件夹粘到任何项目的 .trae/skills/ 下即可 ├── SKILL.md ← 你正在读的这个 ├── pdf2md.py ← PDF 转英文 Markdown(依赖 pdfplumber) └── format.py ← 中文 Markdown 转 docx(依赖 python-docx) ``` ## 使用前提 - 已安装 pdfplumber:`pip install pdfplumber` - 已安装 python-docx:`pip install python-docx` ## 触发方式 用户说类似下面的话时启用: - "帮我把 D:/papers 里的英文 PDF 都翻译一下" - "扫一下这个文件夹里的 PDF,翻成中文存 md" - "处理一下这个目录下的英文文献" ## 执行流程(必须严格按顺序走) ### 第 1 步:确认目标文件夹和输出格式 先跟用户确认两件事: 1. 要处理哪个文件夹的 PDF(完整路径) 2. 翻译后存成什么格式(md / docx / 两者都要) ### 第 2 步:运行 pdf2md.py,把所有 PDF 转成英文 Markdown ``` python <skill_path>/pdf2md.py <target_folder> ``` - 脚本扫描 `<target_folder>` 下所有 `.pdf` 文件 - 每个 PDF 生成一个 `<原名>.en.md`,放在同目录 - 已经有 `.en.md` 的跳过,不会重复解析 ### 第 3 步:AI 逐篇翻译 .en.md → .zh.md(在对话里翻,不用脚本) 这是整个流程的核心。**不调外部翻译 API,不跑 translate.py**。AI 直接用 Read 工具读 `.en.md` 文件,读到对话里,然后在对话里翻译,翻译完 Write 回去。 翻译规则: - 保持原文段落结构,不要打乱语序 - 专业术语保留英文(首次出现时可在括号里给中文译法) - 翻不完就继续翻,直到 `.en.md` 全文译完,不受单次输出限制 - 每翻完一篇就存成 `<原名>.zh.md`,放在同目录,**一篇存一篇**,不要等全部翻完再存 翻完一篇就存一篇的原因:如果翻到一半 AI 断了,你不会丢已经翻好的部分,下次可以从断点接着翻。 ### 第 4 步:按用户要求转存格式 如果用户要求输出 docx(或 md + docx 都要),运行: ``` python <skill_path>/format.py <target_folder> .zh.md <output_format> ``` - `<output_format>` 填 `md` 或 `docx` - 如果用户只想要 md,这一步跳过 ### 第 5 步:汇总输出清单告诉用户 跑完后列一下:一共多少 PDF,转了多少 en.md,翻了多少 zh.md,最终生成了哪些格式,放在哪个目录。 ## 关于复用 - 英文 `.en.md` 长期留存,以后查原文/做笔记不用再解析 PDF - 以后往同一个文件夹里加新的 PDF,直接再触发本 skill,已有的 `.en.md` 和 `.zh.md` 会跳过,只处理新增的 - 换了新文件夹,重新走一遍 1-4 步即可 ## 关于安全 - 不会删除任何文件,PDF 原件始终保留 - 所有输出都是新增文件(`.en.md`、`.zh.md`、`.docx`),不覆盖已有三个文件复制完,skill 就建好了。以后要处理 PDF,把 PDF 丢到你想处理的文件夹里,跟 AI 说一声就行使用这个文件夹下的技能,就可以美滋滋的复用啦。
最后说一句
相信你自己实验过后,就会发现本地化AI在这种重复工作中的效率绝对是碾压的。