如之前的文章所述,我司下半年成立大模型项目团队之后,我虽兼管整个项目团队,但为让项目的推进效率更高,故分成了三大项目组
对于知识库问答,现在有两种方案,一种基于llamaindex,一种基于langchain +LLM,考虑到我已在此文《基于LangChain+LLM的本地知识库问答:从企业单文档问答到批量文档问答》中详细介绍了langchain、以及langchain-ChatGLM项目的源码剖析,本文重点则阐述如何通过基于langchain-chatchat二次开发一个知识库问答系统,包括其商用时的典型问题以及对应的改进方案,包括且不限于
将七月近两年整理的大厂面试题PDF文件作为源文件来进行知识库的构建
默认使用RapidOCRPDFLoader作为文档加载器
RapidOCR是目前已知运行速度最快、支持最广,完全开源免费并支持离线快速部署的多平台多语言OCR。由于PaddleOCR工程化不是太好,RapidOCR为了方便大家在各种端上进行OCR推理,将PaddleOCR中的模型转换为ONNX格式,使用Python/C++/Java/Swift/C# 将它移植到各个平台
更多详情参考:https://rapidai.github.io/RapidOCRDocs/docs/overview/
另,本文里的测试及二次开发主要针对langchain-chatchat的V0.2.6版本,资源及相关默认配置如下:
会出现检索出的部分结果与问题相关性不大的情况,甚至还会出现对某些问题检索不到的情况
比如问一个面试题:用通俗的语言介绍下强化学习?检索得到的内容如下:
出处 [1] 2022Q2大厂面试题共92题(含答案及解析).pdf
CART 树算法的核心是在生成过程中用基尼指数来选择特征。 4、用通俗的语言介绍下强化学习(Reinforcement Learning)监督学习的特点是有一个“老师”来“监督”我们,告诉我们正确的结果是什么。在我们在小的时候,会有老师来教我们,本质上监督学习是一种知识的传递,但不能发现新的知识。对于人类整体而言,真正(甚至唯一)的知识来源是实践——也就是强化学习。比如神农尝百草,最早人类并不知道哪些草能治病,但是通 过尝试,就能学到新的知识。学习与决策者被称为智能体,与智能体交互的部分则称为环境。智能体与环境不断进行交互,具体而言,这一交互的过程可以看做是多个时刻,每一时刻,智能体根据环境的状态,依据一定的策略选择一个动作(这
出处 [2] 2021Q3大厂面试题共107题(含答案及解析).pdf
20.2 集成学习的方式,随机森林讲一下,boost 讲一下, XGBOOST 是怎么回事讲一下。 集成学习的方式主要有 bagging,boosting,stacking 等,随机森林主要是采用了 bagging 的思想,通过自助法(bootstrap)重采样技术,从原始训练样本集 N 中有放回地重复随机抽取 n 个样本生成新的训练样本集合训练决策树,然后按以上步骤生成 m 棵决策树组成随机森林,新数据的分类结果按分类树 投票多少形成的分数而定。 boosting是分步学习每个弱分类器,最终的强分类器由分步产生的分类器组合而成,根据每步学习到的分类器去改变各个样本的权重(被错分的样本权重加大,反之减小) 它是一种基于 boosting增强策略的加法模型,训练的时候采用前向分布算法进行贪婪的学习,每次迭代
出处 [3] 2022Q2大厂面试题共92题(含答案及解析).pdf
特征工程可以并行开发,大大加快开发的速度。 训练速度较快。分类的时候,计算量仅仅只和特征的数目相关。 缺点:准确率欠佳。因为形式非常的简单,而现实中的数据非常复杂,因此,很难达到很高的准确性。很难处理 数据不平衡的问题。 3、介绍下决策树算法常见的决策树算法有三种:ID3、C4.5、CART 树 ID3 算法的核心是在决策树的每个节点上应用信息增益准则选择特征,递归地构架决策树。C4.5 算法的核心是在生成过程中用信息增益比来选择特征。 CART 树算法的核心是在生成过程中用基尼指数来选择特征。4、用通俗的语言介绍下强化学习(Reinforcement Learning)
可以看出
再比如问一个面试题:Bert的预训练过程是什么?
出处 [1] 2021Q2大厂面试题共121题(含答案及解析).pdf
成. 15.6 bert 的改进版有哪些 参考答案: RoBERTa:更强大的 BERT 加大训练数据 16GB -> 160GB,更大的batch size,训练时间加长 不需要 NSP Loss: natural inference 使用更长的训练 SequenceStatic vs. Dynamic Masking 模型训练成本在 6 万美金以上(估算) ALBERT:参数更少的 BERT一个轻量级的 BERT 模型 共享层与层之间的参数 (减少模型参数)
出处 [2] 2022Q1大厂面试题共65题(含答案及解析).pdf
可以从预训练方法角度解答。
… 20
5、RoBERTa 相比 BERT 有哪些改进?
…
20 6、BERT 的输入有哪几种 Embedding?
出处 [3] 2022Q2大厂面试题共92题(含答案及解析).pdf
保证模型的训练,pre-norm 显然更好一些。 5、GPT 与 Bert 的区别 1) GPT
是单向模型,无法利用上下文信息,只能利用上文;而 BERT 是双向模型。 2) GPT 是基于自回归模型,可以应用在 NLU 和 NLG两大任务,而原生的 BERT 采用的基于自编码模 型,只能完成 NLU 任务,无法直接应用在文本生成上面。 6、如何加速 Bert模型的训练 BERT 基线模型的训练使用 Adam with weight decay(Adam 优化器的变体)作为优化器,LAMB 是一款通用优化器,它适用于小批量和大批量,且除了学习率以外其他超参数均无需调整。LAMB 优化器支持自
可以看出,是没有检索到的相关内容的
使用默认配置时,虽然上传文档可以实现基础的问答,但效果并不是最好的,通常需要考虑以下几点原因
优化方法:
判断哪些文本嵌入模型效果较好,通常需要一个评估指标来进行比较,《MTEB: Massive Text Embedding Benchmark(海量文本嵌入基准)》就是一个海量文本嵌入模型的评估基准
榜单地址:https://huggingface.co/spaces/mteb/leaderboard
LLM问题主要有以下几点:
比如我们还用上面的一个面试题:用通俗的语言介绍下强化学习
强化学习是一种人工智能技术,它通过不断地试错和学习,使机器逐步掌握如何在特定环境中实现某种目标。与监督学习不同,强化学习没有一个“老师”来指导机器,而是通过与环境的交互来不断学习。
在强化学习中,机器作为一个智能体,与环境的交互过程可以看作是多个时刻的循环。在每个时刻,机器根据当前的环境状态,依据一定的策略选择一个动作,然后接着得到一个反馈(如得分或奖励)。机器通过不断试错和学习,逐渐提高自己的策略,以最大化累积的奖励。
强化学习算法主要有三种:ID3、C4.5和CART树。其中,ID3算法通过信息增益准则来选择特征,C4.5算法则用信息增益比来选择特征,而CART树算法则是用基尼指数来选择特征。这些算法都在决策树的生成过程中应用某种准则来选择特征,以达到提高模型性能的目的
可以看出,LLM并没有完全根据文档内容来回答,而是基于自己的知识进行了相应回答,而对于回答的第三段话,强化学习算法主要有三种:ID3、C4.5和CART树。可以看出,这段话的表达是完全错误的
// 待更
Langchian-Chatchat中对于不同类型的文件提供了不同的处理方式,从项目server/knoledge_base/utils.py文件中可以看到对于不同类型文件的加载方式,大体有HTML,Markdown,json,PDF,图片及其他类型等
LOADER_DICT = {"UnstructuredHTMLLoader": ['.html'],
"UnstructuredMarkdownLoader": ['.md'],
"CustomJSONLoader": [".json"],
"CSVLoader": [".csv"],
# "FilteredCSVLoader": [".csv"], # 需要自己指定,目前还没有支持
"RapidOCRPDFLoader": [".pdf"],
"RapidOCRLoader": ['.png', '.jpg', '.jpeg', '.bmp'],
"UnstructuredFileLoader": ['.eml', '.msg', '.rst',
'.rtf', '.txt', '.xml',
'.docx', '.epub', '.odt',
'.ppt', '.pptx', '.tsv'],
}
这里,我们重点关注PDF文件的解析方式,并探究其可能的优化方案。从上面的文件加载字典中可以看出,PDF文件使用的加载器为RapidOCRPDFLoader,该文件的方法在项目document_loaders/mypdfloader.py中
处理方法:
这种方式的优点简单粗暴,基本上对于任何排版的PDF文件都能够提取到有效信息。但缺点也很明显,就是无差别,比如我们的文档本身就有较好结构,提取出来的内容也无法将结构反映出来。所以,通常情况下需要根据文档的具体情况对解析后的文档做进一步定制化处理
以七月在线大厂面试题PDF文档为例,有以下特点:
因此,可以考虑根据文档的标题进行分割,即将文档中的标题和标题对应的内容分为一块,在放入向量库的时候可以尝试两种方式,一种是只将题目进行向量化表示存入向量库,另一种是将题目和答案一起进行向量化表示存入向量库
对此,尝试了几种PDF解析工具包:pdfplumber、PyPDF2、fitz(PyMuPDF)
文档解析过程中存在的问题:
解决方案:
具体解析结果暂见我司「大模型项目开发线上营」中的代码
测试效果:
以2022Q2大厂面试题共92题(含答案及解析).pdf文件为例,共92道面试题
匹配不到的数量
pdfplumber:30
PyPDF2:20(解析过程中,英文词之间的空格会消失,如selfattention)
fitz:35
// 待更
// 待更