ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

自制WPS AI插件:接入大模型API实现文档摘要与翻译

自制WPS AI插件:接入大模型API实现文档摘要与翻译

先说结论:不建议去网上找那种“WPS AI 插件破解版”,也不要用任何绕过会员、改包解锁的工具。真正安全可控的做法,是花一晚上自己做一个合规的 WPS AI 插件,把大模型 API 接进 WPS,选中文档内容直接生成摘要、翻译、续写,效果和 WPS 会员里的 AI 功能是同一类东西,而且自由度更高。

这篇文章会拆成两条路线来说明。第一条是快速方案:不安装任何插件,用 Python 脚本 + 剪贴板,在 WPS 里选中内容、Ctrl+C、跑脚本、Ctrl+V,相当于把大模型变成一个“随叫随到的 AI 助手”。第二条是正规方案:用 WPS 官方加载项机制,开发一个侧边栏插件,配合本地 FastAPI 服务调用大模型接口,做到真正的“直接安装加载项、在 WPS 侧边栏里使用 AI”。

实操内容覆盖:环境准备、快速脚本、加载项开发流程、本地 API 服务、批量文档总结、资源占用观察、常见报错排查。如果你只用 WPS 做日常办公,又没有买 AI 会员,这篇非常值得看完。

1. 核心能力速览

能力项说明
项目类型WPS 办公增强,AI 插件 / 自动化脚本
核心功能文档摘要、改写润色、翻译、续写、会议纪要、表格公式生成、批量文档总结
快速方案Python 剪贴板脚本,无需安装 WPS 插件,选中文字即可调用大模型
进阶方案WPS 官方加载项 + 本地 FastAPI 服务,侧边栏集成
显存占用使用云端大模型 API 时不占显存;使用本地 Ollama 才按模型大小占用显存
推荐环境Windows 10/11,WPS 2019 或更新版本;Python 3.9+;Node.js LTS(仅加载项开发需要)
启动方式命令行启动 Python 脚本 / 运行 FastAPI 服务 / WPS 加载项调试模式
接口能力对接 OpenAI 兼容格式的大模型 API,支持自定义模型名和密钥
批量任务支持批量读取 docx 文件并输出 Markdown 摘要
适合场景日常办公提效、内容创作、文档整理、团队内部知识库

没有固定的一键包,也不需要复杂的模型部署。核心依赖就是一个可用的大模型 API,或者本机 Ollama。如果你不想把文档内容发给第三方 API,就改用本地模型;隐私敏感的场景建议全部本地处理。

2. 适用场景与使用边界

这个方案适合三类人:

  • 普通办公人群:需要写工作总结、会议纪要、周报,但不想为 AI 功能单独开会员。
  • 开发者:希望把大模型能力嵌入 WPS,做一个自己可控的办公插件。
  • 团队管理员:需要批量处理旧文档,把 Word 文件统一生成摘要或结构化 Markdown。

不适合的场景也要说清楚。如果你的需求是 WPS 会员里的 PDF 转 Word、图片 OCR、云盘容量、模板会员权益等非 AI 功能,本文的方案覆盖不了,那些是独立的会员能力,和生成式 AI 不是一回事。更准确地说,本文替代的是“AI 写作、AI 阅读、AI 表格公式”这一类大模型功能。

使用边界是这篇文章最重要的一部分。我明确不建议做下面这些事:

  • 不下载、不传播任何声称“破解 WPS 会员”“解锁 AI 会员”的第三方插件。
  • 不使用注册机、盗版序列号、修改版安装包。
  • 不把公司保密文档、个人隐私数据直接提交给未经确认的第三方大模型 API。

如果你需要处理敏感文档,更稳妥的做法是在本机部署 Ollama 等本地推理服务,然后让 WPS 调用本地地址,数据不出机器。批量处理他人文档时,也要确认文档来源和授权范围,不要在未授权的情况下提取、生成、复制他人作品内容。

下面进入实操部分。先做快速方案,因为它在 5 分钟内就能见效,适合先验证效果,再决定是否投入时间开发完整插件。

3. 快速方案:Python 剪贴板 AI 助手

这个方案的思路非常直接:WPS 里选中一段文字,先复制到剪贴板,然后运行一个 Python 脚本读取剪贴板内容,调用大模型 API 生成结果,把结果写回剪贴板,再回到 WPS 按 Ctrl+V 粘贴。整个过程不依赖 WPS 的插件接口,兼容性最好。

3.1 环境准备

安装 Python 3.9 或更高版本,然后安装两个依赖包:

pip install pyperclip requests
  • pyperclip:读写系统剪贴板。
  • requests:调用大模型 HTTP API。

准备一个大模型服务的 API Key。现在很多模型服务商都提供 OpenAI 兼容接口,只需要知道 Base URL、模型名和密钥。如果你希望完全本地运行,可以使用 Ollama,默认地址是http://127.0.0.1:11434,模型名按实际拉取的模型填写,例如qwen2.5:7b。

3.2 脚本实现

新建一个文件wps_ai.py,内容如下:

import sys import pyperclip import requests API_URL = "https://your-api.example.com/v1/chat/completions" API_KEY = "your-api-key" MODEL = "your-model-name" def call_llm(prompt: str) -> str: response = requests.post( API_URL, headers={"Authorization": f"Bearer {API_KEY}"}, json={ "model": MODEL, "messages": [{"role": "user", "content": prompt}], "temperature": 0.7, "stream": False, }, timeout=120, ) response.raise_for_status() return response.json()["choices"][0]["message"]["content"] def main(): clipboard_text = pyperclip.paste() if not clipboard_text.strip(): print("剪贴板中没有文本,请先在 WPS 中复制一段内容。") sys.exit(1) mode = sys.argv[1] if len(sys.argv) > 1 else "summarize" if mode == "summarize": instruction = f"请对下面的内容做 300 字以内的摘要,保留关键结论:\n\n{clipboard_text}" elif mode == "translate": instruction = f"请把下面的内容翻译成中文,语言自然,保留术语:\n\n{clipboard_text}" elif mode == "polish": instruction = f"请对下面的内容做语言润色,使其更书面、更通顺,不要改变原意:\n\n{clipboard_text}" else: instruction = clipboard_text result = call_llm(instruction) pyperclip.copy(result) print("生成完成。回到 WPS 按 Ctrl+V 粘贴即可。") if __name__ == "__main__": main()

注意:API_URL、API_KEY、MODEL三个变量需要替换成你自己的内容。如果不确定模型服务商的具体接口格式,可以先看服务商文档里的“Chat Completions 调用示例”。

3.3 使用步骤

  1. 在 WPS 文字中选中一段需要处理的内容,按 Ctrl+C。
  2. 打开命令行,进入脚本目录,运行:
python wps_ai.py summarize
  1. 等待几秒钟,命令行显示“生成完成”。
  2. 回到 WPS,按 Ctrl+V 粘贴结果。

如果要做翻译,就运行:

python wps_ai.py translate

如果要打磨语言风格,就运行:

python wps_ai.py polish

3.4 判断是否成功

  • 粘贴出来的内容是否和原意一致。
  • 摘要是否包含核心结论。
  • 翻译是否流利,术语是否保持原样。

如果命令行报错401或403,说明 API Key 或接口地址配置错误。如果报超时,说明模型服务端响应慢,可以增加timeout参数,或把输入文本缩短一些。

这个方案最大的优点是没有平台限制,Windows 上只要 WPS 能跑就能用。缺点是操作上多了一步命令行,适合偶尔用一下;如果你希望做成一个能长期使用的工具,建议直接做加载项。

4. 进阶方案:WPS 官方加载项 + 本地 API 服务

WPS 本身提供加载项机制,比如 JS 加载项可以在 WPS 侧边栏显示一个网页界面。我们利用这一机制,开发一个“AI 助手面板”:在面板里输入指令,点击按钮,请求本地 FastAPI 服务,本地服务再转发给大模型 API。

这个结构并不复杂:

  • WPS 侧边栏加载项:负责显示界面、收集用户输入、展示返回结果。
  • 本地 FastAPI 服务:负责接收请求、调用大模型、处理错误、返回结果。
  • 大模型 API:云端或本地 Ollama。

4.1 WPS 加载项开发环境

WPS 官方提供了wpsjs命令行工具,用来创建、调试和打包加载项。安装前确保本机有 Node.js LTS 版本,然后安装工具:

npm install -g wpsjs

初始化项目:

wpsjs create wps-ai-assistant cd wps-ai-assistant

这里会生成一个标准的 WPS 加载项工程,主要文件包括:

wps-ai-assistant/ ├── package.json ├── src/ │ ├── index.html │ ├── index.js │ └── style.css └── wpsjs.config.js

如果你的wpsjs版本生成的结构不同,就以实际生成的文件为准。接下来修改两个关键文件。

4.2 侧边栏页面

打开src/index.html,改成下面这样:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style> body { font-family: system-ui, sans-serif; padding: 12px; } textarea { width: 100%; height: 90px; box-sizing: border-box; } button { width: 100%; margin-top: 8px; padding: 6px; } #result { margin-top: 12px; padding: 8px; border: 1px solid #ddd; border-radius: 4px; white-space: pre-wrap; min-height: 80px; } </style> </head> <body> <p>WPS AI 助手</p> <textarea id="prompt" placeholder="输入指令,例如:把下面内容写成会议纪要"></textarea> <button onclick="runAI()">生成</button> <div id="result">结果区域</div> </body> </html>

这里只做了一个极简界面,一个输入框、一个按钮、一个结果区。实际使用时你可以增加“选中文本”“插入到文档”“清空结果”等按钮,这取决于你想把加载项做到多完整。

4.3 前端调用逻辑

打开src/index.js,写入:

async function runAI() { const prompt = document.getElementById("prompt").value; const resultEl = document.getElementById("result"); if (!prompt.trim()) { resultEl.innerText = "请输入指令"; return; } resultEl.innerText = "正在生成..."; try { const response = await fetch("http://127.0.0.1:8000/chat", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ prompt: prompt }), }); const data = await response.json(); if (data.code === 0) { resultEl.innerText = data.text; } else { resultEl.innerText = "返回错误:" + data.message; } } catch (err) { resultEl.innerText = "调用失败:" + err.message; } }

这里请求的是本地http://127.0.0.1:8000。如果你本机已经跑了别的服务占用 8000 端口,记得把 FastAPI 和这个前端请求改成同一个端口,比如 8010。

4.4 本地 FastAPI 服务

新建一个main.py,内容如下:

from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from pydantic import BaseModel import requests app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"], ) LLM_BASE_URL = "https://your-api.example.com/v1" LLM_API_KEY = "your-api-key" LLM_MODEL = "your-model-name" class ChatRequest(BaseModel): prompt: str @app.post("/chat") def chat(req: ChatRequest): prompt = req.prompt if not prompt.strip(): return {"code": -1, "message": "prompt is empty", "text": ""} try: payload = { "model": LLM_MODEL, "messages": [ {"role": "system", "content": "你是 WPS 文档助手,回答简洁、可直接粘贴使用。"}, {"role": "user", "content": prompt}, ], "temperature": 0.7, "stream": False, } response = requests.post( f"{LLM_BASE_URL}/chat/completions", headers={"Authorization": f"Bearer {LLM_API_KEY}"}, json=payload, timeout=120, ) response.raise_for_status() result = response.json()["choices"][0]["message"]["content"] return {"code": 0, "message": "ok", "text": result} except Exception as exc: return {"code": -2, "message": str(exc), "text": ""}

启动本地服务:

pip install fastapi uvicorn requests uvicorn main:app --host 127.0.0.1 --port 8000

看到Uvicorn running on http://127.0.0.1:8000说明服务启动成功。此时可以先用 curl 验证接口能不能通:

curl -X POST "http://127.0.0.1:8000/chat" \ -H "Content-Type: application/json" \ -d '{"prompt":"请帮我写一份关于本周工作总结的会议纪要"}'

如果返回 JSON 中包含code: 0和text字段,说明本地服务正常,前端加载项就可以直接调用了。

4.5 调试加载项

在项目目录执行:

wpsjs debug

按照 wpsjs 的提示,在 WPS 中打开“开发工具”相关入口,选择“加载项调试”并加载本地项目。具体路径以你的 WPS 版本为准,通常是在 WPS 右侧会出现一个自定义面板,打开后就能看到刚才写的界面。

调试过程中最常遇到三个问题:

  • WPS 没有“开发工具”选项卡:需要去 WPS 设置里开启开发工具模式。
  • 加载项面板空白:检查wpsjs debug是否还在运行,或者刷新加载项。
  • 前端提示“调用失败”:先确认 FastAPI 服务是否在运行,再用 curl 测一次。

从输入材料看,无法确定每个人 WPS 版本的具体菜单名称,所以遇到找不到入口的情况,去 WPS 开放平台查对应版本的加载项调试文档即可。

4.6 打包发布

调试通过后,可以打包:

wpsjs publish

这一步会生成可发布的加载项文件。如果你只在自己电脑上用,不发布到 WPS 开放平台,本地wpsjs debug模式已经够用。如果想分发给同事,需要按 WPS 开放平台的要求完成签名和发布流程。

5. 接口 API 与批量任务

加载项方案解决的是“在 WPS 里交互式使用 AI”的问题。但实际工作中还有一个高频需求:批量处理大量文档。比如你手头有 50 个 docx 周报,想一次性生成摘要,逐个人工复制粘贴显然不现实,这时候需要写一个批量脚本,直接调用本地 API 服务。

5.1 批量 docx 文档总结脚本

安装依赖:

pip install python-docx requests

写一个batch_summarize.py:

from pathlib import Path import requests from docx import Document API_URL = "http://127.0.0.1:8000/chat" def summarize_docx(path: Path, output_dir: Path) -> Path: doc = Document(path) text = "\n".join(p.text for p in doc.paragraphs if p.text.strip()) if not text.strip(): return None response = requests.post( API_URL, json={"prompt": f"请总结下面的文档内容,输出 Markdown 格式:\n\n{text[:5000]}"}, timeout=300, ) response.raise_for_status() result = response.json()["text"] output_file = output_dir / f"{path.stem}_summary.md" output_file.write_text(f"# {path.stem}\n\n{result}", encoding="utf-8") return output_file if __name__ == "__main__": input_dir = Path("./docs") output_dir = Path("./summaries") output_dir.mkdir(exist_ok=True) for docx in sorted(input_dir.glob("*.docx")): try: out = summarize_docx(docx, output_dir) if out: print(f"完成:{docx.name} -> {out}") else: print(f"跳过空文档:{docx.name}") except Exception as exc: print(f"失败:{docx.name},原因:{exc}")

使用前,在脚本所在目录建一个docs文件夹,把要处理的 docx 文件放进去,运行:

python batch_summarize.py

结果会输出到summaries目录,每个文档生成一个同名 Markdown 文件。

5.2 批量任务的工程化建议

批量任务最忌“跑到一半断了,只能从头开始”。上面的脚本是最简版本,实际生产使用建议加三样东西:日志、断点续跑、失败重试。

日志方面,每个文件处理前记录开始时间,处理后记录耗时和输出路径:

import time start = time.time() out = summarize_docx(docx, output_dir) print(f"{docx.name} 完成,耗时 {time.time() - start:.2f}s")

断点续跑方面,可以先把已完成的文件名写入一个done.txt,下次运行时跳过这些文件。

失败重试方面,给请求加一个简单的重试循环:

for attempt in range(3): try: response = requests.post(API_URL, ..., timeout=300) response.raise_for_status() break except Exception as exc: print(f"第 {attempt + 1} 次尝试失败:{exc}") time.sleep(5)

5.3 API 调用规范

本地 FastAPI 服务本身不算复杂,但要保持稳定,需要注意几件事:

  • 不要把 API Key 硬编码在前端页面里。正确做法是 Key 只存在于后端,前端只和本地服务通信。
  • 给/chat接口加一个简单的长度限制,比如prompt超过 8000 字符就截断,避免大文本请求导致超时。
  • 如果多人同时使用,需要在本地服务里加一个请求队列或并发控制,避免某个模型服务端限流导致全部失败。

如果你用的是 OpenAI 兼容接口,很多模型的调用限制体现在 RPM(每分钟请求数)和 TPM(每分钟 Token 数)上。批量任务建议每处理一个文件后加 2 到 5 秒延迟,降低被限流的概率。

6. 资源占用与性能观察

很多人关心这个方案到底吃多少资源,这里分三种情况说明。

6.1 云端大模型 API 模式

这种模式下,占用资源最重的是本地 FastAPI 进程和 Python 脚本进程。通常几十到几百 MB 内存,CPU 占用很低,完全不占显存。因为实际推理发生在别人的服务器上,本机只是做请求转发和文本处理。

6.2 本地 Ollama 模式

如果你自建本地模型,资源占用才需要认真观察。显存占用取决于模型大小,比如 7B 级别模型通常需要 8GB 以上显存,13B 级别需要更高。如果没有独立显卡,用 CPU 推理也不是不行,但速度明显变慢,单次生成长文本可能要等几分钟。

更稳妥的判断方式是:先用ollama run 模型名单独测试一次生成,观察任务管理器里 CPU、内存、显存占用,再决定是否接入 WPS 的批量流程。

6.3 性能瓶颈观察

实际使用中,影响响应速度的主要是四个因素:

  • 输入文本长度:文本越长,模型处理时间越长,也更容易触发超时。
  • 生成长度:要求长文输出时,耗时基本线性增长。
  • 并发数量:同时发起多个请求时,如果你的大模型 API 有并发限制,后面的请求会排队。
  • 网络延迟:云端 API 模式受网络波动影响,建议在代码里设置合理超时。

观察方法很简单。Windows 上打开任务管理器,看 Python 进程的 CPU 和内存;如果用了本地模型,再看“GPU”一栏的显存占用。启动服务后,命令行日志会打印每次请求的耗时,连续跑几轮就能大致摸清本机性能上限。

7. 常见问题与排查方法

问题现象可能原因排查方式解决方案
剪贴板脚本提示没有文本剪贴板里不是文本内容,或 pyperclip 读取失败先在任何地方 Ctrl+C 复制一段文字再运行脚本重新复制文本;确认 pyperclip 安装成功
调用大模型接口报 401/403API Key 错误,或没有访问目标模型的权限检查 API_KEY 变量;用 curl 单独测试一次模型接口重新生成或正确配置 API Key;确认模型名正确
本地服务启动失败端口被占用,或依赖包未安装完整查看 Uvicorn 报错信息;检查 8000 端口占用关闭占用端口的进程,或改用--port 8010
WPS 加载项面板空白wpsjs debug进程被关闭,或 WPS 未开启开发工具重新执行wpsjs debug;在 WPS 里刷新加载项按 WPS 开放平台文档检查调试配置
前端 fetch 调用失败后端服务未启动,或 CORS 不匹配先用 curl 访问http://127.0.0.1:8000/chat确保 FastAPI 已启动;检查 CORS 中间件配置
API 请求超时输入文本过长,或模型服务端响应慢检查 FastAPI 日志中的耗时截断输入文本;把 timeout 调大到 300 秒
批量任务中途失败单个文件内容异常,或模型限流查看失败文件对应的异常信息加异常捕获和重试;两个文件之间加延迟
输出内容不稳定模型温度参数过高,或提示词不够明确检查 temperature 设置;调整提示词把 temperature 降到 0.3 到 0.5 之间;细化提示词
隐私数据泄漏风险把敏感文档发给了第三方 API确认 API Base URL 是否为可信服务高隐私场景改用本机 Ollama 等本地模型

排查时记住一个原则:从下往上查。先确认大模型接口本身能通,再确认本地 FastAPI 服务能通,最后看 WPS 加载项或脚本有没有调用对地址。很多问题其实出在最外层调用参数上。

8. 最佳实践与使用建议

第一,密钥只放后端。前端加载项和脚本都只跟本地服务通信,不要把大模型 API Key 写在index.js或index.html里。本地服务的 API Key 只放在main.py的环境变量或配置文件中,避免项目被分享时泄露。

第二,先小参数测试,再批量执行。第一次接入时用一句话测试,确认接口通了,再测试一段几百字的短文,最后才跑批量任务。批量任务建议先放 3 个文件试运行,确认输出目录、文件命名、失败重试逻辑都没问题,再处理全部文档。

第三,保持目录规范。建议统一为以下结构:

wps-ai/ ├── scripts/ │ ├── wps_ai.py │ └── batch_summarize.py ├── server/ │ └── main.py ├── docs/ # 输入文档 ├── summaries/ # 输出结果 └── logs/ # 运行日志

文档输入、结果输出、脚本代码、服务代码分开放,避免混在一起后误删数据。

第四,接口服务要限制访问范围。本地 FastAPI 服务启动时绑定127.0.0.1,不要使用0.0.0.0,否则同一局域网内其他设备也能调用你的接口,可能造成密钥滥用或服务器资源被消耗。

第五,批量任务加日志和失败重试。至少要把每个文件的处理结果输出到命令行,并把失败原因写到一个error.log文件里。生产环境建议加断点续跑,避免中断后从头开始。

第六,涉及人脸、声音、版权素材时必须确认授权。本文方案虽然主要是文本处理,但如果你后续扩展成处理图片、录音或视频,要确保素材来源合法,不侵犯肖像权、声音权、著作权。

第七,发布或商用前要做效果复核。AI 生成内容不代表最终结果,尤其是公司报告、合同摘要、对外文档,必须人工检查关键数据和结论,防止模型幻觉带来错误。

9. 总结与下一步

这次我们做了一件很实际的事:绕过那些来路不明的插件,用正规技术手段把大模型能力接进 WPS。快速方案适合 5 分钟上手,剪贴板脚本几乎零成本;进阶方案适合长期使用,侧边栏加载项一旦调通,体验和商业 AI 插件已经很接近。

最值得先验证的功能是摘要和翻译。这两种任务对模型幻觉敏感度低,即使偶尔出错,也容易人工发现。

最容易踩的坑有三个:一是 API Key 配置错误导致 401;二是本地服务端口没起对,前端一直调不到;三是批量任务没有加重试,跑到一半中断就得重来。把这三点避开,整个方案基本就稳定了。

接下来你可以按自己的需求扩展:在加载项里加“选中当前文档段落”的功能,让 WPS 自动获取光标附近的文本;把批量脚本改成处理 PDF 或 Excel;或者接入本地 Ollama,走完全离线路线。每一步都是沿着本文的框架继续延伸。

这篇文章的核心思路是:WPS 的 AI 能力不是只能靠付费会员获得,符合规范的 API 接入、自研加载项、批量任务脚本一样能覆盖大部分日常需求。自己动手把服务跑通一次,你会比单纯下载一个插件更清楚里面每一步在做什么。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进