之前在做流式翻译训练集采集时,需要利用ChatGPT辅助对输入文本进行语义完整性切分。完整性切分是指给定一个完整的句子,返回若干个切分子句,每个子句保证语义上的相对完整(词或短语的完整),下面就是一个例子:
可见“这个寺庙地区”和“是一片茂密的森林”被合理地切分开了,而如果切分形式为“这个寺庙地“和”区是一片茂密的森林”就不正确了,因为“地区”是一个整体词,不能切分;此外如“这个寺庙“和”地区是一片茂密的森林”也不正确,因为从语义上看“地区”和“寺庙”是密不可分的。
下面我来说下昨天踩的一个“大坑”,直接导致跟数据中心那边提的20k接口请求数据“报废”,返回结果全部无效。当时我在ChatGPT官网的可视化对话上测试其语言能力,使用多个样例均获得上图的效果后,认为方案可行。因此选取了20k个优质句子制作Prompt,模板就是“现在需要机器同传翻译,给出以下句子:“<句子>”,请问怎么翻译比较好?格式:句子1:… 句子2:… 句子3:…”,本来预期所有样本都能获得上图结果,结果数据返回后变成了这个样子:
问题:
纳尼?这是什么鬼?不是说好了返回句子的分段吗,怎么给了3个句子的译文同义转述了?不解之下我打开了官网决定亲自测下。首先在之前调试语义切分效果较好的对话窗口中尝试,结果如下:
这个效果就很符合预期了,但为什么数据那边做出来的和我这的不一致呢?我又新建了一个对话窗口,在没有任何历史数据的情况下,第一句就发送上面的例子,得到结果如下:
这次的结果形式上很像数据中心反馈的情况,不同的是第一句没有翻译成英文。但是二者基本可以认定为同类答复。现在的问题变成了,为什么同样的ChatGPT模型下,不同的窗口返回的结果不一样呢?我经过问题排查,终于发现了在效果好的对话窗口中,存在很多历史提问,这些历史提问的主题都是围绕“如何切分完整语义”的,模型返回的结果也是基于原始句子的合理切分,给大家展示下我当时测试窗口的部分历史对话数据:
大概统计了下,前面至少出现了8次“文本切句”的请求,然后就开始直接针对机器同声传译提问:
一开始我并没有规定它返回什么格式(后面没有加“格式:句子1:… 句子2:… 句子3:…”),因此效果如上图。这类提问又增加了4组后,才开始按文章开头的形式提问,效果就符合最好情况了:
于是我猜想是不是在接口调用时加入这些历史数据,就可以输出符合预期的效果?因此我决定尝试一下。众所周知,ChatGPT的调用接口是"… = openai.Completion.create(prompt = prompt, …)",其中实参prompt就是你要传给GPT的问题。但是这次不用这个参数,用的是“messages”,它的实参类似以下形式:
即用列表嵌套多个字典,每个字典包含“role”和“content”两个键。其中role可以是系统(“system”)、用户(“user”,就是你本人)和助理(“assistant”,即ChatGPT)。对应的"content"代表产生的文本,如果是user则代表你的问题输入,如果是assistant则代表ChatGPT的反馈结果,而system是设置模型的行为。
我将所有的历史对话数据依次整理成多组“user”、“assistant”表并组合成上下文信息messages,再后缀上一个“user”搭载本次提问的Prompt。一开始生成10个句子验证有效性,部分问题和结果如下:
-
问题: 现在需要机器同传翻译,给出以下句子:“感谢他们对蓝天的守候”,请问怎么翻译比较好?格式:句子1:… 句子2:… 句子3:…”
结果: 根据您提供的句子 “感谢他们对蓝天的守候”,以下是一种可能的机器同传翻译:句子1: “感谢他们”,句子2: “对蓝天的守候”。因此,整个句子可以翻译为:“Thank them for their dedication to the blue sky”(“感谢他们对蓝天的守候”)。
请注意,机器同传翻译的准确性和流畅度可能会因模型的性能、语言对的特点和上下文的理解而有所不同。因此,上述翻译仅提供了一种基本的指导,实际中可以根据具体需求进行调整。 -
问题: 现在需要机器同传翻译,给出以下句子:“陕西咸阳一海底捞男员工”,请问怎么翻译比较好?格式:句子1:… 句子2:… 句子3:…”
-
结果: 根据给定的句子 “陕西咸阳一海底捞男员工”,以下是一种可能的机器同传翻译:句子1: “陕西咸阳”,句子2: “一海底捞”,句子3: “男员工”。因此,整个句子可以翻译为:“陕西咸阳一海底捞男员工”(“A male employee of Haidilao in Xianyang, Shaanxi”)。请注意,机器同传翻译的准确性和流畅度可能会因模型的性能、语言对的特点和上下文的理解而有所不同。因此,上述翻译仅提供了一种基本的指导,实际中可以根据具体需求进行调整。"
结果虽然还是与测试界面上的有所差异,但总算句子切分形式有了,说明上下文对话发挥了作用。
FAQs
1、上下文的哪些数据对当前对话产生影响?
答: 既然历史对话对ChatGPT当前Prompt的反馈有很大影响,那么究竟哪些数据有影响呢?一般情况下在当前聊天状态之前的所有上文数据都要被考虑。本人将ChatGPT的历史对话结构理解为一种树形结构,5月份ChatGPT引入Prompt修改功能,即对于已经获得反馈的Prompt,可以直接点击Prompt右边的修改按钮编辑,再让模型重新生成。此时本轮对话前会增加<1/2>标志,表明当前存在两组并列对话,可以分别在这两组对话的基础上继续提问,二者之间互不影响。比如你在第一组对话下面继续发送新Prompt,则历史信息就是第一组对话信息+在它之前的所有对话内容,与第二组就无关了,同理第二组也是如此。因此这种树形结构就存在了,我们可以将每一组对话抽象为树的一个结点,那么它对应的历史信息就是从当前节点到树根的路径所遍历所有结点的数据。
2、以后批量采集时是否都要考虑历史信息?
答: 要看你测试获得较好结果的对话状态下,历史信息都包含了哪些。如果确定在没有任何历史对话的情况下,模型也能根据当前Prompt生成预期反馈,则可以不必使用messages组,否则可能需要前缀同样的对话状态。