基于LLM+向量库的文档对话经验面来自:AiGC面试宝典宁静致远2023年09月28日23:12一、基于LLM+向量库的文档对话基础面1.1为什么大模型需要外挂(向量)知识库?如何将外部知识注入大模型,最直接的方法:利用外部知识对大模型进行微调既然大模型微调不是将外部知识注入大模型的最优方案,那是否有其它可行方案?1.2.基于LLM+向量库的文档对话思路是怎么样?版本一版本一•思路:构建几十万量级的数据,然后利用这些数据对大模型进行微调,以将额外知识注入大模型•优点:简单粗暴•缺点:i.这几十万量级的数据并不能很好的将额外知识注入大模型;ii.训练成本昂贵。不仅需要多卡并行,还需要训练很多天;1.加载文件2.读取文本3.文本分割4.文本向量化5.问句向量化6.在文本向量中匹配出与问句向量最相似的topk个7.匹配出的文本作为上下文和问题一起添加到prompt中8.提交给LLM生成回答扫码加查看更多1.3.基于LLM+向量库的文档对话核心技术是什么?1.4.基于LLM+向量库的文档对话prompt模板如何构建?二、基于LLM+向量库的文档对话优化面痛点1:文档切分粒度不好把控,既担心噪声太多又担心语义信息丢失问题描述问题1:如何让LLM简要、准确回答细粒度知识?•基于LLM+向量库的文档对话核心技术:embedding•思路:将用户知识库内容经过embedding存入向量知识库,然后用户每一次提问也会经过embedding,利用向量相关性算法(例如余弦算法)找到最匹配的几个知识库片段,将这些知识库片段作为上下文,与用户问题一起作为promt提交给LLM回答已知信息:{context}根据上述已知信息,简洁和专业的来回答用户的问题。如果无法从中得到答案,请说“根据已知信息无法回答该问题”或“没有提供足够的相关信息”,不允许在答案中添加编造成分,答案请使用中文。问题是:{question}•举例及标答如下:用户:2023年我国上半年的国内生产总值是多少?LLM:根据文档,2023年的国民生产总值是593034亿元。问题2:如何让LLM回答出全面的粗粒度(跨段落)知识?用户:根据文档内容,征信中心有几点声明?LLM:根据文档内容,有三点声明,分别是:一、……;二……;三……。要实现语义级别的分割,而不是简单基于html或者pdf的换行符分割。笔者发现目前的痛点是文档分割不够准确,导致模型有可能只回答了两点,而实际上是因为向量相似度召回的结果是残缺的。有人可能会问,那完全可以把切割粒度大一点,比如每10个段落一分。但这样显然不是最优的,因为召回片段太大,噪声也就越多。LLM本来就有幻觉问题,回答得不会很精准(笔者实测也发现如此)。所以说,我们的文档切片最好是按照语义切割。•需求分析:一是简要,不要有其他废话。二是准确,而不是随意编造。•举例及标答如下:•需求分析:解决方案思想(原则)基于LLM的文档对话架构分为两部分,先检索,后推理。重心在检索(推荐系统),推理交给LLM整合即可。而检索部分要满足三点①尽可能提高召回率,②尽可能减少无关信息;③速度快。将所有的文本组织成二级索引,第一级索引是[关键信息],第二级是[原始文本],二者一一映射。检索部分只对关键信息做embedding,参与相似度计算,把召回结果映射的原始文本交给LLM。如何构建关键信息?首先从架构图可以看到,句子、段落、文章都要关键信息,如果为了效率考虑,可以不用对句子构建关键信息。•主要架构图如下:1.文章的切分及关键信息抽取•关键信息:为各语义段的关键信息集合,或者是各个子标题语义扩充之后的集合(pdf多级标题识别及提取见下一篇文章)•语义切分方法1:利用NLP的篇章分析(discourseparsing)工具,提取出段落之间的主要关系,譬如上述极端情况2展示的段落之间就有从属关系。把所有包含主从关系的段落合并成一段。这样对文章切分完之后保证每一段在说同一件事情.•语义切分方法2:除了discourseparsing的工具外,还可以写一个简单算法利用BERT等模型来实现语义分割。BERT等模型在预训练的时候采用了NSP(nextsentenceprediction)的训练任务,因此BERT完全可以判断两个句子(段落)是否具有语义衔接关系。这里我们可以设置相似度阈值t,从前往后依次判断相邻两个段落的相似度分数是...
发表评论取消回复