跳转至

10 概念详解:摘要与翻译,RAG应用的两大利器

你好,我是叶伟民。

上一节课我们了解了什么是元数据,以及如何根据元数据从数据库里检索知识。这节课,我们来学习RAG中另一个重要的基本概念——文本摘要。

首先我们说一下为什么需要文本摘要。

为什么需要文本摘要?

概括来说,文本摘要可以提升用户体验,并且提高检索效率。

提升用户体验

先讲用户体验,就我们的实战案例2而言,使用了文本摘要之后,用户浏览内容的步骤大概是这样 。

  1. 文本摘要很短,用户可以先快速看一眼有没有自己感兴趣的内容,而不需要看完全部内容。
  2. 如果有感兴趣的,则点击详细内容链接来阅读详细内容。
  3. 如果没有,则跳过。

我们可以看到文本摘要可以节省用户的阅读时间,从而提高用户的阅读体验。

提高检索效率

然后讲检索效率。你可以想象一下,当我们想从一本书里面检索我们想要的知识,我们会怎么做?

其中一种方法就是先查看前言部分对这本书章节内容的描述,例如:

本书第1章讲述了某某某知识点,使用了某某某工具。
本书第2章讲述了某某某知识点,使用了某某某工具。

通过这种方式找出第几章讲述了我们想要的知识,然后就翻开这一章查看。

这里的前言部分对章节内容的描述其实就是文本摘要。同样的,RAG也可以参考这个思路来检索用户提问相关的知识。也就是说:

  1. 程序先从文本摘要里面搜索,确定有没有想要的内容。
  2. 如果有,则返回更详细的内容。
  3. 如果没有,则跳过。

不过,你应该很容易就能发现文本摘要是有局限性的。比如假设一本书里前言部分的文本摘要只能涵盖最关键的内容,但遗漏了一些不那么重要的部分。那么当用户需要的知识恰好就在遗漏部分里面,系统就无法回答用户问题了。所以还需要结合其他检索方法一起使用。

尽管有这个局限,就我们实战案例2的情况来看,文本摘要在提高用户体验这方面是十分有用的。那么,如何进行文本摘要呢?

如何进行文本摘要?

很简单,我们只需要简单编写以下提示语。

def 构造文本摘要messages(输入字符串):
  messages=[
  {"role": "user", "content": f"""
  请对以下文本进行摘要:

  {输入字符串}
  """},
  ]
  return messages

然后编写大模型调用messages的函数。

def 对话模式(messages):
  url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-lite-8k?access_token=" + get_access_token()
  json_obj = {
      "messages": messages,
  }
  playload = json.dumps(json_obj)
  headers = {
      'Content-Type': 'application/json'
  }
  response = requests.request("POST", url, headers=headers, data=playload)
  json_result = json.loads(response.text)
  if "error_code" in json_result:
    return json_result["error_msg"] + ":" + playload
  else:
    return result

然后交给大模型调用。

messages = 构造文本摘要messages(输入文本)
文本摘要结果 = 对话模式(messages)

然而以上函数有一个问题,就是大模型的输入长度是有限制的。那么当输入文本超过大模型输入长度限制的时候,又该如何处理呢?

如何对长文本进行摘要?

方法其实有很多,本着这门课程从最简单的入门方法讲起的原则,我们先讲一个最简单的方法。

  1. 将文本按某个长度或某种方法分成几段。
  2. 对这几段文本分别摘要。
  3. 将这几段摘要整合在一起。

具体代码如下。

def 对长文本进行摘要(输入文本):
  if len(输入文本) > 文本划分长度:
    文本list = 按长度划分文本(输入文本, 文本划分长度)
    文本摘要结果 = ''
    for 当前文本 in 文本list:
      当前文本摘要结果=文本摘要(当前文本)
      文本摘要结果 += 当前文本摘要结果 + '\n'
    return 文本摘要结果
  else:
    return 文本摘要(输入文本)

这段代码很好理解。我们首先判断输入文本是否长于文本划分长度(对应第2行代码)。如果输入文本长于文本划分长度,则按文本划分长度分成一个list(对应第3行代码)。然后遍历这个list,对list里面的每一段文本进行摘要(对应第5、6行代码)。最后将这几段摘要整合在一起(对应第7行代码)。

按长度划分文本函数详细代码我们会在后面第12节课提到。

好了,现在我们了解了如何完成长文本的文本摘要。接下来我们来学习另一个基本概念,机器翻译。

机器翻译

首先我们讲一下为什么需要机器翻译。

为什么需要机器翻译?

一般来说,只要有以下需求的RAG应用,都是需要机器翻译的:

  1. 用户提问和入库知识是不同语言的。
  2. 入库知识是多种语言的。
  3. 用户提问可能会有多种语言的。

第一类以实战案例2为例。实战案例2抓取的CNET新闻是英文的。而用户需要的是中文的内容,用户提问也是中文的。用户提问是中文,入库知识是英文,两者是不同的语言,所以需要机器翻译。

第二类还是以实战案例2为例。如果我们扩展一下实战案例2,不仅仅抓取英文的IT新闻,还抓取日文、中文的IT新闻,那么我们的入库知识就有多种语言了。这时候我们就需要把日文的IT新闻也要翻译成中文了。

第三类以旧金山一些组织的RAG应用为例。旧金山的官方语言是英文、西班牙语、繁体中文。所以用户可能会用英文、西班牙语、繁体中文这三种语言之一进行提问。还有旅游相关的RAG应用,游客可能会用不同的语言进行提问。

对文本内容进行机器翻译

对于第一类和第二类RAG应用,我们需要对文本内容进行机器翻译。

我们先定义生成messages的函数。具体代码很简单。

def 构造英译中messages(输入字符串):
  messages=[
  {"role": "user", "content": f"""
  请将以下文本翻译成中文:

  {输入字符串}
  """},
  ]
  return messages

然后我们将生成的messages传给大模型调用。

messages = 构造英译中messages(输入文本)
机器翻译结果 = 对话模式(messages)

对用户提问和答案进行机器翻译

对于第三类RAG应用,我们首先需要对用户的提问进行机器翻译。具体代码如下。

messages = 构造英译中messages(用户的提问)
机器翻译结果 = 对话模式(messages)

然后对系统给出的回答进行机器翻译。具体代码如下。

messages = 构造英译中messages(系统给出的回答)
机器翻译结果 = 对话模式(messages)

如何对长文本进行翻译?

机器翻译和文本摘要会面临一个同样的问题——对于超过大模型输入长度限制的长文本,我们需要拆分成多段,然后单独翻译,最后再合并在一起。

现在我们按照与文本摘要同样的原则修改机器翻译代码,以支持长文本翻译。

def 对长文本进行翻译(输入文本):
  if len(输入文本) > 文本划分长度:
    文本list = 按长度划分文本(输入文本, 文本划分长度)
    文本翻译结果 = ''
    for 当前文本 in 文本list:
      当前文本翻译结果=翻译成中文(当前文本)
      文本翻译结果 += 当前文本翻译结果 + '\n'
    return 文本翻译结果
  else:
    return 翻译成中文(输入文本)

有些同学可能会说,这样的长文本拆分方法会有问题。例如当拆分的位置不对,将一句话砍成两段之后会得到两句病句,本身就无法表达正确的意思。比如“我昨天在公园里看到一只可爱的小狗”这句话。当使用前面划分文本函数进行划分时,恰好在“天”字这里砍成了两段,变成了“我昨”、“天在公园里看到一只可爱的小狗”。可以预见的是,这两段话都不完整,本身就无法表达正确的意思。

首先,解决这个问题的方法是有的,例如分析文本之后按正确的换行符进行分段处理。但是出于这门课的教学目的,这里我想谈两点:

  1. 业务场景对准确率的要求是多少?
  2. 要达到业务目标需要投入多少资源进行细节处理?

我们先谈第一点。不少业务场景对文本摘要和机器翻译的准确率要求并不高。就本实战案例而言,业务目标是快速浏览判断新闻是否是我们感兴趣的内容。因此这样的划分方法其实可以实现业务目标了,因此已经足够了。

第二点,就是要达到业务目标需要投入多少资源进行细节处理。假设我们对文本摘要和机器翻译的准确率要求很高,那么我们就要计划好需要投入多少资源进行细节处理。投入这么多资源的收益是多少,是否划算。

小结

好了,今天这一讲到这里就结束了,最后我们来回顾一下。这一讲我们学会了四件事情。

第一件事情是知道了为什么需要文本摘要。文本摘要可以提高用户体验,可以提高检索效率。

第二件事情是掌握如何完成文本摘要。需要注意的是,大模型的输入长度是有限制的,因此当输入文本长度超过这个限制的时候,我们需要将输入文本拆成多段分别进行摘要再整合。

第三件事情是了解了为什么需要机器翻译。后面这三种情况都需要用到机器翻译:

  1. 用户提问和入库知识是不同语言。
  2. 入库知识有多种语言。
  3. 用户使用多种语言提问。

前两种情况我们需要对知识进行翻译,第三种情况我们需要对用户的提问和大模型的回答进行翻译。

现在实战案例2的基础概念我们都讲解完了。下一节我们将开始动手实现实战案例2,敬请期待。

思考题

在新闻简报这个案例背景下,我们是否需要对所有文章都进行文本摘要呢?

欢迎你在留言区和我交流互动,如果这节课对你有启发,也推荐分享给身边更多朋友。

精选留言(2)
  • kevin 👍(0) 💬(1)

    如果新闻很短,则无需摘要

    2024-11-08

  • 亚林 👍(0) 💬(0)

    毕竟,这是一个入门课程

    2025-02-18