分类 抽取 下的文章

本文档分三个阶段:1、政策文档抽取QA问答 2、结构化数据融合大语言模型问答 3、自动化部署

一、政策文档抽取QA问答

由于格式复杂、标准多样,非结构化数据处理起来既困难又耗时。面对海量非结构化数据,如果没有自动化解决方案,人工手动处理将面临巨大挑战。

1.传统的QA问答抽取算法(非大模型)

传统的QA生成框架需要三个流程:pdf/word问答转txt、文档分块、问题生成,三个流程分别涉及到不同的技术
1.pdf问答转txt
文本转化:可以通过技术PyPDF2,pdfminer,textract,slate,直接提取文本内容。
2.文档分块
通过规则,通过分割算法方案
参考:https://github.com/chschock/textsplit
有相关论文在做文本分割算法
3.Learning to Ask模型
基于模型在中文问答语料DuReader数据上和已经结构化的政策QA问答数据集上微调,得到通用Learning to Ask模型;
DuReader数据数据集主要包含的QA问答对,可以用此数据集中的答案生成问题来微调模型。
此模型的输入为:上面文档分块的txt文本
输出为:对应的问题Q

2.基于大模型的QA问答抽取算法

本版本只实现了word文档的抽取,

(1)读取word文档内容

注意通过python-docx可以读取docx文件

pip install python-docx

(2)清洗待抽取的文档内容

去除无法提取(容易出错的)的部分:表格、图片、流程图

(3)对待抽取内容分块

python-docx 可以提取word文档的段落,按照段落组待提取的内容分块,经过实验每个块字数,实验结果每块在500-600左右的字数提取效果最好。

(4)写prompt内容,抽取返回特定格式

本版本使用百川2-13b模型作为抽取大模型,关键的prompt为:

prompt = "你是湖南省政策文档QA问答提取助手,需要提取的内容如下:" + cont + "抽取的内容结束"
new_query = [{"role":"system","content":prompt},{"role":"user","content":"参考上面内容,尽可能多的提取QA问答json数据,Q为对应问题,以问号结尾,A为对应答案,必须返回json格式
,格式为:[{\"Q\":抽取的问题,\"A\":抽取的答案},{\"Q\":抽取的问题,\"A\":抽取的答案}]"}]

其中,cont为待提取块文本内容。
实例:
待提取内如如下:

3 政策总体情况
【长沙市】个人待遇政策


(1)目前辖区内已开展的业务
职工:药店购药、普通门诊、普通住院、单病种住院、意外伤害住院、门特、特殊药品、门诊急诊、
生育门诊、生育住院
离休:普通门诊、普通住院
居民:门诊统筹、门特、普通住院、单病种住院、意外伤害住院、门诊两病、特殊药品、居民生育
住院、门诊急诊


(2)参保人存在险种划分
职工:职工基本医疗保险、职工大病互助保险、公务员医疗补助保险、职工生育保险。
离休:离休基本医疗保险
居民:居民基本医疗保险、居民大病



(3)具体基金分类和享受待遇人群分类
职工基金分类:职工基本医疗保险统筹基金、职工大病互助保险基金、公务员医疗补助基金、职工
享受待遇人群:在职、退休
离休基金分类:离休基金、个人账户金
离休享受待遇人群:离休、老红军、二乙伤残军人
居民基金分类:居民统筹基金、居民大病保险基金、医疗救助基金、特惠保金、医院减免金、财政
兜底金
居民享受待遇人群:新生儿、在校学生、大学生、未成年人、农村居民、非从业居民、老年居民。

提取之后的结果如下:

{
  "data": [
    {
      "question": "长沙市的个人待遇政策有哪些业务项目?",
      "answer": "目前辖区内已开展的业务包括:职工的药店购药、普通门诊、普通住院、单病种住院、意外伤害住院、门特、特殊药品、门诊急诊、生育门诊、生育住院;离休人员的普通门诊和普通住院;居民的门诊统筹、门特、普通住院、单病种住院、意外伤害住院、门诊两病、特殊药品、居民生育住院、门诊急诊。"
    },
    {
      "question": "职工参保人存在哪些险种划分?",
      "answer": "职工参保人存在以下险种划分:职工基本医疗保险、职工大病互助保险、公务员医疗补助保险、职工生育保险。"
    },
    {
      "question": "离休参保人存在哪些险种划分?",
      "answer": "离休参保人存在以下险种划分:离休基本医疗保险。"
    },
    {
      "question": "居民参保人存在哪些险种划分?",
      "answer": "居民参保人存在以下险种划分:居民基本医疗保险、居民大病保险。"
    },
    {
      "question": "职工基金的分类和享受待遇人群有哪些?",
      "answer": "职工基金分为职工基本医疗保险统筹基金、职工大病互助保险基金、公务员医疗补助基金。享受待遇的人群包括在职和退休人员。"
    },
    {
      "question": "离休基金的分类和享受待遇人群有哪些?",
      "answer": "离休基金分为离休基金和个人账户金。享受待遇的人群包括离休、老红军和二乙伤残军人。"
    },
    {
      "question": "居民基金的分类和享受待遇人群有哪些?",
      "answer": "居民基金分为居民统筹基金、居民大病

(5)大模型返回结果后置处理

通过正则对提取的后置内容做处理.

二、结构化数据融合大语言模型问答

1.抽取QA问答数据和历史问答合并

将新抽取的QA问答数据和已经存在QA问答库数据出重合并

2.训练检索模型(可以省略)

将合并后的QA问答数据中的问题库,调用同义不同问检索模型,训练同义不同问模型。如果之前的问题库数据量已经够多了,可以不用训练,直接推理就行。

3.检索后的top5数据用大模型回答

将检索模型检索的结果,给到大模型,同时将用户问题给到大模型,让大模型回答相关问题。

三、自动化部署(待开发)

整个自动化部署可以通过shell脚本,pipeline处理整个过程

自动化部署主要涉及到两个方面:1.增量数据处理 2.服务的重启

1.增量数据处理

(1)可以通过python 脚本,将提取的QA问答对数据从mysql(大模型抽取后后端开发放到数据库中)同步到服务器端本地文件中。
(2)和之前的QA问答对合并处理。
(3)并将对应的问题,通过同义不同问模型转为embedding问题向量。

2.服务的重启

数据处理完成后,服务启动的时候会初始化模型和数据到内存中,所以需要重启服务。主要重启的服务有:
(1)rasa框架服务器,主要提供对话的pipeline处理
(2)对话大模型服务,要重新加载数据

时间:从结构化一个政策文档10页word文档,到可以在大模型中访问,预计抽取可能2-5分钟,中间数据处理和服务重启预计2-5分钟,整体10分钟内可以完成。