10 概念详解:摘要与翻译,RAG应用的两大利器
你好,我是叶伟民。
上一节课我们了解了什么是元数据,以及如何根据元数据从数据库里检索知识。这节课,我们来学习RAG中另一个重要的基本概念——文本摘要。
首先我们说一下为什么需要文本摘要。
为什么需要文本摘要?
概括来说,文本摘要可以提升用户体验,并且提高检索效率。
提升用户体验
先讲用户体验,就我们的实战案例2而言,使用了文本摘要之后,用户浏览内容的步骤大概是这样 。
- 文本摘要很短,用户可以先快速看一眼有没有自己感兴趣的内容,而不需要看完全部内容。
- 如果有感兴趣的,则点击详细内容链接来阅读详细内容。
- 如果没有,则跳过。
我们可以看到文本摘要可以节省用户的阅读时间,从而提高用户的阅读体验。
提高检索效率
然后讲检索效率。你可以想象一下,当我们想从一本书里面检索我们想要的知识,我们会怎么做?
其中一种方法就是先查看前言部分对这本书章节内容的描述,例如:
本书第1章讲述了某某某知识点,使用了某某某工具。
本书第2章讲述了某某某知识点,使用了某某某工具。
通过这种方式找出第几章讲述了我们想要的知识,然后就翻开这一章查看。
这里的前言部分对章节内容的描述其实就是文本摘要。同样的,RAG也可以参考这个思路来检索用户提问相关的知识。也就是说:
- 程序先从文本摘要里面搜索,确定有没有想要的内容。
- 如果有,则返回更详细的内容。
- 如果没有,则跳过。
不过,你应该很容易就能发现文本摘要是有局限性的。比如假设一本书里前言部分的文本摘要只能涵盖最关键的内容,但遗漏了一些不那么重要的部分。那么当用户需要的知识恰好就在遗漏部分里面,系统就无法回答用户问题了。所以还需要结合其他检索方法一起使用。
尽管有这个局限,就我们实战案例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
然后交给大模型调用。
然而以上函数有一个问题,就是大模型的输入长度是有限制的。那么当输入文本超过大模型输入长度限制的时候,又该如何处理呢?
如何对长文本进行摘要?
方法其实有很多,本着这门课程从最简单的入门方法讲起的原则,我们先讲一个最简单的方法。
- 将文本按某个长度或某种方法分成几段。
- 对这几段文本分别摘要。
- 将这几段摘要整合在一起。
具体代码如下。
def 对长文本进行摘要(输入文本):
if len(输入文本) > 文本划分长度:
文本list = 按长度划分文本(输入文本, 文本划分长度)
文本摘要结果 = ''
for 当前文本 in 文本list:
当前文本摘要结果=文本摘要(当前文本)
文本摘要结果 += 当前文本摘要结果 + '\n'
return 文本摘要结果
else:
return 文本摘要(输入文本)
这段代码很好理解。我们首先判断输入文本是否长于文本划分长度(对应第2行代码)。如果输入文本长于文本划分长度,则按文本划分长度分成一个list(对应第3行代码)。然后遍历这个list,对list里面的每一段文本进行摘要(对应第5、6行代码)。最后将这几段摘要整合在一起(对应第7行代码)。
按长度划分文本函数详细代码我们会在后面第12节课提到。
好了,现在我们了解了如何完成长文本的文本摘要。接下来我们来学习另一个基本概念,机器翻译。
机器翻译
首先我们讲一下为什么需要机器翻译。
为什么需要机器翻译?
一般来说,只要有以下需求的RAG应用,都是需要机器翻译的:
- 用户提问和入库知识是不同语言的。
- 入库知识是多种语言的。
- 用户提问可能会有多种语言的。
第一类以实战案例2为例。实战案例2抓取的CNET新闻是英文的。而用户需要的是中文的内容,用户提问也是中文的。用户提问是中文,入库知识是英文,两者是不同的语言,所以需要机器翻译。
第二类还是以实战案例2为例。如果我们扩展一下实战案例2,不仅仅抓取英文的IT新闻,还抓取日文、中文的IT新闻,那么我们的入库知识就有多种语言了。这时候我们就需要把日文的IT新闻也要翻译成中文了。
第三类以旧金山一些组织的RAG应用为例。旧金山的官方语言是英文、西班牙语、繁体中文。所以用户可能会用英文、西班牙语、繁体中文这三种语言之一进行提问。还有旅游相关的RAG应用,游客可能会用不同的语言进行提问。
对文本内容进行机器翻译
对于第一类和第二类RAG应用,我们需要对文本内容进行机器翻译。
我们先定义生成messages的函数。具体代码很简单。
def 构造英译中messages(输入字符串):
messages=[
{"role": "user", "content": f"""
请将以下文本翻译成中文:
{输入字符串}
"""},
]
return messages
然后我们将生成的messages传给大模型调用。
对用户提问和答案进行机器翻译
对于第三类RAG应用,我们首先需要对用户的提问进行机器翻译。具体代码如下。
然后对系统给出的回答进行机器翻译。具体代码如下。
如何对长文本进行翻译?
机器翻译和文本摘要会面临一个同样的问题——对于超过大模型输入长度限制的长文本,我们需要拆分成多段,然后单独翻译,最后再合并在一起。
现在我们按照与文本摘要同样的原则修改机器翻译代码,以支持长文本翻译。
def 对长文本进行翻译(输入文本):
if len(输入文本) > 文本划分长度:
文本list = 按长度划分文本(输入文本, 文本划分长度)
文本翻译结果 = ''
for 当前文本 in 文本list:
当前文本翻译结果=翻译成中文(当前文本)
文本翻译结果 += 当前文本翻译结果 + '\n'
return 文本翻译结果
else:
return 翻译成中文(输入文本)
有些同学可能会说,这样的长文本拆分方法会有问题。例如当拆分的位置不对,将一句话砍成两段之后会得到两句病句,本身就无法表达正确的意思。比如“我昨天在公园里看到一只可爱的小狗”这句话。当使用前面划分文本函数进行划分时,恰好在“天”字这里砍成了两段,变成了“我昨”、“天在公园里看到一只可爱的小狗”。可以预见的是,这两段话都不完整,本身就无法表达正确的意思。
首先,解决这个问题的方法是有的,例如分析文本之后按正确的换行符进行分段处理。但是出于这门课的教学目的,这里我想谈两点:
- 业务场景对准确率的要求是多少?
- 要达到业务目标需要投入多少资源进行细节处理?
我们先谈第一点。不少业务场景对文本摘要和机器翻译的准确率要求并不高。就本实战案例而言,业务目标是快速浏览判断新闻是否是我们感兴趣的内容。因此这样的划分方法其实可以实现业务目标了,因此已经足够了。
第二点,就是要达到业务目标需要投入多少资源进行细节处理。假设我们对文本摘要和机器翻译的准确率要求很高,那么我们就要计划好需要投入多少资源进行细节处理。投入这么多资源的收益是多少,是否划算。
小结
好了,今天这一讲到这里就结束了,最后我们来回顾一下。这一讲我们学会了四件事情。
第一件事情是知道了为什么需要文本摘要。文本摘要可以提高用户体验,可以提高检索效率。
第二件事情是掌握如何完成文本摘要。需要注意的是,大模型的输入长度是有限制的,因此当输入文本长度超过这个限制的时候,我们需要将输入文本拆成多段分别进行摘要再整合。
第三件事情是了解了为什么需要机器翻译。后面这三种情况都需要用到机器翻译:
- 用户提问和入库知识是不同语言。
- 入库知识有多种语言。
- 用户使用多种语言提问。
前两种情况我们需要对知识进行翻译,第三种情况我们需要对用户的提问和大模型的回答进行翻译。
现在实战案例2的基础概念我们都讲解完了。下一节我们将开始动手实现实战案例2,敬请期待。
思考题
在新闻简报这个案例背景下,我们是否需要对所有文章都进行文本摘要呢?
欢迎你在留言区和我交流互动,如果这节课对你有启发,也推荐分享给身边更多朋友。
- kevin 👍(0) 💬(1)
如果新闻很短,则无需摘要
2024-11-08 - 亚林 👍(0) 💬(0)
毕竟,这是一个入门课程
2025-02-18