|
法学硕士九层妖塔:
NLP菜鸟的逆袭:
NLP涵盖一切:
这篇文章的思路是【吴一吉:如果你想用它来做文档问答...】以后知识库问答会用到很多大模型,也可以用Text-to- SQL。搜索数据库回复(吴一吉:大模型与数据科学:从Text-to-SQL开始(一))。知识库检索和数据库检索将是未来大型模型应用的标准,因此在相应的实践过程中会遇到不同的问题。
作者随手画了一张草图。在这个过程中,有几个环节可以应用到大模型上:
那么这三个环节中的前两个应该问题比较多。
最后一步,通过召回的文本,可以使用大模型来验证结果。
1 查询意图识别+意图补充+意图修复链接
之前的文档问答【吴一吉:如果你想用它来做文档问答……】就非常粗暴了。查询是直接通过一些句子向量来查询的。在实际应用中,如果精度要求高的话,基本上是行不通的。
因此,这个环节需要同样的意图识别。
1.1 意图识别方法一:多关键词/主题词提取与检索
本文【小虫飞飞:LLM+构建问答系统的局限性及优化方案】的解决方案是
【关键词/主题词提取+基于多个关键词向量的搜索】
关键词/主题词提取:传统的成分句法分析模型,具体方案如下:
总体规划如下:
-----------续订----------
北大团队发布大型法律模型时,使用了以下内容:
(参考:北大团队发布大型法律模型,为公众提供普惠法律服务,会带来什么影响?):
<p><pre style="overflow-wrap: initial;background: rgb(248, 248, 250);border-radius: 4px;font-size: 0.9em;overflow: auto;padding: calc(0.888889em);word-break: initial;"> <code style="background-color: inherit;border-radius: 0px;font-family: Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace;font-size: inherit;">ChatLaw=ChatLaw LLM + keyword LLM + laws LLM </code></pre></p>
LLM是一个微调模型,单独完成关键词提取的任务;
当然,按照文章作者的说法,这里的LLM其实并不是一个大模型。是模仿CLIP比较学习的BERT模型,使用了94W个国家裁判文书。
1.2 意图识别方法二:集中式大模型进行语义识别
【小虫飞飞:用LLM+构建问答系统的局限性及优化方案】和【小虫飞飞:基于大语言模型构建知识问答系统】
通过深度学习、统计学习、甚至LLM,理解用户问题并提取语义槽中需要的内容。
《构建基于大语言模型的知识问答系统》一文中给出了一个例子:通过Role告知LLM需要提取槽位信息,让LLM通过多轮对话引导用户给出所有槽位信息。
仍以游戏指南为例,如果玩家咨询玩家的游戏风格,则必须提供:玩家姓名、年份(如2020/2022)、游戏模式。相应的语义槽可以定义为:
<p><pre style="overflow-wrap: initial;background: rgb(248, 248, 250);border-radius: 4px;font-size: 0.9em;overflow: auto;padding: calc(0.888889em);word-break: initial;"> <code style="background-color: inherit;border-radius: 0px;font-family: Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace;font-size: inherit;">"球员打法" : {<br /> "球员名称" : ____,<br /> "年代" : ____,<br /> "比赛模式": ____,<br /> }</code></pre></p>
1.3 补充、修复、重写的意图
转帖自[[]基于构建‘中文自动转SQL’产品(第1部分)》,从端来说,query还有一些功能点需要做:
来自【小虫飞飞:构建基于大语言模型的知识问答系统】,类似于变成NPC进行对话,用于回收+修复槽位。
重写模块包括(来自[R&S[21] | 搜索中涉及的算法问题]):
1.4 多轮对话意图继承能力
多轮的根本问题是如何保留关键信息并在合适的时候拿出来使用。目前大家可能会使用更直接的历史对话拼接。这还不错。有了大模型的能力,确实可以实现高水平的多轮对话,但实际上,我们还是可以利用很多思路(来自:提高大模型系统体验的一些思路):
1.5 过长问题总结 1.6 拒绝回复
来自【改善大型模型系统体验的一些想法】
其实拒绝回复在很多场景都会应用。例如,当用户提出的问题不在我们目前期望支持的范围内(询问天气的客服场景),或者当用户提出基于观点的问题(如何看待俄罗斯-乌克兰问题)时,色情内容等等。当出现问题时(这个我不需要举例),当大模型是安全的(查询中存在诱发错误)时,或者当知识库为空时,我们需要拒绝并给用户一些回复,这样用户就不会那么难受了。常见的策略一般包括以下几种:
其实也可以看出,没有必要使用大模型。有时似乎可以写下来或者提出一些建议和提问(前沿重工具[12] | 美团搜索引导技术启示)。
2 Text-to-SQL会话 2.1 通过高质量大模型解决Text-to-SQL的准确性问题
具体任务如下:
有一个BI分析任务,需要关联6个表进行数据分析。当前数据库中有1000+张表。
LLM目前处理这个任务有两大难点:
Text-to-SQL的解决方案:【大模型帮助小模型】
大和小实际上是指大模型帮助小模型,更具体地说。就是通过/GPT-4、统一钱文、文心一言等更大的模型来辅助百亿级模型的私有化部署来完成任务。在我们写SQL的案例中,一个关联6张表的小查询模型是非常难以理解的,所以我们会让大模型先根据Query+的内容完成语义提取。了解复杂的问题,格式化并输出固定的ToT模板内容,并将复杂的任务分解为几个独立的简单步骤。
之后,我们将每个小步骤的任务交给小模型来处理。当然,在这个环节中,为了达到更加稳定的效果,我们还是需要完成一些与大模型的交互。例如,在DB-GPT中,我们发现-13b在格式化输出Json时准确性和稳定性较差,准确率低于70%。这就需要我们编写大量的代码来处理格式。以下面的格式为例,但是当我们调用GPT-4进行格式化时,准确率和稳定性能都达到了95%以上。
<p><pre class="code-snippet__js" data-lang="makefile"> <code><span class="code-snippet_outer">RESPONSE_FORMAT = {</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__string">"thoughts"</span>: {</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__string">"reasoning"</span>: <span class="code-snippet__string">"reasoning"</span>,</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__string">"speak"</span>: <span class="code-snippet__string">"thoughts summary to say to user"</span>,</span></code><code><span class="code-snippet_outer"> },</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__string">"sql"</span>: <span class="code-snippet__string">"SQL Query to run"</span>,</span></code><code><span class="code-snippet_outer">}</span></code></pre></p>
因为是多步分割任务,所以我们会将模型执行的中间结果临时存储在中间状态。最后通过链式计算返回最终的正确结果。
我们再举一个直接通过GPT实现Text-to-SQL的例子,来自【Goose 架构师:GPT X -GPT Tips工程与低代码开发实践】
您可以从产品表格中了解一下
结构:
于是我们就有了下面的构造方法
其想法是将表结构和用户输入传递给GPT并让GPT写入。我们目前可能的产品形态如下:
当用户输入复杂的描述,甚至包含很多SQL语法要求时,GPT可以快速准确地返回它们。
2.2 拆解Text-to-SQL任务
来源:普通程序员:LLM的中文任务优化V1.0和普通程序员:LLM的中文实践
子任务分为3个子任务:
此时设置的结构体为:
<p><pre class="code-snippet__js" data-lang="ini"> <code><span class="code-snippet_outer"><span class="code-snippet__attr">Output</span> = LLM(Instruction + Context + Input Data + Data Indicator)</span></code></pre></p>
表示大模型需要执行的指令,表示上下文信息。输入数据表示需要处理的数据,数据表示输出信息的格式准则。
在:
案例可参考:【普通程序员:中文LLM实践】和【京东云:LLM在互联网中的应用|京东云技术团队]
做Link的时候,可能由于项目比较大,完成起来比较麻烦。您也可以使用 COT。您可以参考:普通程序员:中文任务上的LLM优化V1.0,包括:
在:
数据表的设计非常重要。需要清楚地描述表的主要信息以及表中的重要字段和字段含义。
2.3 SQL修复
同时,同类产品【SQL查询-SQL查询AI机器人】也有SQL修复模块。
特点包括:
3 知识库向量搜索
我不会在本文中讨论太多细节。详细信息请参见:
吴易吉:如果你想用它来做文档问答……
4 结果验证与总结
在【如何利用大语言模型构建知识问答系统】中,结果集成的主要作用是对本地搜索系统返回的结果进行二次处理,比如使用LLM:
4.1 结果总结
召回的信息可以通过大型模型来验证结果。在【无脏话:一篇文章理解:打造垂直领域大型模型应用】中,通过一条思路进行反复推理,生成最终的正确结果。
在私有化模型下,目前重复推理成本和模型稳定性的表现并不那么理想。为了节省成本并增加稳定性,我们在ToT链路中添加了/GPT-4进行正确性演示的能力。 。
以上是我们综合考虑成本、隐私、效果等因素制定的折衷方案。核心数据资产通过本地化模型传递,然后存储在私有矢量数据中。用户的复杂问题通过DB-GPT Proxy转移到集中式大模型进行语义识别和任务拆解。将已完成的小任务拆解,通过DB-GPT中私有化的大模型完成具体的任务执行。最终结果经过多轮思维链/思维树路径验证,确保结果准确。在此过程中,与用户环境交互的用户数据和模型被本地化。但在任务拆解和格式化输出方面,为了提供准确性的同时降低推理成本,我们将这部分任务分解为/GPT-4等API来完成。
4.2 毒性试验
李莉:利用LLM打造企业专属的用户助手
LLM将努力使其答案符合人类价值观。这项工作在模型训练中被称为“Align”,允许LLM拒绝回答与仇恨和暴力相关的问题。如果LLM没有按照规定回答与仇恨和暴力相关的问题,我们称之为检测毒性()。
对于我们即将创造的机器人来说,毒性的范围实际上是增加的,也就是说,凡是回答非企业业务的东西都可以称为有毒的。
需要使用Few-Shot方法构建毒性检测的提示词,以便LLM在有多个示例时判断用户的问题是否在企业服务范围内。
4.3 输出结构对齐
来自:LLM针对中文任务的优化V1.0
这样的情况有很多,无论是多大的模型,都会遇到这种情况:
<p><pre class="code-snippet__js" data-lang="python"> <code><span class="code-snippet_outer"><span class="code-snippet__string">'''SQL: SELECT item_name FROM product_item_sales_table WHERE item_sales_cnt_1_days > 500; '''</span></span></code></pre></p>
此时多了一条SQL,需要剪枝。
此时的解决办法:
4.4 数字错觉
可能会出现数字幻觉。例如输入为:点击率大于8%,最终生成的SQL语句为:8。来自:普通程序员:LLM中文任务优化V1.0
此时可以提到:
<p><pre class="code-snippet__js" data-lang="json"> <code><span class="code-snippet_outer">{</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__attr">"value"</span>: <span class="code-snippet__string">"问句中提到'5%',它代表的浮点型数值为 [0.05]"</span>, </span></code><code><span class="code-snippet_outer"> <span class="code-snippet__attr">"cot_type"</span>: <span class="code-snippet__string">"column_infer"</span></span></code><code><span class="code-snippet_outer">}</span></code></pre></p>
5 产品/数据的持续运行
李莉:利用LLM打造企业专属的用户助手
为了继续对 TiDB Bot 进行优化,我们搭建了一个内部操作平台,可以更方便地实现本文介绍的几种优化方法。该平台的核心能力包括:
连续手动操作的优点和缺点:
6 云厂商集成解决方案 6.1 基于Azure Model 的知识库问答系统
Azure一文中提到【无粗言秽语:一篇文章理解:创建垂直领域的大规模模型应用】
本demo构建了一个基于知识库的简单问答系统。企业可以将各种内部文档、表格、图片等转换为便于模型计算的语义向量,并存储在向量数据库中。当用户提出问题时,它会从知识库(向量库)中检索最相关的文档,然后使用 GPT 生成问题的最终答案。
但实际操作中可能仍存在不少问题
6.2 阿里云的Tair向量检索
阿里云数据库:如何让聊天机器人更懂你? Tair向量搜索给你答案
未经过专门测试
以用户的历史记录为例,用户的历史记录作为请求的一部分不断附加。当超过令牌数量限制时,旧的聊天记录需要被丢弃。因此,LLM方案无法实现太长的多轮对话的能力。基于Tair,可以存储用户的历史聊天记录,并可以为这些信息设置TTL等过期机制。 Tair还支持海量索引空间()。申请LLM时,通过向量检索技术检索相关历史信息。经过打磨后一起发送到大模型,可以实现基于多轮对话的长期上下文感知。
6.3-7B 文本代码生成模型
继续对基于代码的模型进行预训练和SFT微调,并设计模型的指标评估体系。目前,该榜单已达到sota。它可以通过改变数据来适应不同领域的SQL查询场景。
训练示例: |
|