名师讲堂|使用 Stata 调用 deepseek-r1 模型判断上市公司高管的政治背景

AI 摘要:本课程主要介绍了如何使用 Stata 调用 DeepSeek-R1 模型判断上市公司高管的政治背景。课程先提及可参考的上市公司高管简历数据及相关前期课程,接着讲解了安装DeepSeek-R1 模型的方法,随后分别介绍了通过 DeepSeek 的 API 以及本地部署的离线模型进行请求的操作,包括在 Stata 中调用 curl 工具、处理返回的 JSON 文件,还说明了循环处理所有简历并批量处理结果的步骤,最后提到可进一步对有政治背景的高管判断具体政治层级。

最近给大家分享了上市公司高管简历数据:

历年上市公司高管、董事和监事简历、持股情况、任职情况变动数据(2025年8月初爬取):https://rstata.duanshu.com/#/brief/course/b75a97992e6e4e63a50ef8c79d3a47b7

使用该数据可以做一些很意思的研究,例如今天就给大家分享的这个课程,根据简历信息判断高管是否具有从政经历或政治背景。传统的数据处理方法中,我们需要人工一条条的查看和判断。不过现在我们可以借助 LLM 模型完成这种工作。

在之前的课程中我已经给大家介绍了使用本地部署的 LLM 模型进行经济增长目标提取:

使用 Stata 调用本地部署的大语言模型进行文本主要内容提取——历年政府工作报告中的经济增长目标提取:https://rstata.duanshu.com/#/brief/course/42f4af4244df4e26b1f8b625ab5e321d

在学习本课程之前,大家可以参考该课程安装 ollama 等预置项目。

类似 llama3.1,安装 deepseek-r1 模型可以使用下面的代码(在终端(Mac)或 DOS 窗口(Windows)运行):

ollama run deepseek-r1:1.5b

使用 1.5b 参数的模型会更快速点。

sampledata.dta 是我从高管简历数据里随机抽取的样本:

use sampledata.dta, clear

例如郑钟焕的简历:

郑钟焕先生:1962年出生,大学本科,工程师职称。曾在深圳市轻纺工业公司、深圳市轻工业公司就职;自1985年10月起进入深圳中华自行车集团(股份)有限公司工作,历任计划部副经理、经理,资材部经理、制造部经理等职;现为本公司监事、深圳市阿米尼实业有限公司采购物管部经理。

我们按照下面的提示词进行提问:

根据下面的简历信息判断该主体是否有从政经历或者政治背景,仅返回是或者否即可:“郑钟焕先生:1962年出生,大学本科,工程师职称。曾在深圳市轻纺工业公司、深圳市轻工业公司就职;自1985年10月起进入深圳中华自行车集团(股份)有限公司工作,历任计划部副经理、经理,资材部经理、制造部经理等职;现为本公司监事、深圳市阿米尼实业有限公司采购物管部经理。”

在使用本地部署的离线模型之前,我们先介绍下如何使用 Deeseek 的 API 进行请求。

首先我们需要在 deepseek 的网站上充值和申请 API key:https://platform.deepseek.com/

需要注意这个密钥只有在创建的时候是可以看到的,记得及时复制保存下来。

在终端(Mac)或 DOS 窗口(Windows)运行:

curl https://api.deepseek.com/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer sk-1c6ee***********************54a1" -d '{"model": "deepseek-chat","messages": [{"role": "system", "content": "根据下面的简历信息判断该主体是否有从政经历或者政治背景,仅返回是或者否即可:“郑钟焕先生:1962年出生,大学本科,工程师职称。曾在深圳市轻纺工业公司、深圳市轻工业公司就职;自1985年10月起进入深圳中华自行车集团(股份)有限公司工作,历任计划部副经理、经理,资材部经理、制造部经理等职;现为本公司监事、深圳市阿米尼实业有限公司采购物管部经理。”"}, {"role": "user", "content": "Hello!"}], "stream": false}' -o temp1.json

sk-1c6ee***********************54a1 替换成大家自己的即可(注意是创建时候的那串不带星号的字符串,不是现在看到的这个)。

temp1.json 里面存储的就是保存的结果。主要内容如下:

否

另外需要注意,在 Windows 电脑上,上述的 curl 语句需要进行如下调整:

  1. 单引号都要替换成双引号;
  2. 双引号都替换成 "。
curl "https://api.deepseek.com/chat/completions" -H "Content-Type: application/json" -H "Authorization: Bearer sk-1c6ee***********************54a1" -d "{\"model\": \"deepseek-chat\",\"messages\": [{\"role\": \"system\", \"content\": \"根据下面的简历信息判断该主体是否有从政经历或者政治背景,仅返回是或者否即可\"}, {\"role\": \"user\", \"content\": \"郑钟焕先生:1962年出生,大学本科,工程师职称。曾在深圳市轻纺工业公司、深圳市轻工业公司就职;自1985年10月起进入深圳中华自行车集团(股份)有限公司工作,历任计划部副经理、经理,资材部经理、制造部经理等职;现为本公司监事、深圳市阿米尼实业有限公司采购物管部经理。\"}], \"stream\": false}" -o temp1.json

使用 Windows 小伙伴记得把后面代码里面的单引号和双引号都做出这样的调整。

关于 deepseek api 的使用可以阅读官方文档:https://api-docs.deepseek.com/zh-cn/

考虑到这个 api 的调用是需要付费的,所以我们还是转而使用本地部署的离线模型:

这个请求也可以使用 curl 语句(在终端(Mac)或 DOS 窗口(Windows)运行):

记得先退出 ollama 聊天窗口再运行!

curl http://localhost:11434/api/generate -d '{"model": "deepseek-r1:1.5b", "prompt": "根据下面的简历信息判断该主体是否有从政经历或者政治背景,仅返回是或者否即可:“郑钟焕先生:1962年出生,大学本科,工程师职称。曾在深圳市轻纺工业公司、深圳市轻工业公司就职;自1985年10月起进入深圳中华自行车集团(股份)有限公司工作,历任计划部副经理、经理,资材部经理、制造部经理等职;现为本公司监事、深圳市阿米尼实业有限公司采购物管部经理。”", "stream": false}' -o temp2.json

返回的结果会被保存到 temp0.json 文件中。

Stata 中调用 curl 工具非常简单,在前面加上感叹号就可以了:

!curl http://localhost:11434/api/generate -d '{"model": "deepseek-r1:1.5b", "prompt": "根据下面的简历信息判断该主体是否有从政经历或者政治背景,仅返回是或者否即可:“郑钟焕先生:1962年出生,大学本科,工程师职称。曾在深圳市轻纺工业公司、深圳市轻工业公司就职;自1985年10月起进入深圳中华自行车集团(股份)有限公司工作,历任计划部副经理、经理,资材部经理、制造部经理等职;现为本公司监事、深圳市阿米尼实业有限公司采购物管部经理。”", "stream": false}' -o temp2.json

json 文件的处理在之前的课程中就已有讲解:

Stata 网络数据爬取:JSON 篇:https://rstata.duanshu.com/#/brief/course/c6de9fae65df4eeb814d2275545e224d

处理结果:

insheetjson using temp2.json, showr flatten
clear
gen str2045 response = ""
insheetjson response using temp2.json, col(response)
replace response = ustrregexs(1) if ustrregexm(response, "\\u003c/think\\u003e(.*)")
list

*> +----------+
*> | response |
*> |----------|
*> 1. | \n\n否 |
*> +----------+

下面我们再循环处理所有的简历:

*- 此处代码需下载讲义材料查看~

由于该循环非常费时,可能需要重复运行多次,所以还是加个 if 判断跳过已经运行成功的:

forval i = 1/`=_N' {
if !fileexists("res/`i'.json") {
!curl http://localhost:11434/api/generate -d '{"model": "deepseek-r1", "prompt": "根据下面的简历信息判断该主体是否有从政经历或者政治背景,仅返回是或者否即可:“`=简历[`i']'”", "stream": false}' -o res/`i'.json
}
}

然后再批量处理 json 文件:

*- 此处代码需下载讲义材料查看~

最后得出具有从政经历或政治背景的有 12 个:

tab finale_res

*> finale_res | Freq. Percent Cum.
*> ------------+-----------------------------------
*> 否 | 127 91.37 91.37
*> 是 | 12 8.63 100.00
*> ------------+-----------------------------------
*> Total | 139 100.00

另外如果想要得到具体政治层级,可以在上面结果的基础上对那些具有政治背景的高管简历再使用下面的提示词提问:

!curl http://localhost:11434/api/generate -d '{"model": "deepseek-r1:1.5b", "prompt": "根据下面的简历信息判断该主体是否有从政经历或者政治背景(对应下面级别的均是“有”),仅返回行政级别编号即可,如果有多个级别编号的,使用分号分隔。其中行政级别编号为:政治背景行政层级:1=国家级正职,2=国家级副职,3=省部级正职,4=省部级副职,5=厅局级正职,6=厅局级副职,7=县处级正职,8=县处级副职,9=乡科级正职,10=乡科级副职,11=巡视员,12=副巡视员,13=调研员,14=副调研员,15=主任科员,16=副主任科员,17=科员,18=办事员,98=无法确定行政级别,99=无政府背景。若为人大代表、党代表等、则1=国家级,3=省级,5=市级,7=县级,9=乡级:“冀光恒先生,执行董事、行长。1968年出生,北京大学经济地理学本科、人文地理学硕士、区域经济学博士,高级经济师。冀光恒先生于2020年4月加入中国平安,历任上海总部党委书记、总经理,陆金所控股有限公司党委书记、董事长,中国平安副总经理,2022年7月至今,任中国平安党委副书记。2023年6月至今,任平安银行党委书记,2023年11月至今,任平安银行执行董事、行长。在加入中国平安前,冀先生曾出任宝能集团副董事长、联席总裁;上海农商银行党委书记、董事长;上海浦东发展银行党委委员、副行长、北京分行党委书记、行长;中国工商银行北京市分行党委委员、副行长,北京市分行办公室主任兼党办主任,长安支行党委书记、行长,总行副行长专职秘书,总行住房信贷部市场开发处副处长;上海银工房地产开发公司董事、副总经理。”", "stream": false}' -o temp3.json

结果:

好的,我现在要根据用户提供的简历信息,判断主体是否有从政经历或政治背景,并按照指定的行政级别编号来回答。首先,我需要仔细阅读简历内容,找出他是否担任过职位和在哪个级别的职位。,冀光恒先生的身份是“执行董事、行长”,这属于国家级高级经济师级,对应编号11。接下来,检查其担任过的职位,包括上海总部党委书记、总经理等,这些都在长官级及以上,但具体级数需要确认。根据信息,他是高级经济师,属于高级职位。,简历中提到他在加入中国平安前已经担任过多个重要职务,如宝能集团副董事长和银行党委书记,这些都是高级职位,符合高级经济师或高级经济师以上的位置,因此他的政治背景是高级的,对应编号11或者更高,但根据级别分类,他可能属于高级经济师(11)或更高级(比如高级经济师及以上),但通常高级经济师已经是三级,接下来应该是高级经济师以上。不过,用户提供的级别是从1到98,其中11是巡视员,而他在担任长官级职位时才加入中国平安,所以他的政治背景应为高级的,对应编号11或更高,但根据信息,他可能处于高级经济师以上,即国家三级的高级职位。,冀光恒先生具备从政经历,属于高级经济师(11)和高级经济师以上(可能是国家一级或二级),因此他的政治背景是高级的。;11

不过这个感觉就不是那么靠谱了。

点击这里跳转到 RStata 短书平台获取附件:名师讲堂|使用 Stata 调用 deepseek-r1 模型判断上市公司高管的政治背景

评论