你真的会写 Prompt ? 剖析 RAG 应用中的指代消解

随着 ChatGPT 等大语言模型(LLM)的不断发展,越来越多的研究人员开始关注语言模型的应用。

其中,检索增强生成(Retrieval-augmented generation,RAG)是一种针对知识密集型 NLP 任务的生成方法,它通过在生成过程中引入检索组件,从已知的知识库中检索相关信息,并将这些信息与 LLM 的生成能力结合,从而提高生成的准确性和可靠性。这种方法可以用于实现各种知识密集型 NLP 任务,如问答、文摘生成、语义推理等。

本文将从解决优化 RAG 系统里的一个具体问题出发,通过展示使用 LLM Prompt Engineering 的方法,来解析传统 NLP 的问题。

01.解决方案初探

开源项目 Akcio 就是一套完整的 RAG 问答系统,用户导入各类私有专业知识,就可以构建专业领域的问答系统。

alt |Akcio 的架构图。专业知识是各类 Documents,通过 DataLoader 导入进 Store。在每次提问 Question 后,LLM 可以结合召回知识,加上 LLM 自身的自然语言生成能力,给出对应的回答。

举个例子,比如我们将一篇名为《2023 大模型落地进展趋势洞察报告》的文章,将它导入 Akcio,就可以问它这篇报告里的问题了,比如:

2023年,大模型行业的应用场景可以分为哪几类?

通过一些召回策略,在 Store 里召回出了《报告》中,与问题最相关的 3 条原文片段:

['在2023年,大模型行业的应用场景可分为生成和决策两类应用场景,决策场景预期业务值更高。',
'大模型行业的生成场景主要有对话交互,代码开发,智能体等。',
'NLP的应用场景有文本分类,机器翻译,情感分析,自动摘要等。']

很显然,最有用的片段是第一条,但没关系,Akcio 会把这 3 条都作为 context,去问 LLM,比如它是这样问的:

请根据下面知识回答问题:

知识:

2023年,大模型行业的应用场景可分为生成和决策两类应用场景,决策场景预期业务值更高。
大模型行业的生成场景主要有对话交互,代码开发,智能体等。
NLP的应用场景有文本分类,机器翻译,情感分析,自动摘要等。

问题:

2023年,大模型行业的应用场景可以分为哪几类?

LLM 就可以给出合理的回答:

大模型行业的应用场景可以分为生成和决策两类应用场景。

这样的话整条链路就走通了。这套架构逻辑看似并不复杂,但如果深入到开发过程中,就会发现其中有一些难点需要解决。

比如在多轮对话的情况下,就需要解决一个问题:如果在最新一轮的提问,里面有些指代上文的代词,那么如果直接用这个问题去做召回,很可能会召回错误的知识,比如:

12023年,大模型行业的应用场景可以分为哪几类?
1: 大模型行业的应用场景可以分为生成和决策两类应用场景。
2: 它们有什么区别,能举例说明吗?

这里的“它们”很显然指的是“生成和决策两类应用场景”,问题的原意是“生成和决策场景有什么区别,能举例说明吗?”。但如果直接用这个问题“它们有什么区别,能举例说明吗?”去做召回,那很有可能召回的是比如这样的知识片段:

['BERT和GPT都是NLP领域的重要模型,但它们的设计和应用场景有很大的区别。',
'大模型和小模型的区别在于其规模和复杂度。大模型通常具有更多的参数和更复杂的结构,需要更多的计算资源和时间来训练和推理。而小模型则相对简单,参数较少,训练和推理速度较快。',
'但没有更多的信息来区分这两个产品,因为它们看起来非常相似。']

显然主体错了,那用这些召回的知识肯定也就不对了,LLM 利用这些无用的知识也不用给用户很好的回答了。

那么要解决这个问题有什么好的办法呢?

首先可以想到的是NLP领域中的一个常见任务:指代消解(Coreference resolution)。指代消解是自然语言处理(NLP)中的一项重要任务,用于确定文本中指代相同实体的词语。该任务旨在识别代词、名词短语等,将它们与先前提到的实体关联起来。例如,在句子“John saw Mary. He waved to her.”中,coreference resolution会将“He”和“John”以及“her”和“Mary”归纳为同一实体。

也许这个任务可以帮助我们解决这个问题,但经过实践发现,无论是通过 spacy,还是 huggingface,目前的开源模型,处理指代消解这个任务都有一定的局限性,只能处理比较简单的场景,比如:

1:大模型是什么?
2:它有什么用?

可以找出“它”指的是“大模型”。然而,对于复杂的指代,却不能识别出来,比如:

1:GPT3是什么?
2:GPT4又是什么时候发布的?
3:二者有什么区别?后者有什么优势?

没法识别出“二者”指的是 GPT3 和 GPT4,“后者”指的是“GPT4”。再比如:

1:GPT4又是什么时候发布的?
1:GPT4是在 2023 年发布的
2:这一年在计算机视觉有什么进展?

没法识别出“这一年”指的是“2023年”。

也就是说,现有的 NLP 小模型,只能处理识别“它”,“他”,“她”,“这个”等简单的代词,而对于复杂的指代表述,没法识别处理。

那该怎么办呢,对于复杂语言场景,也许最好的处理就是用大模型,毕竟 ChatGPT 火爆时可是号称是“让 NLP 不存在的”的终极武器。于是我们可以尝试,让 LLM 来做这个指代消解任务。

02.用 ChatGPT 做指代消解

我们尝试使用便宜又好用的 ChatGPT 来做这个任务。这里面的关键,其实就是 prompt 怎么写的问题,也就是常说 prompt engineering。这其实是一个看起来好像很简单,但要做好,其实并不简单的一个事情。

比如我们最开始用一些简单的命令类的 prompt,试着让 ChatGPT 去代换最新问题中的代词:

prompt = f'''Please return a new question with the following requirements:
1. If there are pronouns or conditions are missing in the question, please make a complete question according to the context.
2. If the question is complete, please keep the original question.

{history}
Question: {question}'''

这个 prompt 并不复杂,提出要求,要么替换代词,要么保留原问题不变,并把历史上下文,和最新问题给到 GPT,让它来帮我们完成这个任务。那来测一些效果(相对中文来说,GPT 更擅长英文,所以直接用英文测试):

history = ''' What is NLP? 
NLP stands for Natural Language Processing. It is a field of computer science and artificial intelligence that focuses on the interaction between computers and humans using natural language. '''

question = 'What problem does it solve?'

ChatGPT给的返回是:

What problem does Natural Language Processing (NLP) solve?

好像还不错,它把“it”识别出了“NLP”,而且还用“Natural Language Processing (NLP)”来补充全称。

再试试复杂的例子:

history = '''When was GPT4 released?
GPT4 was released in 2023'''

question = 'What progress has been made in computer vision this year?'

返回是:

What progress has been made in computer vision this year?

GPT 并没有成功替换掉 “this year”,在这个例子下它失败了。

再试个复杂例子:

history = '''What is GPT3?
GPT-3 (Generative Pre-trained Transformer 3) is a state-of-the-art language processing model developed by OpenAI.
When was GPT4 released?
GPT4 was released in 2023'''

question = 'What is the difference between the two? What are the advantages of the latter?'

返回是:

Sorry, the information provided about GPT-4's release date is not accurate as it has not been officially announced by OpenAI. Therefore, it is not possible to answer the question about the difference between GPT-3 and GPT-4 or the advantages of the latter.

ChatGPT 并没有按照我们的要求,去改写掉代词,而是直接去回答这个问题了(这里用的 GPT3 模型是偏早期的,它的训练资料里还没有关于 GPT4 的信息,因此它回答称自己不知道)。

在我们的后面的测试中,发现 ChatGPT 有一定的概率会去直接回答问题,而不是按照我们的要求 prompt 去改写代词。我们尝试在 prompt 里加一些要求,让它不要去直接回答问题,但这一问题还是有小的概率会出现。看来ChatGPT 并不是所有要求都能听懂,有时候也容易被其它信息干扰错乱。

在传统 NLP 小模型,和 ChatGPT 这样的大模型都无法解决这个问题的情况下,应该怎么办呢?也许我们从另外一个角度尝试优化我们的 prompt,可以让 ChatGPT 更加听话。

03.Few-shot prompt + CoT

在 prompt engineering 里有一些技巧,可以让 LLM 更加理解并服从指令,比如,我们给 LLM 多看几个参考答案,让它模仿我们的参考例题继续作答,这种 few-shot context learning 的方法,即不需要 fine-tune LLM 模型,又能产生很好的效果。一般给 LLM 看 5 次 shot 后,LLM 就能很好地顺从你的参考案例继续回答。

但是否需要做代词替换,还是要保留原问题,是一个比较复杂的 NLP 理解问题。即使是 ChatGPT 这样的 LLM,也不一定可以按照几个参考例子,直接给出正确的回答。还好,在 prompt engineering 里还有一个常见的方法,可以让 LLM 更好地处理逻辑问题,那就是思维链 CoT。

“思维链 (Chain-of-thought,CoT) 的概念是在 Google 的论文 "Chain-of-Thought Prompting Elicits Reasoning in Large Language Models" 中被首次提出。思维链(CoT)是一种改进的提示策略,用于提高 LLM 在复杂推理任务中的性能,如算术推理、常识推理和符号推理。大概思想就是,让 LLM 在回答的过程中,把中间过程推导也一并回答出来,让 LLM 逐步推导出最后的答案。这样比让 LLM 直接回答出最后的答案的准确率要高得多。

所以,我们完全可以在给 few-shot examples 时,也给到 LLM Chain-of-thought,就是也让它看到思考推理的过程。这样可以提高准确率。

于是,我们按照这样的思想,写出我们的最终 prompt:

REWRITE_TEMP = f'''
HISTORY:
[]
NOW QUESTION: Hello, how are you?
NEED COREFERENCE RESOLUTION: No => THOUGHT: So output question is the same as now question. => OUTPUT QUESTION: Hello, how are you?
-------------------
HISTORY:
[Q: Is Milvus a vector database?
A: Yes, Milvus is a vector database.]
NOW QUESTION: How to use it?
NEED COREFERENCE RESOLUTION: Yes => THOUGHT: I need to replace 'it' with 'Milvus' in now question. => OUTPUT QUESTION: How to use Milvus?
-------------------
HISTORY:
[]
NOW QUESTION: What is the features of it?
NEED COREFERENCE RESOLUTION: Yes => THOUGHT: I need to replace 'it' in now question, but I can't find a word in history to replace it, so the output question is the same as now question. => OUTPUT QUESTION: What is the features of it?
-------------------
HISTORY:
[Q: What is PyTorch?
A: PyTorch is an open-source machine learning library for Python. It provides a flexible and efficient framework for building and training deep neural networks. 
Q: What is Tensorflow?
A: TensorFlow is an open-source machine learning framework. It provides a comprehensive set of tools, libraries, and resources for building and deploying machine learning models.]
NOW QUESTION: What is the difference between them?
NEED COREFERENCE RESOLUTION: Yes => THOUGHT: I need replace 'them' with 'PyTorch and Tensorflow' in now question. => OUTPUT QUESTION: What is the different between PyTorch and Tensorflow?
-------------------
HISTORY:
[{history}]
NOW QUESTION: {question}
NEED COREFERENCE RESOLUTION: '''

这里给 ChatGPT 看 4 个参考例子。第一个是一个空的对话历史,第二个是最简单的例子,第三个是一个替换失败的例子,最后一个是替换两个指代的例子。

在格式上,“HISTORY:”后面就是历史上下文,为了和其它行区分开,在格式上,每次问题前加上“Q:”,每次回答前加上“A:”。“NOW QUESTION”就是最新一轮的提问。而“NEED COREFERENCE RESOLUTION:”这一行后面,就是一次CoT的推导,先让LLM先判断是否需要做“COREFERENCE RESOLUTION”, 然后“THOUGHT:”一下,看看在尝试去替换时,是否成功。最后“OUTPUT QUESTION:”后输出改写后的问题。

最后解析 LLM 的返回时,只需要把 LLM 返回字符串的格式拆解开,只有在“NEED COREFERENCE RESOLUTION:”后跟“Yes”的情况,才去拿最后“OUTPUT QUESTION:”改写的最终问题。

接下来,我们来看看用这个 prompt 的使用效果,还是用上面失败的两个例子,LLM 还是用 ChatGPT:

history = '''When was GPT4 released?
GPT4 was released in 2023'''

question = 'What progress has been made in computer vision this year?'

返回:

Yes => THOUGHT: I need to replace "this year" with "2023" in the now question. => OUTPUT QUESTION: What progress has been made in computer vision in 2023?
```python
可以看到 ChatGPT 成功返回了我们想要的结果,成功将“this year”替换成“2023”。



下一个例子:


```python
history = '''What is GPT3?
GPT-3 (Generative Pre-trained Transformer 3) is a state-of-the-art language processing model developed by OpenAI.
When was GPT4 released?
GPT4 was released in 2023'''
question = 'What is the difference between the two? What are the advantages of the latter?'

返回:

Yes => THOUGHT: I need to replace 'the two' with 'GPT-3 and GPT-4' and 'the latter' with 'GPT-4' in the now question. => OUTPUT QUESTION: What is the difference between GPT-3 and GPT-4? What are the advantages of GPT-4?

可以看到这种复杂问题,也能成功将“the two”替换成“GPT-3 and GPT-4”,“the latter”替换成“GPT-4”。

04.总结

本文从解决优化 RAG 系统里的一个具体问题出发,讨论了使用 LLM prompt engineering 的方法,来解析传统 NLP 的问题,并得到一定的质量提升。可以看到,写 prompt 有时很简单,有时却是一个很难的事。所以在 LLM 爆火之后,prompt engineering 分支领域也逐渐形成并发展,各种写 prompt 层出不穷。也许本文展示的最终 prompt 可能并非最优解,但一定比传统 NLP 方法好得多。这也让我们看到了,用 LLM 大模型,确实可以帮助优化和解决很多传统 NLP 领域的问题,也许就是大模型之所以强大的地方吧。

随着GPT-4之后的大模型能力越来越强,我相信也许多年后 NLP 领域的很多问题可能已不是问题,通用的人工智能会慢慢走近我们。

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/257307.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

带外应用程序安全测试 (OAST)

Burp Suite的polling.oastify.com的dns请求类似全流量中的旁路检测,或是云原生中的边车模式检测,类似引用带外的DNSLog。 一、传统的动态测试 传统的动态测试简单而优雅。从本质上讲,它将有效负载发送到目标应用程序并分析返回的响应 - 就像…

清华提出ViLa,揭秘 GPT-4V 在机器人视觉规划中的潜力

人类在面对简洁的语言指令时,可以根据上下文进行一连串的操作。对于“拿一罐可乐”的指令,若可乐近在眼前,下意识的反应会是迅速去拿;而当没看到可乐时,人们会主动去冰箱或储物柜中寻找。这种自适应的能力源于对场景的…

Vim命令大全(超详细,适合反复阅读学习)

Vim命令大全 Vim简介Vim中的模式光标移动命令滚屏与跳转文本插入操作文本删除操作文本复制、剪切与粘贴文本的修改与替换文本的查找与替换撤销修改、重做与保存编辑多个文件标签页与折叠栏多窗口操作总结 Vim是一款文本编辑器,是Vi编辑器的增强版。Vim的特点是快速、…

云仓酒庄的品牌雷盛红酒LEESON分享起泡酒要醒酒吗?

常喝葡萄酒的朋友知道,陈年酒、单宁含量重的红酒都需要在喝之前进行醒酒,有朋友问了,起泡酒需要醒酒吗?关于起泡酒醒酒有两种声音,有人反对,认为醒酒会让起泡酒失去细腻的泡泡。有人支持认为醒酒可以让起泡…

蜘点云原生之 KubeSphere 落地实践过程

作者:池晓东,蜘点商业网络服务有限公司技术总监,从事软件开发设计 10 多年,喜欢研究各类新技术,分享技术。 来源:本文由 11 月 25 日广州站 meetup 中讲师池晓东整理,整理于该活动中池老师所分享…

内网安全—Windows系统内核溢出漏洞提权

系统内核溢出漏洞提权 往缓冲区中写入超出限定长度的内容,造成缓冲区溢出,从而破坏程序的堆栈进而运行自己精心准备的指定代码,达到攻击的目的。 分类: 堆溢出 栈溢出 查找补丁的方法 1、手工查找补丁情况 systeminfo Wmic qfe…

福德植保无人机:让植保工作更轻松

亲爱的读者们,欢迎来到我们的公众号!今天,我想和大家分享一个我们生活中不可或缺的东西——福德植保无人机。它不仅改变了我们的植保工作,更提升了工作效率,减少了人工负担。福德植保无人机,一家在植保无人…

3ds max软件中的一些常用功能分享!

3ds max软件有很多小伙伴反馈说,明明有很多3ds max教程资料。却不知道如何入门3dmax。 掌握3dmax基本功能是开始使用3dmax的基础之一,所以,小编带大家盘点一下3dmax常用操作。 3dmax常用功能介绍如下,快快跟着小编一起看起来。 1…

回归预测 | MATLAB实现GA-LSSVM基于遗传算法优化最小二乘向量机的多输入单输出数据回归预测模型 (多指标,多图)

回归预测 | MATLAB实现GA-LSSVM基于遗传算法优化最小二乘向量机的多输入单输出数据回归预测模型 (多指标,多图) 目录 回归预测 | MATLAB实现GA-LSSVM基于遗传算法优化最小二乘向量机的多输入单输出数据回归预测模型 (多指标&#…

红外二极管发射电路图大全

红外二极管发射电路图(一) 传感器检测及声光报警电路 传感器模块由热释电传感器、烟雾传感器MQ211和红外传感器组成。 烟雾传感器的内部电阻是随着烟雾的浓度的变化而变化,因此要将其转化为变化的电压信号,在此通过电压比较器LM…

智能监控平台/视频共享融合系统EasyCVR如何做到不被其他软件强制终止?具体如下

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。国标GB28181流媒体视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频…

linux 多路径multipath的安装

1. 什么是多路径 在计算机系统中,多路径是指在存储系统中使用多个物理路径来连接主机和存储设备,以增加系统的可用性和容错性。多路径技术的目标是提供冗余路径,以确保在某个路径发生故障时,数据仍然可以通过其他路径进行传输具体…

【UE5.1】M4自动地形材质+UltraDynamicSky+Oceanology插件的使用记录

目录 效果 步骤 一、项目准备 二、插件使用记录 准备过程 M4自动地形插件使用过程 超动态天空插件使用过程 运行时修改天空效果 运行时修改天气效果 海洋插件使用过程 在海洋中游泳 效果 步骤 一、项目准备 1. 创建一个第三人称游戏工程 2. 将M4文件夹和Ultr…

解决ZooKeeper中/rmstore无法删除问题

无法删除znode /rmstore的原因在于yarn在注册时候候自己添加上ACL,导致无法直接删除。解决办法:重新设置ACL。 首先,查看ACL:getAcl /rmstore/ZKRMStateRoot 之后,重新设置ACL:setAcl /rmstore/ZKRMState…

产品入门第六讲:Axure中继器

📚📚 🏅我是默,一个在CSDN分享笔记的博主。📚📚 ​​​​​​ 🌟在这里,我要推荐给大家我的专栏《Axure》。🎯🎯 🚀无论你是编程小白&#xff0c…

Python Pandas 的DataFrame修改列名 (第8讲)【columns属性与rename方法】

Python Pandas 的DataFrame修改列名 (第8讲)【columns属性与rename方法】         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

文字识别和阅读软件OmniReader Pro mac介绍

OmniReader Pro mac是一款文字识别和阅读软件,它可以将印刷体和手写体的文字转换为数字文本,并将其朗读出来。该软件适用于视力受损、阅读困难、语言障碍等用户,可以帮助他们更加轻松地获取信息和阅读文本。 OmniReader Pro mac具有简洁直观的…

【迁移学习论文四】Multi-Adversarial Domain Adaptation论文原理及复现工作

Multi-Adversarial Domain Adaptation 多对抗域适应 前言 好久没有更新了,所以这周开始记录下来,也好督促自己。记录本人预备研究生阶段相关迁移学习论文的原理阐述以及复现工作。 问题 跨域混淆或错误对齐 文章介绍 这篇文章于2018年发表在AAAI&…

如果大量利用工具类导出的常量,可以通过利用静态导入机制,避免用类名来修饰常量名。

通过使用静态导入机制,可以避免在代码中使用类名修饰常量名,从而提高代码的可读性。静态导入机制允许直接访问导入的类的静态成员(包括常量)而无需使用类名限定符。 以下是一个示例,演示如何利用静态导入来使用工具类…

【C语言】数据结构——链式二叉树实例探究

💗个人主页💗 ⭐个人专栏——数据结构学习⭐ 💫点击关注🤩一起学习C语言💯💫 导读: 我们在前面学习了单链表,顺序表,栈和队列,小堆。 今天我们来学习链式二叉…