运行 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()开始,并在制表符代码部分结束时结束。

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参数指定我们要以"user"的角色提交查询,我们的查询内容存储在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。若用于正式工作,你务必了解相关版权风险,并对生成内容进行严格复核。

 

从 Stata 调用 Python 函数

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

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

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

program chatgpt
     python: chatgpt()
end

出于技术原因,我们的新chatgpt命令还无法工作。我们可以通过将 Stata 代码和 Python 代码保存到一个名为chatgpt.ado的文件中来使其工作。请注意,我在下面的代码块中对我们的代码做了两处更改。首先,我删除了注释以节省空间。其次,我们已经定义了 Python 函数chatgpt()和 Stata 程序chatgpt。所以我键入了python clearprogram 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)
end

让我们运行我们的代码来重新定义我们的 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 导入 Macro 包。然后我们可以键入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 的 Macro 包中的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 代码造成问题。

 

结论

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

 

 

 

 

 

 

 


 

在线留言

尊敬的客户朋友,如您有任何意见建议,请通过下表反馈给我们,我们会尽快与您联系。

 

 

 

 

联系我们

 

微信公众号

咨询微信

企业店铺

400-621-1085

(节假日期间办公室座机如无人接听,请选择其他联系方式,感谢理解!祝您节日快乐!)

 

联系我们 快速链接 相关产品 上海卡贝信息技术有限公司

©2025  上海卡贝信息技术有限公司

产品中心

下载中心

站点地图

隐私政策

 

销售QQ咨询

产品QQ咨询

淘宝店铺

IBM SPSS Statistics 20 -统计分析软件
IBM SPSS Statistics 31 -统计分析软件

 

综述

功能概述

Stata/MP

最新更新:19版

版本选择

 

EQS

GraphPad Prism

LISREL

SmarPLS

Statgraphics

HLM

IRTPRO

flexMIRT

IBM SPSS Statistics

SAS

NCSS

PASS

SigmaPlot

nQuery

Analyse-it

MedCalc

AMOS

GAUSS

SYSTAT

EViews