RAG是什么?RAG综述,看这一篇就够了!

RAG(Retriever-Augmented Generation)是一种将检索与生成相结合的人工智能模型架构。

当大模型回答问题或生成文本,首先从大量文档中检索相关信息,随后再利用这些检索到的信息来生成响应或文本,从而提高预测的质量。
其主要用于知识密集型的自然语言处理任务,尤其是在需要结合外部知识库的信息生成高质量文本的场景中。

1、RAG到底是什么?

2020年,RAG这个概念第一次出现,但它真正变得流行起来,是在ChatGPT于2022年12月发布之后。之前结合ChatGPT的官方介绍,简单来说,它给大模型带来的价值可以这样理解:没用RAG技术的大模型回答问题时,就像闭卷考试;而用了RAG技术的大模型,就好比——外挂了一个知识库来开卷考试

现在大模型生成回答时有三个大问题:容易胡说八道、缺少专业知识、回答没法追根溯源。而RAG技术通过外挂专业的知识库,在回答问题时结合库里的内容,还会在结果里标明信息来自哪里,基本上把这三个问题解决了。

那RAG到底是怎么解决这三个问题的呢?

首先看看RAG的架构,总共分为建索引、做检索、内容增强、生成回答四个大步骤:

图片

1.1 索引Indexing

这一步指通过内容分块、向量化等方式,生成索引并存入向量数据库。为什么这里这么麻烦,既要分块又要做向量化处理来建索引,而不是像一些关系型数据库直接去建立索引呢?

这是核心因为2个点:

(1)大模型需要通过向量化去建立语义理解。

通过将包含高维信息的知识降维拍到向量空间里,这些知识就变成了一堆数字串;此时,当用户去提问时,先将提问的知识向量化变成一串数字后,再从知识库中通过余弦计算等方式找出和用户提问数字串最相似的信息出来,这就完成了所谓的语义理解(当然这块还有复杂的对称和不对称计算等,不做展开了)。

(2)分块能够有效提升检索效率和缓解上下文长度限制。

理想状态下,在检索时将每个信息都遍历一遍肯定就不会漏信息了,但是当信息量大且不能让用户等待过久的时候,还是需要更高效和更具性价比的方式;同时,大模型一次能输入的上下文有长度限制,虽然已经有大模型将上下文长度延伸至了更高量级,但似乎实验证明更大的上下文窗口不一定对检索结果更有效。

而分块技术,则可以理解为将一篇50w字的书籍文档按照段落或者语义等方式划分成n个块。这样,既能够有效解决上下文长度限制问题,同时也对于检索有一定的效率提升;但同时也存在可能会丢失文档的全局结构、不同块之间的前后逻辑等问题(不过这些问题都在陆续通过建立重叠上下块内容、建立块的类似索引结构等方式逐渐解决中)。

1.2 检索Retrieval

当用户提问后,通过检索技术则可以从知识库中召回相关内容块。根据2024年一篇很火的RAG论文,其将RAG划分为3大范式:原生RAG、先进RAG、模块化RAG

图片

目前2024年基本大部分厂商已经在第二步(先进RAG)这一层面了,例如Dify就有全文检索和向量检索2种模式。

图片

因此,在检索这一步,我特地画了2种混合检索来做示意,个人判断混合检索会是未来的一大趋势,因为每种检索都有其优势和弊端,只有结合才能取长补短。 而检索方式将不局限于关键词检索和向量检索,最终的形态一定是多种检索方式的结合和互补。当混合检索结束后,再通过一个Rerank的机制重新对不同渠道的检索结果做一个最终的整合和排序。

1.3 增强Augment

当重排序结束后,将生成最终前n个匹配度最高的内容块,将这些内容块与用户的查询、系统配置的prompt等做整合,一并让大模型根据这些信息生成最终的回答。

在整个完整的RAG过程中,索引和检索将极大的影响最终生成的质量。

2、RAG能帮助企业做什么?

从下述生成式AI技术应用跟踪来看,目前最常见的几大使用场景:知识助手、智能客服、数据分析等无一例外都应用到了知识库及RAG技术。

图片

当企业某一业务存在大量重复性、知识密集型且标准化较高的特征时,则可以考虑使用RAG来搭建一个问答机器人。如果是搭建基础知识问答助手,FastGPT、Dify社区版、Coze都可以很快捷地进行知识库的搭建,也有完整的FAQ支持。

以我们公司为例,产品本身专业性强所以使用门槛较高,因此搭建了围绕产品使用的问答助手

某医疗公司每年都会推出新的医疗器械、医药等,医药代表不一定能及时记忆最新的产品和细节,则可以通过新产品问答助手随时查询围绕产品的细节

而某高端社区打造了社区内部的社群服务,每天都要频繁被咨询如何创建社群、如何参加活动、停车、wifi等问题,此时他们则选择通过AI客服助手来解决重复回答效率低的问题

如今的AI问答其优势在于能够很好的理解自然语言、并很好的生成自然语言,这让对话不再显得是那么的「人工智障」和生硬(虽然又会容易存在幻觉问题,但问题总在解决的过程中嘛)。

当然,如果是搭建复杂的知识问答助手,其难点还是在于:

1、面向问答机器人使用场景下,额外所需的文档整理: 例如某企业做了一个财务助手,对于某项报销条款,不同角色能看到的内容是不同的,而这就倒逼企业对该条款进行一些元数据的二次处理

2、面向特定使用场景的索引与检索策略: 不同使用场景的前述2种策略往往有差异。

例如某产品推荐场景下,针对结构化的产品数据则不需要做内容分块,直接针对字段进行向量化和关键词检索即可;

针对某医疗问诊助手场景下的大量非结构化和疾病相关的pdf文档,则需要分块向量化;

而针对某社区提供的社群问答助手场景,其直接提供了数十个Q&A结构的文档,那自然按照原始的Q&A结构去做问题的分块,才能更好的保证最终的检索结果。

3、RAG未来将怎样发展?

2024年这一年,RAG领域出现了非常多的论文,夸张的时候一周可能有十多篇。同时,根据下图这篇报告,2024年RAG占据设计的主导地位,而提示词和微调已逐渐有些弱化掉了。这说明,RAG正处在一个大家对其充满期望和肯定的蓬勃探索期。

图片

这一年,RAG领域涌现了诸多新思路和新技术,以下列举比较热门的3个:

1、通过提炼内容结构和宏观理解等来缩减语义鸿沟:如GraphRAG、SiReRAG、RAPTOR

以GraphRAG为例,这是一种微软在24年中开源的图RAG技术,其本质上是将知识图谱和RAG做了融合。

通过利用大模型自动抽取文档内的命名实体,然后利用这些实体自动构建知识图谱。在图谱中,同样利用聚类产生实体聚集的“社区”,并利用 LLM 生成这些社区的摘要。在召回的时候,知识图谱的实体、边、以及社区摘要,它们连同原始文档一起来做混合召回。

由于这些数据同样形成了文档中跨 Chunk 的关联信息,因此对于宏观性提问,多跳提问,有着更好的效果。GraphRAG 可以看作是解决语义鸿沟的当下行之有效的策略和架构。

2、通过Agent来加强RAG:即Agentic RAG

RAG 本身是 Agent 的重要算子,它可以解锁 Agent 访问内部数据的能力;Agent 直接用于 RAG,可以提供高级 RAG 能力,这就是所谓 Agentic RAG。

在RAG的过程中,诸如该如何进行分块、该如何选择检索方式、如何选择最终召回结果、召回效果怎么样评估、基于多跳问题该如何补足等,都可以利用大模型的能力打造一个独立的Agent来实现。

3、多模态RAG

未来的 RAG 系统不仅限于文本检索,还将能够处理图像、音频等多种媒体类型。大模型将能够理解并生成包含文本、图像和声音的信息,为用户提供更丰富的互动体验。

对于RAG未来将怎样发展这个命题,我同意RAGFlow负责人的观点:

RAG 就相当于过去的数据库,对外暴露的接口无比简单,内部却无比复杂,它不仅仅包含了数据库本身,还包含了各种小模型以及把它们串接起来的工具,从本质上来说,它就是过去的企业搜索引擎在大模型时代的进化,但它又大大超出了搜索引擎本身的范畴。

那么,如何系统的去学习大模型LLM?

作为一名从业五年的资深大模型算法工程师,我经常会收到一些评论和私信,我是小白,学习大模型该从哪里入手呢?我自学没有方向怎么办?这个地方我不会啊。如果你也有类似的经历,一定要继续看下去!这些问题啊,也不是三言两语啊就能讲明白的。

所以我综合了大模型的所有知识点,给大家带来一套全网最全最细的大模型零基础教程。在做这套教程之前呢,我就曾放空大脑,以一个大模型小白的角度去重新解析它,采用基础知识和实战项目相结合的教学方式,历时3个月,终于完成了这样的课程,让你真正体会到什么是每一秒都在疯狂输出知识点。

由于篇幅有限,⚡️ 朋友们如果有需要全套 《2025全新制作的大模型全套资料》,扫码获取~
在这里插入图片描述

👉大模型学习指南+路线汇总👈

我们这套大模型资料呢,会从基础篇、进阶篇和项目实战篇等三大方面来讲解。
在这里插入图片描述
在这里插入图片描述

👉①.基础篇👈

基础篇里面包括了Python快速入门、AI开发环境搭建及提示词工程,带你学习大模型核心原理、prompt使用技巧、Transformer架构和预训练、SFT、RLHF等一些基础概念,用最易懂的方式带你入门大模型。
在这里插入图片描述

👉②.进阶篇👈

接下来是进阶篇,你将掌握RAG、Agent、Langchain、大模型微调和私有化部署,学习如何构建外挂知识库并和自己的企业相结合,学习如何使用langchain框架提高开发效率和代码质量、学习如何选择合适的基座模型并进行数据集的收集预处理以及具体的模型微调等等。
在这里插入图片描述

👉③.实战篇👈

实战篇会手把手带着大家练习企业级的落地项目(已脱敏),比如RAG医疗问答系统、Agent智能电商客服系统、数字人项目实战、教育行业智能助教等等,从而帮助大家更好的应对大模型时代的挑战。
在这里插入图片描述

👉④.福利篇👈

最后呢,会给大家一个小福利,课程视频中的所有素材,有搭建AI开发环境资料包,还有学习计划表,几十上百G素材、电子书和课件等等,只要你能想到的素材,我这里几乎都有。我已经全部上传到优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费
在这里插入图片描述
相信我,这套大模型系统教程将会是全网最齐全 最易懂的小白专用课!!

《基于检索增强生成(RAG)的多场景问答系统》 一、项目背景 针对目标公司业务,设计一个融合传统检索技术与大模型生成能力的问答系统,重点解决以下问题: 简单问题:通过高效检索快速返回标准答案(如产品FAQ) 复杂问题:调用大模型生成解释性答案,并利用检索结果约束生成内容可信度 内容安全:通过相似度检测拦截重复/低质用户提问,降低服务器负载 二、技术架构 mermaid graph TD A[用户提问] --> B{问题类型判断} B -->|简单问题| C[检索式问答] B -->|复杂问题| D[生成式问答] C --> E[返回结构化答案] D --> E E --> F[答案去重与缓存] F --> G[用户反馈] G --> H[模型迭代] subgraph 检索式问答 C1[(知识库)] --> C2[BM25/Jaccard检索] C2 --> C3[相似度排序] end subgraph 生成式问答 D1[微调大模型] --> D2[Prompt工程] D2 --> D3[检索增强生成] end 三、核心模块与代码关联 原代码模块 迁移应用场景 升级策略 情感分析代码 用户意图分类 将情感标签替换为问题类型(简单/复杂) LSTM模型代码 微调轻量化大模型(如T5-small) 将LSTM替换为Transformer架构 相似度检测代码 答案去重与缓存 Jaccard→余弦相似度+Sentence-BERT 四、关键技术实现 1. 混合问答路由(复用情感分析逻辑) def route_question(question): # 使用预训练模型判断问题复杂度 inputs = tokenizer(question, return_tensors="pt") outputs = classifier_model(**inputs) prob_complex = torch.softmax(outputs.logits, dim=1)[0][1] return "生成式" if prob_complex > 0.7 else "检索式" 2. 检索增强生成(融合代码2/3)from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration # 初始化RAG模型 tokenizer = RagTokenizer.from_pretrained("facebook/rag-sequence-nq") retriever = RagRetriever.from_pretrained("facebook/rag-sequence-nq", index_name="exact") model = RagSequenceForGeneration.from_pretrained("facebook/rag-sequence-nq") def answer_with_rag(question): inputs = tokenizer(question, return_tensors="pt") outputs = model.generate(input_ids=inputs["input_ids"]) return tokenizer.decode(outputs[0], skip_special_tokens=True) 3. 动态知识更新(复用相似度检测) python 复制 class KnowledgeManager: def __init__(self): self.knowledge_base = [] def add_document(self, doc): # 去重检查(复用代码3的Jaccard逻辑) segments = segment(doc) for existing in self.knowledge_base: if jaccard_similarity(segments, existing['segments']) > 0.8: return False self.knowledge_base.append({'text': doc, 'segments': segments}) return True 五、面试展示策略 1. 技术深度表达 检索优化: “我将电影评论分析中的词频统计升级为BM25算法,解决TF-IDF对长文档不敏感的问题,在开放域问答任务中检索准确率提升18%” 生成控制: “复用LSTM训练经验,使用LoRA技术对Llama-2进行高效微调,在保持90%性能的同时减少70%训练成本” 2. 业务思维体现 成本控制: “通过问题分类路由,对80%的简单问题使用检索式回答,相比全量调用大模型,API成本降低65%” 效果验证: “在500条测试数据上,混合系统的回答准确率达到92%,纯生成方案为85%,响应时间从3.2s降至1.4s” 3. 难点突破 冷启动问题: “初期缺乏标注数据时,使用SimCSE无监督训练相似度模型,实现检索模块的零样本启动” 生成幻觉抑制: “通过检索结果约束生成空间,加入惩罚项使模型更关注知识库内容,虚构回答比例从23%降至7%” 六、延伸建议 部署演示:用Gradio搭建Web Demo,展示实时问答流程 性能对比:提供不同方案(纯检索/纯生成/混合)的准确率-耗时曲线图 优化路线:提出引入强化学习实现自动路由策略的下一步计划 帮我完善以上文档提供的代码
03-08
<think>嗯,用户让我帮忙完善基于RAG的多场景问答系统的代码。首先,我需要仔细看一下用户提供的文档和现有的代码结构。用户已经给出了一些核心模块的代码片段,比如混合问答路由、检索增强生成和动态知识更新,但可能这些代码还不完整或者需要优化。 首先,混合问答路由部分,用户用了预训练模型来判断问题类型,返回生成式或检索式。但这里可能需要更详细的处理,比如处理CUDA设备、错误处理,以及添加日志记录,这样在实际部署时会更加可靠。另外,路由的阈值0.7是硬编码,或许可以改成可配置的参数,方便后续调整。 接下来是检索增强生成的部分,用户使用了Facebook的RAG模型,但代码示例中没有考虑输入长度限制,也没有处理可能出现的异常。此外,生成的参数比如max_length和num_beams可以调整,以平衡生成速度和质量。需要添加这些参数,并且确保模型在GPU上运行(如果有的话)。 动态知识更新的部分,用户提到了去重检查,但Jaccard相似度的具体实现没有给出。可能需要补充相似度计算的函数,以及文档分段的逻辑。另外,去重的阈值0.8也是硬编码,应该作为参数传入。同时,文档分段的方法需要具体实现,比如按句子或段落分割,这里可能需要调用现有的分词工具或库。 然后,用户可能希望代码更模块化,比如将知识管理器封装成类,并添加必要的辅助函数。比如,文档分段可以使用nltk的句子分割,但需要处理可能的安装和导入问题。另外,去重检查不仅要考虑Jaccard,还可以结合余弦相似度,使用Sentence-BERT等更先进的模型,但用户提到复用现有代码,所以可能先实现Jaccard,后续再升级。 还要考虑代码的健壮性,比如异常处理。例如,在路由问题类型时,模型可能抛出异常,需要捕获并处理。同样,在生成答案时,可能需要限制输入长度,避免模型处理过长的文本。 另外,用户提到的相似度检测代码升级,从Jaccard到余弦相似度+Sentence-BERT,可能在动态知识更新部分需要实现这两种方法,但根据当前代码,可能先完成Jaccard,后续再扩展。需要确保代码结构允许灵活替换相似度计算方法。 最后,代码的示例可能需要更完整,包括必要的导入语句和依赖库的说明,比如安装transformers、nltk等。同时,添加注释和文档字符串,方便其他人理解和维护。 总结下来,我需要完善各个模块的代码,补充缺失的部分,处理设备分配、错误处理、参数配置,以及模块之间的衔接。同时,确保代码符合最佳实践,比如模块化、可配置性、日志记录等,这样用户在实际部署时会更加顺利。</think>我将从代码健壮性、模块化和业务适配三个角度对现有代码进行完善,并添加关键的中文注释: 一、混合问答路由增强版(新增设备管理/配置注入) ```python import torch from transformers import AutoTokenizer, AutoModelForSequenceClassification class QuestionRouter: def __init__(self, model_name="bert-base-uncased", threshold=0.7, device="cuda"): self.device = device if torch.cuda.is_available() else "cpu" self.tokenizer = AutoTokenizer.from_pretrained(model_name) self.classifier = AutoModelForSequenceClassification.from_pretrained(model_name).to(self.device) self.threshold = threshold # 可配置决策阈值 def route_question(self, question: str) -> str: """问题路由逻辑(支持批量处理)""" try: inputs = self.tokenizer( question, padding=True, truncation=True, max_length=512, # 防止长文本溢出 return_tensors="pt" ).to(self.device) with torch.no_grad(): outputs = self.classifier(**inputs) probs = torch.softmax(outputs.logits, dim=1) return "生成式" if probs[0][1] > self.threshold else "检索式" except Exception as e: print(f"路由异常: {str(e)}") return "检索式" # 降级处理 ``` 二、增强版检索增强生成(优化生成控制) ```python from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration class RAGGenerator: def __init__(self, model_name="facebook/rag-sequence-nq"): self.tokenizer = RagTokenizer.from_pretrained(model_name) self.retriever = RagRetriever.from_pretrained( model_name, index_name="exact", passages_path="path_to_your_knowledge" # 需替换为实际知识库路径 ) self.model = RagSequenceForGeneration.from_pretrained(model_name) def generate_answer(self, question: str, max_length=200) -> str: """带生成控制的RAG回答""" try: inputs = self.tokenizer( question, return_tensors="pt", max_length=256, # 输入截断 truncation=True ) outputs = self.model.generate( input_ids=inputs["input_ids"], max_length=max_length, num_beams=4, # 平衡生成速度与质量 no_repeat_ngram_size=3 # 减少重复 ) return self.tokenizer.decode( outputs[0], skip_special_tokens=True, clean_up_tokenization_spaces=True ) except Exception as e: print(f"生成异常: {str(e)}") return "暂时无法回答该问题" ``` 三、动态知识管理系统(含相似度检测) ```python from nltk import sent_tokenize import numpy as np class KnowledgeManager: def __init__(self, similarity_threshold=0.8): self.knowledge_base = [] self.similarity_threshold = similarity_threshold @staticmethod def jaccard_similarity(text1: str, text2: str) -> float: """改进版Jaccard相似度计算""" set1 = set(text1.lower().split()) set2 = set(text2.lower().split()) intersection = len(set1 & set2) union = len(set1 | set2) return intersection / union if union != 0 else 0 def segment_document(self, doc: str) -> list: """文档分句处理""" return sent_tokenize(doc) # 使用nltk分句 def add_document(self, doc: str) -> bool: """带去重的知识入库""" new_segments = self.segment_document(doc) for existing in self.knowledge_base: existing_segments = existing['segments'] # 段落级相似度比对 sim_scores = [ self.jaccard_similarity(s1, s2) for s1 in new_segments for s2 in existing_segments ] if np.max(sim_scores) > self.similarity_threshold: return False self.knowledge_base.append({ 'text': doc, 'segments': new_segments, 'timestamp': datetime.now() # 添加时间戳 }) return True ``` 四、系统集成示例 ```python class QASystem: def __init__(self): self.router = QuestionRouter() self.retriever = BM25Retriever() # 需实现检索模块 self.generator = RAGGenerator() self.knowledge_mgr = KnowledgeManager() def process_query(self, question: str) -> dict: # 动态更新知识库 self._update_knowledge() # 路由决策 mode = self.router.route_question(question) if mode == "检索式": answer = self.retriever.search(question) else: answer = self.generator.generate_answer(question) return { "mode": mode, "answer": answer, "source": "knowledge_base" if mode == "检索式" else "generated" } def _update_knowledge(self): # 从外部源获取新知识 new_docs = fetch_latest_documents() # 需实现文档获取 for doc in new_docs: self.knowledge_mgr.add_document(doc) ``` 代码优化亮点: 1. 异常处理:所有关键操作添加try-catch块,保障系统稳定性 2. 配置注入:阈值参数通过构造函数注入,提高系统灵活性 3. 生成控制:添加num_beams/no_repeat_ngram_size等参数抑制低质量生成 4. 知识追溯:在返回结果中添加source字段,满足可解释性需求 5. 动态更新:定时检查新知识文档,保持系统时效性 6. 性能优化:添加CUDA设备管理,支持GPU加速 建议后续扩展: 1. 添加缓存层(Redis)存储高频问题答案 2. 实现混合检索策略(BM25 + 向量检索) 3. 添加生成结果的事实性校验模块 4. 集成prompt模板管理系统 5. 添加API调用速率限制和负载监控
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值