word 一键审稿 deepseek 公文审稿大师

## 前言

在工作中,文稿审核至关重要。然而,这项工作往往枯燥乏味,尤其对于像我这样粗心大意的人来说,常常因疏忽检查而导致错误。最近,我痛定思痛,决定借助 AI 成为我的审稿助手,并在之前 Word 接入 DeepSeek 代码的基础上,进一步开发,新增了以下功能:

  1. 输出格式优化
  2. 审稿提示词优化
  3. 模型调用设置优化

代码的亮点是无需复制粘贴,即可在 word 中快速解决文稿审查问题。

输出格式优化

我们对输出格式进行了自定义,采用了仿宋字体、小四字号和首行缩进的格式。同时,去除了默认 Markdown 格式中的 #、*、- 等符号,并替换了空格,以确保在 Word 中输出的友好性。

提示词优化

根据我的审稿需求,我对提示词进行了调整,使其更符合实际工作场景。

1
2
3
4
5
6
作为审稿专家,请按以下优先级审查文稿:
1. 基础错误排查:检查序号连贯性、错别字、数字逻辑矛盾;
2. 语言优化:修正语句不通顺、冗余表达,提升可读性;
3. 逻辑审查:验证段落过渡自然性,图表与文字一致性;
4. 内容评估:判断创新性与学术价值;
请按「问题-建议」格式逐条反馈,区分修改优先级,如果没有相关问题则跳过该条目。

模型调用设置优化

将 apiurl、modelname 、apykey 作为变量,方便大家调试。

效果演示

以下是一段常见的函件示例。

image.png

在 Word 中选中该段文字,点击“审稿大师”,即可生成审稿意见。

image.png

VBA 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
Sub Perform()
Dim selectedText As String
Dim apiKey As String
Dim response As Object
Dim re As String
Dim midString As String
Dim ans As String
Dim polishPrompt As String
Dim rng As Range
Dim model_name As String ' 模型名称变量

' 检查是否有正常选择文本
If Selection.Type <> wdSelectionNormal Then Exit Sub

' 获取选中文本并保存范围
Set rng = Selection.Range
selectedText = rng.text
selectedText = Replace(selectedText, ChrW$(13), "") ' 移除回车符

' API 配置
apiKey = "sk-wna"
Const URL As String = "https://api.siliconflow.cn/v1/chat/completions"

' 修改后的提示词
polishPrompt = "作为审稿专家,请按以下优先级审查文稿并提供反馈:" & _
"1. 基础错误排查:检查序号连贯性、错别字;" & _
"2. 数字与数学逻辑审查:检查数字一致性、单位匹配、计算正确性、数学表达规范性;" & _
"3. 语言优化:修正语句不通顺、冗余表达,提升可读性;" & _
"4. 逻辑审查:验证段落过渡自然性,图表与文字一致性;" & _
"请按「问题-建议」格式逐条反馈,区分修改优先级,如果没有相关问题则跳过该条目。"

' 设置模型名称
model_name = "Qwen/Qwen2.5-72B-Instruct-128K"

' 发送 API 请求
Set response = CreateObject("MSXML2.XMLHTTP")
With response
.Open "POST", URL, False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Authorization", "Bearer " & apiKey
.Send "{""model"":""" & model_name & """, ""messages"":[{""role"":""user"",""content"":""" & polishPrompt & selectedText & """}], ""temperature"":0.7}"
re = .responseText
End With

' 解析响应
midString = Mid(re, InStr(re, """content"":""") + 11)
ans = Split(midString, """")(0)
ans = Replace(ans, "\n", vbNewLine) ' 将 \n 转换为实际换行

' 创建必要样式
Call CreateDocumentStyles

' 插入结果
With rng
.Collapse wdCollapseEnd
.InsertAfter vbNewLine & vbNewLine

Dim outputRange As Range
Set outputRange = .Duplicate

' 插入文本并清理格式
outputRange.text = ans
Call CleanTextFormatting(outputRange)

' 添加尾部换行符并定位光标
outputRange.InsertAfter vbNewLine & vbNewLine
.End = outputRange.End
.Select
Selection.Collapse wdCollapseEnd
End With

' 清理
Set response = Nothing
Set rng = Nothing
Set outputRange = Nothing
End Sub

Private Sub CreateDocumentStyles()
' 只创建正文样式
Dim sty As Style

On Error Resume Next
Set sty = ActiveDocument.Styles("BodyText")
If sty Is Nothing Then
Set sty = ActiveDocument.Styles.Add("BodyText", wdStyleTypeParagraph)
With sty
.Font.Name = "仿宋"
.Font.Size = 12 ' 小四
.ParagraphFormat.FirstLineIndent = CentimetersToPoints(0.74) ' 2字符
.ParagraphFormat.LineSpacingRule = wdLineSpaceExactly
.ParagraphFormat.LineSpacing = 22 ' 行距22磅
End With
End If
On Error GoTo 0
End Sub

Private Sub CleanTextFormatting(rng As Range)
' 清理文本中的无意义符号、删除空行并应用正文样式
With rng
' 移除 Markdown 符号
.text = Replace(.text, "**", "") ' 移除粗体标记
.text = Replace(.text, "*", "") ' 移除单个星号
.text = Replace(.text, "#", "") ' 移除标题标记
.text = Replace(.text, "-", "") ' 移除-标记

' 移除无序列表符号和其他常见无意义符号
With .Find
.ClearFormatting
.text = "^p- " ' 移除行首 "- "
.Replacement.text = "^p"
.Execute Replace:=wdReplaceAll
End With
With .Find
.ClearFormatting
.text = "^p-" ' 移除行首单独 "-"
.Replacement.text = "^p"
.Execute Replace:=wdReplaceAll
End With
With .Find
.ClearFormatting
.text = "^p> " ' 移除引用符号 "> "
.Replacement.text = "^p"
.Execute Replace:=wdReplaceAll
End With

' 删除空行
With .Find
.ClearFormatting
.text = "^p^p" ' 连续两个段落标记
.Replacement.text = "^p" ' 替换为单个段落标记
.Execute Replace:=wdReplaceAll
End With
With .Find
.ClearFormatting
.text = "^p[ ^t]^p" ' 删除只包含空格或制表符的空行
.Replacement.text = "^p"
.Execute Replace:=wdReplaceAll
End With
With .Find
.ClearFormatting
.text = "^p$" ' 删除段落末尾的空行
.Replacement.text = ""
.Execute Replace:=wdReplaceAll
End With

' 应用统一的正文样式
.text = Replace(.text, " ", "") ' 移除空格
.Style = "BodyText"
End With
End Sub


代码解析

这段 VBA 代码是一个用于 Word 文档的宏,其主要作用是:

  1. 获取选中文本: 从 Word 文档中获取用户选中的文本内容。
  2. 调用 AI 润色接口: 将选中的文本发送到指定的 AI 接口(硅 flow),并附带一个润色提示词,要求 AI 对文本进行润色和审查。
  3. 处理 AI 响应: 接收 AI 返回的润色结果,并对结果进行简单的格式处理。
  4. 将润色结果插入文档: 将处理后的润色结果插入到 Word 文档中,位于原始选中文本的下方,并应用指定的正文样式。

下面是代码的详细解析和调试内容:

代码解析:

  • Sub Perform() 主过程,当宏运行时,从这里开始执行。
  • 变量声明:
    • selectedText As String: 用于存储选中的文本。
    • apiKey As String: 用于存储 API 密钥。
    • response As Object: 用于存储 HTTP 请求的响应。
    • re As String: 用于存储完整的 API 响应文本。
    • midString As String: 用于存储从 API 响应中提取的内容部分。
    • ans As String: 用于存储最终的润色结果。
    • polishPrompt As String: 用于存储发送给 AI 的润色提示词。
    • rng As Range: 用于存储选中文本的范围。
    • model_name As String 变量,存储调用模型名称
  • 检查选中文本:
    • If Selection.Type <> wdSelectionNormal Then Exit Sub: 确保用户选择了正常的文本范围。如果没有选择文本,则退出宏。
  • 获取选中文本并移除回车符:
    • Set rng = Selection.Range: 获取选中文本的范围。
    • selectedText = rng.text: 获取选中文本的内容。
    • selectedText = Replace(selectedText, ChrW$(13), ""): 移除选中文本中的回车符。
  • API 配置:
    • apiKey = "sk-rvv": 重要: 这里需要替换成你自己的 API 密钥。
    • Const URL As String = "https://api.siliconflow.cn/v1/chat/completions": 定义 API 的 URL。
  • 设置润色提示词:
    • polishPrompt = ...: 定义发送给 AI 的提示词,指示 AI 作为审稿专家,按照一定的优先级对文本进行审查和润色。
  • 发送 API 请求:
    • Set response = CreateObject("MSXML2.XMLHTTP"): 创建一个 XMLHTTP 对象,用于发送 HTTP 请求。
    • With response ... End With: 使用 With 语句简化代码,设置 HTTP 请求的各种属性。
      • .Open "POST", URL, False: 以 POST 方式打开连接到指定的 URL。False 表示同步请求。
      • .setRequestHeader "Content-Type", "application/json": 设置请求头,指定内容类型为 JSON。
      • .setRequestHeader "Authorization", "Bearer " & apiKey: 设置请求头,添加授权信息,使用 Bearer 令牌认证。
      • .Send "{""model"":""" & model_name & """, ""messages"":[{""role"":""user"",""content"":""" & polishPrompt & selectedText & """}], ""temperature"":0.7}": 发送 JSON 格式的请求体,包含模型名称、用户角色和内容(提示词 + 选中文本)。temperature 参数控制生成文本的随机性。
      • re = .responseText: 获取 API 的响应文本。
  • 解析响应:
    • midString = Mid(re, InStr(re, """content"":""") + 11): 从响应文本中提取 content 字段的值。
    • ans = Split(midString, """")(0): 将提取的字符串按 " 分割,取第一个元素,得到最终的润色结果。
    • ans = Replace(ans, "\n", vbNewLine): 将结果中的 \n 替换为 VBA 的换行符 vbNewLine
  • 创建必要样式:
    • Call CreateDocumentStyles: 调用 CreateDocumentStyles 子过程,创建或获取名为 “BodyText” 的样式。
  • 插入结果:
    • With rng ... End With: 使用 With 语句简化代码,对选中文本的范围进行操作。
      • .Collapse wdCollapseEnd: 将范围折叠到选中文本的末尾。
      • .InsertAfter vbNewLine & vbNewLine: 在选中文本后插入两个换行符。
      • Set outputRange = .Duplicate: 创建一个与原始范围相同的副本,用于插入润色结果。
      • outputRange.text = ans: 将润色结果插入到 outputRange 中。
      • Call CleanTextFormatting(outputRange): 调用 CleanTextFormatting 子过程,清理文本格式并应用正文样式。
      • outputRange.InsertAfter vbNewLine & vbNewLine: 在润色结果后插入两个换行符。
      • .End = outputRange.End: 更新原始范围的结束位置。
      • .Select: 选中更新后的范围。
      • Selection.Collapse wdCollapseEnd: 将光标移动到选中文本的末尾。
  • 清理:
    • Set response = Nothing: 释放对象变量,防止内存泄漏。
    • Set rng = Nothing
    • Set outputRange = Nothing
  • Private Sub CreateDocumentStyles() 创建或获取名为 “BodyText” 的样式。如果样式不存在,则创建一个新的样式,并设置字体、字号、缩进和行距。
  • Private Sub CleanTextFormatting(rng As Range) 清理文本格式并应用正文样式。
    • 移除 Markdown 符号(**, *, #, -)。
    • 移除无序列表符号和其他常见无意义符号(如行首的 - -> )。
    • 移除空格
    • 应用 “BodyText” 样式。

可调试内容:

  1. API 密钥: 确保将 apiKey = "sk-rvv" 替换为你自己的有效 API 密钥。这是代码能够正常运行的关键。
  2. API Endpoint: 确认 Const URL As String = "https://api.siliconflow.cn/v1/chat/completions" 这个 API 是硅基流动的 api ,根据自己的情况选择 api 接口
  3. model_name 用的 Qwen/Qwen2.5-7B-Instruct,可以更换为 Pro/deepseek-ai/DeepSeek-V3Pro/deepseek-ai/DeepSeek-R1 等收费模型,不过需要等待的时间更长,且 R 1 模型可能存在更多幻觉。
  4. Prompt 优化: 根据实际润色效果,可优化 polishPrompt,以获得更好的结果。

代码使用方法

宏的使用有很多方法,快捷键、放在功能区都行,这里以自定义功能区简单介绍。

添加开发工具

  1. 选项-信任中心-宏设置-启用所有宏-信任 vba
  2. 开启开发工具, 选项-自定义选项卡-勾选开发工具。
  3. Word 工具栏点击“开发工具”选项卡。
  4. 点击“Visual Basic”。
  5. 右键当前文稿下的“模块”,选择“插入模块”。
  6. 复制上述代码到新建的模块中,或者右键模块-导入 bas 文件。

image.png

自定义功能区调用宏

宏有多中调用方式,这里介绍选项卡调用。

  1. 点击“文件”->“选项”->“自定义功能区”。
  2. 选择“宏”,在右侧自定义功能区新建选项卡和组。
  3. 将宏添加至组中,重命名并更换图标。

image.png

注意事项

  1. 需要替换自己的 API 密钥。
  2. 不建议用推理模型,文稿审核相对比较简单,用推理模型反而慢了,容易卡顿。
  3. 可以根据自己的需要修改提示词。
  4. 运行转圈是正常的,需要等待结果生成。

希望这次润色能够帮助您更好地呈现您的工作成果。如果您有任何其他问题或需要进一步的修改,请随时告诉我。


word 一键审稿 deepseek 公文审稿大师
https://maoyu92.github.io/2025/03/12/06 人工智能/Word + deepseek:打造高效文稿审稿助手/
作者
陈文茂
发布于
2025年3月12日
许可协议