Stata命令chatgpt,運行ChatGPT

人工智能( AI )是當今媒體的熱門話題,而ChatGPT可能是最知名的人工智能工具。最近在Twitter上寫了一篇名爲Stata命令chatgpt的來運行ChatGPT的文章。下面是解釋,如何實現的。

回顧Stata/Python綜述合集

我的chatgpt命令使用了Stata和Python代碼相結合的方式。如果你不熟悉Stata和Python的結合使用,可以參考以前的博文。Stata/Python integration part 1: Setting up Stata to use PythonStata/Python integration part 2: Three ways to use Python in StataStata/Python integration part 3: How to install Python packagesStata/Python integration part 4: How to use Python packagesStata/Python integration part 6: Working with APIs and JSON dataStata/Python integration part 8: Using the Stata Function Interface to copy data from Stata to Python

使用Python與ChatGPT進行交互ChatGPT是由OpenAI創建的,我們將使用OpenAIAPI與ChatGPT進行通信。您需要一個OpenAI用戶帳戶和自己的OpenAIAPI密鑰才能使用下面的代碼。另外還需要安裝Python包openai。如果使用Python,可以在Stata命令窗口中輸入shellpipinstallopenai。如果使用Python作爲平臺(如Anaconda)的一部分,則可能需要使用不同的方法來安裝openai包。

首先我們編寫一些Python代碼導入openai包,定義一個名爲chatgpt()的函數,並將API密鑰傳遞給OpenAI服務器。我用綠色字體輸入註釋,以表明後續每行代碼的用途。注意,該函數是使用選項卡定義的。函數定義從defchatgpt()開始,在選項卡代碼部分結束時結束。

接下來,讓我們添加一些代碼,讓ChatGPT編寫一個關於Stata的haiku。我們將查詢內容存儲到inputtext中。然後使用ChatCompletion.create()方法通過API將內容發送到ChatGPT,並將ChatGPT的回覆存儲到outputtext中。"method"一詞是Python中函數的的術語,而ChatCompletion.create()方法需要兩個參數。model參數指定我們使用"gpt-3.5-turbo"模型,messages參數指定我們以"用戶"身份提交查詢,查詢的內容存儲在inputtext中。ChatGPT回覆的文本存儲在outputtext.choices[0].message.content中,我們的chatgpt()函數的最後一行代碼將回復打印到屏幕上。

現在我們可以在Python中運行我們的函數並查看結果。

成功了!而且這比我們開始時我想的要容易得多。請記住,我們使用ChatGPT只是爲了好玩。在使用ChatGPT進行嚴肅工作之前,您應該瞭解其版權含義,並對內容進行仔細檢查。

從Stata中調用Python函數在Stata中使用新的Python函數最簡單的方法是輸入python: chatgpt()。注意,每次使用函數時,ChatGPT都會返回一個不同的回覆。

但是我想創建一個Stata命令,在Python中運行chatgpt()函數。可以通過輸入program chatgpt來創建一個名爲chatgpt的Stata命令來開始我的命令並輸入end來結束命令。

由於技術原因,我們新的chatgpt命令還不能正常工作。我們可以通過將Stata代碼和Python代碼保存在一個名爲chatgpt.ado的文件中使其工作。注意,在下面的代碼塊中對我們的代碼進行了兩次更改。首先,我刪除了評論以節省篇幅。其次,我們已經定義Python函數chatgpt()和Stata程序chatgpt。爲此,我輸入了pythonclear和programdropchatgpt,將它們從Stata的內存中刪除。

chatgpt.ado version 1

讓我們運行代碼來重新定義Stata命令chatgpt和Python函數chatgpt(),然後輸入chatgpt。

我們成功編寫了一個Stata命令,調用一個Python函數,該函數通過OpenAI API將我們的查詢內容發送到ChatGPT,通過API從ChatGPT檢索回覆,並將回覆打到屏幕上。

將查詢從Stata傳遞到Python我們遲早可能會厭倦閱讀有關Stata的haikus,並希望向ChatGPT提交一個新的查詢。如果我們可以直接在Stata命令中輸入查詢,那就太好了。爲此,我們需要允許Stata命令接受一個輸入字符串,然後將該字符串傳遞給Python函數。

我們可以通過添加行參數argsInputText來允許chatgpt命令接受字符串輸入。然後可以輸入chatgpt'query',查詢的內容將存儲在本地宏InputText中。我使用紅色字體將這一行添加到下面的代碼塊中。

接下來,我們需要將Stata中的本地宏InputText傳遞給我們的Python函數。Stata的函數接口(SFI)使得在Stata和Python之間來回傳遞信息變得容易。首先我們可以輸入from sfi import Macro來從sfi導入宏包。然後輸入inputtext=Macro.getLocal('InputText'),使用getLocal()方法將Stata本地宏InputText傳遞給Python變量inputtext。我又在下面的代碼塊中添加了這些帶有紅色字體的代碼行,這樣就很容易看到了。

chatgpt.ado version 2

讓我們運行更新後的代碼來重新定義Stata命令chatgpt和Python函數chatgpt(),然後嘗試新版本的chatgpt命令。

這一次我要求ChatGPT寫一篇關於Stata的文章,結果成功了!注意,雙引號裡的查詢內容不是可選的。

將響應結果從Python傳遞給Stata在某些情況下,我們可能希望在運行命令後使用ChatGPT的回覆。具體來說,我們不妨將ChatGPT的回覆存儲到一個本地宏,這樣我們就不必從屏幕上覆制和粘貼。同樣,Stata的SFI接口使這一任務變得簡單。

讓我們先修改Python函數。回想一下,ChatGPT回覆的文本存儲在

outputtext.choices[0].message.content中。我們可以使用SFI’s Macro包中的setLocal()方法將回復存儲到一個名爲OutputText的Stata本地宏中。我再次用紅色字體輸入了這行代碼,以便在下面的代碼塊中更容易看到。

接下來,我們需要對Stata命令的定義做兩點修改。首先,我們需要將選項rclass添加到程序定義中,以允許我們的命令在終止後返回信息。其次,我們需要添加行return local OutputText = `“`OutputText’”’來將本地宏OutputText的內容返回給用戶。注意,我對本地宏使用了複合雙引號,因爲ChatGPT的回覆可能包含雙引號。再次,我用紅色字體輸入了這些變化,以便在下面的代碼塊中很容易看到。

chatgpt.ado version 3

讓我們運行ado-file重新定義Stata命令和Python函數,然後輸入一個新的chatgpt命令。

現在我們可以輸入return list,看到ChatGPT的回覆已經存儲到本地宏r(OutputText)中。

將ChatGPT的回覆寫入文件

我喜歡在本地宏中訪問ChatGPT的回覆,但是我注意到一些格式,如換行符,已經丟失了。對於簡短的回覆來說這很容易糾正,但是對於較長的回覆來說可能會很耗時。解決這個問題的一個辦法是將ChatGPT的回覆寫到一個文件中。

我在下面的代碼塊中使用紅色字體爲Python函數添加了三行代碼。第一行使用open()方法創建一個名爲chatgpt_output.txt的輸出文件。w告訴open()重寫文件,而不是追加新的文本。第二行使用write()方法將ChatGPT的回覆寫入文件。第三行使用close()方法關閉文件。

chatgpt.ado version 4

再次,我們運行ado-file來重新定義Stata命令和Python函數。然後輸入一個新的chatgpt命令來提交一個新的查詢。

現在我們可以查看輸出文件來驗證其中是否包含ChatGPT的回覆。

一旦完成對程序的修改,我們需要從.ado文件中刪除pythonclear行。這可能會導致其他Python代碼出現問題。

結論

這就是在Twitter上發佈的chatgpt小命令。這只是一個簡單的例子,內容比較直觀明瞭。我還做了一些其他嘗試,比如讓ChatGPT編寫Stata代碼,來模擬不同場景的電力計算。結果好壞參半。但ChatGPTAPI所能做的遠不止我在這裡展示的,您可以通過閱讀ChatGPTAPIReference瞭解更多。Python與Stata的集成使得利用這些強大的工具去創建用戶友好的Stata命令變得相對容易。

北京天演融智軟件有限公司(科學軟件網)是STATA軟件在中國的授權經銷商,爲中國軟件用戶提供優質的軟件銷售和培訓服務。