我要摸鱼系列|“Ollama + WPS宏”实现本地AI帮你一键续写文档,幼儿园级教程(附代码,开箱即用)
那我们首先第一个问题:啥是Ollama?为什么要用它?
这篇文章
市场小窗,公众号:市场小窗Ollama + Python|本地AI部署保姆级指南,真·幼儿园难度!(附代码)
第二个问题:为什么要搭配WPS宏?
小科普:啥是WPS宏?
回到正题





Sub AI续写()' 1. 声明所有变量 + 定义常量Dim contextText As String, promptText As StringDim httpObj As Object, apiUrl As String, postData As StringDim responseText As String, resultText As StringDim lineArr As Variant, singleLine As StringDim responseStart As Integer, responseEnd As IntegerDim i As IntegerDim cleanContext As String, cleanResult As StringDim 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 ThenMsgBox "请先选中需要续写的文字!", vbExclamation, "温馨提示"Exit SubEnd If' 3. 获取并清理选中的上下文(保留基础格式,仅清理多余换行,整理要发给 AI 的文字)contextText = Selection.TextcontextText = Replace(Replace(contextText, vbCrLf, " "), vbCr, " ") '把原文里的换行符(vbCrLf/vbCr/vbLf,就是按回车产生的符号)换成空格, 清理后 AI 更容易理解原文contextText = Replace(contextText, vbLf, " ") '去掉原文首尾的空格,然后判断 “如果清理后文字为空”(比如只选了空格 / 换行),就弹提示、结束程序If Trim(contextText) = "" ThenMsgBox "选中的文本为空,请重新选择!", vbExclamation, "温馨提示"Exit SubEnd If' 4. 指令词promptpromptText = "你是一位顶尖文字写作专家,精通各类文体。请严格遵循以下要求在待续写原文之后进行文字续写: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 APIErrorWith httpObj.Open "POST", apiUrl, False ' 同步请求,新手友好.setRequestHeader "Content-Type", "application/json;charset=utf-8" ' 避免中文乱码.send postDataEnd With' 6. 解析Ollama流式JSON响应responseText = httpObj.responseTextlineArr = 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"":""") + 12responseEnd = InStr(responseStart, singleLine, """")' 拼接有效续写内容(避免空内容拼接)If responseEnd > responseStart ThenresultText = resultText & Mid(singleLine, responseStart, responseEnd - responseStart) '把每行里的纯续写文字 “拼起来”,装到 resultText 里End IfEnd IfNext' 8. 清理结果并插入到选中文字末尾resultText = Trim(Replace(Replace(resultText, "\n", ""), "\r", "")) '清理续写内容里的换行符(\n/\r),去掉首尾空格'如果 AI 返回了有效内容If resultText <> "" ThenSelection.Collapse Direction:=wdCollapseEnd ' 光标移至选中内容末尾' 设置字体颜色为红色Selection.Font.Color = RGB(255, 0, 0) ' 设置即将输入的文字颜色为红色Selection.TypeText Text:=resultText ' 自动插入续写内容MsgBox "续写完成!", vbInformation, "操作成功"ElseMsgBox "模型未返回有效内容,请检查:" & Chr(13) & _"1. 已拉取对应大模型(ollama list验证)" & Chr(13) & _"2. Ollama服务正常运行(ollama serve)" & Chr(13) & _"3. 选中文本为有效文字(非纯符号/空格)", vbExclamation, "提示"End IfExit 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








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


夜雨聆风
