如何让LLM回答出全面的粗粒度(跨段落)知识?
目前的痛点是文档分割不够准确,导致模型有可能只回答了部分内容,而实际上是因为向量相似度召回的结果是残缺的。那如果把切割的粒度放大呢?比如每10个段落一分。但这样显然不是最优的,因为召回片段太大,导致噪声就越多。LLM本来就有幻觉,回答得不会很准确。
解决方案:
- 基于LLM的文档对话架构分为两个部分:先检索,后推理。重心放在检索,推理交给LLM整合即可。
- 而检索部分需要满足三点:尽可能提高召回率、尽可能减少无关信息、速度快。
- 将所有文本组织成二级检索,第一级检索是【关键信息】,第二集是【原始文本】,二者一一映射。
- 检索部分只对关键信息做Embedding,参与相似度计算,把召回结果映射到原始文本交给LLM。
如何构建关键信息?
首先句子、段落、文章都要关键信息,如果为了效率考虑,可以不用对句子构建关键信息。
1、文章的切分及关键信息抽取
- 关键信息:为各语义段的关键信息集合,或者是各个子标题语义扩充之后的集合
- 语义切分方法1:利用NLP的篇章分析工具(discourse parsing),提取出段落之间的主要关系。
- 语义切分方法2:除了上述的工具外,还可以写一个简单的利用BERT等模型来实现语义分割。BERT等模型才预训练的时候采用了NSP的训练任务,因此BERT完全可以判断两个句子是否具有语义衔接关系。这里我们可以设置相似度阈值t,从前往后依次判断相邻两个段落的相似度分数是否大于t,如果大于则合并,否则断开。
2、语义段的切分及段落(句子)关键信息抽取
如果向量检索效率很高,获取语义段之后完全可以按照真实段落句号切分,以缓解细粒度知识点检索时大语块噪声多的场景。
- 方法1:利用NLP中的成分句法分析工具(constitutency parsing)和命名实体识别(NER)工具提取
- 方法2:可以用语义角色标注来分析句子的谓词论元结构,提取“谁对谁做了什么”的信息作为关键信息。
- 方法3:直接法。其实NLP的研究中本来就有关键词提取工作(Keyphrase Extraction)也有一个成熟的工具,一个是HanLP,中文效果好,但付费;另一个是开源工具KeyBERT,英文效果好,但是中文效果差。
- 方法4:垂直领域建议的方法。以上两个方法在垂直领域都有准确度低的缺陷,垂直梁宇可以仿照ChatLaw的方法,即:存连一个生成关键词的模型。
句子、语义段之间召回不会有包含关系吗?是否会造成冗余?
答:会造成冗余,但是在试验后发现,无论是细粒度知识还是粗粒度知识准确度都比LangChain粗粉效果好。
基于在垂直领域表现不佳
解决方案:
模型微调,一个是对Embedding模型的垂直领域的数据进行微调;一个是对LLM模型的基于垂直领域的数据进行微调;
LangChain内置问答分句效果不佳
对文档进行加工
- 一种是使用更好的文档拆分方式;
- 一种是改进填充的方式,判断中心句上下文的句子是否和中心句相关,仅添加相关度高的句子;
- 一种是文本分段后,对每段分别进行总结,基于总结内容语义进行匹配;
如何尽可能召回与query相关的Document问题
- 将本地知识切分成Document的时候,需要考虑Document的长度、Document Embedding质量和被召回Document数量这三者之间的相互影响。在文本切分算法还没有那么智能的情况下,本地知识的内容最好是已经结构化比较好了,各个短多之间语义关联没那么强。Document较短的情况下,得到的Document Embedding的质量可能会高一些,通过Faiss得到的Document 与Query相关度会高一些。
- 使用Faiss做搜索,前提条件是有高质量的文本向量化工具。因此最好是基于本地知识对文本向量化工具进行Finetune。另外也可以考虑将ES搜素结果与Faiss结果相结合。
如何让LLM基于Query 和 Context得到高质量的response
- 尝试多个Prompt模板,选择一个合适的;
- 用于本地知识问答相关的语料,对LLM进行Finetune;
Embedding模型在表示text chunks时偏差太大问题
问题:一些开源的Embedding模型本身效果一般,尤其是当text chunk很大的时候,强行变成一个简单的vector是男准确表示的,开源的模型效果上确实不如OpenAI Embedding;多语言问题,paper是英文,用户使用的Query是中文,这里有个语言之间的对齐问题,尤其是可以用中文Query Embedding来从英文text chunking embedding中找到更加相似的top-k?
解决方法:
用更小的text chunk配合更大的topk来提升表现,毕竟smaller text chunk用Embedding表示起来noise更小,更大的topk可以组合更丰富的Context 来生成质量更高的回答;
多语言的问题,可以找到一个更加适合多语言的Embedding模型