接下来,我们添加一些代码来要求 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 中运行我们的函数并查看结果
. python:
------------------------------ python (type end to exit) -----------------------
>>> chatgpt()
Data ready, Stata
Regression, plots, and graphs
Insights we unearth
--------------------------------------------------------------------------------
有效!这比我们开始时想象的要容易得多。请记住,我们使用 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()
由于技术原因,我们的新chatgpt命令尚无法运行。我们可以通过将 Stata 代码和 Python 代码保存在名为chatgpt.ado的文件中来使其工作。请注意,我对下面的代码块中的代码进行了两处更改。首先,我删除了注释以节省空间。其次,我们已经定义了 Python 函数chatgpt()和 Stata 程序chatgpt。所以我输入了pythonclear和program drop chatgpt将它们从Stata的内存中删除。
chatgpt.ado 版本 1
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
. 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
print(outputtext.choices[0].message.content)
Macro.setLocal("OutputText", outputtext.choices[0].message.content)
让我们运行 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
同样,我们必须运行 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"
Leave a Reply