大模型政府公文经济指标抽取指南
介绍
这次我们来聊聊怎么用LangChain配合Ollama上的qwen2:7b模型,从政府工作报告中抽取出全国各市级单位每年的预期GDP增长目标。qwen2:7b这个模型显存占用只有5GB左右,大多数消费级显卡都能跑起来,门槛并不高。
流程结构介绍
先看看整体的处理流程:
- 从相关政府工作报告的文本中,筛选出包含目标信息的句子;
- 通过提示工程,用few-shot的方式给出几个例子,定义模型的输出格式;
- 将大模型的输出结果插入到pandas的DataFrame中,后续再转成Excel。

相关文本筛选
关键句子的定位——从一整篇政府工作报告中,找到包含目标信息的句子。直接喂一整篇文本给大模型,精度往往会下降;用句子级别的短文本反而能提高信息抽取的准确率。
筛选相关文本通常有两种思路:
向量筛选:行业内常用基于向量相似度的文本块筛选(也就是RAG中的文本召回技术),类似llama-index结合chatglm3-6B利用RAG进行文档智能问答的做法。不过这种方法对硬件和配置有一定要求。
关键词筛选:这个项目直接用了关键词筛选。因为需求很明确——找到包含“生产总值”、“增长”这些词的句子,关键词筛选的召回率反而更高,也更简单直接。
大模型 few-shot
目标句子中虽然含有明显的经济指标数据,但不太建议用正则表达式来识别。文本表述变化很大,有的说“增长10%”,有的说“增速高于全省平均水平1到2个百分点”,正则很难全覆盖。直接让大模型来抽取信息就方便多了。
拿到包含目标信息的句子后,用提示词告诉大模型要提取哪些值,以及返回什么格式。提示词如下:
prompt = """
参考下述例子,生成相应的回答,请你从中提取出今年生产总值的预期增长值是多少?
按照下述提供的json格式返回结果。
Input: 孝感市1894年文件节选:主要预期目标是:全市生产总值增长10%以上
Output: {"city":"孝感市", "year":"1894", "GDP_growth":"10%"}
Input: 上海市1895年文件节选:初步核算,全市生产总值比上年增长11.1%,规模以上工业增加值增长21.7%,全社会固定资产投资增长22.6%,社会消费品零售总额增长13.7%,地方一般预算收入增长18.1%,实际利用外资增长12.4%,外贸出口增长28.4%,城镇居民人均可支配收入增长10.1%,农民人均纯收入增长10.2%,年初确定的主要预期目标和各项工作任务全面超额完成n今年经济社会发展的主要预期目标是:生产总值增长12%,全社会固定资产投资增长20%,'
Output: {"city":"上海市", "year":"1895", "GDP_growth":"12%"}
Input: {filename}年文件节选:{content}
Output:
""".strip()
给了两个Input/Output示例,让大模型学习并模仿结构化输出。这种用例子提示的方法就是few-shot。
大模型
这里用的是本地Ollama上的qwen2:7b模型。推理速度大概每秒处理1.6条数据,显存只占5GB。因为手头有6000份文本需要抽取,本地模型速度更快——虽然gpt-4o-mini准确率更高,收费也不贵,但网络延时实在太大。
如果想追求更快的速度,可以用llamafactory配合vllm来部署qwen2:7B,推理速度可以明显提升。测试环境是48GB显存的3090级别显卡,按照以往经验,每秒大概能处理15条数据。
当然,llamafactory+vllm部署起来不算太麻烦,如果勤快的话推荐试试。Ollama的好处是不用部署模型,直接挂机等结果就行,省心不少。
from langchain_community.llms import Ollama
llm = Ollama(model="qwen2:7b", temperature=0)
这次的few-shot本质上是为了实现结构化的输出。不过OpenAI在2024年已经官方支持结构化输出了,如果没有大量文本推理的需求,直接用gpt-4o-mini也是个不错的选择,一次调用大约$0.000102。具体可以参考LangChain官方文档中关于结构化输出的说明。
抽取结果
在全国所有市级单位中,从2000年开始一共抽取出6000条数据。
虽然qwen2这个小模型的能力没有那么强,但返回的结果还是挺令人满意的。从输出中能明显看到大模型的思考过程。举个例子,商丘市2011年的政府工作报告节选中并没有直接给出具体增长数值,只说了“生产总值增速高于全省平均水平1到2个百分点”:
今年经济社会发展主要预期目标是:生产总值增速高于全省平均水平1到2个百分点,财政一般预算收入增速高于生产总值增速2个百分点,全社会固定资产投资增长20%,社会消费品零售总额增长17%,外贸出口增长21%,实际利用外商直接投资增长22%,居民消费价格涨幅控制在4%左右,人口自然增长率控制在6.5%以内,新增城镇就业人员5.6万人,农民人均纯收入增长9%,城镇居民人均可支配收入增长9%,节能减排完成省定目标。
大模型的输出结果是:生产总值增速高于全省平均水平1到2个百分点。这个回答非常准确。事前并没有给模型任何关于这种模糊表述的提示,它能主动理解并提取出最优结果,确实很厉害。