笔者运营的知识星球里有朋友提问,大意是公司不能访问外网,想在 Microsoft Word 里访问公司本地部署的 DeepSeek API,问具体应该如何操作? 笔者蛇年春节时曾经尝试过自己部署 DeepSeek. 笔者使用的笔记本配置:Intel(R) Core(TM) i7 2.4G + 64G 内存 + 2TB SSD 所以笔者没打算在本地部署哪怕是参数最小的 DeepSeek 版本,而是死皮赖脸的找腾讯云社区的运营小姐姐,要了 100 元代金券,然后在腾讯 HAI 上创建了一台 Windows Server 实例,在上面部署了 DeepSeek: 后来这 100 元被我霍霍完之后,我也不好意思再去要代金券了,如今我又转战 DeepSeek 官方的 API 了。 不过在 Word 里调用 DeepSeek 官方 API 还是本地 API,步骤都基本一致,无非是 API url 修改一下就行了。本文给出的示例代码里,调用的是官网 API endpoint. 实现思路就是在 Word 里创建一个宏,把调用 DeepSeek API 的 Visual Basic 代码,写在这个宏里。 我们首先需要把 Word 里创建宏的入口放出来,让它显示在 Word 的工具栏里。 在 Word 的 File->Options 选项里,选择 Customize Ribbon,将 Developer 标签从左侧移到右侧,然后在 Developer 标签下新建一个 Group,随便起个名称。 一会儿我们要把创建好的宏,放到这个 Group 里去。 接下来我们就能在工具栏里看到 Developer 了,点击 Visual Basic,新建一个 Module: 下一步是给这个 Module 填充 Visual Basic 代码。 代码从哪来?肯定不用自己写。再次祭出 Trae(笔者现在是越来越懒了): 发出指令: 我要在 Word 里使用 Visual Basic, 调用 DeepSeek V3 API. API 输入,是用户在 Word 里选中的一段文本。
Trae 很快给我返回了下面的 Visual Basic 代码,除了将代码里的 API key place holder 去掉之外,其他的原封不动。 把 Trae 写好的 Visual Basic,粘贴到新建的 Module 中。 Function CallDeepSeekAPI(api_key As String, inputText As String) Dim API As String Dim SendTxt As String Dim Http As Object Dim status_code As Integer Dim response As String API = "https://api./chat/completions" SendTxt = "{""model"": ""deepseek-chat"", ""messages"": [{""role"":""system"", ""content"":""You are word writting assistant""}, {""role"":""user"", ""content"":""" & inputText & """}], ""stream"": false}" Set Http = CreateObject("MSXML2.XMLHTTP") With Http .Open "POST", API, False .setRequestHeader "Content-Type", "application/json" .setRequestHeader "Authorization", "Bearer " & api_key .send SendTxt status_code = .Status response = .responseText End With If status_code = 200 Then CallDeepSeekAPI = response Else CallDeepSeekAPI = "Error: " & status_code & " - " & response End If Set Http = Nothing End Function Sub DeepSeekV3() Dim api_key As String Dim inputText As String Dim response As String Dim regex As Object Dim matches As Object Dim originalSelection As Object api_key = "<此处粘贴你自己的 DeepSeek API Key>" If api_key = "" Then MsgBox "Please enter the API key." Exit Sub ElseIf Selection.Type <> wdSelectionNormal Then MsgBox "请在 Word 里选中一段文字" Exit Sub End If Set originalSelection = Selection.Range.Duplicate inputText = Replace(Replace(Replace(Replace(Replace(Selection.Text, "\", "\\"), vbCrLf, ""), vbCr, ""), vbLf, ""), Chr(34), "\""") response = CallDeepSeekAPI(api_key, inputText) If Left(response, 5) <> "Error" Then Set regex = CreateObject("VBScript.RegExp") With regex .Global = True .MultiLine = True .IgnoreCase = False .Pattern = """content"":""(.*?)""" End With Set matches = regex.Execute(response) If matches.Count > 0 Then response = matches(0).SubMatches(0) response = Replace(Replace(response, """", Chr(34)), """", Chr(34)) response = Replace(response, "\n", vbCrLf) response = Replace(response, "\n", vbCrLf) response = Replace(response, "*", "") response = Replace(response, "#", "") Selection.Collapse Direction:=wdCollapseEnd Selection.TypeParagraph Selection.TypeText Text:=response originalSelection.Select Else MsgBox "Failed to parse API response.", vbExclamation End If Else MsgBox response, vbCritical End If End Sub
把上面的代码保存到 Module 之后,在 Word Customize Ribbon 里,把宏配置到自定义组里,随便维护一个图标即可。 上面的 Visual Basic 定义了名叫 DeepSeekV3 的 subroutine,同理我们可以让 Trae 再写一个调用开启了 DeepThink(R1) 模式的 DeepSeek API,步骤类似,这里不再赘述。 最后测试一下,在 Word 里随便写一句话,选中之后,点击 Developer 的 DeepSeekV3, 这样我们刚才给这个选项分配的 Visual Basic 实现的同名 subroutine 就会执行: API 调用的 response,自动填充到了 Word 里。 笔者对于 Visual Basic 的语法是一窍不通,但这并不会妨碍我使用它编写代码来调用 DeepSeek API,这就是 AI 的力量。
|