【高手揭秘】RAG“一看就会,一做就废”的真相!原来我们都被“理想模型”给骗了!

随着大语言模型(LLM)的广泛应用,检索增强生成(RAG)技术作为一种结合检索技术和LLM提示的创新架构,因其在结合外部知识库和生成模型方面的卓越表现而备受关注。RAG系统通过将LLM与结构化或非结构化的外部数据源相结合,显著提升了生成内容的准确性、相关性和可信度。

RAG在聊天机器人、知识密集型任务和企业应用中表现出色。然而从理论到工程实践,开发和优化一个高效的RAG系统并非易事,RAG系统面临着诸多挑战。尽可能的系统性地分析RAG系统的开发难点与优化路径。

一、RAG系统的12个问题

首先看下澳大利亚吉朗应用人工智能研究所 Scott Barnett等人撰写的论文 《Seven Failure Points When Engineering a Retrieval Augmented Generation System》, 探讨了RAG系统在工程实践中的问题,论文中总结了7个常见的问题:

1. 缺失内容(Missing Content)

当用户的问题无法从文档库中检索到时,可能会导致大模型的幻觉现象。理想情况下,RAG 系统可以简单地回复一句 “抱歉,我不知道”,然而,如果用户问题能检索到文档,但是文档内容和用户问题无关时,大模型还是可能会被误导。

2. 错过超出排名范围的文档(Missed Top Ranked)

由于大模型的上下文长度限制,我们从文档库中检索时,一般只返回排名靠前的K个段落,如果问题答案所在的段落超出了排名范围,就会出现问题。

3. 不在上下文中(Not In Context)

包含答案的文档已经成功检索出来,但却没有包含在大模型所使用的上下文中。当从数据库中检索到多个文档,并且使用合并过程提取答案时,就会出现这种情况。

4. 未提取(Not Extracted)

答案在提供的上下文中,但是大模型未能准确地提取出来,这通常发生在上下文中存在过多的噪音或冲突信息时。

5. 错误的格式(Wrong Format)

问题要求以特定格式提取信息,例如表格或列表,然而大模型忽略了这个指示。

6. 不正确的具体性(Incorrect Specificity)

尽管大模型正常回答了用户的提问,但不够具体或者过于具体,都不能满足用户的需求。不正确的具体性也可能发生在用户不确定如何提问,或提问过于笼统时。

7. 不完整的回答(Incomplete Answers)

考虑一个问题,“文件 A、B、C 包含哪些关键点?”,直接使用这个问题检索得到的可能只是每个文件的部分信息,导致大模型的回答不完整。一个更有效的方法是分别针对每个文件提出这些问题,以确保全面覆盖。

Wenqi Glantz撰文《12 RAG Pain Points and Proposed Solutions》,又提了另外5个问题:

8. 数据摄取的可扩展性问题(Data Ingestion Scalability)

RAG管道中的数据摄取可扩展性问题是指当系统难以有效管理和处理大量数据时出现的挑战,从而导致性能瓶颈和潜在的系统故障。此类数据摄取可扩展性问题可能会导致摄取时间延长、系统过载、数据质量问题和可用性受限等问题。

9. 结构化数据的问答(Structured Data QA)

根据用户的问题准确检索出所需的结构化数据可能很困难,尤其是当用户的问题比较复杂或比较模糊时,由于文本到 SQL 的转换不够灵活及当前大模型在有效处理这类任务方面仍然存在一定的局限性。

10. 从复杂PDF文档提取数据(Data Extraction from Complex PDFs)

复杂的PDF文档中可能包含有表格、图片等嵌入内容,在对这种文档进行问答时,传统的检索方法往往无法达到很好的效果。我们需要一个更高效的方法来处理这种复杂的PDF数据提取需求。

11. 备用模型(Fallback Model(s))

在使用单一大模型时,我们可能会担心模型遇到问题,比如遇到 OpenAI 模型的访问频率限制错误。这时候,我们需要一个或多个模型作为备用,以防主模型出现故障。

12. 大语言模型的安全性(LLM Security)

如何有效地防止恶意输入、确保输出安全、保护敏感信息不被泄露等问题,都是每个AI架构师和工程师需要面对的重要挑战。

二、RAG系统的12个优化策略

从RAG的工作流程来看,其中的各个环节均有着极大的优化空间。我们将从工作流程5个环节中,结合上述12个问题详细了解具体优化策略。

1. 数据清洗(Clean your data)

高性能RAG系统依赖于准确且清洁的原始知识数据。
一方面为了保证数据的准确性,需要优化文档读取器和多模态模型。特别是处理如CSV表格等文件时,单纯的文本转换可能会丢失表格原有的结构。因此,我们需引入额外的机制以在文本中恢复表格结构,比如使用分号或其他符号来区分数据。
另一方面也需要对知识文档做一些基本数据清洗,其中可以包括:

  • 1.1 文本清理
    规范文本格式,去除特殊字符、干扰和不相关信息;删除可能使检索过程产生偏差的重复文档或冗余信息;识别并更正拼写错误和语法错误,拼写检查器和语言模型等工具可以帮助解决这个问题。
  • 1.2 实体解析
    消除实体和术语的歧义以实现一致的引用。例如,将“LLM”、“大语言模型”和“大模型”标准化为通用术语。
  • 1.3 文档划分
    合理地划分不同主题的文档,不同主题是集中在一处还是分散在多处?如果作为人类都不能轻松地判断出需要查阅哪个文档才能来回答常见的提问,那么检索系统也无法做到。
  • 1.4 数据增强
    使用同义词、释义甚至其他语言的翻译来增加语料库的多样性。
  • 1.5 用户反馈循环
    基于现实世界用户的反馈不断更新数据库,标记它们的真实性。
  • 1.6 时间敏感数据
    对于经常更新的主题,实施一种机制来使过时的文档失效或更新。

2. 分块处理

在RAG系统中,文档需要分割成多个文本块再进行向量嵌入。在不考虑大模型输入长度限制和成本问题情况下,其目的是在保持语义上的连贯性的同时,尽可能减少嵌入内容中的噪声,从而更有效地找到与用户查询最相关的文档部分。如果分块太大,可能包含太多不相关的信息,从而降低了检索的准确性。相反,分块太小可能会丢失必要的上下文信息,导致生成的回应缺乏连贯性或深度
在RAG系统中实施合适的文档分块策略,旨在找到这种平衡,确保信息的完整性和相关性。一般来说,理想的文本块应当在没有周围上下文的情况下对人类来说仍然有意义,这样对语言模型来说也是有意义的。

  • 2.1 分块方法的选择
    固定大小的分块:这是最简单和直接的方法,我们直接设定块中的字数,并选择块之间是否重复内容。通常,会保持块之间的一些重叠,以确保语义上下文不会在块之间丢失。与其他形式的分块相比,固定大小分块简单易用且不需要很多计算资源。
  • 2.2 内容分块
    顾名思义,根据文档的具体内容进行分块,例如根据标点符号(如句号)分割。或者直接使用更高级的NLTK或者spaCy库提供的句子分割功能。
  • 2.3 递归分块
    在大多数情况下推荐的方法。其通过重复地应用分块规则来递归地分解文本。例如,在langchain中会先通过段落换行符(\n\n)进行分割。然后,检查这些块的大小。如果大小不超过一定阈值,则该块被保留。对于大小超过标准的块,使用单换行符(\n)再次分割。以此类推,不断根据块大小更新更小的分块规则(如空格,句号)。这种方法可以灵活地调整块的大小。例如,对于文本中的密集信息部分,可能需要更细的分割来捕捉细节;而对于信息较少的部分,则可以使用更大的块。而它的挑战在于,需要制定精细的规则来决定何时和如何分割文本
  • 2.4 从小到大分块
    既然小的分块和大的分块各有各的优势,一种更为直接的解决方案是把同一文档进行从大到小所有尺寸的分割,然后把不同大小的分块全部存进向量数据库,并保存每个分块的上下级关系,进行递归搜索。但可想而知,因为我们要存储大量重复的内容,这种方案的缺点就是需要更大的储存空间。
  • 2.5 特殊结构分块
    针对特定结构化内容的专门分割器。这些分割器特别设计来处理这些类型的文档,以确保正确地保留和理解其结构。langchain提供的特殊分割器包括:Markdown文件,Latex文件,以及各种主流代码语言分割器。
  • 2.6 分块大小的选择
    上述方法中无一例外最终都需要设定一个参数——块的大小,那么我们如何选择呢?
    首先不同的嵌入模型有其最佳输入大小。比如Openai的text-embedding-ada-002的模型在256 或 512大小的块上效果更好。
    其次,文档的类型和用户查询的长度及复杂性也是决定分块大小的重要因素。
    处理长篇文章或书籍时,较大的分块有助于保留更多的上下文和主题连贯性;而对于社交媒体帖子,较小的分块可能更适合捕捉每个帖子的精确语义。如果用户的查询通常是简短和具体的,较小的分块可能更为合适;相反,如果查询较为复杂,可能需要更大的分块。
    实际场景中,我们可能还是需要不断实验调整,在一些测试中,128大小的分块往往是最佳选择,在无从下手时,可以从这个大小作为起点进行测试

3. 嵌入模型

过嵌入模型能够将文本转换成向量,显然不同的嵌入模型带来的效果也不尽相同,例如Word2Vec模型,尽管功能强大,但存在一个重要的局限性:其生成的词向量是静态的。一旦模型训练完成,每个词的向量表示就固定不变,这在处理一词多义的情况时可能导致问题。

比如, “我买了一张光盘”,这里“光盘”指的是具体的圆形盘片,而在“光盘行动”中,“光盘”则指的是把餐盘里的食物吃光,是一种倡导节约的行为。语义完全不一样的词向量却是固定的。 相比之下,引入自注意力机制的模型,如BERT,能够提供动态的词义理解。这意味着它可以根据上下文动态地调整词义,使得同一个词在不同语境下有不同的向量表示。“光盘”这个词在两个句子中会有不同的向量,从而更准确地捕捉其语义。

有些项目为了让模型对特定垂直领域的词汇有更好的理解,会嵌入模型进行微调。但在这里我们并不推荐这种方法:
一方面其对训练数据的质量有较高要求,
另一方面也需要较多的人力物力投入,且效果未必理想,最终得不偿失。
在这种情况下,对于具体应该如何选择嵌入模型,我们推荐参考Hugging Face推出的嵌入模型排行榜MTEB。这个排行榜提供了多种模型的性能比较,能帮助我们做出更明智的选择。同时,要注意并非所有嵌入模型都支持中文,因此在选择时应查阅模型说明。

4. 元数据

当在向量数据库中存储向量数据时,某些数据库支持将向量与元数据(即非向量化的数据)一同存储。为向量添加元数据标注是一种提高检索效率的有效策略,它在处理搜索结果时发挥着重要作用

例如,日期就是一种常见的元数据标签。它能够帮助我们根据时间顺序进行筛选。设想一下,如果我们正在开发一款允许用户查询他们电子邮件历史记录的应用程序。在这种情况下,日期最近的电子邮件可能与用户的查询更相关。然而,从嵌入的角度来看,我们无法直接判断这些邮件与用户查询的相似度。通过将每封电子邮件的日期作为元数据附加到其嵌入中,我们可以在检索过程中优先考虑最近日期的邮件,从而提高搜索结果的相关性。

此外,我们还可以添加诸如章节或小节的引用,文本的关键信息、小节标题或关键词等作为元数据。这些元数据不仅有助于改进知识检索的准确性,还能为最终用户提供更加丰富和精确的搜索体验。

5. 多级索引

元数据无法充分区分不同上下文类型的情况下,我们可以考虑进一步尝试多重索引技术。多重索引技术的核心思想是将庞大的数据和信息需求按类别划分,并在不同层级中组织,以实现更有效的管理和检索
这意味着系统不仅依赖于单一索引,而是建立了多个针对不同数据类型和查询需求的索引。例如,可能有一个索引专门处理摘要类问题,另一个专门应对直接寻求具体答案的问题,还有一个专门针对需要考虑时间因素的问题。这种多重索引策略使RAG系统能够根据查询的性质和上下文,选择最合适的索引进行数据检索,从而提升检索质量和响应速度。但为了引入多重索引技术,我们还需配套加入多级路由机制。

多级路由机制确保每个查询被高效引导至最合适的索引。查询根据其特点(如复杂性、所需信息类型等)被路由至一个或多个特定索引。这不仅提升了处理效率,还优化了资源分配和使用,确保了对各类查询的精确匹配。

例如,对于查询“最新上映的科幻电影推荐”,RAG系统可能首先将其路由至专门处理当前热点话题的索引,然后利用专注于娱乐和影视内容的索引来生成相关推荐。

总的来说,多级索引和路由技术可以进一步帮助我们对大规模数据进行高效处理和精准信息提取,从而提升用户体验和系统的整体性能。

6.索引/查询算法

可以利用索引筛选数据,但说到底还是要从筛选后的数据中检索出相关的文本向量。由于向量数据量庞大且复杂,寻找绝对的最优解变得计算成本极高,有时甚至是不可行的。加之,大模型本质上并不是完全确定性的系统,这些模型在搜索时追求的是语义上的相似性——一种合理的匹配即可。从应用的角度来看,这种方法是合理的
例如,在推荐系统中,用户不太可能察觉到或关心是否每个推荐的项目都是绝对的最佳匹配;他们更关心的是推荐是否总体上与他们的兴趣相符。因此查找与查询向量完全相同的项通常不是目标,而是要找到“足够接近”或“相似”的项,这便是最近邻搜索(Approximate Nearest Neighbor Search,ANNS)。这样做不仅能满足需求,还为检索优化提供了巨大的优化潜力。
但是在”法律“、”医疗“、”金融“等垂直领域,大模型的这种不确定性,会带来致命的结果,因此LLM+RAG结合互补,以期望解决LLM在某些场景的短板。

7. 查询转换

在RAG系统中,用户的查询问题被转化为向量,然后在向量数据库中进行匹配。不难想象,查询的措辞会直接影响搜索结果。如果搜索结果不理想,可以尝试以下几种方法对问题进行重写,以提升召回效果:

  • 7.1 结合历史对话的重新表述
    在向量空间中,对人类来说看似相同的两个问题其向量大小并不一定很相似。我们可以直接利用LLM 重新表述问题来进行尝试。此外,在进行多轮对话时,用户的提问中的某个词可能会指代上文中的部分信息,因此可以将历史信息和用户提问一并交给LLM重新表述。
  • 7.2 假设文档嵌入(HyDE)
    HyDE的核心思想是接收用户提问后,先让LLM在没有外部知识的情况下生成一个假设性的回复。然后,将这个假设性回复和原始查询一起用于向量检索。假设回复可能包含虚假信息,但蕴含着LLM认为相关的信息和文档模式,有助于在知识库中寻找类似的文档。
  • 7.3 退后提示(Step Back Prompting)
    如果果原始查询太复杂或返回的信息太广泛,我们可以选择生成一个抽象层次更高的“退后”问题,与原始问题一起用于检索,以增加返回结果的数量。例如,原问题是“桌子君在特定时期去了哪所学校”,而退后问题可能是关于他的“教育历史”。这种更高层次的问题可能更容易找到答案。
  • 7.4 多查询检索/多路召回(Multi Query Retrieval)
    使用LLM生成多个搜索查询,特别适用于一个问题可能需要依赖多个子问题的情况。

通过这些方法,RAG系统能够更精准地处理和响应复杂的用户查询,从而提升整体的搜索效率和准确性。

8. 检索参数

把查询问题准备好,可以进入向量数据库进行检索。在具体的检索过程中,可以根据向量数据库的特定设置来优化一些检索参数,以下是一些常见的可设定参数:

  • 8.1 稀疏和稠密搜索权重
    稠密搜索即通过向量进行搜索。然而,在某些场景下可能存在限制,此时可以尝试使用原始字符串进行关键字匹配的稀疏搜索。一种有效的稀疏搜索算法是最佳匹配25(BM25),它基于统计输入短语中的单词频率,频繁出现的单词得分较低,而稀有的词被视为关键词,得分会较高。我们可以结合稀疏和稠密搜索得出最终结果。向量数据库通常允许设定两者对最终结果评分的权重比例,如0.6表示40%的得分来自稀疏搜索,60%来自稠密搜索。
  • 8.2 结果数量(topK)
    检索结果的数量是另一个关键因素。足够的检索结果可以确保系统覆盖到用户查询的各个方面。在回答多方面或复杂问题时,更多的结果提供了丰富的语境,有助于RAG系统更好地理解问题的上下文和隐含细节。但需注意,结果数量过多可能导致信息过载,降低回答准确性并增加系统的时间和资源成
  • 8.3 相似度度量方法
    计算两个向量相似度的方法也是一个可选参数。这包括使用欧式距离和Jaccard距离计算两个向量的差异,以及利用余弦相似度衡量夹角的相似性。通常,余弦相似度更受青睐,因为它不受向量长度的影响,只反映方向上的相似度。这使得模型能够忽略文本长度差异,专注于内容的语义相似性。需要注意的是,并非所有嵌入模型都支持所有度量方法,具体可参考所用嵌入模型的说明。

9. 高级检索策略

最为关键和复杂的步骤是在向量数据库检索之上如何具体开发或改进整个系统的策略。这部分的内容足够写成一篇独立文章。为了保持简洁,我们只讨论一些常用或者新提出的策略。

  • 9.1 上下文压缩
    我们提到过当文档文块过大时,可能包含太多不相关的信息,传递这样的整个文档可能导致更昂贵的LLM调用和更差的响应。上下文压缩的思想就是通过LLM的帮助根据上下文对单个文档内容进行压缩,或者对返回结果进行一定程度的过滤仅返回相关信息。
  • 9.2 句子窗口搜索
    相反,文档文块太小会导致上下文的缺失。其中一种解决方案就是窗口搜索,该方法的核心思想是当提问匹配好分块后,将该分块周围的块作为上下文一并交给LLM进行输出,来增加LLM对文档上下文的理解。
  • 9.3 父文档搜索
    无独有偶,父文档搜索也是一种很相似的解决方案,父文档搜索先将文档分为尺寸更大的主文档,再把主文档分割为更短的子文档两个层级,用户问题会与子文档匹配,然后将该子文档所属的主文档和用户提问发送给LLM。
  • 9.4 自动合并
    自动合并是在父文档搜索上更进一步的复杂解决方案。同样地,我们先对文档进行结构切割,比如将文档按三层树状结构进行切割,顶层节点的块大小为1024,中间层的块大小为512,底层的叶子节点的块大小为128。而在检索时只拿叶子节点和问题进行匹配,当某个父节点下的多数叶子节点都与问题匹配上则将该父节点作为结果返回。
  • 9.5 多向量检索
    多向量检索同样会给一个知识文档转化成多个向量存入数据库,不同的是,这些向量不仅包括文档在不同大小下的分块,还可以包括该文档的摘要,用户可能提出的问题等等有助于检索的信息。在使用多向量查询的情况下,每个向量可能代表了文档的不同方面,使得系统能够更全面地考虑文档内容,并在回答复杂或多方面的查询时提供更精确的结果。例如,如果查询与文档的某个具体部分或摘要更相关,那么相应的向量就可以帮助提高这部分内容的检索排名。
  • 9.6 多代理检索
    多代理检索,简而言之就是选取我们提及的12大优化策略中的部分交给一个智能代理合并使用。就比如使用子问题查询,多级索引和多向量查询结合,先让子问题查询代理把用户提问拆解为多个小问题,再让文档代理对每个字问题进行多向量或多索引检索,最后排名代理将所有检索的文档总结再交给LLM。这样做的好处是可以取长补短,比如,子问题查询引擎在探索每个子查询时可能会缺乏深度,尤其是在相互关联或关系数据中。相反,文档代理递归检索在深入研究特定文档和检索详细答案方面表现出色,以此来综合多种方法解决问题。需要注意的是现在网络上存在不同结构的多代理检索,具体在多代理选取哪些优化步骤尚未有确切定论,我们可以结合使用场景进行探索。
  • 9.7 Self-RAG
    自反思搜索增强是一个全新RAG框架,其与传统RAG最大的区别在于通过检索评分(令牌)和反思评分(令牌)来提高质量。它主要分为三个步骤:检索、生成和批评。Self-RAG首先用检索评分来评估用户提问是否需要检索,如果需要检索,LLM将调用外部检索模块查找相关文档。接着,LLM分别为每个检索到的知识块生成答案,然后为每个答案生成反思评分来评估检索到的文档是否相关,最后将评分高的文档当作最终结果一并交给LLM。

10.重排模型(Re-ranking)

在完成语义搜索的优化步骤后,能够检索到语义上最相似的文档,但不知你是否注意到一个关键问题:语义最相似是否总代表最相关?答案是不一定。例如,当用户查询“最新上映的科幻电影推荐”时,可能得到的结果是“科幻电影的历史演变”,虽然从语义上这与科幻电影相关,但并未直接回应用户关于最新电影的查询。

重排模型可以帮助我们缓解这个问题,重排模型通过对初始检索结果进行更深入的相关性评估和排序,确保最终展示给用户的结果更加符合其查询意图。这一过程通常由深度学习模型实现,如Cohere模型。这些模型会考虑更多的特征,如查询意图、词汇的多重语义、用户的历史行为和上下文信息等。

举个例子,对于查询“最新上映的科幻电影推荐”,在首次检索阶段,系统可能基于关键词返回包括科幻电影的历史文章、科幻小说介绍、最新电影的新闻等结果。然后,在重排阶段,模型会对这些结果进行深入分析,并将最相关、最符合用户查询意图的结果(如最新上映的科幻电影列表、评论或推荐)排在前面,同时将那些关于科幻电影历史或不太相关的内容排在后面。这样,重排模型就能有效提升检索结果的相关性和准确性,更好地满足用户的需求。

在实践中,使用RAG构建系统时都应考虑尝试重排方法,以评估其是否能够提高系统性能。

11. 提示词

大型语言模型的解码器部分通常基于给定输入来预测下一个词。这意味着设计提示词或问题的方式将直接影响模型预测下一个词的概率。这也给了我们一些启示:通过改变提示词的形式,可以有效地影响模型对不同类型问题的接受程度和回答方式,比如修改提示语,让LLM知道它在做什么工作,是十分有帮助的。

为了减少模型产生主观回答和幻觉的概率,一般情况下,RAG系统中的提示词中应明确指出回答仅基于搜索结果,不要添加任何其他信息。例如,可以设置提示词如:
“你是一名智能客服。你的目标是提供准确的信息,并尽可能帮助提问者解决问题。你应保持友善,但不要过于啰嗦。请根据提供的上下文信息,在不考虑已有知识的情况下,回答相关查询。”

当然你也可以根据场景需要,也可以适当让模型的回答融入一些主观性或其对知识的理解。此外,使用少量样本(few-shot)的方法,将想要的问答例子加入提示词中,指导LLM如何利用检索到的知识,也是提升LLM生成内容质量的有效方法。这种方法不仅使模型的回答更加精准,也提高了其在特定情境下的实用性。

12. 大语言模型

最后一步——LLM生成回答。LLM是生成响应的核心组件。与嵌入模型类似,可以根据自己的需求选择LLM,例如开放模型与专有模型、推理成本、上下文长度等。此外,可以使用一些LLM开发框架来搭建RAG系统,比如,LlamaIndex或LangChain。这两个框架都拥有比较好用的debugging工具,可以让我们定义回调函数,查看使用了哪些上下文,检查检索结果来自哪个文档等等。

小结

建设RAG系统需要兼顾技术深度与工程实践,从检索精度、生成质量到系统稳定性均需精心设计。通过结合最新的优化策略与工具链(如Cursor、MCP技术),能够有效解决开发中的核心问题,构建高效、可靠且适应性强的RAG系统。随着多模态技术、大模型上下文理解、动态学习机制和隐私保护技术的不断成熟,RAG系统将在更多垂直领域场景释放其潜力,成为下一代智能应用的核心技术之一,同时为用户提供更加智能、可靠的服务。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

在这里插入图片描述

<think>好的,用户现在让我个基于LLM和RAG,以及模型微调的资料问答系统。首先,我需要明确用户的需求。他们可能想要个能够高效处理大量文档,并且能准确回答用户问题的系统。结合LLM和RAG的话,应该是想利用预训练模型的知识,同时通过检索增强生成来提高回答的准确性,特别是在专业领域的资料上。模型微调可能是为了让系统更适应特定的数据集或领域术语。 接下来,我得考虑用户的使用场景。可能是企业内部的知识库问答,或者教育领域的资料查询系统。用户可能希望系统不仅能够回答常见问题,还能处理复杂的查询,比如需要跨文档整合信息的场景。这时候,RAG的作用就很重要了,因为它可以从外部知识库检索相关信息,再生成回答,避免LLM的幻觉问题。 然后,用户可能没有明确说出来的深层需求,比如系统的响应速度、可扩展性、以及数据的安全性。特别是如果用在企业环境,数据保密性很重要,需要确保检索的文档和生成的回答不会泄露敏感信息。此外,系统的维护和更新也是个考虑点,如何持续加入新的资料,保持信息的时效性。 接下来,我需要规划系统的架构。首先,数据预处理部分,可能需要处理各种格式的文档,比如PDF、Word、网页等,需要文本提取和清洗。然后,构建向量数据库,选择合适的嵌入模型,比如BERT或者Sentence Transformers,将文档分块并向量化存储。接着,在检索阶段,用户的问题会被编码成向量,与数据库中的向量进行相似度匹配,获取相关段落。 然后是生成部分,使用LLM如GPT-3或开源的Llama等模型,结合检索到的上下文生成回答。可能需要微调模型,使其更适应特定领域的术语和回答风格。微调需要准备标注数据,可能涉及到数据增强和领域适配的训练策略。 还需要考虑系统的评估,如何衡量回答的准确性和相关性,可能需要BLEU、ROUGE等自动指标,再加上人工评估。此外,用户反馈机制也很重要,收集用户的评价来持续优化系统。 潜在的问题包括检索的准确性,如果向量模型不够好,可能导致检索到不相关的段落,影响生成结果。另外,模型微调需要足够的数据和计算资源,特别是如果使用大型模型,成本可能较高。系统的延迟也是个挑战,尤其是实时检索和生成需要平衡速度和准确性。 用户可能还关心如何部署这样的系统,是否需要云服务还是本地部署,以及如何集成到现有的应用中。安全性方面,数据传输和存储的加密,权限控制等都需要考虑。 最后,总结下来,构建这样个系统需要分步骤进行,从数据准备到模型选择,再到系统集成和评估,每个环节都需要仔细设计和测试,确保最终效果符合用户需求。</think>### 基于 LLM 和 RAG 的資料問答系統設計 #### 1. **核心技術組成** - **LLM(大型語言模型)** 如 GPT、Llama 等,負責理解用戶問題並生成自然語言回答,提供基礎的推理和語言能力。 - **RAG(檢索增強生成)** 結合檢索(Retrieval)與生成(Generation),從外部知識庫(如向量數據庫)動態提取相關內容,避免模型依賴自身知識的局限性,提升回答的準確性和專業性。 - **模型微調(Fine-tuning)** 針對特定領域數據(如法律、醫療文檔)調整 LLM 參數,使其更適應垂直場景的術語、格式和邏輯。 --- #### 2. **系統架構與流程** 1. **數據預處理** - **文本提取**:解析 PDF、HTML、Markdown 等格式,提取結構化文本。 - **分塊與嵌入**:將文本切分為段落或句子,通過嵌入模型(如 `text-embedding-3-small`)轉換為向量。 - **向量數據庫存儲**:使用 Milvus、Pinecone 或 FAISS 存儲向量,支持快速相似度檢索。 2. **檢索增強(RAG)** - **用戶查詢嵌入**:將問題轉換為向量,從數據庫中檢索最相關的 $k$ 個文本片段。 - **上下文融合**:將檢索結果與問題拼接,輸入 LLM 生成回答。 $$ \text{Answer} = \text{LLM}([\text{Query}; \text{Retrieved Context}]) $$ 3. **模型微調策略** - **領域適配**:使用領域數據(如論文、技術手冊)對 LLM 進行指令微調(Instruction-tuning)。 - **低資源優化**:採用 LoRA 或 QLoRA 技術降低微調算力成本。 - **評估指標**:通過 BLEU、ROUGE 或人工評分驗證回答質量。 --- #### 3. **關鍵技術挑戰與解決方案** - **檢索準確性不足** - 優化嵌入模型:使用領域專用模型(如法律版 BERT)。 - 混合檢索:結合關鍵詞匹配(BM25)與向量相似度。 - **生成內容的可靠性** - **引用標註**:要求 LLM 標明答案來源的文檔片段。 - **置信度校驗**:對生成內容與檢索上下文的致性進行評分過濾。 - **系統延遲與成本** - **分級檢索**:先粗檢後精檢,減少計算量。 - **模型壓縮**:量化或蒸餾 LLM(如 GPTQ 量化 Llama 2)。 --- #### 4. **典型應用場景** - **企業知識庫**:快速查詢內部文檔(如產品規格、合規文件)。 - **學術研究**:從論文集中提取實驗方法或結論。 - **客服自動化**:基於 FAQ 和工單歷史生成精準回答。 --- #### 5. **示例代碼片段(Python)** ```python from langchain_community.vectorstores import FAISS from langchain_openai import OpenAIEmbeddings, ChatOpenAI # 1. 加載數據並構建向量庫 documents = ["文本段落1", "段落2", "..."] embeddings = OpenAIEmbeddings() vector_db = FAISS.from_texts(documents, embeddings) # 2. 檢索與生成 query = "用戶問題" retrieved_docs = vector_db.similarity_search(query, k=3) context = "\n".join([doc.page_content for doc in retrieved_docs]) llm = ChatOpenAI(model="gpt-3.5-turbo") response = llm.invoke(f"基於以下內容回答:{context}\n\n問題:{query}") print(response.content) ``` --- #### 6. **未來優化方向** - **多模態支持**:融合文本、表格、圖像的檢索與生成。 - **主動學習**:通過用戶反饋自動標註高價值數據,迭代優化模型。 - **隱私保護**:本地化部署 + 差分隱私技術,避免敏感數據外洩。 通過結合 RAG 的動態知識擴展和 LLM 的生成能力,此類系統可顯著提升專業領域問答的準確性和可解釋性,同時降低幻覺(Hallucination)風險。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值