15天学会AI应用开发(七)有了大模型为什么还要引入RAG
15天学会AI应用开发(七)有了大模型为什么还要引入RAG
大家好,欢迎来到《15天学会AI应用开发》的第七天。在前几天的学习中,我们已经见识了大模型的强大:它能写诗、能编程、能回答各种问题,仿佛无所不能。那么问题来了——既然大模型已经这么厉害,为什么我们还要引入RAG(检索增强生成)技术呢?今天,我们就来解开这个谜题,用通俗易懂的语言和代码示例,让你彻底理解RAG的必要性。## 大模型的“短板”:知道很多,但总有不知道的想象一下,你有一个超级聪明的朋友,他读过几万亿本书,但有一个致命的缺点:他的知识截止于某个时间点(比如2023年1月)。如果你问他“2024年的诺贝尔奖得主是谁?”,他只能尴尬地摇头,或者瞎编一个答案。这就是大模型的第一个短板——知识时效性。第二个短板是专业化知识的缺失。大模型虽然见过海量数据,但针对你公司的内部文档、特定领域的论文、或者你的私人笔记,它完全一无所知。比如,你问它“我们公司最新的产品发布计划是什么?”它肯定答不上来。第三个短板是幻觉问题。当大模型不知道答案时,它不会承认“不知道”,而是会自信地编造一个看起来合理的答案。这在医疗、金融等领域可能造成严重问题。RAG技术正是为了解决这些问题而生的:它让大模型在生成回答之前,先去一个外部知识库中检索相关信息,然后把检索到的内容作为上下文提供给大模型,使其能够基于真实、最新的信息来回答问题。## RAG的核心原理:先查资料,再回答RAG的工作流程可以简单概括为三步:1. 检索:当用户提出问题时,系统首先在知识库中搜索最相关的文档片段。2. 增强:将检索到的文档片段与原始问题拼接成新的提示(Prompt)。3. 生成:大模型基于增强后的提示生成回答。这种方法结合了检索系统的精准性和大模型的生成能力,就像我们人类遇到问题时,先查资料再回答一样自然。## 实战演示:没有RAG vs 有RAG让我们通过代码来直观感受RAG的价值。首先,我们模拟一个场景:假设你有一个公司内部知识库,包含了一些产品文档。我们先用纯大模型来回答问题,再对比引入RAG后的效果。### 示例一:没有RAG——大模型独自战斗python# 模拟一个没有RAG的场景from openai import OpenAI# 假设你使用的是某个大模型APIclient = OpenAI(api_key="your-api-key")# 用户提问:关于公司内部的具体信息question = "我们公司最新的产品“智能空调Pro”的保修政策是什么?"# 直接让大模型回答,没有任何上下文response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "你是一个专业的客服助手。"}, {"role": "user", "content": question} ])print("没有RAG的回答:")print(response.choices[0].message.content)# 输出示例:# “您好!关于‘智能空调Pro’的保修政策,根据行业标准,通常提供1年质保...# 请注意,具体政策可能因地区和购买渠道不同而有所差异。”# # 问题:大模型根本不知道“智能空调Pro”是什么,只能瞎猜!问题分析:大模型没有访问公司内部文档,所以它只能根据一般的行业知识来回答,甚至可能编造信息。如果用户是公司员工,看到这个回答就会知道它完全不准确。### 示例二:有RAG——检索增强回答python# 模拟一个简单RAG系统import numpy as npfrom sentence_transformers import SentenceTransformerfrom openai import OpenAI# 假设的知识库(公司内部文档片段)knowledge_base = [ "智能空调Pro保修政策:3年整机保修,压缩机10年保修。", "智能空调Pro能效等级:一级能效,APF值达到5.0。", "智能空调Pro支持WiFi远程控制,兼容HomeKit和Alexa。", "智能空调Pro售价:标准版4999元,旗舰版6999元。"]# 使用Embedding模型进行语义检索embedder = SentenceTransformer('all-MiniLM-L6-v2')def retrieve_relevant_docs(query, top_k=1): """检索与查询最相关的文档片段""" query_embedding = embedder.encode(query) doc_embeddings = embedder.encode(knowledge_base) # 计算余弦相似度 similarities = np.dot(doc_embeddings, query_embedding) / ( np.linalg.norm(doc_embeddings, axis=1) * np.linalg.norm(query_embedding) ) top_indices = np.argsort(similarities)[-top_k:][::-1] return [knowledge_base[i] for i in top_indices]# RAG流程question = "我们公司最新的产品“智能空调Pro”的保修政策是什么?"# 第一步:检索相关文档relevant_docs = retrieve_relevant_docs(question, top_k=2)retrieved_context = "\n".join(relevant_docs)# 第二步:构建增强的Promptrag_prompt = f"""请基于以下提供的资料来回答问题。如果资料中没有相关信息,请如实告知。相关资料:{retrieved_context}用户问题:{question}你的回答:"""# 第三步:让大模型生成回答client = OpenAI(api_key="your-api-key")response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "你是一个专业的客服助手,回答必须基于提供的资料。"}, {"role": "user", "content": rag_prompt} ])print("有RAG的回答:")print(response.choices[0].message.content)# 输出示例:# “您好!根据公司资料,‘智能空调Pro’的保修政策如下:# 1. 3年整机保修# 2. 压缩机10年保修# # 如有其他问题,欢迎随时咨询!”效果对比:引入RAG后,回答基于真实的内部文档,准确且可信。用户得到了真正有用的信息。## RAG的进阶应用:动态知识库与多轮对话在实际应用中,RAG系统需要处理更复杂的场景。比如,知识库可能会不断更新,用户可能会进行多轮对话。让我们看一个更完整的示例,包含动态更新和多轮对话支持。python# 进阶RAG系统:支持知识库动态更新和多轮对话import jsonfrom sentence_transformers import SentenceTransformerimport numpy as npclass RAGSystem: def __init__(self, embedding_model_name='all-MiniLM-L6-v2'): self.embedder = SentenceTransformer(embedding_model_name) self.documents = [] # 存储文档片段 self.embeddings = [] # 存储对应的向量 self.conversation_history = [] # 存储对话历史 def add_documents(self, new_docs): """向知识库添加新文档""" self.documents.extend(new_docs) new_embeddings = self.embedder.encode(new_docs) self.embeddings.extend(new_embeddings) print(f"已添加 {len(new_docs)} 个文档,当前知识库共 {len(self.documents)} 个文档") def search(self, query, top_k=3): """语义搜索最相关的文档""" query_embedding = self.embedder.encode(query) if not self.embeddings: return [] # 批量计算相似度 similarities = np.dot(np.array(self.embeddings), query_embedding) / ( np.linalg.norm(np.array(self.embeddings), axis=1) * np.linalg.norm(query_embedding) ) top_indices = np.argsort(similarities)[-top_k:][::-1] results = [] for idx in top_indices: results.append({ 'document': self.documents[idx], 'score': similarities[idx] }) return results def generate_response(self, question, use_history=True): """生成RAG增强的回答""" # 构建包含历史对话的搜索查询 search_query = question if use_history and self.conversation_history: # 将最近的对话历史加入搜索,提高上下文相关性 recent_history = self.conversation_history[-3:] search_query = " ".join([f"{h['role']}: {h['content']}" for h in recent_history]) + f" User: {question}" # 检索相关文档 relevant_docs = self.search(search_query, top_k=2) retrieved_context = "\n".join([doc['document'] for doc in relevant_docs]) # 构建增强的Prompt(包含历史) history_str = "" if use_history and self.conversation_history: history_str = "\n".join([f"{h['role']}: {h['content']}" for h in self.conversation_history[-3:]]) prompt = f"""对话历史:{history_str}相关资料:{retrieved_context}最新问题:{question}请基于资料和对话历史回答:""" # 这里模拟大模型生成回答(实际应调用API) simulated_answer = f"基于检索到的文档,回答如下:\n{retrieved_context[:100]}..." # 更新对话历史 self.conversation_history.append({"role": "user", "content": question}) self.conversation_history.append({"role": "assistant", "content": simulated_answer}) return simulated_answer# 使用示例rag = RAGSystem()# 初始知识库rag.add_documents([ "智能空调Pro初始售价:4999元", "智能空调Pro支持制冷和制热",])# 第一轮对话print("用户:智能空调Pro多少钱?")print("RAG回答:", rag.generate_response("智能空调Pro多少钱?"))print()# 动态添加新文档(模拟知识库更新)rag.add_documents([ "智能空调Pro夏季促销:7月1日至7月31日,立减500元", "促销期间购买额外赠送价值200元的安装服务",])# 第二轮对话(利用历史)print("用户:现在有促销活动吗?")print("RAG回答:", rag.generate_response("现在有促销活动吗?"))输出示例:已添加 2 个文档,当前知识库共 2 个文档用户:智能空调Pro多少钱?RAG回答:基于检索到的文档,回答如下:智能空调Pro初始售价:4999元...已添加 2 个文档,当前知识库共 4 个文档用户:现在有促销活动吗?RAG回答:基于检索到的文档,回答如下:智能空调Pro夏季促销:7月1日至7月31日,立减500元...## RAG的挑战与优化方向虽然RAG已经很有用,但它并非完美无缺。在实际应用中,我们需要注意以下几点:1. 检索准确性:如果检索到的文档不相关,大模型会被误导。解决方案:优化Embedding模型、使用重排序(Re-ranking)技术、增加检索数量后让大模型自己筛选。2. 上下文窗口限制:大模型能处理的输入长度有限,不能把所有知识都塞进去。解决方案:智能截断、分块策略优化、使用滑动窗口。3. 实时性:知识库更新后,检索结果需要及时反映。解决方案:使用增量索引、定期重建向量库。4. 多模态数据:如果知识库包含图片、表格等,需要额外的处理。解决方案:使用多模态Embedding模型、表格转文本预处理。## 总结通过今天的文章,你应该已经理解了为什么有了大模型还要引入RAG。大模型就像是一个知识渊博但有点“过时”的教授,而RAG就像是给他配了一个随时更新的图书馆。两者结合,才能发挥出最大的威力。核心要点回顾:- 大模型的三大短板:知识时效性、专业化知识缺失、幻觉问题- RAG的解决思路:先检索相关文档,再基于检索结果生成回答- 实战中,RAG系统需要处理动态知识库和多轮对话等复杂场景- 优化方向包括检索准确性、上下文管理、实时性等在接下来的课程中,我们将深入探讨如何构建生产级的RAG系统,包括向量数据库选型、检索优化、以及如何与现有业务系统集成。记住,RAG不是大模型的替代品,而是它的“外挂大脑”——让AI真正成为你工作中的得力助手。
更多推荐

所有评论(0)