内容参考于:图灵AI大模型全栈
内容缺失的优化
内容缺失这个东西没办法解决
优化手段:
1.只能在前期的文档收集过程尽可能的做好,并且文档的数据一定是要好的,如果文档的内容都是一些垃圾内容,那么输出的结果也会是垃圾结果
2.设计提示词,通过提示词限制大模型在没找到文档的时候回答 无法回答该问题 这样的内容,鼓励大模型承认自己不行,然后并把当前问题记录下来,后续人工介入补充文档
文档加载准确性的优化
1.优化文档读取器:在读取数据时把干扰的无用的内容,比如特殊符号全部删除,并且保留文本之间的关联关系,文档有HTML、PDF、MarkDown、TXT等,为这不同格式的文档都针对性的专门写一个读取的处理方式
文档切分(或者说文档分割)的力度
分割方式有:固定长度分割、内容重叠分割、基于结构的分割、递归分割
固定长度分割:直接设定每个分块的大小,每个分块最多有多少字
内容重叠分割:在固定长度分割的基础上,为了确保分块之间上下文的连贯性,让后面的分块(除了第一个分块)都保留前面分块后面的x个字
基于结构的分割:比如HTML、Markdown中的代码(结构)
递归分割:在重叠分割的基础上,添加优先标点符号分割,除了标点符号也可以是其它的字符(需要根据文本来特殊制定)
分块大小的选择:
1.可以取决于向量模型的大小,这需要先知道向量模型支持的最大长度是多少,比如Openai的text-embedding-ada-002的模型官方推荐在256 或 512大小的分块最好,这里的大小,比如512大小可以理解为描述一个东西用512个词,如果我们的分块大小超过了512就会描述的不好,比如分块大小1024,向量模型推荐大小是512,我们用512个词去描述1024个词,这肯定会有缺失,所以说向量模型推荐长度越大描述的就会越准确,文档分块越大描述的越准确
2.如果处理准确性比较严格的文档,分块的大小就需要很大,比如医学、法律方面的,所以分块的大小也要考虑处理的文档是什么类型的、服务的是什么行业
3.如果是处理比较长的文档可以使用父子文档的结构,比如先把文档按照2048来拆分,拆分完后再对2048拆分成512,当我们检索文档的时候使用512的分块检索,给大模型提问的时候通过512找到它的父文档也就是2048的文档,把2048的文档给大模型回答问题
错过排名靠前的文档
优化手段:
1.增加召回数量:比如原本检索完只要3个文档,给它增加到10个
2.重排:上面召回的多了Token就会消耗的多,所以再对它们10个做一个重新排序,重新排完后把前3个拿出来
3.再用另外一个向量模型,就是说之前检索出了10个文档,但是这10个文档存在错过排名靠前文档的问题,那就把这10个文档给向量模型,然后在通过这个向量模型做问题和文档的相似度
4.响应合成器:在llamaindex中响应合成器也是为了解决这个问题
提取上下文与答案无关
这是内容缺失和错过排名靠前的文档具体的表现
格式错误
优化手段:
1.需要优化提示词,让提示词更加正确的描述返回格式
2.添加格式校验,校验不通过就重新让大模型生成答案
答案不完整
这种情况出现在一次性问了多个问题,比如 今天的天气怎么样,再帮我查询今天薛之谦的演唱会有哪些,这样的一次性两个问题,大模型就会丢弃一个问题
优化手段:
问题重写:把问题改造一下,比如让大模型把问题拆出来,然后一个一个的去问,问完之后把答案拼接起来
未提取到答案
上下文太长,问题是一个很小的点,大模型就会抓不到重点
优化手段:
1.压缩检索到的内容,让大模型根据问题提取文档中的重点
2.
答案太具体或不具体
模型讨好型人格的问题,比如问2+2等于几,就直接说等于4就完了,有些讨好型的模型它会给你分析原因,为什么2+2等于4这就是太具体,比如问2+2等于几,就直接说等于4就完了,有些含糊型的模型它会绕来绕去,说“结果是一个比3大、比5小的偶数”,就是不肯把那个数点出来,这就是不具体。