尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

【干货收藏】大模型RAG知识库实现:从原理到代码的完整教程

【干货收藏】大模型RAG知识库实现:从原理到代码的完整教程 前言在很多大模型平台上其实都已经内置了RAG知识库的功能通常都是上传文档之后做好分段切分然后在调用大模型的时候就会关联上知识库进行输出。本篇就尝试本地开发一个RAG知识库来学习一下具体的实现逻辑。需求分析通常我们与大模型交互时大模型只能回复它所学习到的知识。 有的平台支持联网查询可以补充部分信息。 不过如果我们希望它回答在某个领域下更垂类的问题时效果可能就不尽人意。这个时候就需要给大模型一些参考资料让它根据资料进行“开卷作答”。但是这就涉及到一个问题我们当然可以将所需的内容比如一篇字数比较少的文章扔给大模型并让它根据文章内容回复。但是如果当参考资料是一本书的时候我们不可能将所有几万字甚至几十上百万字的内容都直接在交互对话的过程中扔给大模型根本不现实。那么就有两个主要的思路微调根据资料内容制作训练集在原模型的基础上进行在训练得到一个更垂类的模型RAG另一种方法就是本篇文章中要讲的RAG技术。RAGRAGRetrieval-augmented Generation检索增强生成是一种结合了语言模型的信息检索技术。从链路上来说该技术并不改变大模型本身而是在用户与大模型交互的过程中增加一个步骤从知识库检索资料的过程。具体如下可以看到相当于是在用户的输入到达大模型之前先送给RAG这边根据用户的输入先对知识库进行信息检索然后拿到相关的部分然后构造prompt合并到用户的输入中再送给大模型。prompt示例你是一位知识助手请根据用户的问题和下列的片段生成准确的回答。用户问题{query} 相关片段 {separator.join(chunks)} 请基于上述内容作答不要编造信息这样知识库和大模型的耦合度更低是一种可插拔的实现方式通过更换知识库的内容就可以实现大模型知识的更替成本更低。技术实现这里将通过代码段的方式对实现步骤进行讲解制作向量数据库首先我们要对知识库做处理将其向量化来可被RAG使用from typing import List from sentence_transformers import SentenceTransformer from sentence_transformers import CrossEncoder import chromadb # step1. 知识库分片 def split_info_chunks(doc_file: str) - List[str]: :param doc_file: 知识库的文件 :return: with open(doc_file, r, encodingutf8) as f: content f.read() # 按段落进行分块 return [chunk for chunk in content.split(\n\n)] # 传入你的知识库文件 chunks split_info_chunks(doc.txt) # step2. 向量化 使用embedding模型进行向量化 embedding_model SentenceTransformer(shibing624/text2vec-base-chinese) def embed_chunk(chunk: str) - List[float]: embedding embedding_model.encode(chunk) return embedding.tolist() embeddings [embed_chunk(chunk) for chunk in chunks] # step3. 存入将向量化后的数据存入向量数据库 # 内存型向量数据库 chromadb_client chromadb.EphemeralClient() # 创建一个数据库表 chromadb_collection chromadb_client.get_or_create_collection(namedefault) def save_embedding(chunks: List[str], embeddings: List[List[float]]) - None: # 定义id chromadb需要定义好id ids [str(i) for i in range(len(chunks))] chromadb_collection.add( documentschunks, embeddingsembeddings, idsids ) save_embedding(chunks, embeddings)特殊说明sentence_transformer库用于加载embedding和cross-encoder模型详细使用可以参考https://sbert.net/docs/quickstart.htmlchromadb库一个流行的向量数据库在本demo中主要是对中文做处理所以使用的是shibing624/text2vec-base-chinese该模型关于模型的选择可自行上hugging face找合适的embedding模型至此在用户提问前的服务对于知识库的处理便做好了后续将会对做好的向量数据库进行查阅。知识检索召回本质上这里实现的就是基于用户输入来对向量数据库检索的过程发生在用户提问后对用户输入的处理# 召回即选出最匹配的若干个chunk def retrieve(query: str, top_k: int) - List[str]: :param query: 用户输入的问题 :param top_k: 最匹配的chunk知识块的数量 :return: query_embedding embed_chunk(query) results chromadb_collection.query( query_embeddings[query_embedding], n_resultstop_k ) return results[documents][0] # 由于召回功能不一定能把最优的知识块排序到最前面 # 所以需要重排模型 CrossEncoder进行检索内容的进一步优化 def rerank(query: str, retrieved_chunks: List[str], top_k: int) - List[str]: :param query: 用户输入的问题 :param retrieved_chunks: 召回的chunks列表 :param top_k: 重新去最匹配的若干 :return: cross_encoder CrossEncoder(cross-encoder/mmarco-mMiniLMv2-L12-H384-v1) # 将每个召回结果和问题进行关联 pairs [(query, chunk) for chunk in retrieved_chunks] # 重新计算找回结果和问题的匹配度计算得分 scores cross_encoder.predict(pairs) chunk_with_score_list [(chunk, score) for chunk, score in zip(retrieved_chunks, scores)] chunk_with_score_list.sort(keylambda pair: pair[1], reverseTrue) # print(chunk_with_score_list) return [chunk for chunk, _ in chunk_with_score_list][:top_k]至此数据库检索以及优化部分也完成了。demo演示接下来就演示一下实际的效果这里的知识库doc.txt我选用的是鲁迅先生的《狂人日记》来进行RAG演示# 假设用户的提问 query 妹妹发生什么事了 # 开始进行知识库召回检索和优化 # 优先检索最匹配的5个知识块 retrieved_chunks retrieve(query, 5) # 对知识块的关联性进行重新排序返回关联度最高的3个知识块 reranked_chunks rerank(query, retrieved_chunks, 3) # 将用户提问和返回的知识块拼接成一个prompt separator \n\n prompt f你是一位知识助手请根据用户的问题和下列的片段生成准确的回答。 用户问题{query} 相关片段 {separator.join(reranked_chunks)} 请基于上述内容作答不要编造信息 print(prompt) #后续就是将该prompt发送给大模型等待大模型的返回这里就不再实现了运行后最终prompt如上相关片段就是RAG的结果本篇主要是应用化实现实际产品中仍需进一步优化。最后为什么要学AI大模型当下⼈⼯智能市场迎来了爆发期并逐渐进⼊以⼈⼯通⽤智能AGI为主导的新时代。企业纷纷官宣“ AI ”战略为新兴技术⼈才创造丰富的就业机会⼈才缺⼝将达 400 万DeepSeek问世以来生成式AI和大模型技术爆发式增长让很多岗位重新成了炙手可热的新星岗位薪资远超很多后端岗位在程序员中稳居前列。与此同时AI与各行各业深度融合飞速发展成为炙手可热的新风口企业非常需要了解AI、懂AI、会用AI的员工纷纷开出高薪招聘AI大模型相关岗位。最近很多程序员朋友都已经学习或者准备学习 AI 大模型后台也经常会有小伙伴咨询学习路线和学习资料我特别拜托北京清华大学学士和美国加州理工学院博士学位的鲁为民老师给大家这里给大家准备了一份涵盖了AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频全系列的学习资料这些学习资料不仅深入浅出而且非常实用让大家系统而高效地掌握AI大模型的各个知识点。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】AI大模型系统学习路线在面对AI大模型开发领域的复杂与深入精准学习显得尤为重要。一份系统的技术路线图不仅能够帮助开发者清晰地了解从入门到精通所需掌握的知识点还能提供一条高效、有序的学习路径。但知道是一回事做又是另一回事初学者最常遇到的问题主要是理论知识缺乏、资源和工具的限制、模型理解和调试的复杂性在这基础上找到高质量的学习资源不浪费时间、不走弯路又是重中之重。AI大模型入门到实战的视频教程项目包看视频学习是一种高效、直观、灵活且富有吸引力的学习方式可以更直观地展示过程能有效提升学习兴趣和理解力是现在获取知识的重要途径光学理论是没用的要学会跟着一起敲要动手实操才能将自己的所学运用到实际当中去这时候可以搞点实战案例来学习。海量AI大模型必读的经典书籍PDF阅读AI大模型经典书籍可以帮助读者提高技术水平开拓视野掌握核心技术提高解决问题的能力同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说阅读经典书籍是非常有必要的。600AI大模型报告实时更新这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示。AI大模型面试真题答案解析我们学习AI大模型必然是想找到高薪的工作下面这些面试题都是总结当前最新、最热、最高频的面试题并且每道题都有详细的答案面试前刷完这套面试题资料小小offer不在话下这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
返回列表