Loading...

再看法律领域微调模型及外挂知识库问答优化方案:从引入关键词、领域嵌入到知识库细化、意图识别及知识增强项目案例

智源社区1年前 (2023)发布 智源社区
455 0 0

今天是2023年8月25日,星期五,北京,天气晴。

我们在前面的文章《也谈如何利用关键词缓解LLM文档问答缺陷及微调大模型生成图数据库执行语句:几个代表工作介绍与总结》中,我们介绍了本文主要介绍几个有趣的工作,包括ChatLaw。

该为了缓解单纯使用向量检索出现结果不相关的问题,Keyword LLM用于将用户口语化的诉求转化为法律行业关键词,并用于检索知识库中的法律知识,这个实际上是通过提取关联词的方案来加入一些限定的文档主题信息,而关于关键词提取。

而最近开源外挂的方案越来越多,最近看到一个工作,zhihaiLLM:github.com/zhihaiLLM/wisdomInterrogatory,其实现了之前所说的知识库细化、意图识别分发、关键词与向量化多路召回的知识库完整链路,是个很好的示范,但也有很多的优化空间,比如向量化做的更好、多路召回做投票、如何做更细致的标签等等。

值得我们借鉴的是,其知识库细化、意图识别分发、关键词与向量化多路召回的知识库的具体实现细节,包括数据的构成等,都是可以受益的点。

而进一步的,截至到现在,法律类的大模型已经达到了7个:

再看法律领域微调模型及外挂知识库问答优化方案:从引入关键词、领域嵌入到知识库细化、意图识别及知识增强项目案例

LawGPT-zh:https://github.com/LiuHC0428/LAW-GPT

LaWGPT:https://github.com/pengxiao-song/

lawyer-llama:https://github.com/AndrewZhe/lawyer-llama

HanFei:https://github.com/siat-nlp/HanFei

LexiLaw:https://github.com/CSHaitao/LexiLaw

ChatLaw:https://github.com/PKU-YuanGroup/ChatLaw

wisdomInterrogatory:https://github.com/zhihaiLLM/wisdomInterrogatory

这些开源方案都很有意思,尤其是现在大家发现,靠检索太容易带偏,里面的水还挺深的,本文主要从ChatLaw引入关键词和领域嵌入提升召回相关性、zhihaiLLM融合意图识别、知识检索的问答方案、zhihaiLLM外挂知识数据的构成与构造方案、zhihaiLLM知识增强的三个关键步骤及源码实现等几个角度进行介绍,供大家一起参考。

一、ChatLaw引入关键词和领域嵌入提升召回相关性

文章https://zhuanlan.zhihu.com/p/641561673中介绍了当前chatlaw的实现方案,与标准的Langchain方案不同,作者认为,现在的组成实际是ChatLaw=ChatLawLLM+ keyword LM+lawsLLM,属于一种集成式的方案。

再看法律领域微调模型及外挂知识库问答优化方案:从引入关键词、领域嵌入到知识库细化、意图识别及知识增强项目案例

如上图所示,

首先,为了缓解单纯使用向量检索出现结果不相关的问题,Keyword LLM用于将用户口语化的诉求转化为法律行业关键词,并用于检索知识库中的法律知识。

实际上,作者最初尝试了利用MySQL和Elasticsearch进行检索的传统方案,但效果不佳,所以单独微调了一个LLM来抽取user queries的keywords,然后分别遍历keywords进行embedding,与用户输入input的embedding进行拼接,执行召回。

这个实际上是通过提取关联词的方案来加入一些限定的文档主题信息,而关于关键词提取,我们在前面介绍过TFIDF,TextRank传统方案,以及Keybert等有监督方案,这些都可以尝试。而对于使用LLM进行关键词提取的,工作较少,作者提到了一个商品观点关键词提取的类似项目,可以参考:

地址:https://huggingface.co/JessyTsu1/comment_opinion_extract_ChatGLM_base

该模型利用5000条淘宝评论数据训练,先使用GPT4通过prompt抽取数据的关键词,经过清洗再使用ChatGLM进行训练。效果如下:

再看法律领域微调模型及外挂知识库问答优化方案:从引入关键词、领域嵌入到知识库细化、意图识别及知识增强项目案例

其次,由于领域语料的问题,通用的embedding可能效果交差,所以搞了一个专门的embedding模型,Law LLM,其底层采用BERT对一些法律数据如文书,法规等进行训练,采用的是9.37k个国家判例法示例的数据集【数量级并不多

该模型用于对user queries以及关键词keywords进行向量化,提取相应的法律规定和司法解释参考文献。提取的过程为:遍历每个关键词,取关键词embddding和用户输入embedding做拼接【并设定阈值alpha做加权】,再与知识库的每个文章做相似度计算,每个文章的得分为与所有关键词+用户输入拼接向量相似度之和【这个的逻辑是能够照顾到所有的关键主题信息】,然后按照从大到小顺序进行排列,最终取TopK作为上下文。

最后,ChatLaw LLM对检索出来的结果进行分析,参考相关的法律条款,输出结果。

2、细化文档标签的检索相关性提升

第二篇工作https://zhuanlan.zhihu.com/p/641132245,针对LLM+Embedding构建问答系统的局限性及优化方案进行了总结,该工作指出了当前单纯使用向量化方法进行召回存在的一些问题。

例如,相似度阈值不易控制。

一般而言,相似度阈值过高或topk【最终保留的文档数】过低,会导致某些有效知识点无法命中,反之,很多无效知识点、不相关的内容与噪声会被引入。再加上最大输入长度的限制,通常会截断处理,容易遗漏相似度较低但有效的知识点。

为了避免召回结果有遗漏,就需要降低相似度评分下限,甚至同时提高召回结果数量上限(top k),这样会带来明显的问题,包括召回结果有效信息密度大幅降低,并且长度很长,既慢又花钱。

因此,我们会发现,这个本质上就是一个相关性搜索的问题,所以评论区有些精彩评论:

“感觉检索阶段已经做好了精确搜索了,按照文中的这种例子,检索出来的答案直接展示就好,感觉不必在过一遍LLM。”

“为啥不多路召回,搜索场景非常常用的做法,向量召回效果不一定好,传统方法不能完全丢弃。”

所以,这一套方案的根本,其实还是在如何找到相关性的上下文。

但是,很不幸的是,但文档数很多时,相关性计算上会收到很大挑战。

因此,可以采用的方案是细化文档标签,以提升搜索相关性。例如,对文本进行分类,对于金融领域文本,根据板块进行分类,分成金融、法律、医疗等,也可以进一步细分为金融财务、金融审查、金融数据等多个标签,这样能够更好地缩小检索的问题域。

那么, 什么是关键词和主题词呢?

关键词由作者自定义或自动分析提取,通常是可以高度概括该文章主题的,使用关键词搜索可搜出更加明确的主题方向的文章。主题词是由机构定义和发布的规范词,通常是专有名词或名词短语;主题词检索结果包括检索词的近义词、同义词以及同一概念词的不同书写形式等,通过主题词检索可以很大程度降低漏检和误检。

其中,对于主题词,可以采用结合依存的提取、基于成分句法分析的方法等进行,这些在我们早期的文章也有说过,可以查找进一步地看

而关于基于关键词的做法跟基于向量的方法,两者是做串行组合【先粗排,再精排】,还是并行组合【投票法取最大】,还是说如第一种方法同时转换为向量化操作,这些则需要我们根据具体业务,具体分析。

二、zhihaiLLM融合意图识别、知识检索的问答方案

智海-录问(wisdomInterrogatory)是由浙江大学、阿里巴巴达摩院以及华院计算三家单位共同设计研发的法律大模型,模型基座采用Baichuan-7B,在此基础上,进行了二次预训练以及指令微调训练。

地址:github.com/zhihaiLLM/wisdomInterrogatory

二次预训练阶段,采用包括法律文书、司法案例以及法律问答数据,共40G数据。训练数据的样例如下:


{"text""为一本关于被红眼生物诅咒的家族的恐怖小说生成一个引人入胜且独特的标题。"}
{"text""这个算法的工作原理是循环遍历数组中的每个元素,找到它后面所有未排序元素中的最小值"}

其中,法律领域数据占总体数据的30%,通用数据占总体数据的70%。通用数据中,英文数据和中文数据各占50%。

通用数据上,英文数据包括LIMA 、OpenOrca 、ShareGPT等,中文数据包括BELLE 、MOSS等。

微调阶段的训练数据如下:

{"text""\n\nHuman: 为一本关于被红眼生物诅咒的家族的恐怖小说生成一个引人入胜且独特的标题。\n\nAssistant: 《鬼怪之眼:被诅咒的血脉》"}

{"text""\n\nHuman: 用“勇气”、“诱惑”和“命运”这三个词写一首诗。\n\nAssistant: 雄心壮志,奋发有为,\n勇气汇聚心间,\n勇往直前。。。"}

在数据收集与筛选方面,对数据进行去重和清洗,通过条件过滤去除低质量的数据和重复数据。

同时对数据进行聚类和下采样。先使用Sentence-BERT对数据进行句子嵌入,然后对嵌入向量进行正则化和降维。之后利用KMeans算法对数据进行聚类,并在聚类簇中使用KCenter算法进行降采样。

三、zhihaiLLM外挂知识数据的构成与构造方案

在增强知识库数据方面,一共收集6种类型的知识库,包括法条类、案例类、模板类、书籍类、法律考试类、法律日常问答类。

再看法律领域微调模型及外挂知识库问答优化方案:从引入关键词、领域嵌入到知识库细化、意图识别及知识增强项目案例

其中,在知识库收集与处理上,

1、法条库

包含宪法、法律(宪法相关法、民商法、刑法、经济法、行政法、社会法、诉讼与非诉讼程序法)、司法解释、地方性法规(浙江、河南、北京、广东、重庆、山东、上海)、监察法规和行政法规。将这类文件输出为多个txt文件,其中刑法是json文件,key是标题,value是内容。

{
    "key0":"《公益事业捐赠法(1999-06-28)》 第五条",
    "key":"《公益事业捐赠法(1999-06-28)》 第五条 捐赠财产的使用应当尊重捐赠人的意愿,符合公益目的,不得将捐赠财产挪作他用。",
    "value":"《公益事业捐赠法(1999-06-28)》 第五条 捐赠财产的使用应当尊重捐赠人的意愿,符合公益目的,不得将捐赠财产挪作他用。"
}

{
    "key0":"《劳动法(2018-12-29)》 第四十三条",
    "key":"《劳动法(2018-12-29)》 第四十三条 用人单位不得违反本法规定延长劳动者的工作时间。",
    "value":"《劳动法(2018-12-29)》 第四十三条 用人单位不得违反本法规定延长劳动者的工作时间。"
}

2、法律文书模版库

包含民法、刑法和行政法三大部门法的起诉状、上诉状、法院判决书模版,以及合同等常用法律文书模版。

由于模版通常较长,因此通过ChatGPT总结得到文书模版的书写要点。最后得到一个json文件,key是文书标题,value是文书标题和要点。

数据样式如下:

{ "民事起诉状": "民事起诉状 要点包括:涉案当事人基本信息,法定代理人和委托代理人,诉讼请求,事实与理由,证据及来源,法院名称、附件副本及起诉人签名。", "行政上诉状": "行政上诉状 要点包括:上诉人、被上诉人基本信息,案由,不服原审判决的上诉,上诉请求,上诉理由,法院名称,上诉人签名,日期。" } 

3、法学书籍库

涵盖民法, 国际私法, 环境资源法, 法理学, 国际经济法, 中国特色社会主义法治理论, 民事诉讼法, 刑法, 刑事诉讼法, 司法制度和法律职业道德, 商法, 劳动与社会保障法, 宪法, 行政法与行政诉讼法, 国际法, 知识产权法, 经济法, 中国法律史等领域。

根据标题处理为多个txt文件以及与其对应的json文件,key是标题,value是内容。

法律学.txt,数据样式如下:

再看法律领域微调模型及外挂知识库问答优化方案:从引入关键词、领域嵌入到知识库细化、意图识别及知识增强项目案例

法律学.json,数据样例如下:

"法的起源与历史类型 法的产生": "法作为一种文明现象,是人类历史发展到一定阶段的产物。马克思主义法学认为,法不是从来就有的,也不是永恒存在的,它是人类历史发展到奴隶社会阶段才出现的社会现象。法是随着生产力的提高.社会经济的发展.私有制和阶级的产生.国家的出现而产生的,经历了一个长期的渐进的过程。法产生的主要标志包括国家的产生.权利和义务观念的形成以及法律诉讼和司法审判的出现。原始社会没有法律,人们的生活由习惯和宗教等原始规范予以调整。法律产生之后,逐步在社会生活中发挥着越来越重要的作用。法律与原始社会规范相比,两者之间存在如下区别:法律与原始社会规范相比,两者之间存在如下区别:1.产生的方式不同。法是由国家制定或认可的,原始社会规范是先民在长期的生产和生活过程中自发形成的。法律与原始社会规范相比,两者之间存在如下区别:2.反映的利益和意志不同。法反映统治阶级的利益和意志,原始社会规范反映原始社会全体成员的利益和意志。法律与原始社会规范相比,两者之间存在如下区别:3.实施的机制不同。法以国家强制力保证实施,原始社会规范主要依靠社会舆论.传统力量和氏族部落领袖的威信保证实施。法律与原始社会规范相比,两者之间存在如下区别:4.适用的范围不同。法适用于国家主权范围内的所有居民,原始社会规范只适用于相同血缘的本氏族部落成员。",

4、案例库

包含刑法、民法领域中的大量案例。由于案件事实通常较长,因此通过ChatGPT将案件事实总结成【主观动机】、【客观行为】以及【事外情节】三个部分。最后得到一个json文件,key是案件事实,value是事实和判决结果。

数据样式如下:

"案件事实 主观动机:被告人雷某军故意容留他人吸食毒品。客观行为:被告人雷某军多次提供场所、吸毒工具容许他人吸食毒品,并被公安机关抓获。。事外情节:无(该示例来自司法部)": "案件事实 主观动机:被告人雷某军故意容留他人吸食毒品。客观行为:被告人雷某军多次提供场所、吸毒工具容许他人吸食毒品,并被公安机关抓获。。事外情节:无(该示例来自司法部)。判决:该犯罪事实相关的法条是《中华人民共和国刑法》第354条,罪名是容留他人吸毒罪。", 

5、法考题库

包含2016年到2020年的1200题考题、选项、解析和答案。一个json文件,key是问题,value是问题、选项、解析和答案。

数据样式如下:

"春秋时期,针对以往传统法律体制的不合理性,出现了诸如晋国赵鞅“铸刑鼎”,郑国执政子产“铸刑书”等变革活动。对此,下列哪一说法是正确的?": "春秋时期,针对以往传统法律体制的不合理性,出现了诸如晋国赵鞅“铸刑鼎”,郑国执政子产“铸刑书”等变革活动。对此,下列哪一说法是正确的?A.晋国赵鞅“铸刑鼎”为中国历史上首次公布成文法B.奴隶主贵族对公布法律并不反对,认为利于其统治C.打破了“刑不可知,则威不可测”的壁垒D.孔子作为春秋时期思想家,肯定赵鞅“铸刑鼎”的举措。答案为C。解析为中国历史上首次公布成文法是郑国子产“铸刑书”的活动,晋国赵鞅“铸刑鼎”是第二次公布成文法的活动。成文法的公布,打破了“刑不可知,则威不可测”的传统,对奴隶贵族操纵和使用法律的特权形成严重冲击。因此,引起了奴隶主贵族的强烈指责。一心希望回到“三孔”时期的孔子对于公布成文法的活动也进行了抨击。故ABD选项错误,C选项正确。综上,本题正确答案为C选项。",

6、法律问答库

包含几千条法律领域的常见问题和答案数据。处理成为一个json文件,key是问题,value是答案。

数据样式如下:

"在任何户籍所在地都能办理离婚。我们结婚证在江苏在湖南能办理离婚吗?": "是的,任何户籍所在地都能办理离婚,结婚证在江苏,在湖南也可以办理离婚。",

任何一个知识点都是一个[key, value]的pair,其中:key是该知识点的内容简介,用于检索,value是知识点的具体内容,用于输入到模型中作为参考

四、zhihaiLLM知识增强的三个关键步骤及源码实现

整个知识增强的方案如下图所示,包括意图识别、知识检索以及知识融合三个关键步骤:

再看法律领域微调模型及外挂知识库问答优化方案:从引入关键词、领域嵌入到知识库细化、意图识别及知识增强项目案例

1、意图识别

在意图识别(多步检索)上,不同问题需要不同类型的知识库来辅助问答,首先需要识别出问题意图获取哪些知识。

通过问题中的关键词和上述五种类型知识库的特征的关键词匹配,以此识别出问题涉及的知识类型并用对应知识库辅助。

五种类型知识库的特征关键词如下:

具体详细见:app/langchain_demo/data/cache/intention_reg.json

{"法律法条": ["法律","法条","判罚","罪名","刑期","本院认为","观点","条文","条款","案由","定罪","量刑","法院观点","法官意见","条例","规定","执法依据","法规","罪责","量刑","诉讼","立法"], "法律书籍": ["依据","法律读物","法学著作","法律参考书","法典","法规","参考书","读本","丛书","法理","法学","法哲学","法学家","著作","文献","学说","学术"], "法律文书模板": ["文书","起诉书","法律文书","起诉状","判决书","裁定书","答辩状","法律合同","协议","证据","证明","合同","格式","模板","样本","规范","范本"], "法律案例": ["法律","判罚","事实","案例","罪名","刑期","本院认为","观点","法律案件","典型案例","案情","案由","定罪","量刑","证据","判例","裁决","仲裁","先例","判决","司法"], "法律考试": ["选项","选择","A,B,C,D","ABCD","A,B,C和D","考试","题目","法考","法律考试","考题","选择题","判断题","多选题","单选题","填空题","辨析题","案例分析题","答案","试题","试卷","法学","考研","司法考试","律师考试"]} 

通过识别问题意图,缩小需要检索的知识库范围,减少易混淆知识带来的影响,提升检索精确度。

如下图所示:

再看法律领域微调模型及外挂知识库问答优化方案:从引入关键词、领域嵌入到知识库细化、意图识别及知识增强项目案例

2、知识检索

在知识检索(多路检索)上,同时采用统计特征层面的检索和语义特征层面的检索

对于统计特征,预先提取知识库中每条知识的关键词,比如法条库中每条法条的关键词是所属法律和法条条数,使用fuzzy matching提取问题中的关键词和知识关键词匹配获取相关知识,匹配的逻辑如下图所示:

import json
from fuzzywuzzy import process
import os
import re

## 基于关键词匹配实现意图分类
def key_words_match_intention(input):
    kg_names = set()
    with open("app/langchain_demo/data/cache/intention_reg.json""r") as f:
        dic = json.load(f)
        for key,val in dic.items():
            for el in val:
                if el in input:
                    kg_names.add(key)
    return kg_names
## 初始化article def init_all_articles():    """{ "key0":"《劳动法(2018-12-29)》 第四十三条",    "key":"《劳动法(2018-12-29)》 第四十三条 用人单位不得违反本法规定延长劳动者的工作时间。",    "value":"《劳动法(2018-12-29)》 第四十三条 用人单位不得违反本法规定延长劳动者的工作时间。"} """    art_dir = "app/langchain_demo/data/cache/legal_articles"
    dic_all = {}
    choices = []
    for doc in os.listdir(art_dir):
        if doc.endswith('.json'):
            # print(doc)
            with open(os.path.join(art_dir,doc),"r") as f:
                lines = f.readlines()
                for line in lines:
                    data = json.loads(line)
                    dic_all[data["key0"]] = data["value"]
                    choices.append(data["key0"].split(" ")[0]) 
    choices = list(set(choices))
    return dic_all, choices
## 抽取出具体法条
def key_words_match_knowledge(dic_all, choices, query):
    result_title = process.extract(query, choices, limit=1)
    match = re.search(r'第(\S+)条', query)
    if match:
        result_num = match.group(1)
        key0 = result_title[0][0]+" 第"+ result_num +"条"
        if key0 in dic_all.keys():
            return (key0, dic_all[key0])
    return 

里面使用fuzzey matching的逻辑在于,其可以高效地完成关键词匹配,代码如下:

>>> choices = ["Atlanta Falcons""New York Jets""New York Giants""Dallas Cowboys"]
>>> process.extract("new york jets", choices, limit=2)
        [('New York Jets', 100), ('New York Giants', 78)]
>>> process.extractOne("cowboys", choices)
        ("Dallas Cowboys", 90)

对于语义特征,使用向量相似度检索,为了提升检索精确度,预先准备每条知识对应的摘要,向量检索时使用知识摘要和问题进行相似度计算,找到相关知识后替换成具体知识【这里为什么使用摘要,然后再用摘要替换成原先文本,考虑的是超长问题以及长文本带来的噪声问题】。

再看法律领域微调模型及外挂知识库问答优化方案:从引入关键词、领域嵌入到知识库细化、意图识别及知识增强项目案例

在检索模型训练阶段,为了获得更好的检索效果,额外利用对比学习训练了检索模型的embedding,具体地,将案例所对应的真实法条、类似案例、相关书籍描述等知识作为正例,并通过随机抽取和易混淆抽取(抽取和案例相似度高但并不对应的知识) 两种方式获取负例【这里的出发点是解决领域embedding的问题】

再看法律领域微调模型及外挂知识库问答优化方案:从引入关键词、领域嵌入到知识库细化、意图识别及知识增强项目案例

3、知识融合

在知识融合阶段,由于知识检索在意图识别阶段可能涉及多个知识库类型,将检索到的不同来源的知识融合后输入给法律大模型。

比如询问一个案例如何判罚时,意图识别阶段识别出应在法条库和类案库做检索,把和知识库名和其下检索到的知识拼接,再和问题拼接,共同输入到模型生成答案

可参考的知识:法条:知识1,知识2 类案:知识1,知识2 问题:XXX,请问这个案例应该如何判罚?

4、核心代码实现

最后,我们来看下最终的代码实现,外置知识库的初始化:

class LangChainCFG:
    llm_model_name = 'luwen_baichuan/output/zju_model_0813_100k'  # 本地模型文件 or huggingface远程仓库
    embedding_model_name = 'app/langchain_demo/model/text2vec'  # 检索模型文件 or huggingface远程仓库
    vector_store_path = 'app/langchain_demo/data/cache/legal_articles'
    kg_vector_stores = {
        '法律法条''app/langchain_demo/data/cache/legal_articles',
        '法律书籍''app/langchain_demo/data/cache/legal_books',
        '法律文书模板':'app/langchain_demo/data/cache/legal_templates',
        '法律案例''app/langchain_demo/data/cache/legal_cases',
        '法律考试''app/langchain_demo/data/cache/judicialExamination',
        '日常法律问答''app/langchain_demo/data/cache/legal_QA',
    }  
    
config = LangChainCFG()
application = LangChainApplication(config)

具体的实现逻辑如下:

def predict(input,
            kg_names=None,
            history=None,
            intention_reg=None,
            **kwargs):
    large_language_model="zju-bc"
    max_length=1024
    top_k = 1
    application.llm_service.max_token = max_length
    if history == None:
        history = []
    search_text = ''
    now_input = input
    eos_token_ids = [application.llm_service.tokenizer.eos_token_id]
    application.llm_service.history = history[-5:]
    max_memory = 4096 - max_length
    if intention_reg==["意图识别"]:
        auto_kg_names = key_words_match_intention(input)
        if len(auto_kg_names)==0:
            search_text += "意图识别没有匹配到知识库。\n\n"
        else:
            match_kg_names = "、".join(list(auto_kg_names))
            search_text += "意图识别匹配到知识库是:"+match_kg_names+"。\n\n"
        kg_names = list(set(kg_names) | auto_kg_names)
    kb_based = True if len(kg_names) != 0 else False
    if len(history) != 0:
        if large_language_model=="zju-bc":
            input = "".join(["</s>Human:\n" + i[0] +"\n" + "</s>Assistant:\n" + i[1] + "\n"for i in application.llm_service.history]) + \
            "</s>Human:\n" + input
            input = input[len("</s>Human:\n"):]
        else:
            input = "".join(["### Instruction:\n" + i[0] +"\n" + "### Response: " + i[1] + "\n" for i in application.llm_service.history]) + \
            "### Instruction:\n" + input
            input = input[len("### Instruction:\n"):]
    if len(input) > max_memory:
        input = input[-max_memory:]
    if kb_based:
        related_docs_with_score_seq = []
        for kg_name in kg_names:
            if kg_name=="法律法条":
                related_article = key_words_match_knowledge(application.all_articles, application.choices, now_input)
                if related_article:
                    kg_matches = [[Document(page_content=related_article[0], metadata={"value": related_article[1]})]]
                else:
                    application.source_service.load_vector_store(application.config.kg_vector_stores[kg_name])
                    kg_matches = application.source_service.vector_store.similarity_search_with_score(input, k=top_k)
            else:
                application.source_service.load_vector_store(application.config.kg_vector_stores[kg_name])
                kg_matches = application.source_service.vector_store.similarity_search_with_score(input, k=top_k)
            related_docs_with_score_seq.append(kg_matches)
        related_docs_with_score = related_docs_with_score_seq
        if len(related_docs_with_score) > 0:
            input, context_with_score = application.generate_prompt(related_docs_with_score, input, large_language_model,kg_names)
        search_text += context_with_score
    torch_gc()
    print("histroy in call: "history)
    prompt = application.llm_service.generate_prompt(input, kb_based, large_language_model)
    print("prompt: ",prompt)

4、模型效果

如下图所示,其模型效果如下:

再看法律领域微调模型及外挂知识库问答优化方案:从引入关键词、领域嵌入到知识库细化、意图识别及知识增强项目案例

总结

本文主要从ChatLaw引入关键词和领域嵌入提升召回相关性、zhihaiLLM融合意图识别、知识检索的问答方案、zhihaiLLM外挂知识数据的构成与构造方案、zhihaiLLM知识增强的三个关键步骤及源码实现等几个角度进行介绍。

其中,项目github.com/zhihaiLLM/wisdomInterrogatory大家可以关注,当然,这个项目也存在一些不足,也正如该工作所说,目前通过纯embedding匹配的检索效果仍然一般,后面考虑设计一套流程,可以自动训练得到针对某一知识库的专用检索模型, 同时,模型对融合的知识的理解能力仍有限,考虑在模型训练中对结合知识输出这方面进行增强。

行业微调模型长路漫漫,外挂知识库也本身是治标不治本,期待有更多、更好的工作出现。

参考文献

1、github.com/zhihaiLLM/wisdomInterrogatory

关于我们

老刘,刘焕勇,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。

老刘说NLP,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注。

对于想加入更优质的知识图谱、事件图谱、大模型AIGC实践、相关分享的,可关注公众号,在后台菜单栏中点击会员社区->会员入群加入。

​​       
© 版权声明

相关文章

暂无评论

暂无评论...