iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >如何将ChatGPT整合到Word中
  • 510
分享到

如何将ChatGPT整合到Word中

ChatGPT整合到WordChatGPT整合Word 2023-02-21 12:02:36 510人浏览 薄情痞子
摘要

目录引言需求实现1. api模型选择和费率2.代码2.1.准备工作2.2. 调用API2.3.提取信息2.4.计算模型使用费用2.5.返回信息到Word界面3.界面4.实际

引言

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

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

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

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

这类软件实际上是将内容发送到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自动到账,因此无需绑定付款方式也可以调用。用完之后再决定需不需要单独为此付费。

1. API模型选择和费率

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

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

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

2.代码

2.1.准备工作

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

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

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

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

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

这里通过导入文件的形式,将下载到的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。

此外,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选项中将这些宏添加成按钮。

修改名称和图标即可。

4.实际使用效果

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

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

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

到此这篇关于如何将ChatGPT整合到Word中的文章就介绍到这了,更多相关ChatGPT整合到Word内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 如何将ChatGPT整合到Word中

本文链接: https://www.lsjlt.com/news/196942.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何将ChatGPT整合到Word中
    目录引言需求实现1. API模型选择和费率2.代码2.1.准备工作2.2. 调用API2.3.提取信息2.4.计算模型使用费用2.5.返回信息到Word界面3.界面4.实际...
    99+
    2023-02-21
    ChatGPT整合到Word ChatGPT整合Word
  • 怎么将ChatGPT整合到Word中
    这篇文章主要介绍“怎么将ChatGPT整合到Word中”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么将ChatGPT整合到Word中”文章能帮助大家解决问题。引言自ChatGPT出现,各种基于它...
    99+
    2023-07-05
  • SpringBoot如何整合chatGPT
    这篇文章主要讲解了“SpringBoot如何整合chatGPT”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot如何整合chatGPT”吧!1 添加依赖  ...
    99+
    2023-07-06
  • springboot如何整合mybatis将sql打印到日志
    这篇文章主要介绍了springboot如何整合mybatis将sql打印到日志,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在前台请求数据的时候,sql语句一直都是打印到控制...
    99+
    2023-05-30
    mybatis spring boot
  • Python如何实现将Word表格嵌入到Excel中
    这篇文章给大家介绍Python如何实现将Word表格嵌入到Excel中,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。其实就是把Word中的表格转到Excel中,顺便做一个调整。这个需求在实际工作中,很多人还是经常碰到的...
    99+
    2023-06-22
  • 将百度编辑器(Ueditor)整合到dedecms中的方法
    本文实例讲述了将百度编辑器(Ueditor)整合到dedecms中的方法,分享给大家供大家参考。具体分析如下: 现在百度编辑器感觉比dedecms自带的编辑器要强多了,这里就来给大家介绍替换dedecms自带编辑器的方法...
    99+
    2022-06-12
    百度 编辑器 Ueditor 整合 dedecms 方法
  • Apache 和 Python:如何将它们整合到您的 Web 开发项目中?
    Apache 和 Python 是两种非常流行的开源技术,它们分别用于 Web 服务器和编程语言。在本文中,我们将探讨如何将 Apache 和 Python 整合到您的 Web 开发项目中,以提高您的 Web 应用程序的性能和灵活性。 A...
    99+
    2023-06-27
    spring apache django
  • word画的图如何组合成一个整体
    将Word中的多个图形组合成一个整体,可以通过以下步骤来实现:1. 打开Word文档并插入所有需要组合的图形。2. 选择第一个图形,...
    99+
    2023-09-11
    word
  • 如何将spring与quartz进行整合
    如何将spring与quartz进行整合?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。第0步:在spring配置包扫描以及在 pom导入包spring.xml:pom.xml1...
    99+
    2023-05-31
    quartz spring art
  • windows中abbyy如何将pdf转word
    这篇文章主要介绍“windows中abbyy如何将pdf转word”,在日常操作中,相信很多人在windows中abbyy如何将pdf转word问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,...
    99+
    2022-12-09
    windows abbyy word
  • 如何将SP2整合进Office 2007的安装包中
    这篇文章主要介绍“如何将SP2整合进Office 2007的安装包中”,在日常操作中,相信很多人在如何将SP2整合进Office 2007的安装包中问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何将SP2整...
    99+
    2023-06-14
  • chatgpt赋能python:Python如何将数据存入Excel中?
    Python如何将数据存入Excel中? Python作为一门高级编程语言,广泛应用于数据处理和分析。在数据分析过程中,Excel作为常用的电子表格软件扮演着重要的角色。如果能将Python处理后的数...
    99+
    2023-09-10
    python chatgpt excel 计算机
  • springboot中如何整合log4g2
    这篇文章主要介绍了springboot中如何整合log4g2,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.导入jarspringboot默认是用logback的日志框架的...
    99+
    2023-06-25
  • Springboot中如何整合Activemq
    本篇内容介绍了“Springboot中如何整合Activemq”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 导入整合所需要的依赖:<...
    99+
    2023-06-08
  • 如何解决SpringBoot整合RocketMQ遇到的问题
    本篇内容主要讲解“如何解决SpringBoot整合RocketMQ遇到的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决SpringBoot整合RocketMQ遇到的问题”吧!应用场景...
    99+
    2023-06-20
  • wps中如何将两个表格的内容合并到一起
    小编给大家分享一下wps中如何将两个表格的内容合并到一起,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!把两个表格的内容合并到一起的方法是,首先打开一张空表,点击智能工具箱栏目;然后找到合并表格选项,点击下拉按钮,选择【多个...
    99+
    2023-06-14
  • Java中SpringBoot如何整合RabbitMQ
    这篇文章主要为大家展示了“Java中SpringBoot如何整合RabbitMQ”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中SpringBoot如何整合RabbitMQ”这篇文章吧。...
    99+
    2023-06-05
  • SpringBoot中如何整合Lettuce redis
    这篇文章主要介绍“SpringBoot中如何整合Lettuce redis”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot中如何整合Lettuce redis”文章能帮助大家解决问...
    99+
    2023-06-08
  • SpringBoot中如何整合Dubbo zookeeper
    本篇内容介绍了“SpringBoot中如何整合Dubbo zookeeper”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!docker pu...
    99+
    2023-06-08
  • 如何在SpringBoot2中整合Filter
    今天小编给大家分享一下如何在SpringBoot2中整合Filter的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先定义一...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作