小白程序员必看:手把手教你本地开发RAG知识库,轻松玩转大模型(收藏版)

本文介绍了如何利用RAG技术构建本地知识库,以增强大模型在特定领域的回答能力。首先分析了在大模型中直接输入大量文本的局限性,提出了微调和RAG两种解决方案,并详细阐述了RAG的工作原理。接着,通过代码实例展示了如何制作向量数据库、进行知识检索召回,并最终生成用于大模型的prompt。文章适合想要深入了解并实践大模型应用的开发者,尤其是对本地RAG知识库构建感兴趣的小白程序员。

在很多大模型平台上其实都已经内置了RAG知识库的功能,通常都是上传文档之后,做好分段切分,然后在调用大模型的时候就会关联上知识库进行输出。本篇就尝试本地开发一个RAG知识库,来学习一下具体的实现逻辑。

需求分析

通常我们与大模型交互时,大模型只能回复它所学习到的知识。 有的平台支持联网查询,可以补充部分信息。 不过如果我们希望它回答在某个领域下更垂类的问题时,效果可能就不尽人意。这个时候,就需要给大模型一些参考资料,让它根据资料进行“开卷作答”。

但是这就涉及到一个问题,我们当然可以将所需的内容比如一篇字数比较少的文章扔给大模型,并让它根据文章内容回复。但是,如果当参考资料是一本书的时候,我们不可能将所有几万字甚至几十上百万字的内容都直接在交互对话的过程中扔给大模型,根本不现实。

那么就有两个主要的思路:

  • 微调:根据资料内容制作训练集,在原模型的基础上进行在训练,得到一个更垂类的模型
  • RAG:另一种方法就是本篇文章中要讲的RAG技术。

RAG

RAG(Retrieval-augmented Generation,检索增强生成)是一种结合了语言模型的信息检索技术。从链路上来说,该技术并不改变大模型本身,而是在用户与大模型交互的过程中,增加一个步骤:从知识库检索资料的过程。

具体如下:

可以看到,相当于是在用户的输入到达大模型之前,先送给RAG这边,根据用户的输入先对知识库进行信息检索,然后拿到相关的部分,然后构造prompt,合并到用户的输入中,再送给大模型。prompt示例:

你是一位知识助手,请根据用户的问题和下列的片段生成准确的回答。用户问题:{query}相关片段:{separator.join(chunks)}请基于上述内容作答,不要编造信息

这样知识库和大模型的耦合度更低,是一种可插拔的实现方式,通过更换知识库的内容就可以实现大模型知识的更替,成本更低。

技术实现

这里将通过代码段的方式对实现步骤进行讲解

制作向量数据库

首先,我们要对知识库做处理,将其向量化来可被RAG使用

from typing import Listfrom sentence_transformers import SentenceTransformerfrom sentence_transformers import CrossEncoderimport chromadb# step1. 知识库分片def split_info_chunks(doc_file: str) -> List[str]: """ :param doc_file: 知识库的文件 :return: """ with open(doc_file, 'r', encoding="utf8") 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(name="default")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( documents=chunks, embeddings=embeddings, ids=ids )save_embedding(chunks, embeddings)

特殊说明

  1. sentence_transformer

库:用于加载embeddingcross-encoder模型,详细使用可以参考:

https://sbert.net/docs/quickstart.html
  1. chromadb

库:一个流行的向量数据库

  1. 在本demo中,主要是对中文做处理,所以使用的是shibing624/text2vec-base-chinese该模型;关于模型的选择可自行上hugging face找合适的embedding模型

至此,在用户提问前的服务对于知识库的处理便做好了,后续将会对做好的向量数据库进行查阅。

知识检索召回

本质上,这里实现的就是基于用户输入来对向量数据库检索的过程,发生在用户提问后,对用户输入的处理

# 召回,即选出最匹配的若干个chunkdef 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_results=top_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(key=lambda pair: pair[1], reverse=True) # 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)# 将用户提问和返回的知识块拼接成一个promptseparator = "/n/n"prompt = f"""你是一位知识助手,请根据用户的问题和下列的片段生成准确的回答。用户问题:{query}相关片段:{separator.join(reranked_chunks)}请基于上述内容作答,不要编造信息"""print(prompt)#后续就是将该prompt发送给大模型,等待大模型的返回,这里就不再实现了

运行后,最终prompt如上,相关片段就是RAG的结果,本篇主要是应用化实现,实际产品中仍需进一步优化。

如何学习大模型 AI ?

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

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

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

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

我在一线科技企业深耕十二载,见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事,早已在效率与薪资上形成代际优势,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套AI 大模型突围资料包

  • ✅ 从零到一的 AI 学习路径图
  • ✅ 大模型调优实战手册(附医疗/金融等大厂真实案例)
  • ✅ 百度/阿里专家闭门录播课
  • ✅ 大模型当下最新行业报告
  • ✅ 真实大厂面试真题
  • ✅ 2026 最新岗位需求图谱

所有资料 ⚡️ ,朋友们如果有需要《AI大模型入门+进阶学习资源包》下方扫码获取~

① 全套AI大模型应用开发视频教程

(包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点)

② 大模型系统化学习路线

作为学习AI大模型技术的新手,方向至关重要。 正确的学习路线可以为你节省时间,少走弯路;方向不对,努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划,带你从零基础入门到精通!

③ 大模型学习书籍&文档

学习AI大模型离不开书籍文档,我精选了一系列大模型技术的书籍和学习文档(电子版),它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。

④ AI大模型最新行业报告

2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

⑤ 大模型项目实战&配套源码

学以致用,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。

⑥ 大模型大厂面试真题

面试不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我精心整理了一份大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余

以上资料如何领取?

为什么大家都在学大模型?

最近科技巨头英特尔宣布裁员2万人,传统岗位不断缩减,但AI相关技术岗疯狂扩招,有3-5年经验,大厂薪资就能给到50K*20薪!

不出1年,“有AI项目经验”将成为投递简历的门槛。

风口之下,与其像“温水煮青蛙”一样坐等被行业淘汰,不如先人一步,掌握AI大模型原理+应用技术+项目实操经验,“顺风”翻盘!

这些资料真的有用吗?

这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

以上全套大模型资料如何领取?