将ChatGPT整合到Word中

news2024/9/23 1:19:43

引言

自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 Dictionary
    Dim url As String
    Dim headers As Object
    Dim body As Object
    Dim client As Object
    Dim response As Object


    ' Set up the API endpoint URL, headers, and request body
    url = "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", model
    body.Add "prompt", prompt & "{" & selectedText & "}"
    body.Add "max_tokens", 1000




    ' Send the API request and get the response
    Set client = CreateObject("MSXML2.XMLHTTP")
    client.Open "POST", url, False
    For Each key In headers.Keys
        client.setRequestHeader key, headers(key)
    Next
    client.send JsonConverter.ConvertToJson(body)
    
    'Debug.Print client.responseText




    ' Parse the response JSON and return the completed text
    Set response = JsonConverter.ParseJson(client.responseText)
    Set CallOpenAI = response
    
End 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 Function


Function GetUsage(response As Dictionary) As Integer
GetUsage = response("usage")("total_tokens")
End Function


Function 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 model
    Dim tokenPrices As Object
    Set tokenPrices = CreateObject("Scripting.Dictionary")
    tokenPrices.Add "text-davinci-003", 0.02
    tokenPrices.Add "text-curie-001", 0.002
    tokenPrices.Add "text-babbage-001", 0.0005
    
    ' Calculate the estimated fee
    Dim tokenPrice As Double
    If tokenPrices.Exists(model) Then
        tokenPrice = tokenPrices(model)
    Else
        'Defaultto the davinci token price if the modelisnot recognized
        tokenPrice = tokenPrices("text-davinci-003")
    End If
    GetEstimatedFee = 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 Range
    Dim resp As String
    resp = responseText
    'resp = responseText & "**" & feeText


    ' Get the current selection
    Dim currentSelection As Range
    Set currentSelection = Selection.Range
    
    ' Determine how to handle the corrected text based on the mode parameter
    If mode = "track" Then
        ' Create a new range and insert the corrected text
        Set newRange = ActiveDocument.Range(currentSelection.End, currentSelection.End)
        newRange.Text = resp
        ' Track changes on the new range
        ActiveDocument.TrackRevisions = True
        currentSelection.Text = resp
        ActiveDocument.TrackRevisions = False
    ElseIf mode = "append" Then
        Dim insertText As String
        insertText = vbCr & resp
        ' Insert the corrected text in a new paragraph after the selection
        currentSelection.InsertAfter insertText
        '~~> Remove selection. This will move the cursor at end of selected word
        Selection.MoveRight Unit:=wdCharacter, Count:=1
        '~~> Select the inserted word
        Selection.MoveRight Unit:=wdCharacter, Count:=Len(insertText), Extend:=wdExtend
        Selection.Font.Color = wdColorBlue
    ElseIf mode = "replace" Then
        ' Replace the selected text with the corrected text
        currentSelection.Text = resp
    End If
    MsgBox "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 String
    Dim response As Dictionary
    Dim modelName As String
    Dim tokenN As Integer
    Dim feeText As String
    Dim responseText As String
    selectedText = Selection.Text
    Set 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 text
    ProcessChatGPTResponse responseText, feeText, "append"
    
End Sub

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

Sub ImproveEmail()
RinbbonFun "text-davinci-003", "Improve my writing in the email:"
End Sub


Sub RewordIt()
RinbbonFun "text-davinci-003", "Rephrase the following texts and avoid Plagiarism:"
End Sub


Sub SummarizeIt()
RinbbonFun "text-davinci-003", "Summarize the following texts for me:"
End Sub


Sub Translate2CN()
RinbbonFun "text-davinci-003", "Translate the following texts into simplified Chinese:"
End Sub


Sub Translate2EN()
RinbbonFun "text-davinci-003", "Translate the following texts into English:"
End Sub


Sub ImproveWriting()
RinbbonFun "text-davinci-003", "Improve my writing:"
End Sub


Sub 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.coloradmin.cn/o/351525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

php5.6.9安装sqlsrv扩展(windows)

报错:Marning: PHP Startup: Unable to load dynamic 1library D:lphpstudy_prolExtensionslphpl(phps.6.9ntslextphp_ pdo_sqlsry 56 nts′找不到指定的模块。in Unknown on line 0 整整搞了一天才终于解决 我用的是phpstudy_pro&#xff08;也就是小皮v8.1版本&#xff09;&…

Twitter多账号想要做到防关联?还是得靠它

接着上一篇Twitter养号攻略的文章&#xff0c;这篇龙哥就来详细讲讲当批量注册和管理Twitter账号时需要怎么防关联。 Twitter作为海外最流行的社交网站之一&#xff0c;它拥有很庞大的用户量&#xff0c;所以很多跨境电商都会通过Twitter来投放广告、推广自己的产品、提高曝光度…

pdf生成为二维码

当今数字时代&#xff0c;人们越来越依赖在线工具来处理各种任务&#xff0c;比如合并、拆分和压缩PDF等。Mai File就是这样一个在线工具&#xff0c;它可以将PDF文件转换成在线链接&#xff0c;方便您和他人轻松地查看和共享文件。 Mai File的使用非常简单&#xff0c;您只需…

从GPT到chatGPT(三):GPT3(二)

GPT3&#xff08;二&#xff09; 前言 因为上一篇文章 从GPT到chatGPT&#xff08;三&#xff09;&#xff1a;GPT3&#xff08;一&#xff09;阅读量挺高&#xff0c;给了我继续更新对该论文进行解读的莫大动力。这篇文章主要讲原论文的第三章&#xff08;Results&#xff0…

Vue2快速入门(三)前端项目架构搭建、Axios、Vue-Router

文章目录VueCli 4.3搭建前端项目架构创建vue项目前端项目目录结构添加axios添加cube-ui依赖创建新目录http客户端Axios什么是Axios&#xff1f;GET请求方式POST请求方式Axios封装通用后端请求API模块Vue-Router开发前端项目路由什么是vue-router&#xff1f;配置项目路由VueCli…

Hive SQL语言:DDL建库、建表

Hive SQL语言&#xff1a;DDL建库、建表 Hive数据模型总览 Hive SQL之数据库与建库 SQL中DDL语法的作用 ⚫ 数据定义语言(Data Definition Language, DDL)&#xff0c;是SQL语言集中对数据库内部的对象结构进行创建&#xff0c;删除&#xff0c;修改等的操作语言&#xff…

《反电信网络诈骗法》实行,Galaxybase图平台成为电信反诈黑科技

电信网络诈骗在当前的数字化生活中始终是一个高频讨论词。 近年来&#xff0c;随着互联网技术发展迅速&#xff0c;线上交易趋于频繁化&#xff0c;以电信网络诈骗为代表的新型网络犯罪行为也变得越来越高发。根据中国信通院《新形势下电信网络诈骗治理研究报告&#xff08;20…

交互式推荐在外卖场景的探索与应用

外卖场景的用户停留时长低于传统电商&#xff0c;对用户实时需求的理解和反馈有更高的要求。针对业务问题&#xff0c;外卖推荐团队从2021年起开始持续投入&#xff0c;最终摸索出了一套适用于外卖场景的交互式推荐架构和策略&#xff0c;并取得了较好的收益。下文将详细介绍外…

论文:拖曳线列阵拖曳噪声抑制的试验研究,阅读笔记

目录摘要目前的噪声来源和抑制的方法1.来源2.抑制方法针对流致振动引起的间接噪声提出解决方法1.结构减振优化设计2.扩大水听器与护套的间距实验1.如何划分对象组2.实验装置实验结果实验组1&#xff1a;结构减振优化设计的效果实验组2&#xff1a;扩大水听器与护套的间距的效果…

跨境电商卖家敦煌、雅虎、乐天、亚马逊测评自养号的重要性!

作为亚马逊、敦煌、乐天、雅虎等跨境的卖家&#xff0c;这两年以来&#xff0c;面对流量越来越贵的现实&#xff0c;卖家需要更加珍惜每次访问listing页面的流量&#xff0c;把转化做好&#xff0c;把流量尽可能转化为更多的订单。 提升转化率的技巧 提升产品转化率&#xff0…

springsecurity最基础的授权过程

​ 在SpringSecurity中&#xff0c;会使用默认的FilterSecurityInterceptor来进行权限校验。在FilterSecurityInterceptor中会从SecurityContextHolder获取其中的Authentication&#xff0c;然后获取其中的权限信息。当前用户是否拥有访问当前资源所需的权限。 ​ 所以我们在项…

【JAVA八股文】JVM虚拟机相关

JVM虚拟机相关1. JVM 内存结构2. JVM 内存参数3. JVM 垃圾回收4. 内存溢出5. 类加载6. 四种引用7. finalize1. JVM 内存结构 结合一段 java 代码的执行理解内存划分 执行 javac 命令编译源代码为字节码执行 java 命令 创建 JVM&#xff0c;调用类加载子系统加载 class&#xf…

使用 ChatGPT 、Stable Diffuison、React和NodeJS构建网站图库

本文译者为360奇舞团前端开发工程师原文标题&#xff1a;Building a website gallery with ChatGPT, Stable Diffusion, React and NodeJS原文作者&#xff1a;Nevo David原文地址&#xff1a;https://javascript.plainenglish.io/building-a-website-gallery-with-chatgpt-sta…

Apollo Planning规划算法仿真调试(15):使用Vscode断点调试apollo的方法更新版

前言 使用Vscode断点调试apollo的方法之前在该专栏写过一篇分享,后台很多粉丝留言希望写的更详细一点,所以更新一版,尽量将配置过程详细描述,并且附上完整的配置文档。 Vscode 作为轻量化的调试工具深受广大开发者的青睐,虽然大家都用它来看新闻逛论坛炒股,但是用它开发…

【郭东白架构课 模块一:生存法则】01|模块导学:是什么在影响架构活动的成败?

你好&#xff0c;我是郭东白。这节课是我们模块一的导入部分&#xff0c;我会先来介绍模块的主要内容&#xff0c;以及为什么我要讲生存法则这个话题。 一名软件架构师要为相对复杂的业务制定&#xff0c;并且引导实施一个结构化的软件方案。这个发现最终方案和推动实施的过程&…

智加科技上市箭在弦上,头部自动驾驶技术企业何去何从?

/ 导读 /受禾赛科技美股上市成功的影响&#xff0c;中国商用车自动驾驶技术公司智加科技也传出了即将拆分在美股上市的消息。其中&#xff0c;智加科技的中国部分据传将被满帮收购&#xff0c;并且将并入自动驾驶卡车公司挚途科技。至于美国部分&#xff0c;将寻求独立上市。对…

python切片总算搞明白了

不会python已久矣&#xff01; 简单切片 简单切片指的是这样的切片形式&#xff1a;a[start:stop]&#xff0c; 左闭右开 负索引可以直接代表那个值 >>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[2:3][2]>>> a[5:9][5, 6, 7, 8]>>> a[5…

电商导购CPS,拼多多(多多进宝)如何跟单实现用户和订单绑定

前言 大家好&#xff0c;我是小悟 做过自媒体的小伙伴都知道&#xff0c;不管是发图文还是发短视频&#xff0c;直播也好&#xff0c;可以带货。在你的内容里面挂上商品&#xff0c;你自己都不需要囤货&#xff0c;如果用户通过这个商品下单成交了&#xff0c;自媒体平台就会…

Cortex-M0中断控制和系统控制

目录1.NVIC和系统控制块特性2.中断使能和清除使能3.中断挂起和清除挂起4.中断优先级5.中断控制的通用汇编代码使能和禁止中断设置和清除中断挂起状态设置中断优先级6.异常屏蔽寄存器&#xff08;PRIMASK&#xff09;7.中断输入和挂起行为8.中断等待9.系统异常的控制寄存器10.系…

JuiceFS 在火山引擎边缘计算的应用实践

火山引擎边缘云是以云计算基础技术和边缘异构算力结合网络为基础&#xff0c;构建在边缘大规模基础设施之上的云计算服务&#xff0c;形成以边缘位置的计算、网络、存储、安全、智能为核心能力的新一代分布式云计算解决方案。边缘存储主要面向适配边缘计算的典型业务场景&#…