赞
踩
原文:LLM+Embedding构建问答系统的局限性及优化方案 - 知乎
近期 LangChain + LLM 方案高速发展,降低了知识问答等下游应用的开发门槛。但随着业务深入,一些局限性也日渐显露,比如:LLM意图识别准确性较低,交互链路长导致时间开销大;Embedding 不适合多词条聚合匹配等。本文结合实际案例,分析上述问题存在的根源,并提出基于传统 NLP 技术的解决思路。
笔者在基于大语言模型构建知识问答系统一文中描述了,以 LLM 为基础的知识问答系统构建方法,核心在于:
原文通过 OpenAI API 和ChatGPT 交互,缺陷也很明显:
LangChain 的诞生就是解决这些问题的,它抽象了业务应用和LLM 交互的方式,内置通用环节实现,标准化工具链交互接口,极大提升开发效率。LangChain 的大致结构如下所示:
LangChain 应用示意图
基于LangChain + LLM 的组合,下游应用在:“场景拓展” 和 “效能提升”方面取得长足进步,但垂直领域一些深层问题也逐渐暴露出来。本文就开发问答系统时遇到的实际案例,说明上述方式的局限性,并提出解决方案。
首当其冲的是:多知识点聚合处理场景下,Embedding-Search 召回精度较低 的问题。典型应用范式是:
这种场景在游戏攻略问答中很常见,以体育游戏 NBA2K Online2 为例:
# 多知识点——简单查询
Q: 皮蓬、英格利什和布兰德的身高、体重各是多少?
# 多知识点——筛选过滤
Q: 皮蓬、英格利什和布兰德谁的第一位置是 PF?
# 多知识点——求最值
Q: 皮蓬、英格利什和布兰德谁的金徽章数最多?
原始的 Embedding Search在面对多知识点聚合处理时,存在几个问题:
1. 本地知识建立索引时,通常对单个知识点进行 Embedding;不会也不可能,为不同知识点的排列组合分别制作索引。不难想象,不同记录和属性的组合方式有 C⋅ANx⋅AMy (C问题数,如过滤,查询,最值;A 即排列),所有组合都建立索引的开销是巨大的。
2. 原始问题直接 Embedding ,和单条知识点的向量相似度比较低。为了避免召回结果有遗漏,就需要 **降低** 相似度评分下限(vector similarity score threshold),同时提高召回结果数量上限(top k)。并产生不好的副效应:
下面给出一个示例:
再看看 LLM( ChatGLM-6B )对召回结果整合后的反馈,耗时 16s 用于处理大量输入,结果让人啼笑皆非:
皮蓬、莺利什和布兰德的推荐位置是前锋/后卫。
几处很明显的错误:英格利什莫名其妙变为莺利什;且三人的位置回答不准确,由于过多冗余信息导致混淆。也许和 LLM 自身的性能有关,但也能说明 Embedding Search 低效且不可靠。
针对上面的问题重新整理思路,想要更加精准的回答问题,需要从两个层面入手:
这是问答系统的基础:通过解析用户问题,精准把握意图后,才能更好的规划后续处理步骤:
langchain 中的 Agents 已经对上述步骤提供了标准化接口,它相对于 Chains 一个重要不同在于:结合应用场景,通过提示词引导 LLM和用户多轮交互,摸清在什么时候应该需要选择什么样的工具链进行处理。其中 Plan-and-Execute Agents 用于制定动作计划;Action Agents 决定实施何种动作。
有了 Agents 和 Chains的标准抽象,下面再来看看摸清用户意图的几种方法,这样才能开发合适的工具:
HyDE 要求与用户问题相关的知识,已经存在于 LLM 基础模型中。但专业领域知识,可能本来就是未联网、未公开的;LLM 生成的虚构文档,可能包含很多噪音,所以效果不一定很明显;另外生成文档的额外交互,进一步增加了时间开销。目前,LangChain 提供了 HyDE Chain,LlamaIndex 也提供了类似的能力;大家有兴趣可以尝试,面对中文可能需要自定义 Prompt Template。
- "球员打法" : {
- "球员名称" : ____,
- "年代" : ____,
- "比赛模式": ____,
- }
2. 搜索召回——提升精度
将用户的诉求转化为语义槽后,可以较为准确的体现问答意图,这有助于提升搜索命中精度。原始知识点在建立索引时,除了原始的 Embedding 方法,可以做更多优化:
意图识别和召回优化,属于一体两面,均有助于提升问答系统的精度。搜索层面知识图谱相对于 Embedding 方式,加工成本较高。在遵从奥卡姆剃刀的前提下,有没有什么高性价比的方式来解决这个问题?
笔者想到,意图识别和召回,其实有一个共同点:均可用 **关键词/主题词** 表示。那么问题可以转变为:
基于关键词Embedding的入库和搜索的流程图如下所示:
这种方式怎么解决原始 Embedding 存在的几个局限呢?
语句:姚明和奥尼尔的内线与三分能力。
关键词提取后,按照从属关系叉乘,得到的结果应该是:
- 姚明内线
- 姚明三分
- 奥尼尔内线
- 奥尼尔三分
带着这样的思路,下文主要描述关键词提取实现方法和效果。
我们的目标是,从无标注文本(零样本)是实现信息抽取(Information Extraction,IE),因为很少涉及人为干预,该问题非常具有挑战性。IE 包含三类任务:
笔者针对知识问答这样的特定场景,将上述三类任务简化为两个过程:
1. 名词短语提取。即:主语、宾语。通常由名词,和名词的限定词或者修饰词组成。比如:
姚主席如何评价周琦的组织进攻能力?
主语:姚主席
宾语:能力。但真正具有实际意义的是能力的限定修饰词,即“周琦组织进攻能力”。
2. 谓语。体现名词短语之间的事件。比如:评价。在更多场景中是:比较、查询、过滤、统计等,存在动态计算、处理的需求。因此即使忽略谓语,仅通过名词短语的组合也可以获得完备的知识。谓语所代表的事件,可以交给 LLM 处理。
笔者在经过对多种业务场景的分析后,最终萌生出下面的 关键词提取方式:
将该思路应用到上面的例子中:
如图所示,使用 NLU 的基本处理流程,分析原始问句:
1. 分词
2. 词性标注(Part-Of-Speech Tagging, Penn Chinese Treebank),用于识别名词短语。比如:NR 表示人名、机构、地名等专有名词;NT 表示时间名词,NOI表示汉字顺序颠倒产生的噪声,NN 表示其它类型名词。
3. NER 识别。比如姚,周琦等。
4. 然后还需要考虑语义间的依存关系,确定名词间的关系,比如:
这样不难得到应该搜索的关键词列表:['姚主席', '周琦', '组织进攻能力']。下面来看看这种思路究竟如何实现,还是分为两大类:LLM、传统 NLP。
LLM已经天然具备 NLU 和 NLG 的能力,所以做名词短语提取按道理应该手到擒来。业界已经有尝试,比如《Zero-Shot Information Extraction via Chatting with ChatGPT》一文,提出两阶段多轮问答信息提取方式:
在该思想的启发下,笔者使用 langchain 开发了信息提取 Chain,LLM 使用的是 ChatGLM-6B本地部署,提取部分测试片段如下所示:
发现问题了吗:明明是分析张三丰;结果李四和王五怎么冒出来了。要知道,Prompt 已经添加了“不要编造内容”的说明,但无济于事。总体而言,使用 LLM 提取信息效果如下:
简单而言:不是不能做,但对 LLM 的要求较高;结果不准确、开销也大。
在 LLM 做信息提取,效果不尽如人意的情况下,转而尝试传统 NLP 技术。前面提到的:分词、词性标注、NER 等,业界已经有不少传统 NLP 工具可以使用。
“请比较詹姆斯和麦迪的属性”
—— 无法识别任何人名
“詹姆斯、字母哥和杰林.布朗的金徽章有何差异?”
—— 只能识别出布朗,且将 "杰林" 抛弃
经过测试后最终选择 HanLP作为基础工具,原因在于:
下面基于 HanLP,看看究竟如何解决前文提出的:多知识点聚合查询问题?其核心点在于三步:
举一个更加复杂的例子,在主语和宾语中添加:并列和修饰关系。首先分词,然后添加词性标注,结果如下:
词性有了,下面需要进一步提取句子中单词与单词之间的语法关系,即 依存句法分析;笔者采取 Stanford Dependencies Chinese (SDC) 标准进行分析,并且为了清晰展示,将分析结果转化为 Pandas DataFrame 的形式,如下图所示:
根据 DataFrame 中提供的依赖关系,可以直观地获取名词短语:
所以实际的客体,应该将并列的领事关系和本体叉乘后平铺,结果就是:
['詹姆斯三分能力', '约基奇三分能力', '张伯伦三分能力']
用这三个关键词,Embedding 后去本地知识库搜索就可大大提升命中精度。不过大家如果细心的话可以发现:语义依存分析的结果其实 不准确,比如:
这种语义偏差的原因在于:同一个分词的语义容易产生混淆。比如“指导”既可以作为名词,也可以作为动词。中文多义词和语境比较复杂,导致语义依存分析有不小的概率会出现误判。那么怎么解决这个问题呢?一定要使用有监督训练方式,对基础语义依存分析模型进行 Fine-Tuning吗?一旦涉及有监督,成本就不容小区了。不过幸好:词性标注和依存句法分析,相对语义依存分析,准确率是更高的,所以笔者想到另外一种方式:
基于正确的词性标注,构建出语法树,从 语法角度提取名词短语。
分析一个句子在语法上的递归构成,在 NLU 领域是经典的 成分句法分析 问题。下面罗列 Chinese Treebank 标准片段,描述对分词单元类型的定义,请大家关注蓝色背景内容。
再次回顾我们要解决的多知识点聚合处理的目标:
基于该思路,上文提到实例,可以转化为下面的成分句法分析树:
这是典型的树结构:
这样来看,NP 的提取非常简单,通过递归方式对三种基础形式的树结构进行识别即可,提取时注意区分:
在上述算法下,样例中提取的名词短语列表最终如下所示:
至此,已经介绍完笔者关于关键词提取的基本思路,完整的处理流程如下图所示:
关键词提取实现后,配合前文提到的召回方法,应用到文章开始的几个示例问题,结果如下所示:
最后汇总笔者提出的解决多知识点聚合处理问题的方案:
该方法的优势在于:
LLM 的出现,推动下游应用激烈变革,各种探索如火如荼地展开。但在热潮背后,我们还有一些细节问题需要仔细对待。LLM 的未来是伟大的,甚至可能是迈向 AGI 的重要里程碑;但现在并不能宣判传统 NLP 技术的死亡。
本文提供了传统 NLP 和 LLM 结合的一种可能,通过用户问题和本地知识库关键词提取,能较好的解决 Embedding 精度缺失,以及 HyDE、LLM NLU的精度和性能问题。实现单轮对话,对多知识点的聚合处理。后续将继续探索 LLM 和传统技术的角色分工,进一步提升综合收益。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。