当前位置: 首页 > article >正文

RAG的原理及代码实战(1)基本原理

RAG流程介绍

RAG-文档切分

1、背景

1.1 遇到的问题

在当今信息爆炸的时代,大型语言模型作为人工智能领域的重要成果,已经在许多方面展现出惊人的能力。然而,在这些强大的模型背后,我们也不应忽视它们所面临的挑战和限制。

  • 首先,我们必须认识到,尽管大型语言模型拥有处理海量文本数据的能力,但在实际应用中,它们在单次对话或任务中能够处理的文本长度却是有限的。这一限制在一定程度上影响了模型在处理需要大量背景知识的问题时的表现。当问题涉及复杂的背景信息时,模型可能无法充分利用其全部知识库,从而影响了回答的深度和准确性。
  • 其次,大型模型在专业知识和时效性方面也存在不足。由于单次训练成本高昂,且训练文本具有时效性,这些模型对于专业性知识和最新信息的响应能力相对较弱。在金融、医疗等需要特定领域知识的领域,以及需要最新数据的场景中,大型模型可能会显得力不从心。这意味着,尽管它们在通用领域表现卓越,但在特定领域和需要最新数据的场景中,仍需要人类专家的辅助。
  • 最后,大型模型在连接和整合分散在不同文档中的信息片段方面也面临挑战。尤其是在需要通过共享属性来连接信息片段以提供新的综合见解时,模型往往难以有效地进行信息整合。这一挑战限制了模型在提供深入分析和创新见解方面的能力,特别是在处理复杂问题时。

尽管存在这些挑战和限制,我们仍应看到大型语言模型在许多方面已经取得了显著的进展。通过不断的技术创新和优化,我们有理由相信,这些模型将在未来更好地服务于人类社会,为我们的生活带来更多便利。

1.2、解决的方向

在当今快速发展的AI领域,大型语言模型作为核心技术的代表,其知识储备的更新和优化显得尤为重要。为了使这些模型能够更好地适应不断变化的信息环境和用户需求,研究者们提出了多种更新大模型知识储备的方法。

  1. 首先,我们可以通过知识输入的方式更新模型的知识储备。这种方法的关键在于在模型的预训练、全量指令微调或高效微调阶段输入特定领域的文本,使模型能够“永久记住”某些信息。然而,这种方法的关键在于平衡输入文本的数量和质量,以确保模型既能记住重要信息,又不会被大量非关键信息所淹没。

  2. 其次,我们可以通过增加上下文长度的方式来更新模型的知识储备。这种方法通过增加模型能够处理的上下文长度,使其在一次问答中能够输入更多的相关文档。这无疑提高了模型在处理需要大量背景知识的问题时的能力,但同时也可能导致算力消耗大幅增加,这是我们需要权衡的一个问题。

  3. 最后,我们引出RAG技术,这是更新大模型知识储备的另一种有效方式。利用RAG技术,每次在模型回答问题之前,先从外部知识库中检索与问题相关的文本内容,然后将这些内容作为上下文输入给模型。这种方法可以显著提高模型回答问题的准确性和相关性,同时节省成本和提高响应速度,是未来大型模型发展的一个重要方向。

总的来说,更新大模型知识储备的三种方式各有利弊,我们需要根据实际需求和资源情况,选择最合适的方法。而RAG技术以其独特的优势,无疑为大型模型的知识更新提供了一种新的可能。

2、RAG原理

RAG(Retrieval - Augmented Generation)是一种结合了信息检索和语言生成的技术。它旨在通过检索相关信息来增强语言模型的生成能力,从而生成更准确、更有价值的回答。

2.1 RAG整体流程介绍

在这里插入图片描述

  1. 数据准备
    支持多种格式的数据,包括 PDF、TXT、Word(DOC)和 Markdown(MD)文件。这些文件是知识的来源。
  2. 切分(Chunking)
    将这些文件中的内容进行切分,将大段的文本切割成较小的、易于处理的块。这些块将作为后续步骤的基础。
  3. Embedding Model(嵌入模型)
    使用嵌入模型将切分后的文本块转换为向量表示。这些向量能够在高维空间中表示文本的语义信息。
  4. 查询向量(Query Vector)
    用户提出问题,这个问题同样通过嵌入模型转换为查询向量。这个向量将用于在向量空间中查找相关的文本块。
  5. 检索相关信息
    使用查询向量在嵌入模型生成的向量空间中检索与问题最相关的文本块。这些文本块将作为生成回答的依据。
  6. Prompt(提示)
    将检索到的相关文本块和用户的问题组合成提示(Prompt)。这个提示将被输入到大型语言模型(Large Language Model)中。
  7. Large Language Model(大型语言模型)
    使用大型语言模型根据提示生成回答。这个回答将综合用户的问题和检索到的相关信息,生成准确且有价值的内容。

2.2 文档切分

这里以PDF格式为例,其他格式只是读取的方式换一下即可

import PyPDF2
pdf_path = './data/test.pdf'
with open(pdf_path, 'rb') as file:
    reader = PyPDF2.PdfReader(file)
    text = ""
    for page in reader.pages:
        text += page.extract_text()

打印查看

无论如何,仇恨与痛苦,快乐与悲伤,都已结束。
在之前的文章中,我曾经写过无数个人物,有好人,也有坏人,而张居正,无疑是最为特殊
的一个。
他是一个天才,生于纷繁复杂之乱世,身负绝学,以一介草民闯荡二十余年,终成大器。
他敢于改革,敢于创新,不惧风险,不怕威胁,是一个伟大的改革家。他也有缺点,他独断
专行,待人不善,生活奢侈,表里不一,是个道德并不高尚的人。
一句话,他不是好人,也不是坏人,而是一个复杂的人。
但在明代浩如烟海的人物中,最打动我的,却正是这个复杂的人。
十年前,当我即将踏入大学校园时,在一个极为特殊的场合,有一个人对我说过这样一番话:
你还很年轻,将来你会遇到很多人,经历很多事,得到很多,也会失去很多,但无论如何,
有两样东西,你绝不能丢弃,一个叫良心,另一个叫理想。
我记得,当时我碍于形势,连连点头,虽然我并不知道这句话的真实含义。
一晃十年过去了,如他所言,我得到了很多,也失去了很多,所幸,这两样东西我还带着,
虽然不多,总算还有。
当然,我并不因此而感到自豪,因为这并非是我的意志有多坚强,或是人格有多高尚,唯一
的原因在于,我遇到的人还不够坏,经历的事情还不够多,吃的苦头还不够大。
我也曾经见到,许多道貌岸然的所谓道学家,整日把仁义道德放在嘴边,所作所为却尽为男
盗女娼之流。
我并不愤怒,恰恰相反,我理解他们,在生存的压力和生命的尊严之间,他们选择了前者,
仅此而已,虽不合法,却很合理。
我不知道,是否所有的人在历经沧桑苦难之后,都会变成和他们一样的人。
直到我真正读懂了张居正,读懂了他的经历、他的情感,以及他的选择,我才找到了一个答
案,一个让人宽慰的答案。
他用他的人生告诉我们,良知和理想是不会消失的,不因富贵而逝去,不因权势而凋亡。
不是好人,不是坏人,他是一个有理想、有良心的人。
〖张居正,字叔大,嘉靖四年(1525)生,湖广江陵人。
少颖敏绝伦,嘉靖十八年(1539)中秀才,嘉靖十九年(1540)中举人,人皆称道。
嘉靖二十六年(1547),成进士,改庶吉士,授翰林编修。徐阶辈皆器重之。
嘉靖四十一年(1562),徐阶代嵩为首辅,倾心委于张居正,信任有加,草拟遗诏,引与共
谋。
隆庆元年(1567),张居正四十三岁,任礼部尚书兼武英殿大学士,加少保兼太子太保,进
入内阁。
隆庆六年(1572),隆庆驾崩,张居正引冯保为盟,密谋驱逐高拱,事成,遂代拱为内阁首
辅。
万历元年(1573),张居正主政,推行考成法,整顿官吏,贪吏闻风丧胆。政令传出,虽万
里外,朝下而夕奉行。
万历六年(1578),丈量天下土地,推行一条鞭法,百姓为之欢颜,天下丰饶,仓粟充盈,
可支十年有余。
万历十年(1582)六月,张居正年五十八岁,去世,死后抄家。长子自尽,次子充军。〗
有的人活着,他已经死了。
有的人死了,他还活着。
世间已无张居正。

文档切分是RAG流程中的关键步骤,不同的切分方法各有优缺点,常见的基本上是按照换行符切分、按照特殊的符号(如句号等)切分、按照长度切分和滑动窗口切分,以下是几种常见文档切分方法的介绍及其优缺点:

  • 按照换行符切分:
    优点:简单易实现,适用于格式化良好的文档,如文章、报告等。
    缺点:可能将一个完整的句子或段落分割成多个部分,导致信息不完整;对于格式不规则的文档效果不佳。

  • 按照特殊符号切分:
    优点:可以保持句子的完整性,适用于需要保持句子结构的场景。
    缺点:对于没有明确结束符号的文本(如连续的描述性文本)效果不佳;可能将长句子分割成多个部分。

  • 按照长度切分:
    优点:可以控制每个文本单元的大小,适用于需要固定长度输入的场景。
    缺点:可能将一个完整的句子或段落分割成多个部分,导致信息不完整;对于不同长度的句子可能不够灵活。

  • 滑动窗口切分:
    优点:可以灵活地处理不同长度的句子,同时保持句子的完整性。滑动窗口切分通过设置一个窗口大小,在文档中滑动这个窗口,每次切分出一个窗口大小的文本单元。这种方法可以有效地平衡文本单元的大小和信息的完整性。
    缺点:需要选择合适的窗口大小,过小可能导致信息不完整,过大可能导致处理效率降低。

    滑动窗口切分的优势在于其灵活性,它可以根据需要调整窗口大小,以适应不同长度的句子,同时保持句子的完整性。这种方法在处理长文档或需要保持句子结构的场景中特别有效。

2.2.1 换行符切分

def split_by_newline(text):
    return text.split('\n')
newline_chunk = []

for chunk in split_by_newline(text):
    newline_chunk.append(chunk)

打印查看

['无论如何,仇恨与痛苦,快乐与悲伤,都已结束。',
 '在之前的文章中,我曾经写过无数个人物,有好人,也有坏人,而张居正,无疑是最为特殊',
 '的一个。',
 '他是一个天才,生于纷繁复杂之乱世,身负绝学,以一介草民闯荡二十余年,终成大器。',
 '他敢于改革,敢于创新,不惧风险,不怕威胁,是一个伟大的改革家。他也有缺点,他独断',
 '专行,待人不善,生活奢侈,表里不一,是个道德并不高尚的人。',
 '一句话,他不是好人,也不是坏人,而是一个复杂的人。',
 '但在明代浩如烟海的人物中,最打动我的,却正是这个复杂的人。',
 '十年前,当我即将踏入大学校园时,在一个极为特殊的场合,有一个人对我说过这样一番话:',
 '你还很年轻,将来你会遇到很多人,经历很多事,得到很多,也会失去很多,但无论如何,',
 '有两样东西,你绝不能丢弃,一个叫良心,另一个叫理想。',
 '我记得,当时我碍于形势,连连点头,虽然我并不知道这句话的真实含义。',
 '一晃十年过去了,如他所言,我得到了很多,也失去了很多,所幸,这两样东西我还带着,',
 '虽然不多,总算还有。',
 '当然,我并不因此而感到自豪,因为这并非是我的意志有多坚强,或是人格有多高尚,唯一',
 '的原因在于,我遇到的人还不够坏,经历的事情还不够多,吃的苦头还不够大。',
 '我也曾经见到,许多道貌岸然的所谓道学家,整日把仁义道德放在嘴边,所作所为却尽为男',
 '盗女娼之流。',
 '我并不愤怒,恰恰相反,我理解他们,在生存的压力和生命的尊严之间,他们选择了前者,',
 '仅此而已,虽不合法,却很合理。',
 '我不知道,是否所有的人在历经沧桑苦难之后,都会变成和他们一样的人。',
 '直到我真正读懂了张居正,读懂了他的经历、他的情感,以及他的选择,我才找到了一个答',
 '案,一个让人宽慰的答案。',
 '他用他的人生告诉我们,良知和理想是不会消失的,不因富贵而逝去,不因权势而凋亡。',
 '不是好人,不是坏人,他是一个有理想、有良心的人。',
 '〖张居正,字叔大,嘉靖四年(1525)生,湖广江陵人。',
 '少颖敏绝伦,嘉靖十八年(1539)中秀才,嘉靖十九年(1540)中举人,人皆称道。',
 '嘉靖二十六年(1547),成进士,改庶吉士,授翰林编修。徐阶辈皆器重之。',
 '嘉靖四十一年(1562),徐阶代嵩为首辅,倾心委于张居正,信任有加,草拟遗诏,引与共',
 '谋。',
 '隆庆元年(1567),张居正四十三岁,任礼部尚书兼武英殿大学士,加少保兼太子太保,进',
 '入内阁。',
 '隆庆六年(1572),隆庆驾崩,张居正引冯保为盟,密谋驱逐高拱,事成,遂代拱为内阁首',
 '辅。',
 '万历元年(1573),张居正主政,推行考成法,整顿官吏,贪吏闻风丧胆。政令传出,虽万',
 '里外,朝下而夕奉行。',
 '万历六年(1578),丈量天下土地,推行一条鞭法,百姓为之欢颜,天下丰饶,仓粟充盈,',
 '可支十年有余。',
 '万历十年(1582)六月,张居正年五十八岁,去世,死后抄家。长子自尽,次子充军。〗',
 '有的人活着,他已经死了。',
 '有的人死了,他还活着。',
 '世间已无张居正。']
newline_chunk[0]
'无论如何,仇恨与痛苦,快乐与悲伤,都已结束。'

2.2.2 按照句号切分

period_chunk = []

for chunk in split_by_period(text):
    period_chunk.append(chunk)

查看

['无论如何,仇恨与痛苦,快乐与悲伤,都已结束',
 '在之前的文章中,我曾经写过无数个人物,有好人,也有坏人,而张居正,无疑是最为特殊\n的一个',
 '他是一个天才,生于纷繁复杂之乱世,身负绝学,以一介草民闯荡二十余年,终成大器',
 '他敢于改革,敢于创新,不惧风险,不怕威胁,是一个伟大的改革家',
 '他也有缺点,他独断\n专行,待人不善,生活奢侈,表里不一,是个道德并不高尚的人',
 '一句话,他不是好人,也不是坏人,而是一个复杂的人',
 '但在明代浩如烟海的人物中,最打动我的,却正是这个复杂的人',
 '十年前,当我即将踏入大学校园时,在一个极为特殊的场合,有一个人对我说过这样一番话:\n你还很年轻,将来你会遇到很多人,经历很多事,得到很多,也会失去很多,但无论如何,\n有两样东西,你绝不能丢弃,一个叫良心,另一个叫理想',
 '我记得,当时我碍于形势,连连点头,虽然我并不知道这句话的真实含义',
 '一晃十年过去了,如他所言,我得到了很多,也失去了很多,所幸,这两样东西我还带着,\n虽然不多,总算还有',
 '当然,我并不因此而感到自豪,因为这并非是我的意志有多坚强,或是人格有多高尚,唯一\n的原因在于,我遇到的人还不够坏,经历的事情还不够多,吃的苦头还不够大',
 '我也曾经见到,许多道貌岸然的所谓道学家,整日把仁义道德放在嘴边,所作所为却尽为男\n盗女娼之流',
 '我并不愤怒,恰恰相反,我理解他们,在生存的压力和生命的尊严之间,他们选择了前者,\n仅此而已,虽不合法,却很合理',
 '我不知道,是否所有的人在历经沧桑苦难之后,都会变成和他们一样的人',
 '直到我真正读懂了张居正,读懂了他的经历、他的情感,以及他的选择,我才找到了一个答\n案,一个让人宽慰的答案',
 '他用他的人生告诉我们,良知和理想是不会消失的,不因富贵而逝去,不因权势而凋亡',
 '不是好人,不是坏人,他是一个有理想、有良心的人',
 '〖张居正,字叔大,嘉靖四年(1525)生,湖广江陵人',
 '少颖敏绝伦,嘉靖十八年(1539)中秀才,嘉靖十九年(1540)中举人,人皆称道',
 '嘉靖二十六年(1547),成进士,改庶吉士,授翰林编修',
 '徐阶辈皆器重之',
 '嘉靖四十一年(1562),徐阶代嵩为首辅,倾心委于张居正,信任有加,草拟遗诏,引与共\n谋',
 '隆庆元年(1567),张居正四十三岁,任礼部尚书兼武英殿大学士,加少保兼太子太保,进\n入内阁',
 '隆庆六年(1572),隆庆驾崩,张居正引冯保为盟,密谋驱逐高拱,事成,遂代拱为内阁首\n辅',
 '万历元年(1573),张居正主政,推行考成法,整顿官吏,贪吏闻风丧胆',
 '政令传出,虽万\n里外,朝下而夕奉行',
 '万历六年(1578),丈量天下土地,推行一条鞭法,百姓为之欢颜,天下丰饶,仓粟充盈,\n可支十年有余',
 '万历十年(1582)六月,张居正年五十八岁,去世,死后抄家',
 '长子自尽,次子充军',
 '〗\n有的人活着,他已经死了',
 '有的人死了,他还活着',
 '世间已无张居正']

2.2.3 按照长度切分

length_chunk = []

for chunk in split_by_length(text):
    length_chunk.append(chunk)

查看

['无论如何,仇恨与痛苦,快乐与悲伤,都已结束。\n在之前的文章中,我曾经写过无数个人物,有好人,也有坏人,而张居正,无疑是最为特殊\n的一个。\n他是一个天才,生于纷繁复杂之乱世,身负绝学,以一介草民闯荡二十',
 '余年,终成大器。\n他敢于改革,敢于创新,不惧风险,不怕威胁,是一个伟大的改革家。他也有缺点,他独断\n专行,待人不善,生活奢侈,表里不一,是个道德并不高尚的人。\n一句话,他不是好人,也不是坏人,而是一个',
 '复杂的人。\n但在明代浩如烟海的人物中,最打动我的,却正是这个复杂的人。\n十年前,当我即将踏入大学校园时,在一个极为特殊的场合,有一个人对我说过这样一番话:\n你还很年轻,将来你会遇到很多人,经历很多事,',
 '得到很多,也会失去很多,但无论如何,\n有两样东西,你绝不能丢弃,一个叫良心,另一个叫理想。\n我记得,当时我碍于形势,连连点头,虽然我并不知道这句话的真实含义。\n一晃十年过去了,如他所言,我得到了很多,',
 '也失去了很多,所幸,这两样东西我还带着,\n虽然不多,总算还有。\n当然,我并不因此而感到自豪,因为这并非是我的意志有多坚强,或是人格有多高尚,唯一\n的原因在于,我遇到的人还不够坏,经历的事情还不够多,吃',
 '的苦头还不够大。\n我也曾经见到,许多道貌岸然的所谓道学家,整日把仁义道德放在嘴边,所作所为却尽为男\n盗女娼之流。\n我并不愤怒,恰恰相反,我理解他们,在生存的压力和生命的尊严之间,他们选择了前者,\n仅此',
 '而已,虽不合法,却很合理。\n我不知道,是否所有的人在历经沧桑苦难之后,都会变成和他们一样的人。\n直到我真正读懂了张居正,读懂了他的经历、他的情感,以及他的选择,我才找到了一个答\n案,一个让人宽慰的答案',
 '。\n他用他的人生告诉我们,良知和理想是不会消失的,不因富贵而逝去,不因权势而凋亡。\n不是好人,不是坏人,他是一个有理想、有良心的人。\n〖张居正,字叔大,嘉靖四年(1525)生,湖广江陵人。\n少颖敏绝伦',
 ',嘉靖十八年(1539)中秀才,嘉靖十九年(1540)中举人,人皆称道。\n嘉靖二十六年(1547),成进士,改庶吉士,授翰林编修。徐阶辈皆器重之。\n嘉靖四十一年(1562),徐阶代嵩为首辅,倾心委于张',
 '居正,信任有加,草拟遗诏,引与共\n谋。\n隆庆元年(1567),张居正四十三岁,任礼部尚书兼武英殿大学士,加少保兼太子太保,进\n入内阁。\n隆庆六年(1572),隆庆驾崩,张居正引冯保为盟,密谋驱逐高拱,',
 '事成,遂代拱为内阁首\n辅。\n万历元年(1573),张居正主政,推行考成法,整顿官吏,贪吏闻风丧胆。政令传出,虽万\n里外,朝下而夕奉行。\n万历六年(1578),丈量天下土地,推行一条鞭法,百姓为之欢颜,',
 '天下丰饶,仓粟充盈,\n可支十年有余。\n万历十年(1582)六月,张居正年五十八岁,去世,死后抄家。长子自尽,次子充军。〗\n有的人活着,他已经死了。\n有的人死了,他还活着。\n世间已无张居正。']
print(length_chunk[0])
无论如何,仇恨与痛苦,快乐与悲伤,都已结束。
在之前的文章中,我曾经写过无数个人物,有好人,也有坏人,而张居正,无疑是最为特殊
的一个。
他是一个天才,生于纷繁复杂之乱世,身负绝学,以一介草民闯荡二十

2.2.4 滑动窗口切分

sliding_window_chunk = []

for chunk in split_by_sliding_window(text):
    sliding_window_chunk.append(chunk)

打印查看

['无论如何,仇恨与痛苦,快乐与悲伤,都已结束。\n在之前的文章中,我曾经写过无数个人物,有好人,也有坏人,而张居正,无疑是最为特殊\n的一个。\n他是一个天才,生于纷繁复杂之乱世,身负绝学,以一介草民闯荡二十',
 ',而张居正,无疑是最为特殊\n的一个。\n他是一个天才,生于纷繁复杂之乱世,身负绝学,以一介草民闯荡二十余年,终成大器。\n他敢于改革,敢于创新,不惧风险,不怕威胁,是一个伟大的改革家。他也有缺点,他独断\n',
 '余年,终成大器。\n他敢于改革,敢于创新,不惧风险,不怕威胁,是一个伟大的改革家。他也有缺点,他独断\n专行,待人不善,生活奢侈,表里不一,是个道德并不高尚的人。\n一句话,他不是好人,也不是坏人,而是一个',
 '专行,待人不善,生活奢侈,表里不一,是个道德并不高尚的人。\n一句话,他不是好人,也不是坏人,而是一个复杂的人。\n但在明代浩如烟海的人物中,最打动我的,却正是这个复杂的人。\n十年前,当我即将踏入大学校园',
 '复杂的人。\n但在明代浩如烟海的人物中,最打动我的,却正是这个复杂的人。\n十年前,当我即将踏入大学校园时,在一个极为特殊的场合,有一个人对我说过这样一番话:\n你还很年轻,将来你会遇到很多人,经历很多事,',
 '时,在一个极为特殊的场合,有一个人对我说过这样一番话:\n你还很年轻,将来你会遇到很多人,经历很多事,得到很多,也会失去很多,但无论如何,\n有两样东西,你绝不能丢弃,一个叫良心,另一个叫理想。\n我记得,',
 '得到很多,也会失去很多,但无论如何,\n有两样东西,你绝不能丢弃,一个叫良心,另一个叫理想。\n我记得,当时我碍于形势,连连点头,虽然我并不知道这句话的真实含义。\n一晃十年过去了,如他所言,我得到了很多,',
 '当时我碍于形势,连连点头,虽然我并不知道这句话的真实含义。\n一晃十年过去了,如他所言,我得到了很多,也失去了很多,所幸,这两样东西我还带着,\n虽然不多,总算还有。\n当然,我并不因此而感到自豪,因为这并',
 '也失去了很多,所幸,这两样东西我还带着,\n虽然不多,总算还有。\n当然,我并不因此而感到自豪,因为这并非是我的意志有多坚强,或是人格有多高尚,唯一\n的原因在于,我遇到的人还不够坏,经历的事情还不够多,吃',
 '非是我的意志有多坚强,或是人格有多高尚,唯一\n的原因在于,我遇到的人还不够坏,经历的事情还不够多,吃的苦头还不够大。\n我也曾经见到,许多道貌岸然的所谓道学家,整日把仁义道德放在嘴边,所作所为却尽为男\n',
 '的苦头还不够大。\n我也曾经见到,许多道貌岸然的所谓道学家,整日把仁义道德放在嘴边,所作所为却尽为男\n盗女娼之流。\n我并不愤怒,恰恰相反,我理解他们,在生存的压力和生命的尊严之间,他们选择了前者,\n仅此',
 '盗女娼之流。\n我并不愤怒,恰恰相反,我理解他们,在生存的压力和生命的尊严之间,他们选择了前者,\n仅此而已,虽不合法,却很合理。\n我不知道,是否所有的人在历经沧桑苦难之后,都会变成和他们一样的人。\n直到',
 '而已,虽不合法,却很合理。\n我不知道,是否所有的人在历经沧桑苦难之后,都会变成和他们一样的人。\n直到我真正读懂了张居正,读懂了他的经历、他的情感,以及他的选择,我才找到了一个答\n案,一个让人宽慰的答案',
 '我真正读懂了张居正,读懂了他的经历、他的情感,以及他的选择,我才找到了一个答\n案,一个让人宽慰的答案。\n他用他的人生告诉我们,良知和理想是不会消失的,不因富贵而逝去,不因权势而凋亡。\n不是好人,不是坏',
 '。\n他用他的人生告诉我们,良知和理想是不会消失的,不因富贵而逝去,不因权势而凋亡。\n不是好人,不是坏人,他是一个有理想、有良心的人。\n〖张居正,字叔大,嘉靖四年(1525)生,湖广江陵人。\n少颖敏绝伦',
 '人,他是一个有理想、有良心的人。\n〖张居正,字叔大,嘉靖四年(1525)生,湖广江陵人。\n少颖敏绝伦,嘉靖十八年(1539)中秀才,嘉靖十九年(1540)中举人,人皆称道。\n嘉靖二十六年(1547),',
 ',嘉靖十八年(1539)中秀才,嘉靖十九年(1540)中举人,人皆称道。\n嘉靖二十六年(1547),成进士,改庶吉士,授翰林编修。徐阶辈皆器重之。\n嘉靖四十一年(1562),徐阶代嵩为首辅,倾心委于张',
 '成进士,改庶吉士,授翰林编修。徐阶辈皆器重之。\n嘉靖四十一年(1562),徐阶代嵩为首辅,倾心委于张居正,信任有加,草拟遗诏,引与共\n谋。\n隆庆元年(1567),张居正四十三岁,任礼部尚书兼武英殿大学',
 '居正,信任有加,草拟遗诏,引与共\n谋。\n隆庆元年(1567),张居正四十三岁,任礼部尚书兼武英殿大学士,加少保兼太子太保,进\n入内阁。\n隆庆六年(1572),隆庆驾崩,张居正引冯保为盟,密谋驱逐高拱,',
 '士,加少保兼太子太保,进\n入内阁。\n隆庆六年(1572),隆庆驾崩,张居正引冯保为盟,密谋驱逐高拱,事成,遂代拱为内阁首\n辅。\n万历元年(1573),张居正主政,推行考成法,整顿官吏,贪吏闻风丧胆。政',
 '事成,遂代拱为内阁首\n辅。\n万历元年(1573),张居正主政,推行考成法,整顿官吏,贪吏闻风丧胆。政令传出,虽万\n里外,朝下而夕奉行。\n万历六年(1578),丈量天下土地,推行一条鞭法,百姓为之欢颜,',
 '令传出,虽万\n里外,朝下而夕奉行。\n万历六年(1578),丈量天下土地,推行一条鞭法,百姓为之欢颜,天下丰饶,仓粟充盈,\n可支十年有余。\n万历十年(1582)六月,张居正年五十八岁,去世,死后抄家。长',
 '天下丰饶,仓粟充盈,\n可支十年有余。\n万历十年(1582)六月,张居正年五十八岁,去世,死后抄家。长子自尽,次子充军。〗\n有的人活着,他已经死了。\n有的人死了,他还活着。\n世间已无张居正。',
 '子自尽,次子充军。〗\n有的人活着,他已经死了。\n有的人死了,他还活着。\n世间已无张居正。']
print(sliding_window_chunk[0])

无论如何,仇恨与痛苦,快乐与悲伤,都已结束。
在之前的文章中,我曾经写过无数个人物,有好人,也有坏人,而张居正,无疑是最为特殊
的一个。
他是一个天才,生于纷繁复杂之乱世,身负绝学,以一介草民闯荡二十

print(sliding_window_chunk[1])


,而张居正,无疑是最为特殊
的一个。
他是一个天才,生于纷繁复杂之乱世,身负绝学,以一介草民闯荡二十余年,终成大器。
他敢于改革,敢于创新,不惧风险,不怕威胁,是一个伟大的改革家。他也有缺点,他独断

2.3 token计算

在实际的大模型使用过程中都是使用token来进行对输入输出的内容进行划分和计数的所以我们在切分时也需要使用token来进行切分。

import tiktoken

encoder = tiktoken.get_encoding("cl100k_base")

举个例子

t = "RAG的原理及代码实战"
num_tokens = len(encoder.encode(t))
print(f"Number of tokens: {num_tokens}")

Number of tokens: 10

编码解码

encoded = encoder.encode(t)
print(f"Encoded tokens: {encoded}")

decoded = encoder.decode(encoded)
print(f"Decoded text: {decoded}")

Encoded tokens: [49, 1929, 9554, 53229, 22649, 82317, 47200, 41073, 7688, 246]
Decoded text: RAG的原理及代码实战

定义划分的函数

def split_by_sliding_window_with_tokens(text, encoder, window_size_tokens=100, step_size_tokens=50):
    chunks = []
    tokens = encoder.encode(text)
    start = 0
    while start < len(tokens):
        end = start + window_size_tokens
        if end > len(tokens):
            end = len(tokens)
        chunk_tokens = tokens[start:end]
        chunks.append(encoder.decode(chunk_tokens))
        start += step_size_tokens
    return chunks

切分后可查看

print(sliding_window_chunk_tokens[0])

无论如何,仇恨与痛苦,快乐与悲伤,都已结束。
在之前的文章中,我曾经写过无数个人物,有好人,也有坏人,而张居正,无疑是最为特殊
的一个。
他是一个天才,生于纷繁复杂之乱

print(sliding_window_chunk_tokens[1])

有好人,也有坏人,而张居正,无疑是最为特殊
的一个。
他是一个天才,生于纷繁复杂之乱世,身负绝学,以一介草民闯荡二十余年,终成大器。
他敢于改革,敢于创新,不惧�

未完待续、、、、、


http://www.kler.cn/a/534465.html

相关文章:

  • 【论文精读】Taming Transformers for High-Resolution Image Synthesis
  • React开发中箭头函数返回值陷阱的深度解析
  • 20250205——Windows系统基于ollama的DeepSeek-R1本地安装
  • TCP编程
  • 【Envi遥感图像处理】009:envi5.6设置中文界面的方法
  • C++游戏开发实战:从引擎架构到物理碰撞
  • TaskBuilder低代码开发项目实战—1、实战项目简介
  • linux环境自动化golang项目启动脚本解析
  • stm32点灯 GPIO的输出模式
  • 中国城商行信贷业务数仓建设白皮书(第三期:数据治理体系深度实践)
  • edu小程序挖掘严重支付逻辑漏洞
  • Python调用C++程序实现
  • 尝试把clang-tidy集成到AWTK项目
  • 字母异位词分组(哈希表)
  • LangChain实践1-使用 LangChain 开发应用程序
  • 基于遗传算法的256QAM星座图的最优概率整形matlab仿真,对比优化前后整形星座图和误码率
  • 深入理解k8s中的容器存储接口(CSI)
  • 0 帧起步,腾讯云 TI 平台 5 分钟 私有化 DeepSeek
  • 51单片机 04 编程
  • 【Elasticsearch】 Composite Aggregation 详解
  • React中key值的正确使用指南:为什么需要它以及如何选择
  • 【MySql】数据库Redo日志介绍
  • Slint的学习
  • 文本生图的提示词prompt和参数如何设置(基于Animagine XL V3.1)
  • 2025.2.5总结
  • Deepseek v3R1 学习笔记