将ChatGPT整合到Word中

引言

自ChatGPT出现,各种基于它的软件扩展纷至沓来,目前Word支持ChatGPT的add-in有两款,可以通过:

插入->获取加载项->搜索openai查看。

其中Ghostwriter从介绍上看功能比较单一,而且软件需要购买,用自己的API-key,意味着调用API还要单独出钱。

e871e89b4df5ad44eaa7772a48349574.png

第二个,软件似乎是免费的,应该也是用自己的API-key。从介绍的视频上看符合使用的预期,可以发送选取的文字到ChatGPT,并结合预设的prompt信息返回所需功能,但是安全性未知。

94ff78800f8b2d005e1c00e7bd2d2539.png

73ef432080afa99ad8cd5b67820bb157.png

这类软件实际上是将内容发送到OpenAI的服务器,并将获取返回内容呈现,于是产生了使用VBA在Word中整合ChatGPT的想法。虽然使用其他语言(比如python)调用API更加方便快捷,但VBA对内容的操作更直接。

需求

使用ChatGPT修改语言时,需要将文本复制到网页版的chatGPT中。省掉复制粘贴的过程,能提升效率。设想有以下需求:

基本需求(已实现)

  • 对选取的文字进行操作,包括修改语言,翻译,检查语法错误等

  • 可以选择不同的模型

  • 用自己的api-key

  • token数目显示和计费

进阶需求(已放弃)

  • 提供add-in安装或者可分享

  • 自定义Ribbon的图标

  • 增加Ribbon下拉菜单,实现用户选择模型类型

  • 增加Ribbon选项,实现用户提交api-key

作为野生程序猿,花了一下午完成基本需求,进阶的内容只要花时间是可以实现的。不过相信微软的攻城狮正在全力将ChatGPT的功能整合到Office全家桶中。类似这样个人级别的应用,最终会被微软发布的新功能淘汰,因此无意投入过多。此项目作为VBA练手,基本需求已满足,也可以作为微软发布新word前的过渡。

实现

一切的前提是有openAI的账号并且绑定了付款方式。新注册的账号有$18自动到账,因此无需绑定付款方式也可以调用。用完之后再决定需不需要单独为此付费。

f6e070fbb60e45205bea3c807a215f42.png

1. API模型选择和费率

费用如下是按照1k token来算的,可以简单理解为字数,但不完全相同。最新的模型是Davinci,收费也是最高的。注意这里的token数量指的是发送和返回的token的总和。ChatGPT告诉我6000字的文章,按照常规算法,会有10W的token。。好像还是网页版香呀。。

27c4b77aedbbd01d46f6ce5ed19e2ff1.png

具体调用中,使用模型名称如下。

d057121ad4767944d146bf8aed8ac1af.png

他们都是GPT3的模型,就自身使用感受来看,表现最好的还是davinci,它的速度也是最慢的,ada基本不能用,curie和babbage偶尔能用,不过有的时候连语法错误都修改不了,翻译也是各种不通顺。

2.代码

2.1.准备工作

采用添加宏的方式,首先要添加开发者选项卡。

5171e66072aa543f544155c63e7390f9.png

这也不是必须的,因为可以通过快捷键Alt+F11直接打开VBA的界面。

a59b5b2012c3a5bc234ec8c1de93c26a.png

如果只为当前的文本添加宏,就在当前的project下添加模块,如果是为所有的word文档添加宏的话,就在Normal中添加。之后插入模块,就可以添加VBA的代码了。

5f3fee5ffa3054bd2bf3cc9d416fecbd.png

其次,为了保证之后的代码正常运行,需要添加程序需要用的几个Reference,它们的意思有点类似于R的library。不同的模块可以有不同的Reference,可以选择项目后统一添加。

6de60aaae71ceb14045603b0a1093a1b.png

再次,由于VB处理起API的信息就很麻烦,这里需要单独载入两个文件,主要是JsonConverter,它能将API返回的文本转化为Dictionary的形式方便提取。如果对正则表达熟悉的话,完全不需要使用JsonConverter就可获取到所需信息。 

a9fdfd566e988a8930f979f6510e1258.png

这里通过导入文件的形式,将下载到的bas文件导入。另外要注意的是需要使用这个版本的VBA-JSON-2.3.0,否则会报错。另外Dictionary定义了几个对象的属性,也需要导入。

2.2. 调用API

CallOpenAI,该函数会将word中选取的文字,加上你自己写的指示,一并提交给OpenAI的模型,函数返回值response是一个Dictionary,包括了model, choices, usage, created等各种字段。

model的选择和名称见上文。

prompt可以是任何指示,比如帮我修改这段文字。(变量名用instruction更合理)。

selectedText是Word文档中选取的文字。

Function CallOpenAI(model As String, prompt As String, selectedText As String) As DictionaryDim url As StringDim headers As ObjectDim body As ObjectDim client As ObjectDim response As Object' Set up the API endpoint URL, headers, and request bodyurl = "https://api.openai.com/v1/completions"Set headers = CreateObject("Scripting.Dictionary")headers.Add "Content-Type", "application/json"headers.Add "Authorization", "Bearer <API_KEY>"Set body = CreateObject("Scripting.Dictionary")body.Add "model", modelbody.Add "prompt", prompt & "{" & selectedText & "}"body.Add "max_tokens", 1000' Send the API request and get the responseSet client = CreateObject("MSXML2.XMLHTTP")client.Open "POST", url, FalseFor Each key In headers.Keysclient.setRequestHeader key, headers(key)Nextclient.send JsonConverter.ConvertToJson(body)'Debug.Print client.responseText' Parse the response JSON and return the completed textSet response = JsonConverter.ParseJson(client.responseText)Set CallOpenAI = responseEnd Function

这里需要在header变量中添加自己的OpenAI的API-Key,具体而言是在12行将<API_KEY> 替换为自己的API_key。

0e0a5e8bab074ac9e2b7283d20eaabff.png

此外,body变量可以添加而外的模型参数比如n, temperature等控制结果的输出,具体见API文档。

2.3.提取信息

一众函数分别从response的以下字段提取相应信息。

"model"-模型名称

'usage"-模型使用情况,用了多少个token

”choices"-模型返回的文字信息,这就是ChatGPT的回答。

Function GetModel(response As Dictionary) As String
GetModel = response("model")
End FunctionFunction GetUsage(response As Dictionary) As Integer
GetUsage = response("usage")("total_tokens")
End FunctionFunction GetResponseText(response As Dictionary) As String
Dim resp As String
resp = response("choices")(1)("text")
resp = Trim(resp)resp = Replace(resp, vbNewLine, "")'resp = Replace(resp, "\n\n", "")'resp = Replace(resp, vbLf, "")'resp = Replace(resp, vbCrLf, "")'resp = Replace(resp, Chr(10), "")'resp = Replace(resp, Chr(13), "")'resp = Replace(resp, vbCr, "")'resp = Replace(resp, vbLf, "")
GetResponseText = resp
End Function

Dictornay的变量中,字典的字典是无法直接获取的,大部分操作都可能会报错,用Debug.Print也无法显示。比如choices下包括了一个字典,就需要使用类似的方式获取:response("choices")(1)("text")

2.4.计算模型使用费用

有必要根据模型的名称和使用量,计算一下使用成本。

Function GetEstimatedFee(model As String, totalTokens As Integer) As Double' Set the token prices for each modelDim tokenPrices As ObjectSet tokenPrices = CreateObject("Scripting.Dictionary")tokenPrices.Add "text-davinci-003", 0.02tokenPrices.Add "text-curie-001", 0.002tokenPrices.Add "text-babbage-001", 0.0005' Calculate the estimated feeDim tokenPrice As DoubleIf tokenPrices.Exists(model) ThentokenPrice = tokenPrices(model)Else'Defaultto the davinci token price if the modelisnot recognizedtokenPrice = tokenPrices("text-davinci-003")End IfGetEstimatedFee = totalTokens * tokenPrice * 0.001
End Function

2.5.返回信息到Word界面

该部分代码的输入为,提取到文本(也就是chatGPT给你的答案),费用以及模式。

这里考虑了三种模式:

第一种,track, 是将文本使用修订的方式放到word中,事实证明并不好用,会将所选文字删除并加上提取的文本。并不是哪里不同修订哪里。

第二种, append, 是在所选文字后面加入提取的文本,并以蓝色标注。

第三种, replace, 是直接替换所选文本。

另外,使用量以及费用会以对话框的形式出现。

Sub ProcessChatGPTResponse(responseText As String, feeText As String, mode As String)Dim newRange As RangeDim resp As Stringresp = responseText'resp = responseText & "**" & feeText' Get the current selectionDim currentSelection As RangeSet currentSelection = Selection.Range' Determine how to handle the corrected text based on the mode parameterIf mode = "track" Then' Create a new range and insert the corrected textSet newRange = ActiveDocument.Range(currentSelection.End, currentSelection.End)newRange.Text = resp' Track changes on the new rangeActiveDocument.TrackRevisions = TruecurrentSelection.Text = respActiveDocument.TrackRevisions = FalseElseIf mode = "append" ThenDim insertText As StringinsertText = vbCr & resp' Insert the corrected text in a new paragraph after the selectioncurrentSelection.InsertAfter insertText'~~> Remove selection. This will move the cursor at end of selected wordSelection.MoveRight Unit:=wdCharacter, Count:=1'~~> Select the inserted wordSelection.MoveRight Unit:=wdCharacter, Count:=Len(insertText), Extend:=wdExtendSelection.Font.Color = wdColorBlueElseIf mode = "replace" Then' Replace the selected text with the corrected textcurrentSelection.Text = respEnd IfMsgBox "Estimated Cost:" & vbCrLf & feeText, vbInformation, "Estimated Cost"End Sub

3.界面

由于不同的按钮目前只是用户的指示不同,剩下内容均一致,所以这里创建了一个函数,简化后面的流程。输入是model和prompt。这里统一使用了"append"的显示方式,即在选取文字之后添加chatGPT回答。

Sub RinbbonFun(model As String, prompt As String)Dim selectedText As StringDim response As DictionaryDim modelName As StringDim tokenN As IntegerDim feeText As StringDim responseText As StringselectedText = Selection.TextSet response = CallOpenAI(model, prompt, selectedText)responseText = GetResponseText(response)modelName = GetModel(response)tokenN = GetUsage(response)EstimatedFee = GetEstimatedFee(modelName, tokenN)feeText = "Model: " & modelName & ", estimated cost: $" & EstimatedFee & "(Tokens:" & tokenN & ")"'Debug.Print responseText' Do something with the response, such as replace the selection with the returned textProcessChatGPTResponse responseText, feeText, "append"End Sub

建立相应的函数,用于不同的按钮。

Sub ImproveEmail()
RinbbonFun "text-davinci-003", "Improve my writing in the email:"
End SubSub RewordIt()
RinbbonFun "text-davinci-003", "Rephrase the following texts and avoid Plagiarism:"
End SubSub SummarizeIt()
RinbbonFun "text-davinci-003", "Summarize the following texts for me:"
End SubSub Translate2CN()
RinbbonFun "text-davinci-003", "Translate the following texts into simplified Chinese:"
End SubSub Translate2EN()
RinbbonFun "text-davinci-003", "Translate the following texts into English:"
End SubSub ImproveWriting()
RinbbonFun "text-davinci-003", "Improve my writing:"
End SubSub ElaborateIt()
RinbbonFun "text-davinci-003", "Elaborate the following content:"
End Sub

然后在Ribbon选项中将这些宏添加成按钮。9cb5eb8acc5de867d747df69c36236a8.png

修改名称和图标即可。

47385a02ff4d94026aea6a43b54b9fc8.png

4.实际使用效果

找了一个改错题,选取整段文字,点击按钮,返回修改好的文字,以及使用信息。

6123309a0d5bb7c0904737a5c75f566b.png

之后用修改过的文字,测试其他按键。

74f791311d4e8a5f4c1036eaf17ba1e6.png

b96931bdabe83a21d92b2d683612d16a.png

22eb081f3df028b1ae904e74fd770967.png

8bf8c4a962aa66cc208c48bdf7087ed6.png

至此,基本功能实现。其他的一些功能,比如使用下拉菜单选择想要的模型,添加输入框录入使用组的API-key,添加自定义的按钮图案等功能,需要通过XML定制Ribbon内容,就不浪费时间了。

2023/01/16

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/7585.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用上ChatGPT的这几个功能,你的开发效率不高都难

ChatGPT去年12月份开始火得不行了&#xff0c;它彻底改变了程序员开发代码的方式。怎么来提高程序员开发程序的效率呢&#xff1f;可能现在大多数软件开发人员仍然没有习惯使用 ChatGPT&#xff0c;本文将介绍几种方式来提升和简化自己的工作。 一、重构你的代码 如果你是一个开…

Intellij:自然语言到代码自动生成 by ChatGPT

背景 Intellij是一个非常流行的开发工具&#xff0c;它被广泛用于软件开发。随着OpenAI训练的ChatGPT模型越来越智能&#xff0c;我们开发了一个名为EDQL的Intellij插件。这个插件可以将ChatGPT的智能写代码能力转化为代码。 安装和尝试: https://github.com/chengpohi/edql/re…

chatgpt到底颠覆了什么 第二部分

以第二个理由就是两个字&#xff0c;垄断。 现在谈到范式转变&#xff0c;如果首先谈的还是算法&#xff0c;那说明还没有透彻理解范式改变范式改变&#xff0c;首先要改的是什么。是什么&#xff1f;是参赛资格。 过去我相信大企业大团队聚拢了许多聪明的脑袋&#xff0c;但我…

chatgpt 到底颠覆了什么 第一部分

ChatGPT一出来&#xff0c;一堆搞NLP的立马哭了。为什么&#xff1f;不该问为什么哭&#xff0c;而该问为什么还不哭。 有两个立马大哭的理由。 第一个理由很多人说了&#xff0c;范式改变。 虽然说没有哪个研究领域&#xff0c;甚至没有哪个领域敢说自己真的是天道酬勤绝对公平…

文心一言---中国版的“ChatGPT”狂飙的机会或许要出现了

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

果然,ChatGPT 技术还是被拿去搞黄色了!

转自&#xff1a;顶级程序员 此前&#xff0c;推出的各类AI绘画工具。 想要制作出还能看得过去的作品&#xff0c;需要一定的美术功底和美感&#xff0c;上手门槛一点也不低。 大部分绅士顶多做个饱饱眼福的观众&#xff0c;完全没有参与感。 啪得一下很快啊&#xff0c;最近一…

ChatGPT 漩涡 :The ChatGPT Maelstrom

ChatGPT 漩涡 by Jean-Louis Gasse ChatGPT 以自 2007 年 iPhone 问世以来从未见过的方式迅速俘获了人们的想象力。今天,我们试探性地随机漫步其迅速扩张的景观。 在结束了法国和奥地利部分地区的旅行后,当我愉快地回到我的写作站时,我在我钟爱的科技世界中看到了太多诱人…

ChatGPT神奇应用:快速撰写大众点评好评

正文共 464 字&#xff0c;阅读大约需要 2 分钟 消费者必备技巧&#xff0c;您将在2分钟后获得以下超能力&#xff1a; 快速自动撰写大众点评评论 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●…

被ChatGPT带飞的AIGC,能为垂直产业做些什么?

2022年8月&#xff0c;游戏设计师杰森艾伦使用 Midjourney 平台创作了一幅名为《太空歌剧院》的画作&#xff0c;并获得了美国科罗拉多州博览会艺术类比赛一等奖&#xff0c;引起巨大轰动和舆论&#xff0c;彻底引爆 AIGC 的热潮。 ● 图片来源&#xff1a; AI 作画《太空歌剧院…

【chatGPT】

chatGPT&#xff08;Generative pretrained transformer &#xff09; ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过理解和学习人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人类一样来聊天交流&#xff0c;甚至能完…

「ChatGPT」一夜之间“火爆出圈“【杞人忧天 or 未雨绸缪】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

InstructGPT原理讲解及ChatGPT类开源项目

InstructGPT原理讲解及ChatGPT类开源项目 Generative Pre-Trained Transformer&#xff08;GPT&#xff09; 是OpenAI的提出的生成式预训练语言模型&#xff0c;目前已经发布了GPT-1、GPT-2、GPT-3和GPT-4&#xff0c;未来也将发布GPT-5。 最近非常火的ChatGPT是基于Instruct…

数据开源 | Magic Data开源基于ChatGPT的可扩展的对话数据集

在过去的一月里&#xff0c;人工智能领域中最火的话题莫过"ChatGPT"。ChatGPT是OpenAI于11月30日发布最新作品聊天机器人&#xff0c;开放公众免费测试。聊天机器人是一种软件应用程序&#xff0c;根据用户的提问做出回应、模仿人类的对话方式。目前&#xff0c;Chat…

chatgpt赋能python:Python的玩法

Python的玩法 Python作为一种高级编程语言&#xff0c;在计算机编程领域非常流行。它是一种自由软件&#xff0c;可以在多种平台上运行。Python在数据科学、机器学习等土地居功无比&#xff0c;但它的应用除了这些重磅级领域&#xff0c;还有很多有趣的玩法。 编写游戏 Pyth…

教你轻松玩转-ChatGPT或生成类大模型--助你成为未来高端黄金职业人

文章目录 1、前言2、大模型--巴拉巴拉小魔仙3、巴拉巴拉小魔仙-指导方向3、二次元美女或科幻图-魔法4、Cosplay-魔法5、魔法师5.1、系统消息5.2、小样本学习5.3、非对话场景5.4、使用明确的指令5.5、最后重复一遍指令5.5、对输出的操作5.6、添加语法5.7、把任务分解5.8、思维链…

海外ChatGPT专题

作为AIGC领域顶尖的模型&#xff0c;ChatGPT有望对现有生产力工具进行变革&#xff0c;引领赛道发展。海外ChatGPT专题_up.pdf: https://url39.ctfile.com/f/2501739-805099789-098b62?p2096 (访问密码: 2096) 参考文献&#xff1a; [1]海外ChatGPT专题_up.pdf: https://url39…

浅谈 ChatGPT —— 现代巴别塔

theme: nico 一、用 ChatGPT 一搜就到你这了 ChatGPT 在去年 11 月发布以后&#xff0c;上线 5 天后就有了 100 万用户&#xff0c;上线两个月后已有上亿用户&#xff0c;可谓一炮而红。起初我对 ChatGPT 是没有什么感知的&#xff0c;我单纯认为人工智能还没有发展到完全超越人…

“我们聘请 ChatGPT,让它当了一天 ML 工程师”

随着 ChatGPT 的爆火&#xff0c;许多人提出疑问&#xff1a;它究竟是否可以取代人类&#xff1f;于是&#xff0c;面对众说纷纭的答案&#xff0c;本文作者决定&#xff1a;让 ChatGPT 当一天的机器学习工程师&#xff0c;毕竟实践出真理。 原文链接&#xff1a;https://encor…

Twitter崩了,马斯克:代码太烂,全部重写!

上一篇&#xff1a;高校教师“夸”女学生「睡衣好看」「含苞欲放」被投诉&#xff0c;校方回应 本来有很多人非常好奇&#xff0c;自去年 10 月底&#xff0c;马斯克掌管 Twitter 之后&#xff0c;便大刀阔斧的改革&#xff0c;尤其是对于员工数量从彼时的 7500 名员工骤减到了…

【Python|从0到1】小白的学习之旅:跟chatgpt学python(1)

软件&#xff1a;pycharm3.3 插件:NexChatGPT 今日学习成果&#xff1a; 文件的输入与输出 我宣布chatgpt就是我的亲妈呜呜呜&#xff01;还有谁会这么耐心细致地给PS讲这么简单但是我死活搞不明白的东西&#xff01;&#xff01;&#xff01; PS&#xff1a;先帝创业未半而中…