直达「 通往AGI之路 」飞书知识库 →
首页/问答列表/问答详情

什么是RAG的分词?

回答

RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合检索和生成能力的自然语言处理架构,旨在为大语言模型(LLM)提供额外的、来自外部知识源的信息。通过检索的模式为大语言模型的生成提供帮助,使大模型生成的答案更符合要求。

LLM 需要 RAG 进行检索优化的原因在于 LLM 存在一些缺点:

  1. 无法记住所有知识,尤其是长尾的,受限于训练数据和现有的学习方式,对长尾知识的接受能力不高。
  2. 知识容易过时且不好更新,微调效果不佳且有丢失原有知识的风险。
  3. 输出难以解释和验证,存在内容黑盒、不可控以及受幻觉干扰等问题。
  4. 容易泄露隐私训练数据。
  5. 规模大,训练和运行成本高。

RAG 具有以下优点:

  1. 数据库对数据的存储和更新稳定,不存在模型学不会的风险。
  2. 数据库的数据更新敏捷,增删改查可解释,且对原有知识无影响。
  3. 数据库内容明确、结构化,加上模型的理解能力,能降低大模型输出出错的可能。
  4. 知识库存储用户数据,便于管控用户隐私数据,且可控、稳定、准确。
  5. 数据库维护可降低大模型的训练成本,新知识存储在数据库即可,无需频繁更新模型。

在 PDF 结构识别方面,基于规则的方法 PyPDF 存在一些问题:

  1. 不擅于检测段落的边界,没有解析段落的边界,使用特殊分隔符“.\n”的启发式方法在很多情况下不成立。
  2. 无法识别表格内的结构,表格的结构会被完全破坏,大语言模型无法从中辨别有意义的信息。
  3. 无法识别内容的阅读顺序,按照字符存储顺序解析文档,面对复杂布局时可能导致解析结果混乱。
  4. 无法识别段落和表格的边界,会错误地分割表格,并将部分与后续段落合并。

PyPDF 的解析和分块工作流程是:先将 PDF 文档中的字符序列化为没有文档结构信息的长序列,然后使用分割规则如换行符“\n”进行分割,仅当组合块的长度不超过预定限制 N 个字符时,才会合并相邻块。

内容由 AI 大模型生成,请仔细甄别(powered by aily)

参考资料

问:RAG 是什么?

RAG(Retrieval-Augmented Generation),即检索增强生成,是一种结合检索和生成能力的自然语言处理架构,它旨在为大语言模型(LLM)提供额外的、来自外部知识源的信息。简单来说,就是通过检索的模式,为大语言模型的生成提供帮助,从而使大模型生成的答案更符合要求。[heading2]为什么LLM需要RAG?[content]众所周知,大模型已经在很多领域和问题下都取得了很好的效果,那为什么还需要RAG进行检索优化呢?[heading3]LLM的缺点[content]1.LLM无法记住所有知识,尤其是长尾的。受限于训练数据、现有的学习方式,对长尾知识的接受能力并不是很高;长尾数据是指数据集中某些类别数量较少,而其他类别样本数较多的不平衡“长尾”状态。例如在自然语言处理中,一些少见的词汇出现频率很低,而常见的词汇出现频率很高。2.LLM的知识容易过时,而且不好更新。只是通过微调,模型的接受能力其实并不高而且很慢,甚至有丢失原有知识的风险;3.LLM的输出难以解释和验证。一方面最终的输出的内容黑盒且不可控,另一方面最终的结果输出可能会受到幻觉之类的问题的干扰;4.LLM容易泄露隐私训练数据。用用户个人信息训练模型,会让模型可以通过诱导泄露用户的隐私;5.LLM的规模大,训练和运行的成本都很大。[heading3]RAG的优点[content]1.数据库对数据的存储和更新是稳定的,不像模型会存在学不会的风险。2.数据库的数据更新可以做得很敏捷,增删改查可解释,而且对原有的知识不会有影响。3.数据库的内容是明确、结构化的,加上模型本身的理解能力,一般而言数据库中的内容以及检索算法不出错,大模型的输出出错的可能就大大降低。4.知识库中存储用户数据,为用户隐私数据的管控带来很大的便利,而且可控、稳定、准确。5.数据库维护起来,可以降低大模型的训练成本,毕竟新知识存储在数据库即可,不用频繁更新模型,尤其是不用因为知识的更新而训练模型。

通过增强PDF结构识别,革新检索增强生成技术(RAG)

PyPDF似乎擅于检测段落的边界,因为它不会将一个段落分割成多个分块。但实际上它并没有解析段落的边界。在“2分块结果”部分我们可以看到,页面中的每个可视文本行在结果中都被解析为以“\n”结尾的一行,并且段落末尾没有特殊格式。PyPDF能够正确地划分段落,是因为我们使用了一个特殊的分隔符“.\n”,它会将一个以句点结尾的行视为可能是段落的结束。然而,这种启发式方法(Heuristic)在许多情况下可能不成立。1.PyPDF无法识别表格内的结构。在“2分块结果”部分,在分块1中,表格的上半部分表示为一系列短语,其中一个单元格可能被拆分成多行(例如单元格“China commerce(1)”),一些相邻的单元格可能被排列在一行中(例如第二行中的第三到第五个单元格,”services(1)Cainiao Cloud”)。所以,表格的结构被完全破坏。如果此分块被检索用于RAG,大语言模型无法从中辨别到任何有意义的信息。分块2的情况也是类似的。此外,表格的表头只存在于分块1中,因此分块2中的表格下半部分变得没有意义。1.PyPDF无法识别内容的阅读顺序。分块5的最后一行“Management Discussion and Analysis”实际位于页面顶部,但在结果中被解析为最后一句。这是因为PyPDF按照字符的存储顺序解析文档,而非它们的阅读顺序。当面对复杂布局时,这可能导致解析结果混乱。另一个案例2为复杂的跨页表格,其解析结果如附录中的图15所示。

通过增强PDF结构识别,革新检索增强生成技术(RAG)

我们先介绍基于PyPDF的解析和分块工作流程。首先,PyPDF将PDF文档中的字符序列化为一个没有文档结构信息的长序列。然后,PyPDF使用一些分割规则对该序列进行分割,如LangChain中的“RecursiveCharacterTextSplitter”函数。具体来说,该函数根据预定义的分隔符列表分割文档,如换行符“\n”。在此初始分割之后,仅当组合块的长度不超过预定限制N个字符时,才会合并相邻块。以下内容中,在没有上下文歧义的情况下,我们使用“PyPDF”来指代使用PyPDF + RecursiveCharacterTextSplitter进行文档解析和分块的方法。下面将分块的最大长度设置为300个词元(Token)。我们通过一个案例来观察PyPDF的固有特征。如图4所示,案例1的文档页面中的表格与双列文本混合布局,两者的边界难以区分。表格中间的行没有水平线,因此表格中的行很难被识别。段落既有单列布局(表下的注释),也有双列布局(页面下部的段落)。图4案例一中PyPDF的解析和分块结果(原文档:[4])。放大查看细节。PyPDF的解析和分块结果如图4所示。在“3分块结果可视化”部分,我们可以看到PyPDF正确识别了页面的单列和双列布局部分。但是PyPDF存在以下三个缺点:1.PyPDF无法识别段落和表格的边界。它错误地将表格分割成两部分,并将第二部分与后续段落合并为一个分块。

其他人在问
我希望做一个回答用户问题的聊天机器人,如何用rag来做
要使用 RAG(RetrievalAugmented Generation,检索增强生成)来做一个回答用户问题的聊天机器人,可以按照以下步骤进行: 1. 加载所需的库和模块:包括用于解析 RSS 订阅源的 feedparse,用于在 Python 程序中跑大模型的 ollama(使用前需确保 ollama 服务已开启并下载好模型)。 2. 从订阅源获取内容:通过特定函数从指定的 RSS 订阅 URL 提取内容,如需接收多个 URL 可稍作改动。然后使用专门的文本拆分器将长文本拆分成较小的块,并附带相关元数据,如标题、发布日期和链接,最终将这些文档合并成一个列表用于后续处理。 3. 为文档内容生成向量:使用文本向量模型 bgem3(可从 https://huggingface.co/BAAI/bgem3 下载,假设放置在某个路径 /path/to/bgem3 ),通过 FAISS 创建一个高效的向量存储。 4. 基于用户的问题,从向量数据库中检索相关段落,并根据设定的阈值进行过滤,最后让模型参考上下文信息回答用户的问题,从而实现 RAG。 5. 创建网页 UI:通过 gradio 创建网页 UI 并进行评测。 6. 技术栈选择:经过调研,可先采取 Langchain + Ollama 的技术栈作为 demo 实现,后续也可考虑使用 dify、fastgpt 等更直观易用的 AI 开发平台。 Langchain 简介:是当前大模型应用开发的主流框架之一,提供一系列工具和接口,其核心在于“链”概念,包括 Model I/O、Retrieval、Chains、Agents、Memory 和 Callbacks 等组件,生态系统还包括 LangSmith、LangGraph 和 LangServe 等工具。 Ollama 简介:是一个开箱即用的用于在本地运行大模型的框架。 总结: 1. 本文展示了如何使用 Langchain 和 Ollama 技术栈在本地部署一个资讯问答机器人,同时结合 RSSHub 来处理和提供资讯。 2. 上下文数据质量和大模型的性能决定了 RAG 系统性能的上限。 3. RAG 通过结合检索技术和生成模型来提升答案的质量和相关性,可以缓解大模型幻觉、信息滞后的问题,但并不意味着可以消除。
2024-11-20
RAG研究报告有哪些
以下是一些关于 RAG 的研究报告: 1. 《RAG 系统开发中的 12 大痛点及解决方案》:研究了开发检索增强生成(RAG)系统时遇到的 12 个主要难题,并提出了相应的解决策略。通过将挑战和解决方法并列在一张表中,更直观地展示了设计和实施 RAG 系统面临的复杂挑战。 2. 《小七姐:精读翻译《提示词设计和工程:入门与高级方法》》:提到在解决预训练大型语言模型(LLM)的限制方面,RAG 成为关键创新,通过动态整合外部知识扩展了 LLM。还介绍了 RAG 感知提示词技术,如 FLARE 以创新方法增强 LLM 性能。 3. 《通过增强 PDF 结构识别,革新检索增强生成技术》:包含对 PDF 识别对 RAG 影响的实验研究,通过列举 ChatDOC 在查询特斯拉用户手册中的具体案例,突出了 ChatDOC 解析方法在处理表格和呈现方式上的有效性。
2024-11-20
如何利用飞书构建RAG系统
以下是关于如何利用飞书构建 RAG 系统的相关内容: RAG 的常见误区: 随意输入任何文档就能得到准确回答:这是常见误区,RAG 流程包含离线环节(文档解析、切割及向量化写入向量数据库)和在线检索环节(用户问题理解、初步检索、重排序及大模型生成),任何环节都会影响最终质量,有效实现 RAG 系统需要考虑多个复杂因素,如文档预处理、高效索引、相关性排序等,需要专业知识和持续优化。 RAG 完全消除了 AI 的幻觉:虽然 RAG 可以显著减少幻觉,但并不能完全消除,只要有大模型参与,就有可能产生幻觉。 RAG 不消耗大模型的 Token 了:从大模型生成结果环节可以看出,最终还是将知识库中检索的结果给到 LLM,然后由 LLM 进行重新整理输出,所以 RAG 仍然消耗大模型的 Token。 本地部署资讯问答机器人:Langchain + Ollama + RSSHub 实现 RAG: 加载所需的库和模块,如 feedparse 用于解析 RSS 订阅源,ollama 用于在 python 程序中跑大模型,使用前需确保 ollama 服务已开启并下载好模型。 从订阅源获取内容,通过函数从指定的 RSS 订阅 url 提取内容,将长文本拆分成较小的块,并附带相关元数据,最终合并成列表返回。 为文档内容生成向量,使用文本向量模型 bgem3,从 hf 下载好模型后,通过函数利用 FAISS 创建高效的向量存储。 RAG 性能提升策略和评估方法(产品视角): 前言:RAG 是检索增强生成的缩写,是结合检索模型和生成模型的技术,核心目的是把知识告诉给 AI 大模型,让其“懂”我们,核心流程是根据用户提问从私有知识中检索相关内容,与用户提问一起放入 prompt 中提交给大模型,常见应用场景如知识问答系统。
2024-11-20
AGI 和RAG AGENT有什么区别
AGI(通用人工智能)、RAG(检索增强生成)和 Agent 存在以下区别: Agent: 本质是动态 Prompt 拼接,通过工程化手段将业务需求转述为新的 Prompt。 包含短期记忆(messages 里的历史 QA 对)和长期记忆(summary 之后的文本塞回 system prompt)。 可以通过工具触发检索和 Action,触发 tool_calls 标记进入请求循环,拿模型生成的请求参数进行 API request,再把结果返回给大模型进行交互。 如 Multi Agents ,主要是更换 system prompt 和 tools 。 为 LLM 增加工具、记忆、行动、规划等能力,目前行业主要使用 langchain 框架,在 prompt 层和工具层完成设计。 有效使用工具的前提是全面了解工具的应用场景和调用方法,学习使用工具的方法包括从 demonstration 中学习和从 reward 中学习。 在追求 AGI 的征途中,具身 Agent 强调将智能系统与物理世界紧密结合,能够主动感知和理解物理环境并互动,产生具身行动。 RAG: 是向量相似性检索,可放在 system prompt 里或通过 tools 触发检索。 AGI:是一种更广泛和全面的智能概念,旨在实现类似人类的通用智能能力。 需要注意的是,这些概念的发展和应用仍在不断演进,想做深做好还有很多需要探索和解决的问题。
2024-11-19
如何对rag进行评估
对 RAG 进行评估可以从以下几个方面入手: 1. 使用 RAG 三角形的评估方法: 在 LangChain 中创建 RAG 对象,使用 RAGPromptTemplate 作为提示模板,指定检索系统和知识库的参数。 在 TruLens 中创建 TruChain 对象,包装 RAG 对象,指定反馈函数和应用 ID。反馈函数可使用 TruLens 提供的 f_context_relevance、f_groundness、f_answer_relevance,也可自定义。 使用 with 语句运行 RAG 对象,记录反馈数据,包括输入问题、得到的回答以及检索出的文档。 查看和分析反馈数据,根据 RAG 三角形的评估指标评价 RAG 的表现。 2. 建立评估框架将检索性能与整个 LLM 应用程序隔离开来,从以下角度评估: 模型角度(generation): 回答真实性:模型结果的真实性高低(减少模型幻觉)。 回答相关度:结果和问题的相关程度,避免南辕北辙。 检索角度(retrieval): 召回率(recall):相关信息在返回的检索内容中的包含程度,越全越好。 准确率(precision):返回的检索内容中有用信息的占比,越多越好。 3. 考虑以下评估方法和指标: 生成质量评估:常用自动评估指标(如 BLEU、ROUGE 等)、人工评估和事实验证,衡量生成文本的流畅性、准确性和相关性。 检索效果评估:包括检索的准确性、召回率和效率,其好坏直接影响生成文本的质量。 用户满意度评估:通过用户调查、用户反馈和用户交互数据了解用户对 RAG 系统的满意度和体验。 多模态评估:对于生成多模态内容的 RAG 系统,评估不同模态之间的一致性和相关性,可通过多模态评估指标实现。 实时性评估:对于需要实时更新的 RAG 任务,考虑信息更新的及时性和效率。 基准测试集:使用基准测试集进行实验和比较不同的 RAG 系统,涵盖多样化的任务和查询,以适应不同的应用场景。 评估方法和指标的选择取决于具体的任务和应用场景,综合使用多种评估方法可更全面地了解 RAG 系统的性能和效果,评估结果能指导系统的改进和优化,满足用户需求。此外,RAGAS 是一个用于 RAG 评估的知名开源库,可参考使用: 。需要注意的是,RAG 适合打造专才,不适合打造通才,且存在一定局限性,如在提供通用领域知识方面表现不佳,可能影响模型的风格或结构输出、增加 token 消耗等,部分问题需使用微调技术解决。
2024-11-13
RAG加速有什么好办法吗
以下是一些加速 RAG 的好办法: 1. 确保 LLM 以正确的格式回应:函数调用已成为确保 LLM 严格输出特定格式的相对靠谱的新方法,推荐使用此方法提升性能。可参考结构化输出文档,其中高层次的 LangChain API 展示了不同 LLM 如何调用工具和函数。 2. 使用参考样例:在实际操作中,将输入和对应输出的样例纳入其中通常大有裨益,这些样例有时比指示本身更能有效指导 LLM 处理特定情况。在提取用例文档中可找到更多细节,助您从 LLMs 中提取更好的性能。 此外,LangChain 携手 NVIDIA 为 RAG 加速带来了新的篇章: 1. 将 NVIDIA NIM 与 LangChain 结合使用:新增了支持 NIM 的集成包,安装专门的集成包后可导入所需模型,并通过示例展示如何构建应用程序,包括安装额外的包、加载数据源、初始化嵌入模型等一系列操作。 2. NVIDIA NIM 介绍:NVIDIA NIM 是一系列用户友好的微服务,旨在加速企业内部生成式 AI 的部署进程,支持广泛的 AI 模型,基于强大的推理引擎和技术构建,提供无缝的 AI 推理体验,是实现大规模、高性能生成式 AI 推理的最佳选择。其具有自托管特性,能保证数据安全;提供预构建的容器,方便选择和使用最新模型;具有可扩展性。开始使用 NIM 非常简单,在 NVIDIA API 目录中可轻松访问多种 AI 模型,NIM 是 NVIDIA AI Enterprise 的一部分,可通过相关博客获取详细指南。
2024-11-12
在tensorflow中实现分词器tokenizer
在 TensorFlow 中实现分词器(tokenizer)的方法如下: 1. 对文本数据进行预处理,添加开始和结束特殊标记。 2. 通过使用 TensorFlow 的文本矢量化模块,可以创建分词器。创建分词器后,可以将文本中的词转换为索引,例如像“开始标记”“猫”“狗”等。 3. 在 Stable Diffusion 中,Tokenizer 首先将 Prompt 中的每个词转换为一个称为标记(token)的数字,这是计算机理解单词的方式。然后,通过 text_encoder 将每个标记都转换为一个 768 值的向量,称为嵌入(embedding),用于 UNet 的 condition。 4. 需要注意的是,prompt 的长度会占用 token 数量。在大型语言模型中,输入的文本会被分词器拆分成一串 token 序列输入给模型,每个 token 通常对应一个单词或字符串片段。不同的分词器有不同的分词策略和词表,对于同一个 prompt,可能得到不同的 token 数。很多大模型对输入长度有限制,比如 GPT3 接受的最大 token 数是 2048。因此,要控制好 prompt 的长度,可使用一些技巧来节省 token 数,如使用简洁的词语、缩写/代词替代复杂词组、去除不必要的标点和空格、小写替代部分大写单词等。对于特别复杂的输入,可以考虑分步骤输入以规避长度限制。
2024-09-23