乐于分享
好东西不私藏

我要摸鱼系列|“Ollama + WPS宏”实现本地AI帮你一键续写文档,幼儿园级教程(附代码,开箱即用)

我要摸鱼系列|“Ollama + WPS宏”实现本地AI帮你一键续写文档,幼儿园级教程(附代码,开箱即用)

大家好,我是你们的摸鱼搭子~
领导对不起:不是我不想干活,是AI太想帮我了!
今天咱们聊聊怎么用本地大模型+ WPS宏,实现“一键写文章”的神仙操作!
全程离线运行,数据不外传,安全又高效!

那我们首先第一个问题:啥是Ollama?为什么要用它?

简单来说它是一个超轻量、超好用的本地大模型运行框架,支持主流开源模型,完全离线运行,隐私安全
不用折腾复杂环境,使用命令简单,对电脑配置要求也不高,普通办公本就能流畅使用,而且调用的开源本地大模型都是免费的,成本友好,简直是办公摸鱼神器
不用再把公司文档、敏感材料传到在线AI工具,不用担心文案泄露
——所有AI计算都在你自己电脑里完成,关了网照样用
关于Ollama详细介绍+ 如何部署本地大模型可以去我之前写的

这篇文章

市场小窗,公众号:市场小窗Ollama + Python|本地AI部署保姆级指南,真·幼儿园难度!(附代码)

第二个问题:为什么要搭配WPS宏?

很多人用AI写东西都是:复制粘贴 → 打开AI → 生成 → 再复制 → 粘回WPS文字
太麻烦了!真正的摸鱼高手,追求的是:在文档里点一下,直接出文章!而且全程没有打开其它界面,咱主打的就是一个字:专注!纯粹!
通过WPS宏(VBA)就能做到:调用本地大模型直接读取你文档里的文字 → 自动发给本地大模型 → AI生成完,自动写回文档里

小科普:啥是WPS宏?

咱打工人聊到宏,别觉得是啥高大上的技术词,说白了,WPS宏就是给办公软件定规矩的“小秘书”,用VBA这门简单的语言,把你在WPS里要重复做的操作(点按钮、输文字、调格式、连工具啥的)写成一串“指令脚本”,点一下就能让软件自动帮你干完,主打一个“一次编写,无限复用,告别手动重复劳动!”就拿咱这次的AI写文来说,原本要复制文字、开AI、等生成、再粘回文档,好几步操作,宏就把“读取文档文字 → 传给本地Ollama模型 → 接收AI内容 → 写回文档”这整套流程打包成一个按钮,点一下全自动运行,不用你手忙脚乱切界面,这就是宏的核心本事~ 它可不是啥新东西,虽说用的VBA被戏称“上古语言”,但胜在简单、接地气,不管是自动排版、批量改文档,还是像咱这样联动本地AI搞创作,宏都能hold住,对普通办公本没要求,零基础也能照着教程抄代码用,妥妥的打工人摸鱼、提效双神器,学会用宏,办公能省一大半力气~
通过“Ollama + WPS宏”实现全程手不离键盘、眼不离文档,再加一个眉头紧锁、奋力思考的表情,领导、同事路过,都会被你的专注所打动,升职加薪就在今朝!

回到正题

前置条件(重要)——运行Ollama + 下载好大模型在本地
不知道咋弄的小伙伴参考前面链接的文章,里面有非常详细的教程,一步步教你弄

下面我们正式开始,干货满满:
步骤1:
先新建一个WPS文字文档,依次点击“工具” → “开发工具” → “VB编辑器”,如下图分别所示:
打开后如下图所示:
然后我们在左上方“Normal”的地方 → 鼠标右键点击 → 插入 → 选择“模块”,如下图所示:
然后就会弹出如下空白的框框(这里面就是写VBA代码的地方):
步骤2:
我们复制如下代码进去,保存即可,可用快捷键“Ctlr + S”或者点击下图保存按钮,随后右上角退出即可,如下图所示:
Sub AI续写()    ' 1. 声明所有变量 + 定义常量    Dim contextText As String, promptText As String    Dim httpObj As Object, apiUrl As String, postData As String    Dim responseText As String, resultText As String    Dim lineArr As Variant, singleLine As String    Dim responseStart As Integer, responseEnd As Integer    Dim i As Integer    Dim cleanContext As String, cleanResult As String    Dim duplicatePos As Integer    ' 常量定义(便于修改)    Const API_URL As String = "http://localhost:11434/api/generate"    Const MODEL_NAME As String = "deepseek-r1:1.5b" ' 替换为你本地有的模型    Const MAX_TOKENS As Integer = 300 ' Token设置 中文场景下,1个Token ≈ 0.6~0.7个汉字(或1个汉字 ≈ 1.5个Token)    Const TEMPERATURE As Double = 0.1 ' 降低随机性,提升稳定性    ' 2. 检查是否选中有效文本 作用:防止没选文字就点续写,提示出错    If Selection.Type <> wdSelectionNormal Then        MsgBox "请先选中需要续写的文字!", vbExclamation, "温馨提示"        Exit Sub    End If    ' 3. 获取并清理选中的上下文(保留基础格式,仅清理多余换行,整理要发给 AI 的文字)    contextText = Selection.Text    contextText = Replace(Replace(contextText, vbCrLf, " "), vbCr, " ")  '把原文里的换行符(vbCrLf/vbCr/vbLf,就是按回车产生的符号)换成空格, 清理后 AI 更容易理解原文    contextText = Replace(contextText, vbLf, " ") '去掉原文首尾的空格,然后判断 “如果清理后文字为空”(比如只选了空格 / 换行),就弹提示、结束程序    If Trim(contextText) = "" Then        MsgBox "选中的文本为空,请重新选择!", vbExclamation, "温馨提示"        Exit Sub    End If    ' 4. 指令词prompt    promptText = "你是一位顶尖文字写作专家,精通各类文体。请严格遵循以下要求在待续写原文之后进行文字续写:1. 禁止重复或改写所提供的原文内容,仅在其结尾处自然延展;2. 语境延续:完全基于原文的语境、逻辑、风格和语气进行无缝衔接;3. 风格一致:精准匹配原文的文体、语言节奏、用词习惯与句式结构;4. 内容规范:主题聚焦、逻辑严密、语言精炼,杜绝虚构、冗余、口语化或语法错误;5. 输出格式:仅输出续写部分的正文内容,不包含标题、说明、注释、总结或任何元信息,结尾需自然收束。待续写原文为:" & contextText    ' 5. 调用Ollama REST API(流式接口)    Set httpObj = CreateObject("MSXML2.XMLHTTP.6.0") ' 6.0版本兼容性更强    apiUrl = API_URL     ' 构造POST参数(构造发给 AI 的 “请求数据包”,JSON 格式)    postData = "{""model"":""" & MODEL_NAME & """,""prompt"":""" & Replace(promptText, """""""""") & """,""stream"":true,""options"":{""temperature"":" & TEMPERATURE & ",""max_tokens"":" & MAX_TOKENS & "}}"    ' 捕获API调用错误(Ollama未启动/模型不存在/端口占用),作用:发送请求给 AI + 捕获错误(和 AI “对话” + 防错)    On Error GoTo APIError    With httpObj        .Open "POST", apiUrl, False ' 同步请求,新手友好        .setRequestHeader "Content-Type""application/json;charset=utf-8" ' 避免中文乱码        .send postData    End With    ' 6. 解析Ollama流式JSON响应    responseText = httpObj.responseText    lineArr = Split(responseText, Chr(10)) ' 按行分割流式JSON数据    ' 7. 逐行提取response字段内容,作用:从 AI 返回的杂乱数据里,只提取出 “纯续写的文字”    For i = 0 To UBound(lineArr)        singleLine = Trim(lineArr(i)) ' 去除每行首尾空格/换行        ' 仅处理包含有效response字段的行        If singleLine <> "" And InStr(singleLine, """response"":""") > 0 Then '只处理 “有内容、且包含 response 字段” 的行(过滤空行 / 无效行)            ' 定位response字段的起始和结束位置            responseStart = InStr(singleLine, """response"":""") + 12            responseEnd = InStr(responseStart, singleLine, """")            ' 拼接有效续写内容(避免空内容拼接)            If responseEnd > responseStart Then                resultText = resultText & Mid(singleLine, responseStart, responseEnd - responseStart) '把每行里的纯续写文字 “拼起来”,装到 resultText 里            End If        End If    Next    ' 8. 清理结果并插入到选中文字末尾    resultText = Trim(Replace(Replace(resultText, "\n"""), "\r""")) '清理续写内容里的换行符(\n/\r),去掉首尾空格    '如果 AI 返回了有效内容    If resultText <> "" Then         Selection.Collapse Direction:=wdCollapseEnd ' 光标移至选中内容末尾        ' 设置字体颜色为红色        Selection.Font.Color = RGB(255, 0, 0) ' 设置即将输入的文字颜色为红色        Selection.TypeText Text:=resultText ' 自动插入续写内容        MsgBox "续写完成!", vbInformation, "操作成功"    Else        MsgBox "模型未返回有效内容,请检查:" & Chr(13) & _               "1. 已拉取对应大模型(ollama list验证)" & Chr(13) & _               "2. Ollama服务正常运行(ollama serve)" & Chr(13) & _               "3. 选中文本为有效文字(非纯符号/空格)", vbExclamation, "提示"    End If    Exit Sub ' 正常结束程序'以下为错误处理(AI 调用失败时的提示,方便错误排查)APIError:    ' 详细错误提示,精准定位问题    MsgBox "Ollama API调用失败,请按步骤排查:" & Chr(13) & _           "1. 终端输入ollama serve,确认服务已启动" & Chr(13) & _           "2. 输入ollama list,检查是否有对应大模型" & Chr(13) & _           "3. 浏览器访问http://localhost:11434,显示Ollama is running" & Chr(13) & _           "4. 检查11434端口是否被占用(Windows:netstat -ano | findstr 11434)", vbCritical, "调用失败"End Sub
步骤3:
使用(注意一定要使用按住鼠标左键选择了文字后才能正常使用)
在上方的“开发工具” → 点击“运行宏”,就会发现多了个名为“AI续写”的宏,我们随便编一段文字,选中它,点击下面的“运行”,如下图所示:
点了以后会卡一会儿,看上去什么反应都没有,这是正常的。因为此时本地大模型已经在奋力打工了,只是不显示而已。卡顿的时长和你电脑的配置有关,配置越高则速度越快。结果生成的字体我改为了红色,方便对比、修改
然后我们可以看到模型生成效果(我所使用的是deepseek-r1:1.5b模型,代码里用的就是这个):
使用优化:
我们刚刚的操作过于繁琐,每次都需要在上方的“开发工具” → 点击“运行宏”,我们添加个快捷键,这样每次调用都很方便,操作如下:
点击左上角“文件” → 点击“选项”,弹出界面点击“快速访问工具栏” → 在“常用命令”右边的小三角 → 点击“宏”,如下图
然后点击左边红色框框的“Normal.模块1.AI续写” → 点击“添加” → 右边也显示“Normal.模块1.AI续写” → 点击右下方“确定”,如下图箭头所示:
然后我们就会发现左上角多了个这个标识,这样每次使用时选择了文字直接点他就能调用AI了,非常方便,如下图所示:
然后再来看看写相对正式的文章效果,我们分别用2个模型作为对比
首先模型为qwen3:14b(怎么改模型写在后面,这里先看看效果),结果如下:
然后模型改为gpt-oss:20b,同样的文字续写效果如下:
可以看到模型的参数越大(模型越强)则效果越好,不过国内的系列对于中文适配性更好,建议大家使用时优先使用国内的大模型

第三个问题:怎么修改调用的大模型?怎么更改给模型的提示词prompt来更加匹配自己的需求?

我们回到VBA代码界面(WPS文字文档上方,依次点击“工具” → “开发工具” → “VB编辑器”)
1.在这里修改调用大模型,目前为deepseek-r1:1.5b,可以像我一样改成qwen3:14b或者gpt-oss:20b(当然你得提前下载好模型到你本地的电脑),如下图红色框框所示:
2.这里修改给模型的提示词prompt,下图红线部分(注意提示词别换行,就在这一行修改,不然会报错
至此完毕~
演的专注,生活才酷,摸鱼~
本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 我要摸鱼系列|“Ollama + WPS宏”实现本地AI帮你一键续写文档,幼儿园级教程(附代码,开箱即用)

评论 抢沙发

8 + 9 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮