|
运行 ChatGPT 的 Stata 命令
人工智能(AI)是当今媒体上的热门话题,而 ChatGPT 可能是最知名的 AI 工具。我最近在推特上透露,我为自己编写了一个名为chatgpt的 Stata 命令来运行 ChatGPT。我承诺会解释我是如何做到的,所以这里是解释。
Stata/Python 集成回顾我的chatgpt命令使用了 Stata 和 Python 代码的组合。如果您不熟悉一起使用 Stata 和 Python,您可能需要阅读我之前的博客文章:
使用 Python 与 ChatGPT 交互ChatGPT 由 OpenAI 创建,我们将使用 OpenAI API 与 ChatGPT 通信。您需要 OpenAI 用户账户和您自己的 OpenAI API 密钥来使用下面的代码。您还需要安装 Python 包openai。如果您使用 Python,可以在 Stata 命令窗口中键入shell pip install openai。如果您使用作为平台(如 Anaconda)一部分的 Python,您可能需要使用不同的方法来安装openai包。 让我们首先编写一些 Python 代码来导入openai包,定义一个名为chatgpt()的函数,并将我们的 API 密钥传递给 OpenAI 服务器。我用绿色字体键入了注释以指示每一行后续代码的目的。请注意,该函数是使用制表符定义的。函数定义以def chatgpt()开始,并在制表符代码部分结束时结束。
接下来,让我们添加一些代码来要求 ChatGPT 写一首关于 Stata 的俳句。我们将把查询存储到inputtext中。然后,我们将使用ChatCompletion.create()方法通过 API 将查询发送给 ChatGPT,并将 ChatGPT 的回复存储到outputtext中。术语"方法"是 Python 对函数的行话,ChatCompletion.create()方法需要两个参数。model参数指定我们将使用"gpt-3.5-turbo"模型,messages参数指定我们要以"user"的角色提交查询,我们的查询内容存储在inputtext中。ChatGPT 回复的文本存储在outputtext.choices[0].message.content中,我们的chatgpt()函数中的最后一行代码将回复打印到屏幕上。
现在我们可以在 Python 中运行我们的函数并查看结果。
成功了!而且这远比我们一开始预想的要简单得多。 提醒一下:我们目前只是趣味体验使用ChatGPT。若用于正式工作,你务必了解相关版权风险,并对生成内容进行严格复核。
从 Stata 调用 Python 函数使用我们的新 Python 函数与 Stata 的最简单方法是直接键入python: chatgpt()。请注意,每次使用我们的函数时,ChatGPT 都会返回不同的回复。
但是,我想创建一个 Stata 命令来在 Python 中运行我的chatgpt()函数。我可以通过键入program chatgpt来开始我的命令,并键入end来结束命令,从而创建一个名为chatgpt的 Stata 命令。
出于技术原因,我们的新chatgpt命令还无法工作。我们可以通过将 Stata 代码和 Python 代码保存到一个名为chatgpt.ado的文件中来使其工作。请注意,我在下面的代码块中对我们的代码做了两处更改。首先,我删除了注释以节省空间。其次,我们已经定义了 Python 函数chatgpt()和 Stata 程序chatgpt。所以我键入了python clear和program drop chatgpt来将它们从 Stata 的内存中移除。 chatgpt.ado 版本 1
让我们运行我们的代码来重新定义我们的 Stata 命令chatgpt和我们的 Python 函数chatgpt(),然后键入chatgpt。
成功了!我们成功编写了一个 Stata 命令,该命令调用一个 Python 函数,该函数通过 OpenAI API 将我们的查询发送给 ChatGPT,通过 API 从 ChatGPT 检索回复,并将回复打印到屏幕上。
从 Stata 向 Python 传递查询这很有趣,但迟早我们会厌倦阅读关于 Stata 的俳句,并希望向 ChatGPT 提交一个新的查询。如果我们能够直接在 Stata 命令中键入我们的查询,那就太好了。为此,我们需要允许我们的 Stata 命令接受一个输入字符串,然后将该字符串传递给我们的 Python 函数。 我们可以通过添加行args InputText来允许我们的chatgpt命令接受字符串输入。然后我们可以键入chatgpt "query",query的内容将存储在本地宏InputText中。我在下面的代码块中使用红色字体添加了这一行。 接下来,我们需要将本地宏InputText从 Stata 传递给我们的 Python 函数。Stata 的函数接口(SFI)使得在 Stata 和 Python 之间来回传递信息变得容易。首先,我们可以键入from sfi import Macro来从 SFI 导入 Macro 包。然后我们可以键入inputtext = Macro.getLocal('InputText')来使用getLocal()方法将 Stata 本地宏InputText传递给 Python 变量inputtext。我在下面的代码块中再次使用红色字体添加了这些代码行,以便于看到。 chatgpt.ado 版本 2
让我们运行我们更新的代码来重新定义我们的 Stata 命令chatgpt和我们的 Python 函数chatgpt(),然后尝试我们chatgpt命令的新版本。
这次我要求 ChatGPT 写一首关于 Stata 的打油诗,而且成功了!请注意,查询周围的双引号不是可选的。
将 Python 的响应传递给 Stata在某个时候,我们可能希望在运行我们的命令后使用 ChatGPT 的回复。具体来说,我们可能希望将 ChatGPT 的回复存储到本地宏中,这样我们就不必从屏幕上复制和粘贴它。同样,Stata 的 SFI 接口使这项任务变得容易。 让我们首先修改我们的 Python 函数。回想一下,ChatGPT 回复的文本存储在outputtext.choices[0].message.content中。我们可以使用 SFI 的 Macro 包中的setLocal()方法将回复存储到名为OutputText的 Stata 本地宏中。我在下面的代码块中再次使用红色字体键入了那行代码,以便于看到。 接下来,我们需要对我们的 Stata 命令的定义进行两处更改。首先,我们需要在我们的程序定义中添加选项rclass,以允许我们的命令在终止后返回信息。其次,我们需要添加行return local OutputText = `"`OutputText'"'来将本地宏OutputText的内容返回给用户。请注意,我在本地宏周围使用了复合双引号,因为 ChatGPT 的回复可能包含双引号。同样,我在下面的代码块中再次使用红色字体键入了这些更改,以便于看到。 chatgpt.ado 版本 3
让我们运行我们的 ado 文件来重新定义我们的 Stata 命令和 Python 函数,然后键入一个新的chatgpt命令。
现在我们可以键入return list,看到 ChatGPT 的回复已经存储到本地宏r(OutputText)中。
将 ChatGPT 的回复写入文件我喜欢在本地宏中访问 ChatGPT 的回复,但我注意到某些格式(如换行符)已经丢失了。这对于短回复来说很容易纠正,但对于长回复来说可能会很耗时。解决这个问题的一个方法是将 ChatGPT 的回复写入文件。 我在下面的代码块中用红色字体向 Python 函数添加了三行代码。第一行使用open()方法创建一个名为chatgpt_output.txt的输出文件。w告诉open()覆盖文件而不是追加新文本。第二行使用write()方法将 ChatGPT 的回复写入文件。第三行使用close()方法关闭文件。 chatgpt.ado 版本 4
同样,我们必须运行我们的 ado 文件来重新定义我们的 Stata 命令和 Python 函数。然后我们可以键入一个新的chatgpt命令来提交一个新的查询。
现在我们可以查看输出文件以验证它包含 ChatGPT 的回复。
一旦我们完成修改程序,我们需要从我们的.ado文件中删除行python clear。这可能会对其他 Python 代码造成问题。
结论这就是我编写我在推特上发布的那个小chatgpt命令的方法。它的功能非常有限,但我只是出于好奇在某天吃午饭时写的。我尝试了一些有趣的实验,例如要求 ChatGPT 编写 Stata 代码来进行不同场景的模拟功效计算。结果充其量是好坏参半的,所以我还不必拿出我的简历。但是 ChatGPT API 可以做我在这里演示的更多事情,您可以通过阅读ChatGPT API 参考了解更多信息。而且 Stata 与 Python 的集成使得创建使用这些强大工具的用户友好的 Stata 命令相对容易。
在线留言尊敬的客户朋友,如您有任何意见建议,请通过下表反馈给我们,我们会尽快与您联系。
|
|
|
||||||||||||||||||||||||||