简介:面向金融科技与环境经济交叉领域的研究者,项目包演示了基于RAG与大语言模型分析A股上市公司年报的完整流程,旨在量化评估人工智能对企业绿色全要素生产率(GTFP)的影响,并引入融资约束异质性视角开展稳健性检验,解决传统计量方法难以处理海量文本信息的痛点。项目共20个文件,压缩包仅2.29MB,核心为7个Python脚本与7个Jupyter Notebook,覆盖年报爬取、格式转换、RAG嵌入生成、GPT打分、数据预处理、统计建模与可视化等环节;另有json配置文件、txt说明文档、docx附赠材料与md说明文件,便于对照理解模型参数与运行步骤,其中py与ipynb相互衔接,可分段复现各流程。已有66人学习下载,适合经管类高年级学生、研究人员及企业数据分析师作为AI+计量经济实证项目的代码模板。通过项目可直接获取年报文本处理与GTFP指标构建思路、调用大语言模型的具体实现、融资约束异质性分组分析及稳健性检验的代码范例,同时附有浏览器驱动安装等环境配置说明,可帮助使用者快速搭建同类研究框架,缩短前期摸索时间。
1. 这个项目到底在解决什么问题:RAG只是前菜,统计建模才是正餐
把A股上市公司年报喂给大语言模型做RAG,再把抽取结果拿去回归“人工智能对企业绿色全要素生产率的影响”——这个方案乍一听像把两个世界硬接到一起。我做过几年企业绿色效率方向的实证课题,GTFP测算和面板回归本身都是成熟工具,真正卡脖子的变量是“人工智能应用水平”:财报不直接披露这个数,相关表述散落在董事会报告、管理层讨论和研发投入明细里。手工读几千份年报不现实,RAG加LLM恰好把非结构化文本到结构化变量的规模化抽取这条路走通了。
但这个项目的难度不在RAG本身。更现实的问题是:抽取出来的字段能不能经得起计量检验,测量误差会不会衰减估计系数,融资约束分组的样本截断会不会引入内生性。这套管线的价值在于把“文本分析”和“统计建模”焊在一起,让AI变量不仅读得出来,还用得进去。适合正在做ESG实证、绿色金融、数字经济方向论文或课题的人,以及想用LLM给传统计量研究当数据前处理工具的一线从业者。
2. 用RAG和大语言模型读年报:先建知识库,再要结构化答案
2.1 为什么年报场景不能只靠长上下文硬读:RAG的三个不可替代性
年报场景第一个直觉方案是“把全文塞给大语言模型让它直接回答”。我劝你别这么干。A股年报动辄二三十万字,三千家公司三年就是上万份文档,token成本是一方面,更麻烦的是幻觉和不可追溯。让LLM直接报“某公司AI投入金额”,它很可能一本正经编一个数——年报里数字密集,position encoding稍一错位,十万和十亿就分不清了。RAG的本质是先检索再作答,把答案锚定在原文片段上,每一行抽取结果都能回溯到年报的某一页,这对后续审稿、复核、对抗“黑匣子”质疑是决定性的。
框架选型上,Python生态用LangChain最顺手,Java团队用langchain4j也能达到类似效果。有同学问agentic rag能不能提升抽取质量,年报场景我不建议一上来就上多轮编排。RAG和MCP的区别也在这里:MCP解决的是外部工具串联,年报抽取是单轮定向问答,复杂度不在工具链,而在检索召回率和字段定义本身。
2.2 建RAG知识库的最小链路:PDF解析、文本切块、向量化入库
年报PDF的解析质量直接决定后面所有环节。我用PyMuPDF按页提取文本,过滤掉页眉页脚和过短行,然后用递归字符切块器按段落粒度切开。这里有个“rag切块”的常见误区:年报是高度模板化的文档,按字符硬切容易把“研发投入”和“较上年增长”切成两半,检索时必然漏召回。我一般把chunk_size设在800到1000个汉字之间,overlap取120左右,分隔符按段落优先:
import fitz # 按页提取年报文本并做粗清洗,保留会计期间的上下文 def extract_pdf_text(path): doc = fitz.open(path) pages = [] for page in doc: text = page.get_text("text") lines = [line.strip() for line in text.splitlines() if len(line.strip()) > 4] # 过滤页码和页眉碎片 pages.append("\n".join(lines)) return pages from langchain.text_splitter import RecursiveCharacterTextSplitter splitter = RecursiveCharacterTextSplitter( chunk_size=800, chunk_overlap=120, separators=["\n\n", "\n", "。", ";"] # 优先按语义边界切 ) chunks = [] for page_text in extract_pdf_text("2023_年度报告.pdf"): chunks += splitter.split_text(page_text)切完先别急着入库。我习惯先打印几条chunk看切点是否落在句子中间。前面过滤短行那一步很关键——年报页脚经常出现“XX股份有限公司 2023年年度报告”这种重复短句,不滤掉会让检索结果里混入大量噪音片段,向量检索时这些重复文本会抢占相似度排序的坑位。
2.3 向量化入库与按字段定向检索:一次查一个字段,比一次问完更稳
向量化我直接用FAISS落盘,embedding模型按成本和数据敏感度选。如果用的是API embedding,年报这种中文术语密度极高的文本,建议先拿50条年报段落做一次小规模相似度抽查,确认“人工智能”“研发投入”“环保设备”这些词的召回是否正常。
from langchain_community.vectorstores import FAISS from langchain_openai import OpenAIEmbeddings # 向量化后保存到本地,后续年份增量更新时不必重新embedding全部语料 db = FAISS.from_texts(chunks, OpenAIEmbeddings(model="text-embedding-3-small")) db.save_local("annual_report_index") # 按字段定向检索:每个待抽取字段一个独立query,合并去重 retriever = db.as_retriever(search_kwargs={"k": 4}) query_list = ["人工智能 研发投入 项目 金额", "环保 投入 万元 本期", "发明专利 数量 累计 报告期"] hit_docs = [] for q in query_list: hit_docs += retriever.invoke(q)检索参数里最容易被忽略的是top_k。年报里一个字段往往只在某个章节出现一次,top_k设为4就够用;设得太大反而把不相关段落带进来,干扰抽取准确率。真正的“坑”藏在query设计上——“人工智能投入金额”这种query大概率命中管理层讨论章节,但具体金额在“研发投入”明细表里,所以我会拆成“人工智能 研发投入 项目 金额”这种不完整句法去撞相似度。
2.4 字段抽取的Prompt设计:JSON输出、温度归零、缺省返回null
检索到的段落拼进Prompt,用结构化输出约束LLM返回JSON。抽取类是纯信息搬运,temperature必须设成0,否则同一段文本跑两遍结果不一致,对账时人会崩溃。规则上要写死三件事:缺省返回null而不是编数、金额统一转成万元、小数保留两位。
import json from langchain_openai import ChatOpenAI llm = ChatOpenAI(model="gpt-4o-mini", temperature=0) extract_prompt = """从下面的年报文本中抽取字段,只输出JSON,不要输出任何解释。 字段: - ai_investment: 人工智能相关研发投入金额,单位万元,没有则null - green_tech_desc: 是否有绿色技术/环保技术相关表述,有则输出1,无则0 - patent_num: 报告期末累计专利数,没有则null 规则:文本中明确提到的才填;金额统一换算成万元;不推测、不补全。 文本: {context} """ from langchain_core.output_parsers import JsonOutputParser def extract_fields(context_text): resp = llm.invoke(extract_prompt.format(context=context_text[:3000])) return JsonOutputParser().parse(resp.content)注意我截断了context的前3000字。向量检索返回的多个chunk拼起来可能超过模型窗口,但抽取字段只看相关段落即可,截断顺序取“检索分数最高的排前面”,避免LLM被无关文本带跑。这里如果把“文本没提到就返回null”这条规则漏了,后面统计建模阶段缺失率会高得不像话,而且缺失不是随机的——都是检索不到的地方缺失,直接进回归会导致严重的样本选择偏误。
2.5 向量模型和LLM怎么选:云API还是本地部署大语言模型
| 场景 | 推荐选择 | 原因 |
|---|---|---|
| 一次跑几千份年报、预算有限 | API embedding + 小型Chat模型 | 效率高,成本可控 |
| 年报文本敏感、不能出内网 | 本地部署大语言模型 + 中文embedding | 数据不出域,但需GPU |
| 追求字段抽取的稳定性 | 温度归零 + 结构化输出 | 可复现,对账一致 |
| 已经上Java技术栈 | langchain4j的rag组件 | 不必跨语言维护 |
本地部署我常用bge-m3做embedding加Qwen系列做抽取,中文年报术语命中率不输主流API。但本地部署的部署成本和推理速度要用数据说话:一万份年报乘每份三个字段的抽取密度,本地V100跑也要几个小时,先算清账再决定。
3. 从抽取结果到可回归的面板数据:AI变量、GTFP与融资约束的口径
3.1 GTFP的投入产出口径与数据边界:SBM-DDF和GML的选择
绿色全要素生产率这个变量,核心是“同时考虑期望产出和非期望产出”的效率测度。常见做法是用SBM方向性距离函数配合GML指数计算。投入侧取年末固定资产净额、员工人数、能源消耗量,期望产出取营业收入,非期望产出用CO2排放量或工业SO2排放量。企业层面的能源和排放数据不是完整可得的,很多实证课题用行业能源强度乘企业营收做近似,或者匹配环保披露数据库。
这里有个边界要坦白:非期望产出数据缺失严重时,GML指数算出来的GTFP会大量集中在1附近,组内变异太小,后面固定效应回归几乎没有识别力。如果遇到这种情况,优先考虑用当期参比的M指数替代全局参比的GML,或者改用两阶段法在第一阶段用DEA算效率、第二阶段再做面板回归。测算口径的一致性比“绝对精确”更重要,因为你的目标是比较AI对绿色效率的边际影响,而不是测准每一家企业的绝对效率。
3.2 AI变量三种测度:词频、投资额与专利,基准和替换怎么排
AI变量是这个项目里最需要拿捏的部分。三种常见测度,各自的脾气完全不一样:
- 年报词频:统计“人工智能、机器学习、深度学习、智能+”等关键词在年报中出现的相对次数。覆盖最全,没缺失,但不区分“真实投入”和“讲故事”。
- AI投资额:RAG抽取的人工智能相关研发投入。信息浓度高,但年报披露口径混乱,缺失率高。
- AI专利数:人工智能相关专利。最硬核,但存在申报滞后,当年的专利反映的是两三年前的研发。
我一般用词频做基准回归,投资额和专利做稳健性替换。词频计算不需要复杂NLP,用正则就能搞定:
import re import pandas as pd # df_text: 一列是股票代码,一列是年报全文文本 keywords = ["人工智能", "机器学习", "深度学习", "大模型", "智能制造"] df_text["ai_count"] = df_text["annual_report"].apply( lambda txt: sum(len(re.findall(kw, txt)) for kw in keywords) ) # 用总字数归一化,避免同一年报篇幅差异带来的伪相关 df_text["ai_freq"] = df_text["ai_count"] / df_text["annual_report"].str.len()词频这个测度最大的优点是零缺失。零缺失在计量上太重要了——只要变量构造逻辑一致,审稿人不会质疑样本选择。缺点是它衡量的是“关注度”而非“投入”,所以基准回归显著之后,必须用投资额做稳健性,否则结论会被批“AI讲故事也能提升效率吗”。
3.3 融资约束的SA指数:为什么不用KZ和WW
融资约束异质性是标题里的核心分析维度。衡量融资约束的指数很多,KZ和WW指数理论上更全面,但都需要股息支付、托宾Q、现金流这些财务数据,A股不少样本对不上。SA指数只需要企业规模和上市年龄两个变量,数据完整度极高,是实证界的“后悔药”式选择——简单到不会出错。SA指数公式是:
import numpy as np df["size"] = np.log(df["total_assets"]) # 总资产取对数 df["age"] = df["year"] - df["list_year"] # 上市年限 # 标准SA指数公式,负值越大代表融资约束越强 df["SA"] = -0.737 * df["size"] + 0.043 * df["size"] ** 2 - 0.040 * df["age"]实际分组时,我习惯按SA中位数把样本切成高约束组和低约束组,或者按年份分组各取三分之一做分位组。不要用全局固定切点——不同年份上市企业画像差异很大,刚上市的小公司和老牌大厂混在一起切,分组会严重不平衡。
3.4 面板对齐的主要陷阱:报告期口径与去重
RAG抽取结果和财务数据合并时,最大坑是“年度”定义不一致。年报封面印着“2023年年度报告”,但财报披露的是2022财年数据。如果直接用报告文件年份和财务库的年份对齐,AI变量会整体错位一年,固定效应回归里这种系统性错位很难察觉,因为方向一致但系数会大幅衰减。
# annual_report字段表示披露日期,报告期是上一财年末 df["report_year"] = df["annual_report"].dt.year - 1 # 按股票代码和报告期年份关联财务面板 merged = df_text.merge(df_financial, on=["stkcd", "report_year"], how="left") # 同一code+report_year出现多行时只保留第一次抽取结果 merged = merged.drop_duplicates(subset=["stkcd", "report_year"], keep="first")提示:“报告期”是年报正文里最显眼的日期字段,优先级永远高于文件名和封面年份。金融数据库里的year字段通常就是报告期年份,直接用它join就行。
4. 基准回归与融资约束异质性:固定效应模型的参数选择和检验设计
4.1 基准模型设定:双向固定效应是底线
基准模型是双向固定效应面板回归,GTFP对AI变量回归,控制变量放企业规模、资产负债率、现金流、产权性质。模型写成:
GTFP_it = α + β × AI_it + γ × Controls_it + μ_i + λ_t + ε_it
μ_i是企业固定效应,吸收行业、地区、产权性质等所有不随时间变化的特征;λ_t是年份固定效应,吸收宏观经济波动、政策冲击。随机效应在这个场景下基本不用考虑——企业个体特征和AI变量几乎必然相关,随机效应估计不一致。跑Hausman检验大概率也是强烈拒绝原假设,固定效应是底线不是选择。
被企业固定效应吸收掉的变量要提前想清楚:行业虚拟变量、是否国企这种常量进模型会被drop_absorbed自动弹掉,不用慌,说明它们的信息已经包含在μ_i里了。
4.2 用PanelOLS跑基准回归:面板索引、聚类标准误与结果解读
我用linearmodels的PanelOLS跑双向固定效应,代码和数据格式都相对清爽:
from linearmodels.panel import PanelOLS df_reg = merged.set_index(["stkcd", "year"]) exog_vars = ["ai_freq", "size", "leverage", "cashflow"] exog = df_reg[exog_vars] mod = PanelOLS( df_reg["gtfp"], exog, entity_effects=True, # 企业固定效应 time_effects=True, # 年份固定效应 drop_absorbed=True # 自动丢弃被吸收的常量变量 ) res = mod.fit(cov_type="clustered", cluster_entity=True) print(res)cluster_entity=True表示按企业聚类标准误,这是面板实证的标配——同一家企业的扰动项在不同年份必然相关,不聚类标准误会严重低估,t值会虚高。解读结果时首要看β的符号和显著性,其次看经济显著性:AI词频每提高一个标准差,GTFP变动百分之几。很多论文只报t值不报经济意义,审稿人追问时很可能哑火。
4.3 融资约束异质性:分组回归系数差异检验比交互项更直观
异质性分析的两条技术路线:交互项模型和分组回归。交互项写法是GTFP对AI、AI×HighFC、HighFC及控制变量回归,好处是一个模型出结果,坏处是HighFC的组内均值差异不明显时,交互项解释起来比较绕。分组回归更直观——高约束组和低约束组各跑一遍,然后检验AI系数在两组之间是否显著不同。
分组后系数差异不能只看数值大小,必须做统计检验。常见做法是费舍尔组合检验,逻辑是:把样本的真实分组标签打乱重抽很多次,每次记录两组β差异的分布,看真实差异落在分布的什么位置:
import numpy as np def group_diff(data, group_col, formula_vars): hi = data[data[group_col] == 1] lo = data[data[group_col] == 0] b_hi = PanelOLS(hi["gtfp"], hi[formula_vars], entity_effects=True).fit().params[0] b_lo = PanelOLS(lo["gtfp"], lo[formula_vars], entity_effects=True).fit().params[0] return b_hi - b_lo rng = np.random.default_rng(42) real_diff = group_diff(df_reg, "high_fc", exog_vars) diff_draws = [] labels = df_reg["high_fc"].to_numpy().copy() for _ in range(500): rng.shuffle(labels) # 打乱分组标签,打破约束与变量关联 df_perm = df_reg.copy() df_perm["high_fc"] = labels diff_draws.append(group_diff(df_perm, "high_fc", exog_vars)) p_value = (np.abs(diff_draws) >= np.abs(real_diff)).mean()分组回归有一个隐蔽问题:分组依据SA指数本身和企业特征相关,组内样本量差异大时,低样本组的标准误会很大。如果低约束组只有几百家企业,β不显著很可能是功效不足而不是“没有异质性”,报告时要同时给出两组样本量。
4.4 时滞与内生性的初筛:滞后一期AI变量
AI投入对绿色效率的影响存在传导时间。当年砸钱搞数字化,当年未必见效。基准回归里顺手放一个滞后一期AI变量做初步检验,既是对“同期反向因果”的缓解,也是稳健性检验的前置:
df_reg["ai_freq_lag"] = df_reg.groupby("stkcd")["ai_freq"].shift(1) # 滞后变量进回归,注意有效样本量会减少一年滞后期损失样本是正常现象。如果滞后项系数比当期项还大,说明AI对GTFP的影响存在递增趋势,这个信息本身就有政策含义。工具变量的正式方案放到第5章,滞后只能缓解同期性问题,解决不了“企业预期未来效率高所以现在投AI”这种反向逻辑。
5. 稳健性检验避坑手册:三类翻车现场与对应解法
5.1 稳健性三件套:缩尾、聚类标准误与时滞
实证论文里稳健性检验三件套是缩尾、聚类标准误、解释变量滞后。缩尾处理极端值对效率测算的干扰,GTFP和AI词频都可能存在厚尾——个别企业词频是全行业十倍,不处理直接回归,一个点就撬动整条拟合线:
# 上下1%分位缩尾 for col in ["gtfp", "ai_freq", "size", "leverage"]: lo, hi = df_reg[col].quantile([0.01, 0.99]) df_reg[col] = df_reg[col].clip(lo, hi)聚类标准误的层级选择也有讲究。按企业聚类是底线,如果行业震荡明显,可以考虑行业年份双维聚类。双维聚类标准误通常更大,系数显著性下降是正常的——如果缩尾后显著性崩了,说明原结果依赖极端值,要如实报告而不是换聚类方式“调到显著”。
5.2 替换测度:AI换投资额与专利,GTFP换M指数
基准用词频,稳健性必须换AI测度。替换逻辑是:如果词频反映的是“讲故事”,那么换成投资额真实投入后系数应该依然成立;如果换了就不显著,说明基准结果可能只是市场情绪或文字游戏的面板反映。GTFP测度也换一次,从GML指数换成M指数或普通Malmquist,看看结论对效率算法的敏感性。
# 换AI测度后回归,对比系数表 models = {} for v in ["ai_freq", "ai_investment_log", "ai_patent_log"]: if v not in df_reg.columns: continue mod = PanelOLS(df_reg["gtfp"], df_reg[[v, "size", "leverage"]], entity_effects=True, time_effects=True, drop_absorbed=True) models[v] = mod.fit(cov_type="clustered", cluster_entity=True)换测度时要注意量纲差异。AI投资额是金额单位,词频是万分比,两者系数大小不可直接比,看的是显著性和方向一致性。报告稳健性检验时把不同测度的估计系数画在同一张图里,用置信区间覆盖情况说明结论稳定性,比堆十个回归表更直观。
5.3 内生性再进一步:行业同群工具变量
词频和GTFP之间的内生性有两个来源:遗漏变量(管理水平好的企业既爱用AI效率也高)和反向因果(效率高的企业有钱投AI)。滞后项只能挡反向因果,挡不住遗漏变量。常规做法是用行业内其他企业AI均值的“同群效应”做工具变量——个体企业受同行AI采用趋势影响,但同行的平均AI水平不太可能直接影响这家企业的绿色效率。
from linearmodels.iv import IVPanelOLS # 一阶段:ai_freq对行业均值回归;二阶段:用拟合值做解释变量 df_reg["industry_ai_mean"] = df_reg.groupby(["industry", "year"])["ai_freq"].transform("mean") iv_mod = IVPanelOLS.from_formula( "gtfp ~ 1 + size + leverage + EntityEffects + TimeEffects + [ai_freq ~ industry_ai_mean]", df_reg ) iv_res = iv_mod.fit(cov_type="clustered", cluster_entity=True) # 第一阶段F值低于10说明工具变量太弱 print(iv_res.first_stage)注意:同群工具变量要论证排他性——同行AI均值只能通过本企业AI采用影响绿色效率。如果行业存在共同的技术冲击(比如某年全行业都在上数字化)同时影响效率和AI采用,这个工具变量就失效。稳健的做法是换工具变量组合做overidentifying检验,哪怕只多一个工具变量也好过单工具变量完全无法检验。
5.4 避坑清单:从RAG到面板回归的五种翻车现场
翻车现场一:RAG抽取的AI投资额字段缺失率超过40%。现象:merge后AI投资额大量NaN,回归样本量骤减。原因:检索召回不够,投资额明细在年报“研发投入”章节里,query却只搜“人工智能”。解决:把检索query拆成“研发投入 本期 金额”“人工智能 资本化 费用化”等多路召回,并允许对同一字段做二次抽取。
翻车现场二:LLM抽出的数值与人工复核系统性差一年。现象:抽样对账发现AI投资额常见值是上一年度的。原因:年报PDF中“上年同期数”和“本年数”同时出现,Prompt没指定取哪一个。解决:Prompt里写死“取报告期本年数,不要上年同期和上年末余额”。
翻车现场三:GTFP大量等于1,固定效应回归系数几乎为零。现象:效率值组内变异趋近于零。原因:非期望产出数据缺失严重,SBM把所有样本推向前沿。解决:换非期望产出口径,或改用两阶段方法,先DEA后Tobit/面板。
翻车现场四:加入企业固定效应后AI系数由正转负。现象:混合OLS显著为正,固定效应显著为负。原因:AI词频的组内变异太小,企业个体效应吸收了大部分信息,剩下随时间变化的波动方向和效率变化相反。解决:报告组内R平方和AI变量的组内标准差,如果组内变异实在太小,考虑换成行业×年份维度或改用一阶差分模型。
翻车现场五:工具变量第一阶段F统计量是9.2。现象:F值略低于经验阈值10,IV结果的大标准误让显著性消失。原因:行业均值工具变量与个体AI采用的相关性不够强。解决:换工具变量组合,或改用控制函数法做稳健对照。
6. 验证抽取质量的三道工序:对账、抽样复核与置信度阈值
6.1 与CSMAR字段和人工翻页复核做三方对账
RAG抽取结果不能直接进回归,先做一轮对账。我一般抽30到50家企业,对“AI投资额、专利数、绿色技术有无”三个字段分别核对,第一把手是拿CSMAR或Wind里已有的研发投入字段做近似比对,第二把手是人工打开PDF原文定位到对应段落。
| 字段 | 抽样家数 | 一致率 | 典型偏差 |
|---|---|---|---|
| 研发投入总额 | 40 | 92% | 上年与本年混淆 |
| 累计专利数 | 30 | 87% | “专利”vs“发明”口径不统一 |
| 绿色技术表述 | 40 | 95% | 子公司文本混入 |
一致率低于85%就要回头修Prompt或检索策略,不要硬着头皮进回归。测量误差对系数的衰减作用不是玄学,是真实存在的:解释变量存在纯粹测量误差时,估计系数会朝零衰减。RAG抽取的一致率每降一个百分点,AI系数可能被压低多个百分点,这在审稿意见里几乎必被追问。
6.2 置信度阈值与缺失值策略:给每一个抽取结果留原文证据
我给RAG抽取管线加了一道工序:凡输出数值的字段,必须连带返回命中的原文摘要和页码。这样做有两层好处——复核不用重新查全文,直接看抽取时用的上下文片段;审稿人质疑数据质量时可以给出可核查的证据链。字段为null时也记录原因:是检索无命中,还是LLM判断“未提及”。这两种缺失在回归里含义完全不同。
缺失率超过20%的字段不建议直接插补。插补只适用于“随机缺失”,检索性缺失完全不随机——它取决于年报披露习惯,而披露习惯和企业特征相关。如果某个字段缺失率居高不下,正确做法是换一个测度,而不是把缺失值填成均值继续跑。
6.3 把整套管线打包成可复现的“数据血缘”
我的习惯是把PDF解析切片、检索命中文段、LLM原始输出、人工复核记录四层全部落盘保存。这不是多此一举——统计建模的结果能不能复现,一半取决于模型,另一半取决于抽样和清洗。RAG抽取的随机性已经用temperature=0压掉了,但embedding模型的版本更新、切块策略微调都可能让抽取结果产生漂移。保留数据血缘,意味着几个月后重新跑这个项目时,你还能解释清楚每一个变量是怎么从年报变成数字的。
做这类“文本抽取加计量实证”的项目,我最大的教训是:模型选型从来不是瓶颈,字段颗粒度和口径一致性才是。AI测度差一个字,结论可能从显著为正变成不显著;报告期错位一年,系数方向都可能反转。这个方向值得投入,但请把三分之二的精力放在抽取质量的验证上,回归本身反而很快。
希望帮到你。
本文还有配套的精品资源,点击获取