人工智能 (AI) 是当今媒体的热门话题,而ChatGPT或许是最著名的人工智能工具。我最近发推文说我为自己编写了一个名为chatgpt的 Stata 命令来运行 ChatGPT。我答应解释我是如何做到的,所以这里是解释。

Stata/Python 集成回顾

我的chatgpt命令使用 Stata 和 Python 代码的组合。如果您不熟悉如何同时使用 Stata 和 Python,您可能需要阅读我之前的博客文章。

使用Python与ChatGPT交互

ChatGPT 由OpenAI创建,我们将使用 OpenAI API 与 ChatGPT 进行通信。您需要一个Open AI 用户帐户和您自己的Open AI API 密钥才能使用下面的代码。您还需要安装 Python 包 openai。如果您使用的是 Python,则可以在 Stata 命令窗口中键入shell pip install openai 。如果您使用 Python 作为 Anaconda 等平台的一部分,则可能需要使用不同的方法来安装openai软件包。

首先,我们编写一些 Python 代码来导入openai包,定义一个名为chatgpt()的函数,并将我们的 API 密钥传递给 Open AI 服务器。我使用绿色字体输入注释来指示后续每一行代码的用途。请注意,该函数是使用选项卡定义的。函数定义以def chatgpt()开始,并在选项卡式代码部分结束时结束。

python:

# Import the Open AI package

import openai

# Define a function named chatgpt()

def chatgpt():

     # Pass my API key to the OpenAI server

     openai.api_key = "PASTE YOUR API KEY HERE"

end

接下来,我们添加一些代码来要求 ChatGPT 写一首关于 Stata 的俳句。我们将把查询存储到inputtext中。然后,我们将使用ChatCompletion.create()方法通过 API 将查询发送到 ChatGPT ,并将 ChatGPT 的回复存储到outputtext。术语“方法”是函数的 Python 术语,ChatCompletion.create ()方法需要两个参数。model参数指定我们将使用“gpt-3.5-turbo”模型,messages参数指定我们以“用户”的角色提交查询,并且查询的内容存储在inputtext中。ChatGPT 回复的文本存储在outputtext.choices[0].message.content中,而chatgpt()函数中的最后一行代码将回复打印到屏幕上。


python:

# Import the Open AI package

import openai

# Define a function named chatgpt()

def chatgpt():

     # Pass my API key to the OpenAI server

     openai.api_key = "PASTE YOUR API KEY HERE"

     # Define an input string

     inputtext = "Write a haiku about Stata"

     # Send the inputtext through the API to ChatGPT

     # and store the result to outputtext

     outputtext = openai.ChatCompletion.create(

          model="gpt-3.5-turbo",

          messages=[{"role": "user", "content": inputtext}]

     )

     # Display the result

     print(outputtext.choices[0].message.content)

end

现在我们可以在 Python 中运行我们的函数并查看结果
. python:
------------------------------ python (type end to exit) -----------------------
>>> chatgpt()
Data ready, Stata
Regression, plots, and graphs
Insights we unearth
>>> end
--------------------------------------------------------------------------------
有效!这比我们开始时想象的要容易得多。请记住,我们使用 ChatGPT 只是为了好玩。在使用 ChatGPT 进行认真的工作之前,您应该了解版权影响并仔细检查内容。

从 Stata 调用 Python 函数

在 Stata 中使用我们的新 Python 函数的最简单方法是简单地输入python: chatgpt()。请注意,每次我们使用函数时,ChatGPT 都会返回不同的回复。

. python: chatgpt()
Data is sacred
Stata, the guiding compass
Insights, clear and true

但我想创建一个 Stata 命令来在 Python 中运行我的chatgpt()函数。我可以创建一个名为chatgpt的 Stata 命令,方法是键入program chatgpt来开始命令,然后键入end来结束命令
program chatgpt

     python: chatgpt()

end

由于技术原因,我们的新chatgpt命令尚无法运行。我们可以通过将 Stata 代码和 Python 代码保存在名为chatgpt.ado的文件中来使其工作。请注意,我对下面的代码块中的代码进行了两处更改。首先,我删除了注释以节省空间。其次,我们已经定义了 Python 函数chatgpt()和 Stata 程序chatgpt。所以我输入了pythonclear和program drop chatgpt将它们从Stata的内存中删除。

chatgpt.ado 版本 1
python clear

program drop chatgpt

program chatgpt

     version 18

     python: chatgpt()

end

     

python:

import openai

def chatgpt():

     openai.api_key = "PASTE YOUR API KEY HERE"

     inputtext = "Write a haiku about Stata"

     outputtext = openai.ChatCompletion.create(

          model="gpt-3.5-turbo",

          messages=[{"role": "user", "content": inputtext}]

     )

     print(outputtext.choices[0].message.content)

让我们运行代码来重新定义 Stata 命令chatgpt和 Python 函数chatgpt(),然后输入chatgpt

. chatgpt
Statistical tool
Stata, analyzing data
Insights brought to light

有效!我们成功编写了一个 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 导入宏包。然后我们可以输入inputtext = Macro.getLocal('InputText')来使用getLocal()方法将 Stata 本地宏InputText传递给 Python 变量inputtext。我再次在下面的代码块中添加了这些带有红色字体的代码行,以便它们很容易看到。

chatgpt.ado 版本 2
python clear

capture program drop chatgpt

program chatgpt

     version 18

     args InputText

     python: chatgpt()

end

     

python:

import openai

from sfi import Macro

def chatgpt():

     openai.api_key = "PASTE YOUR API KEY HERE"

     inputtext = Macro.getLocal('InputText')

     outputtext = openai.ChatCompletion.create(

          model="gpt-3.5-turbo",

          messages=[{"role": "user", "content": inputtext}]

     )

     print(outputtext.choices[0].message.content)

end

让我们运行更新后的代码来重新定义 Stata 命令chatgpt和 Python 函数chatgpt(),然后尝试新版本的chatgpt命令。

. chatgpt "Write a limerick about Stata"
There once was a software named Stata,
For data analysis, it was the mantra.
With graphs and regressions,
And countless expressions,
It made statistics feel like a tada!

这次我让 ChatGPT 写一首关于 Stata 的打油诗,成功了!请注意,查询周围的双引号不是可选的。

将 Python 的响应传递给 Stata

在某些时候,我们可能希望在运行命令后使用 ChatGPT 的回复。具体来说,我们可能希望将 ChatGPT 的回复存储到本地宏,这样我们就不必从屏幕上复制并粘贴它。同样,Stata 的SFI界面使这成为一项简单的任务。

让我们首先修改我们的 Python 函数。回想一下,ChatGPT 回复的文本存储在outputtext.choices[0].message.content中。我们可以使用SFI 宏包中的setLocal()方法来存储对名为OutputText的 Stata 本地宏的回复。我再次用红色字体输入了该行代码,以便在下面的代码块中轻松查看。

接下来,我们需要对 Stata 命令的定义进行两处更改。首先,我们需要将选项rclass添加到程序定义中,以允许我们的命令在终止后返回信息。其次,我们需要添加一行return local OutputText = `“`OutputText'”'以将本地宏OutputText的内容返回给用户。请注意,我在本地宏周围使用了复合双引号,因为 ChatGPT 的回复可能包含双引号。再次,我用红色字体输入了这些更改,以便在下面的代码块中轻松查看它们。

chatgpt.ado 版本 3
python clear

capture program drop chatgpt

program chatgpt, rclass

     version 18

     args InputText

     python: chatgpt()

     return local OutputText = `"`OutputText'"'

end

     

python:

import openai

from sfi import Macro

def chatgpt():

     openai.api_key = "PASTE YOUR API KEY HERE"

     inputtext = Macro.getLocal('InputText')

     outputtext = openai.ChatCompletion.create(

          model="gpt-3.5-turbo",

          messages=[{"role": "user", "content": inputtext}]

     )

     print(outputtext.choices[0].message.content)

     Macro.setLocal("OutputText", outputtext.choices[0].message.content)

end

让我们运行 ado 文件来重新定义 Stata 命令和 Python 函数,然后输入新的chatgpt命令。

. chatgpt "Write a haiku about Stata"
Data, Stata's realm,
Numbers dance, insights unfold,
Analysis blooms.

现在我们可以输入return list并看到 ChatGPT 的回复已存储到本地宏r(OutputText)中。

. return list

macros:
         r(OutputText) : "Data, Stata's realm, Numbers dance, insights unfo..."

将 ChatGPT 的回复写入文件

我喜欢在本地宏中访问 ChatGPT 的回复,但我注意到一些格式(例如换行符)已丢失。对于简短的回复来说,纠正这一点很容易,但对于较长的回复来说,可能会很耗时。此问题的一种解决方案是将 ChatGPT 的回复写入文件。

我使用红色字体向下面代码块中的 Python 函数添加了三行代码。第一行使用open()方法创建一个名为chatgpt_output.txt的输出文件。w告诉open()覆盖文件而不是附加新文本。第二行使用write()方法将 ChatGPT 的回复写入文件。第三行使用close()方法关闭文件。

chatgpt.ado 版本 4
python clear

capture program drop chatgpt

program chatgpt, rclass

     version 18

     args InputText

     python: chatgpt()

     return local OutputText = `"`OutputText'"'

end

     

python:

import openai

from sfi import Macro

def chatgpt():

     openai.api_key = "PASTE YOUR API KEY HERE"

     inputtext = Macro.getLocal('InputText')

     outputtext = openai.ChatCompletion.create(

          model="gpt-3.5-turbo",

          messages=[{"role": "user", "content": inputtext}]

     )

     print(outputtext.choices[0].message.content)

     Macro.setLocal("OutputText", outputtext.choices[0].message.content)

     

     f = open("chatgpt_output.txt", "w")

     f.write(outputtext.choices[0].message.content)

     f.close()

end

同样,我们必须运行 ado 文件来重新定义 Stata 命令和 Python 函数。然后我们可以输入新的chatgpt命令来提交新的查询。

. chatgpt "Write a haiku about Stata"
Stata, my great tool
Streamlining data's vast sea
Insights come to me

现在我们可以查看输出文件以验证它是否包含 ChatGPT 的回复。

. view "chatgpt_output.txt"

完成程序修改后,我们需要从.ado文件中删除python clear行。这可能会导致其他 Python 代码出现问题。

结论

这就是我编写在 Twitter 上发布的小chatgpt命令的方式。它的功能非常有限,但我只是出于好奇而在有一天吃午饭时写了它。我尝试过一些有趣的实验,比如让 ChatGPT 编写 Stata 代码来针对不同场景进行模拟功率计算。结果充其量是好坏参半,所以我还不需要掸掉我的简历。但 ChatGPT API 的功能远不止我在这里演示的,您可以通过阅读ChatGPT API 参考了解更多信息。Python 与 Stata 的集成使得创建利用这些强大工具的用户友好的 Stata 命令相对容易。

Categories: Blog

0 Comments

Leave a Reply

Avatar placeholder

Your email address will not be published. Required fields are marked *