广州番禺房价2022年最新房价,seo培训教程,哪家公司做网站不错,中小公司做网站前言
如之前的文章所述#xff0c;我司下半年成立大模型项目团队之后#xff0c;我虽兼管整个项目团队#xff0c;但为让项目的推进效率更高#xff0c;故分成了三大项目组
第一项目组由霍哥带头负责类似AIGC模特生成系统第二项目组由阿荀带头负责论文审稿GPT以及AI agen…前言
如之前的文章所述我司下半年成立大模型项目团队之后我虽兼管整个项目团队但为让项目的推进效率更高故分成了三大项目组
第一项目组由霍哥带头负责类似AIGC模特生成系统第二项目组由阿荀带头负责论文审稿GPT以及AI agent项目第三项目组由朝阳带头负责企业多文档的知识库问答系统朝阳、bingo、猫药师等人贡献了本文的至少一半
对于知识库问答现在有两种方案一种基于llamaindex一种基于langchain LLM
对于前者我近期会另外写一篇文章对于后者考虑到我已在此文《基于LangChainLLM的本地知识库问答从企业单文档问答到批量文档问答》中详细介绍了langchain、以及langchain-ChatGLM项目的源码剖析 如下图所示整个系统流程是很清晰的但涉及的点颇多所以决定最终效果的关键点包括且不限于文本分割算法、embedding、向量的存储 搜索 匹配 召回 排序、大模型本身的生成能力 本文重点则阐述“如何通过基于langchain-chatchat二次开发一个知识库问答系统”包括其商用时的典型问题以及对应的改进方案比如 1 如何解决检索出错embedding算法是关键之一 2 如何解决检索到相关但不根据知识库回答而是根据模型自有的预训练知识回答 3 如何针对结构化文档采取更好的chunk分割基于规则 4 如何解决非结构化文档分割不够准确的问题比如最好按照语义切分 5 如何确保召回结果的全面性与准确性多路召回与最后的去重/精排 6 如何解决基于文档中表格的问答
最后强调一下本文及后续相关的文章(比如embedding、文本语义分割、llamaindex等)更多是入门/梳理其中的细节/深入以及更多问题的解决暂在我司的「大模型项目开发线上营」里见 前置部分 知识库的构建基于langchain-chatchat的V0.2.6版本(chatglm2m3e)
将七月近两年整理的大厂面试题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版本资源及相关默认配置如下
显卡Tesla P10016G显存分词器ChineseRecursiveTextSplitterchunk_size250 (顺带说一下250是默认分块大小但该系统也有个可选项可以选择达摩院开源的语义分割模型nlp_bert_document-segmentation_chinese-base )embedding模型m3e-baseLLM模型chatglm2-6b (默认为该模型但下文会有些结果来自chatglm3)向量库faiss 第一部分 如何解决检索的问题比如检索出错等
1.1 如何解决检索出错embedding算法是关键之一
1.1.1 针对「Bert的预训练过程是什么」检索出的结果与问题不相关
使用原始的langchain-chatchat V0.2.6版本会出现对某些问题检索不到的情况
比如问一个面试题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 decayAdam 优化器的变体作为优化器LAMB 是一款通用优化器它适用于小批量和大批量且除了学习率以外其他超参数均无需调整。LAMB 优化器支持自 可以看出是没有检索到相关内容的 在没检索对的情况下接下来大模型便只能根据自己的知识去回答(下图左侧是chatglm2-6b的回答下图右侧是chatglm3-6b的回答)
1.1.2 可能的原因分析与优化方法
使用默认配置时虽然上传文档可以实现基础的问答但效果并不是最好的通常需要考虑以下几点原因
文件解析及预处理对于PDF文件可能出现解析不准确的情况导致检索召回率低文件切分不同的chunk_size切分出来的粒度不一样。如果设置的粒度太小会出现信息丢失的情况如果设置的粒度太大又可能会造成噪声太多导致模型输出的结果明显错误。且单纯根据chunk_size切分比较简单粗暴需要根据数据进行针对性优化embedding 模型效果embedding效果不好也会影响检索结果
优化方法
文件解析及预处理 一方面可以尝试不同的PDF解析工具解析更加准确 另一方面可以考虑将解析后的内容加上标题并保存成Markdown格式这样可以提高召回率文件切分 基于策略对于特定的文档比如有标题的可以优先根据标题和对应内容进行划分(就是按照题目和对应答案切分成一个块)再考虑chunk_size 基于语义分割模型还可以考虑使用语义分割模型模型效果 尝试使用更多embedding模型获得更精确的检索结果。如piccolo-large-zh 或 bge-large-zh-v1.5等等下文很快阐述向量库 如果知识库比较庞大文档数量多或文件较大推荐使用pg向量数据库 如果文件中存在较多相似的内容可以考虑分门别类存放数据减少文件中冲突的内容多路召回 结合传统方法进行多路召回精排 对多路召回得到的结果进行精排
1.2 如何根据业务场景确定最合适的embedding算法
暂见此文一文通透Text Embedding模型从text2vec、openai-ada-002到m3e、bge 第二部分 如何解决检索到相关但不根据相关结果回答
2.1 开源LLM并没有完全根据文档内容来回答而是根据模型自有的预训练知识回答
LLM问题主要有以下几点
LLM的回答会出现遗漏信息或补充多余信息的情况chatglm2-6b还会出现回答明显错误的情况
2.1.1 针对「用通俗的语言介绍下强化学习」检索到部分相关
比如问一个面试题用通俗的语言介绍下强化学习
该问题在文档中的结果如下 检索得到的内容如下 出处 [1] 2022Q2大厂面试题共92题含答案及解析.pdf CART 树算法的核心是在生成过程中用基尼指数来选择特征。 4、用通俗的语言介绍下强化学习Reinforcement Learning监督学习的特点是有一个“老师”来“监督”我们告诉我们正确的结果是什么。在我们在小的时候会有老师来教我们本质上监督学习是一种知识的传递但不能发现新的知识。对于人类整体而言真正甚至唯一的知识来源是实践——也就是强化学习。比如神农尝百草最早人类并不知道哪些草能治病但是通 过尝试就能学到新的知识。学习与决策者被称为智能体与智能体交互的部分则称为环境。智能体与环境不断进行交互具体而言这一交互的过程可以看做是多个时刻每一时刻智能体根据环境的状态依据一定的策略选择一个动作这 出处 [2] 2021Q3大厂面试题共107题含答案及解析.pdf 20.2 集成学习的方式随机森林讲一下boost 讲一下 XGBOOST 是怎么回事讲一下。 集成学习的方式主要有 baggingboostingstacking 等随机森林主要是采用了 bagging 的思想通过自助法bootstrap重采样技术从原始训练样本集 N 中有放回地重复随机抽取 n 个样本生成新的训练样本集合训练决策树然后按以上步骤生成 m 棵决策树组成随机森林新数据的分类结果按分类树 投票多少形成的分数而定。 boosting是分步学习每个弱分类器最终的强分类器由分步产生的分类器组合而成根据每步学习到的分类器去改变各个样本的权重被错分的样本权重加大反之减小) 它是一种基于 boosting增强策略的加法模型训练的时候采用前向分布算法进行贪婪的学习每次迭代 出处 [3] 2022Q2大厂面试题共92题含答案及解析.pdf 特征工程可以并行开发大大加快开发的速度。 训练速度较快。分类的时候计算量仅仅只和特征的数目相关。 缺点准确率欠佳。因为形式非常的简单而现实中的数据非常复杂因此很难达到很高的准确性。很难处理 数据不平衡的问题。 3、介绍下决策树算法常见的决策树算法有三种ID3、C4.5、CART 树 ID3 算法的核心是在决策树的每个节点上应用信息增益准则选择特征递归地构架决策树。C4.5 算法的核心是在生成过程中用信息增益比来选择特征。 CART 树算法的核心是在生成过程中用基尼指数来选择特征。4、用通俗的语言介绍下强化学习Reinforcement Learning 可以看出 第一个检索结果和问题是相关的第二个检索结果和问题是完全没关系的而第三个检索结果的最后一句话是和问题相关的最终chatglm2基于知识库给的答案如下 可以看出LLM并没有完全根据文档内容来回答而是基于自己的知识进行了相应回答而对于回答的第三段话强化学习算法主要有三种ID3、C4.5和CART树。可以看出这段话的表达是完全错误的
2.1.2 针对「生成式模型和判别式模型的区别并举一些例子」检索到的全是相关的
再看一个例子即提问生成式模型和判别式模型的区别并举一些例子
其在文档(知识库)中的答案如下 系统检索到的结果如下很明显三个检索结果都精准匹配到了问题 但系统最终实际生成的答案如下(下图左侧是chatglm2-6b下图右侧是chatglm3-6b) 相当于即便在上步骤中系统检索到的三个结果的内容都是和问题相关的但大模型还是根据自己的知识进行了回答
2.2 LLM不按照知识库回答的优化方法
优先使用最新的6B/7B模型ChatGLM3-6B、Baichuan2-7B、Qwen-7B 当然即便有的模型换成到了能力更强的最新版也不一定听话(依然不严格按照知识库中的回答)例如“2.1.1 针对「用通俗的语言介绍下强化学习」”中把chatglm2替换成最新的chatglm3也未完全严格按照文档中的答案来回答(但GLM3这个结果相比GLM2的结果 至少是进步了没有出现毫不相干的决策树之类的内容) 所以如果资源可以支持48G以上的显卡可以考虑使用Qwen-14B-Chat 或 Baichuan-13B-Chat13B的模型通常好于6B/7B模型优化prompt可能会有一定效果的。但由于随机性结果并不能得到保证PDF文档解析优化方案下文详述 第三部分 结构化文档与非结构化文档的典型问题如何更好分割
3.1 如何针对结构化文档采取更好的chunk分割基于规则
3.1.1 先解析PDF然后分别获取文本内容和图片内容最后拼接文本内容和图片内容
Langchian-Chatchat中对于不同类型的文件提供了不同的处理方式从项目server/knoledge_base/utils.py文件中可以看到对于不同类型文件的加载方式大体有HTMLMarkdownjsonPDF图片及其他类型等
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中
处理方法
首先使用fitz(即pyMuPDF)的open方法解析PDF文件对于每一页的文本内容通过get_text方法进行获取而对于图片内容通过get_images方法进行获取获取后通过RapidOCR对图片中的文本内容进行提取最后将从图片中提取的文本和原始的文本内容进行拼接得到最终的所有文本内容。然后进行下一步的分词和文本切割。
这种方式的优点简单粗暴基本上对于任何排版的PDF文件都能够提取到有效信息。但缺点也很明显就是无差别比如我们的文档本身就有较好结构提取出来的内容也无法将结构反映出来。所以通常情况下需要根据文档的具体情况对解析后的文档做进一步定制化处理
3.1.2 针对结构化文档本身的特点针对性分割
3.1.2.1 七月在线大厂面试题PDF文档特点
以七月在线大厂面试题PDF文档为例有以下特点
文档具有书签可以直接根据书签对应到具体的页码文档结构不复杂共有两级标题一级标题表示一个大的章节二级标题表示面试题的问题文本内容为每道面试题对应的答案每道面试题是独立的和其前后的面试题并没有明显的相关性。面试题题目的长度长短不一短的有几个词组成长的基本一句话文档中除中文外还有大量模型或算法英文词且文档中包含部分公式和代码
因此可以考虑根据文档的标题进行分割即将文档中的标题和标题对应的内容分为一块在放入向量库的时候可以尝试两种方式
一种是只将题目进行向量化表示存入向量库另一种是将题目和答案一起进行向量化表示存入向量库
3.1.2.2 PDF文档解析可选方案
对此尝试了几种PDF解析工具包pdfplumber、PyPDF2、fitzPyMuPDF
通过fitz获取书签信息得到面试题题目与其所在的页码保存为一个字典尝试用pdfplumber、PyPDF2、fitz抽取每一页的文本信息与字典中的标题进行匹配使用find方法通过面试题当前位置和下一个面试题位置这里的位置指的是索引对面试题进行分块最后输出面试题与其对应的答案
3.1.2.3 PDF文档解析存在问题
文档解析过程中存在的问题
书签中的标题内容和文档中的标题内容并不完全一致这种情况可能是解析后出现多余的空格导致的需要考虑一道面试题可能存在跨页的情况一般是会出现一道面试题出现在两页的情况但也需要考虑一道面试跨三页或多页的情况由于一级标题是有分页符的每个一级标题会另起一页因此在处理时也需要考虑此种情况。解析的文本中带有页脚如第 4 页 共 46 页由于页脚的内容对面试题是没有意义的因此也需要考虑去掉
3.1.2.4 PDF文档解析解决方案
解决方案
对于书签中的标题内容和文档中的标题内容并不完全一致的问题 一种方式有考虑去除文档中标题的空格实现困难在于无法精确定位如果全去掉就会出现一些英文单词拼接在一块的情况可能对语义或后续的检索产生影响 一种方式是不去除如果出现这种情况则将标题所在页的信息都提取出来对于一道面试题可能存在跨页的情况可以通过设置起始页和终止页对相邻标题主要是下一个标题所在页进行判断的方式来处理对于每个一级标题会另起一页的情况可以通过添加对特殊字符“1、”判断的方式来处理对于页脚可以使用正则表达式进行匹配去除
3.1.2.5 结果分析
测试效果 以2022Q2大厂面试题共92题含答案及解析.pdf文件为例共92道面试题匹配不到的数量
pdfplumber30PyPDF220解析过程中英文词之间的空格会消失如selfattentionfitz35
这个结果说明即便根据文档的标题进行分割(将文档中的标题和标题对应的内容分为一块)最终匹配率也不算高因为92个问题各个解析器下来依然都20 30多个匹配不到但如果不按照标题分割的话就会出现那种比如一段文本中只有部分内容而不完整的情况
接下来咱们来看下语义分割的方案
3.2 如何解决非结构化文档分割不够准确的问题比如最好按照语义切分
// 待更 第四部分 让召回结果更全面、准确及基于表格的问答
4.1 如何确保召回结果的全面性与准确性多路召回与最后的去重/精排
// 待更
4.2 如何解决基于文档中表格的问答
// 待更 参考文献与推荐阅读
基于Langchain-Chatchat的知识库问答系统..