赞
踩
LangChain + LLM 方案的局限性:LLM意图识别准确性较低,交互链路长导致时间开销大;Embedding 不适合多词条聚合匹配等。
在探索如何利用大型语言模型(LLM)构建知识问答系统的过程中,我们确定了两个核心步骤:
然而,这种方法在实际应用中遇到了一些挑战:
多知识点聚合处理场景下,Embedding-Search 召回精度较低的问题。典型应用范式是:
这种场景在游戏攻略问答中很常见,以体育游戏 NBA2K Online2 为例:
# 多知识点——简单查询
Q: 皮蓬、英格利什和布兰德的身高、体重各是多少?
# 多知识点——筛选过滤
Q: 皮蓬、英格利什和布兰德谁的第一位置是 PF?
# 多知识点——求最值
Q: 皮蓬、英格利什和布兰德谁的金徽章数最多?
原始的 Embedding Search在面对多知识点聚合处理时,存在几个问题:
想要更加精准的回答问题,需要从两个层面入手:
为了准确理解用户的意图,问答系统需要能够:
在LangChain框架中,Agents 可以帮助系统规划并执行这些步骤。例如,Plan-and-Execute Agents可以用来制定动作计划,而Action Agents则负责执行这些动作。
HyDE 要求与用户问题相关的知识,已经存在于 LLM 基础模型中。但专业领域知识,可能本来就是未联网、未公开的;LLM 生成的虚构文档,可能包含很多噪音,所以效果不一定很明显;另外生成文档的额外交互,进一步增加了时间开销。目前,LangChain 提供了 HyDE Chain,LlamaIndex 也提供了类似的能力;面对中文可能需要自定义 Prompt Template。
- "球员打法" : {
- "球员名称" : ____,
- "年代" : ____,
- "比赛模式": ____,
- }
在问答系统中,将用户的诉求转化为语义槽可以显著提升搜索的精度,因为这样可以更准确地捕捉用户的问答意图。在建立知识点的索引时,除了使用原始的Embedding方法,还可以采取以下优化措施:
意图识别和召回优化是提升问答系统精度的两个关键方面。知识图谱虽然相对于Embedding方式在搜索层面具有更高的加工成本,但在遵循奥卡姆剃刀原则(即“如无必要,勿增实体”)的前提下,我们可以探索一些性价比更高的解决方案。
意图识别和召回均可用 关键词/主题词 表示。那么问题可以转变为:
基于关键词Embedding的入库和搜索的流程图如下所示:
这种方式怎么解决原始 Embedding 存在的几个局限呢?
基于这样的思路,下文将主要描述关键词提取的实现方法和效果,以及如何通过这种方式提升问答系统的整体性能。
关键词提取是信息抽取(IE)的一个重要组成部分,特别是在知识问答场景中。IE通常涉及三类任务:
为了简化这些任务,我们可以将它们归纳为两个主要过程:名词短语提取和谓语分析。
在关键词提取方面,我们可以专注于名词短语,将它们作为知识点的索引用于召回。事件则体现了不同知识点的关系,重点在于事件关联者。获取事件关联者对应的语料后,可以通过LLM理解事件进行处理。知识点通常不是按照事件组织的,而是按实体组织的,因此索引建立和关键词抽取应该以名词短语为主要目标。
在处理主语和宾语之间的并列和限定关系时,我们可以将限定关系按级联方式处理,同一名词短语内如果存在并列关系则与其他部分叉乘。例如,在处理“姚主席如何评价周琦的组织进攻能力?”这个问题时,我们可以通过分词、词性标注、NER识别和名词间关系分析,得到应该搜索的关键词列表:[姚主席, 周琦, 组织进攻能力]。
如图所示,使用 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 提取信息效果如下:
在处理自然语言处理(NLP)任务时,特别是当大型语言模型(LLM)效果不佳时,可以回归使用传统的NLP技术。这些技术包括但不限于分词、词性标注、命名实体识别(NER)等。业界已经开发了许多传统NLP工具,如spaCy、CoreNLP和HanLP等,以应对不同的语言处理需求。
spaCy是一个流行的NLP库,但在某些中文语境下,它的表现可能不尽人意。例如,在处理“请比较詹姆斯和麦迪的属性”这样的句子时,spaCy可能无法识别出任何人名。同样,对于“詹姆斯、字母哥和杰林.布朗的金徽章有何差异?”这样的句子,spaCy可能只能识别出“布朗”,而将“杰林”遗漏。
在进行了一系列的测试比较后,HanLP工具因其对中文的良好支持、较少的依赖性、开箱即用的便利性、完备的基础工具和整洁的接口,而被选为最终的基础NLP工具。HanLP在处理上述提到的句子时,能够正确地进行词性标注和命名实体识别。
为了解决多知识点聚合查询的问题,HanLP的核心处理步骤可以分为三步:
通过上述步骤,可以有效地处理复杂的中文语言结构,提高文本处理的准确性和效率。
名词短语提取与整合是信息抽取中的关键步骤,特别是在处理复杂句子时。以下是一个复杂例子的分析过程。
首先对句子进行分词,然后为每个分词添加词性标注。例如,在处理“张指导、姚主席如何评价詹姆斯、约基奇、张伯伦的三分及抢断能力?”这个问题时,我们首先进行分词和词性标注。
获取到词性后,接下来是提取句子中单词与单词之间的语法关系,即 依存句法分析;例如,使用 Stanford Dependencies Chinese (SDC) 标准进行分析,并将结果转化为Pandas DataFrame的形式,以便于查看和分析。
在自然语言处理中,依赖关系分析是理解句子结构的关键部分。`dep_tok_id` 和 `dep_rel` 是依存句法分析中使用的两个重要概念:
通过分析 DataFrame 中提供的依赖关系,我们可以直观地获取名词短语。例如:
因此,实际的客体应该是将并列的领事关系和本体叉乘后平铺的结果,即:
使用这三个关键词进行 Embedding 并在本地知识库中搜索,可以显著提高搜索的准确性。然而,语义依存分析可能存在不准确的情况,例如:
这种语义偏差的原因在于,同一个词可能有多种语义,容易产生混淆。例如,“指导”可以是名词也可以是动词。中文的多义词和复杂语境可能导致语义依存分析出现误判。
解决这个问题的传统方法是使用有监督的训练方式对基础语义依存分析模型进行微调(Fine-Tuning)。然而,这种方法成本较高。幸运的是,词性标注和依存句法分析的准确率通常高于语义依存分析。因此,可以考虑以下方法:
这种方法可以减少对复杂语义分析的依赖,同时提高名词短语提取的准确性。通过这种方式,可以在不进行有监督训练的情况下,有效地解决名词短语提取的问题。
为了解决语义依存分析中可能出现的误差,可以基于正确的词性标注构建语法树,从语法角度提取名词短语。成分句法分析可以帮助我们理解句子在语法上的递归构成。
分析句子在语法上的递归构成,在 NLU 领域是经典的 成分句法分析 问题。下面罗列 Chinese Treebank 标准片段,描述对分词单元类型的定义,请大家关注蓝色背景内容。
再次回顾我们要解决的多知识点聚合处理的目标:
基于该思路,上文提到实例,可以转化为下面的成分句法分析树:
这是典型的树结构:
这样来看,NP 的提取非常简单,通过递归方式对三种基础形式的树结构进行识别即可,提取时注意区分:
在上述算法下,样例中提取的名词短语列表最终如下所示:
完整的处理流程如下图所示:
通过以上步骤,我们可以有效地提取和整合名词短语,从而提高知识问答系统的精度和效率。完整的处理流程包括分词、词性标注、依存分析、成分句法分析和名词短语提取。
关键词提取实现后,配合前文提到的召回方法,应用到文章开始的几个示例问题,结果如下所示:
解决多知识点聚合处理问题的方案:
这种方法的优势主要体现在以下几个方面:
LLM(大型语言模型)的兴起对下游应用产生了深远的影响,激发了大量的探索和研究。然而,在这股热潮中,我们仍需关注一些关键细节。尽管LLM的未来充满希望,甚至可能是通往通用人工智能(AGI)的关键步骤,但我们还不能完全放弃传统的自然语言处理(NLP)技术。
本文提出了一种将传统NLP技术与LLM结合的方法。通过分析用户问题和利用本地知识库进行关键词提取,这种方法可以有效解决Embedding精度不足的问题,以及HyDE和LLM自然语言理解(NLU)中的精度和性能问题。这种方法能够实现单轮对话中对多个知识点的聚合处理。
未来,我们将继续探索LLM与传统技术在角色上的分工,以进一步提升整体收益。通过这种方式,我们可以充分利用LLM的潜力和传统NLP技术的稳定性,为自然语言处理领域带来更全面和高效的解决方案。
【text2sql】基于ChatGPT打造'中文自动转SQL'产品(第一部分)
在对话系统中,引导能力、槽位补充能力、槽位修复能力、指代消除和解析能力以及改写能力是确保流畅用户体验的关键功能。
以下是对这些功能的详细描述和示例对话:
1. 引导能力:系统引导用户提供完整查询信息的能力。
- 用户:我想查一下电量。
- Bot: 好的,请问您想查的时间范围、空间范围,和分项是?
2. 槽位补充能力:在用户未提供完整信息时,系统补充询问缺失的槽位。
- 用户:查上个月的整个园区的吧。
- Bot: 好的,那请问是要查照明、空调、动力的还是其他类型的耗电量?
3. 槽位修复能力:当用户提供的信息不完整或不明确时,系统要求用户提供更多信息。
- 用户:就查询各个分项的,和总体的都查询。
- Bot: 好的,那我复述一下,您希望查询"照明、空调、动力的还是其他类型的耗电量,以及总体耗电量,时间范围是上个月,空间范围是整体园区",请问是吗?
4. 指代消除和解析能力:系统需要能够理解和澄清用户使用的不明确指代词,如“它”、“这”等。
- Bot: 查询目标设置为查询温度,请问查询哪个空间的温度?
5. 改写能力:系统需要能够将用户的自然语言输入改写为数据库可以理解和处理的形式。
- Bot: 改写模块其实非常关键,数据库的存储有特定的形式,但是用户不会按照你的底层数据结构去写,例如,用户不见得会输入“和平精英”,而是“吃鸡”,数据库里可不见得会存“吃鸡”,对吧?
通过这些功能,对话系统能够更准确地理解用户的意图,提供更精确的响应,并有效地引导对话到预期的结果。
小虫飞飞:基于大语言模型构建知识问答系统,类似将ChatGPT变成NPC进行对话,用来回收+修复槽位。改写模块包括【R&S[21] | 搜索中涉及的算法问题】:
多轮的根本难题在于,如何把关键信息保留并在合适的时间取出并使用。目前的大家可能用的比较多的是直接拼接历史对话,这点并非不好,凭借大模型的能力确实能做到很高程度的多轮对话,但实际上,我们还是可以用很多思路(提升大模型系统体验的一些思路):
过长提问的总结,比较长的提问可以通过LLM进行归纳与总结
在对话系统中,拒绝回复是一个重要的功能,它需要在多种场景下被合理应用。
以下是一些常见的拒绝回复策略:
1. **固定回复**:提供一个预设的回复,用于不支持的问题。
- "哎呀,这方面的问题我还不太懂,需要学习下。"
2. **大模型生成回复**:利用大型语言模型生成个性化的安抚性回复。
- "对不起,你问的[]问题,我好像还不太懂。你可以试试问问别的。"
3. **推荐问题或追问策略**:提供一系列可能相关的问题,或者请求用户提供更多信息。
- "你是否在找以下几个问题XX?"
- "你描述的我好像不太懂,能再补充补充吗?"
不见得非得用大模型:前沿重器[12] | 美团搜索引导技术启示。
通过这些策略,对话系统可以在遇到不适当或无法回答的问题时,以一种更人性化的方式拒绝回答,同时尽量减少用户的挫败感。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。