news 2026/3/11 9:05:26

DeepSeek + RAG 手把手实战:从 0 到 1 打造你的个人知识库助手(附 Python 源码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek + RAG 手把手实战:从 0 到 1 打造你的个人知识库助手(附 Python 源码)

作者:飞哥(一位喜欢讲故事的全栈开发者,擅长把复杂的代码翻译成“人话”)
阶段:GenAI 与大模型应用
关键词:RAG, Embedding, 向量数据库, 知识库问答

大家好,我是飞哥。

前两周我们学会了让 AI “好好说话”(Prompt)和“动手干活”(Function Calling)。
但你在实际开发中,一定遇到过这样的尴尬场景:

  • 你问 ChatGPT:“评价一下我们公司最新的 V3.0 架构。”
  • ChatGPT 一脸懵逼:“亲,我只知道 2023 年以前的互联网公开信息,我不认识你们公司啊。”

或者更惨的:

  • ChatGPT 为了迎合你,开始一本正经地胡说八道(这叫幻觉 Hallucination)。

怎么解决?重新训练一个模型?太贵太慢了!
最聪明的办法是:考试时允许 AI “开卷”查资料
这就是RAG (Retrieval-Augmented Generation,检索增强生成)


1. 什么是 RAG?(三步理解法)

第一步:锚定已知 ⚓️

回想一下你做“开卷考试”的过程:

  1. 看到题目(用户提问)。
  2. 翻书,找到相关的段落(检索 Retrieval)。
  3. (或者总结)到试卷上(生成 Generation)。

RAG 的流程一模一样:先查库,再回答。

第二步:生动类比 📖

  • 纯 LLM (ChatGPT):像一个博学但与世隔绝的老教授。他懂历史天文,但不知道今天的新闻,也不知道你公司的机密。
  • RAG:就是给这位老教授配了一个超级图书管理员
    • 当你问问题时,图书管理员先去档案室(你的私有数据库)把相关文件找出来,递给教授。
    • 教授看着文件,结合自己的学识,给你一个完美的答案。

第三步:提炼骨架 🦴

RAG =检索 (Retrieval)+增强 (Augmented)+生成 (Generation)

  1. 用户提问:“怎么配置 Android 混淆?”
  2. 检索:系统去你的文档库里找,找到了proguard-rules.pro相关的三个段落。
  3. 增强:把这三个段落拼在 Prompt 里:“请根据以下资料回答用户问题…”
  4. 生成:AI 输出最终答案。

2. 核心技术:AI 怎么知道“哪段话”是相关的?

这里涉及到一个魔法概念:Embedding (嵌入/向量化)
计算机不认识字,只认识数字。Embedding 就是把一段文字变成一串数字坐标

2.1 什么是 Embedding?📍

  • 类比:图书馆的索书号
    • “苹果”和“香蕉”的索书号会离得很近(都是水果)。
    • “苹果”和“iPhone”的索书号也会离得很近(科技语境)。
    • “苹果”和“卡车”的索书号就会离得很远。

Embedding 模型会把每一句话变成一个高维向量(比如 OpenAI 的text-embedding-3-small模型生成的向量长度是 1536)。
意思越相近的话,它们在数学空间里的距离(余弦相似度 Cosine Similarity)就越近。

2.2 关键步骤:切片 (Chunking) 🔪

你可能会问:“为什么不把整本书直接塞给 AI?”

  1. 窗口限制 (Context Window):就像人的短期记忆有限。
    • 大模型一次只能处理一定长度的文字(称为Token,比如 4k、32k 或 128k)。
    • 如果你把整本《红楼梦》一次性发给它,超出的部分它根本“看不见”,或者会直接报错。
  2. 精度问题:即使模型能吃下整本书,关键信息也容易被淹没在大量的“废话”中(大海捞针),导致回答不准确。

所以,我们需要把大文档切成小块(Chunk)。

  • 不仅是切断:好的切片策略会保留上下文(比如句子不能切一半,段落之间要有重叠 Overlap)。
  • 常用策略:固定字符数切分、按段落切分、递归字符切分(Recursive)。

3. 实战作业:构建你的第一个“个人知识库” 📚

任务背景:你有一份本地的Android开发规范.md,你希望做一个问答工具,能回答关于这份文档的问题。

3.1 架构流程图

1.切片 Chunking

2.Embedding

3.Embedding

4.检索 Search

5.Top K 相关资料

6.生成回答

文档 Document

文本块 Chunks

向量数据库 Vector DB

用户提问 Query

问题向量

LLM 大模型

最终答案

3.2 核心组件选择

  • Embedding 模型:推荐 OpenAItext-embedding-3-small(便宜、效果好)或 HuggingFace 开源模型(如 BGE, M3E)。
  • 向量数据库
    • 入门/本地:ChromaDB, FAISS(轻量级,Python 直接调)。
    • 生产/云端:Pinecone, Weaviate, Milvus(高性能,支持亿级数据)。

3.3 极简代码实现 (Python)

这是一个可以运行的最小化 RAG Demo(不依赖复杂的向量数据库,直接用内存模拟,方便理解原理)。

前置准备:pip install openai numpy

importosimportnumpyasnpfromopenaiimportOpenAI# 1. 初始化客户端# 注意:这里我们需要两个客户端,因为 DeepSeek 目前只负责对话,向量化还得找 OpenAI (或其他)# 客户端 A:负责 Embedding (使用 OpenAI)# client_emb = OpenAI(api_key="YOUR_OPENAI_API_KEY")# 客户端 B:负责对话生成 (使用 DeepSeek)client_llm=OpenAI(api_key="YOUR_DEEPSEEK_API_KEY",base_url="https://api.deepseek.com")# 2. 模拟知识库:公司内部报销政策 (这是大模型绝对不知道的私有知识)knowledge_base=["出差补贴政策:一线城市(北上广深)每天补贴 300 元,其他城市每天补贴 150 元。","交通报销规定:高铁二等座全额报销,飞机经济舱需提前 3 天申请,打车仅限晚 9 点后。","餐饮报销额度:单人单餐上限 50 元,超过部分自理,禁止报销酒水。","住宿标准:一线城市上限 600 元/晚,非一线城市上限 400 元/晚,必须提供增值税专用发票。"]# 辅助函数:获取文本的 Embedding 向量 (本地模拟版,方便教学)defget_embedding(text):# === 教学模式:本地模拟 Embedding (无需 API Key) ===# 原理:关键词匹配模拟向量相似度# 定义向量的维度意义:[补贴相关, 交通相关, 餐饮相关, 住宿相关]vector=[0.0,0.0,0.0,0.0]if"补贴"intextor"一线城市"intext:vector[0]=1.0if"交通"intextor"高铁"intextor"飞机"intextor"打车"intext:vector[1]=1.0if"餐饮"intextor"吃"intextor"酒水"intext:vector[2]=1.0if"住宿"intextor"酒店"intextor"发票"intext:vector[3]=1.0ifsum(vector)==0:returnnp.random.rand(4)returnvector# === 如果您有 OpenAI Key,可以使用下面的真实代码 ===# response = client_emb.embeddings.create(# input=text,# model="text-embedding-3-small"# )# return response.data[0].embedding#辅助函数:计算余弦相似度defcosine_similarity(v1,v2):returnnp.dot(v1,v2)/(np.linalg.norm(v1)*np.linalg.norm(v2))defsimple_chat(user_query):print(f"\n[无 RAG] 正在直接问大模型:{user_query}...")response=client_llm.chat.completions.create(model="deepseek-chat",messages=[{"role":"system","content":"你是一个有用的助手。"},{"role":"user","content":user_query},],temperature=0.7,# 闲聊模式可以稍微高一点,更有创造性)returnresponse.choices[0].message.contentdefrag_chat(user_query):print(f"\n[有 RAG] 正在思考问题:{user_query}...")# === 步骤 1:检索 (Retrieval) ===# 1.1 把用户问题变成向量query_vector=get_embedding(user_query)# 1.2 遍历知识库,计算相似度similarities=[]fordocinknowledge_base:doc_vector=get_embedding(doc)score=cosine_similarity(query_vector,doc_vector)similarities.append((score,doc))# 1.3 找出最相似的 Top 1similarities.sort(key=lambdax:x[0],reverse=True)best_doc=similarities[0][1]print(f"✅ 找到最相关资料 (相似度{similarities[0][0]:.4f}):\n ->{best_doc}")# === 步骤 2:生成 (Generation) ===# 2.1 组装 Promptprompt=f""" 你是一个公司的行政助手。请基于以下【公司内部政策】回答员工问题。 ⚠️ 严格基于参考资料回答,不要编造。 参考资料:{best_doc}员工问题:{user_query}"""# 2.2 调用 LLMresponse=client_llm.chat.completions.create(model="deepseek-chat",messages=[{"role":"system","content":"你是一个有用的助手。"},{"role":"user","content":prompt}],temperature=0.1# 关键设置:RAG 任务建议设低温度,让回答更严谨,减少幻觉)returnresponse.choices[0].message.content# Main 运行if__name__=="__main__":test_query="我去上海出差,每天补贴多少钱?"# 1. 对比:无 RAG (直接问)answer_no_rag=simple_chat(test_query)print(f"\n❌ [无 RAG] AI 回答:\n{answer_no_rag}\n")print("-"*50)# 2. 对比:有 RAG (查资料后再问)answer_rag=rag_chat(test_query)print(f"\n✅ [有 RAG] AI 回答:\n{answer_rag}")

4. 总结

  1. RAG 是企业级 AI 应用的基石。它解决了 AI知识过时数据隐私两大痛点。
  2. Embedding是 RAG 的核心,它实现了“语义搜索”(搜意思,而不是搜关键词)。

下一篇预告
基本的 RAG 做出来了,但你会发现效果有时候并不好:

  • 切片切断了上下文怎么办?
  • 搜出来的资料不准怎么办?
    下一篇,我们将学习RAG 进阶与评估,引入Rerank (重排序)混合检索,打造生产级别的 RAG 系统!

📢 关注“飞哥”

看得懂、学得会、用得上,我是飞哥,一个拥有 10 年经验的全栈 AI 开发者。

  • 👍点赞/收藏:方便日后复习,也防止走丢。
  • 🗣️交流讨论:在评论区留下你的问题,飞哥看到必回!
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/10 11:44:41

2026年AI大模型将爆发?一文读懂产业落地趋势,程序员必收藏

AI大模型技术正加速从技术概念转向产业现实,2026年或将成为规模化落地的拐点。在餐饮、零售、工业等领域,AI已实现从食品安全管理、智能客服到钢铁高炉智能控制的实际应用。企业对AI的认知正从"效率工具"转变为"核心引擎"&#xff0…

作者头像 李华
网站建设 2026/3/9 18:58:39

通信原理篇---多径效应

我们用“回声听不清说话”这个生活场景,来彻底讲懂多径效应。核心比喻:在山谷里喊话想象一下,你站在一个 有很多高大建筑物的山谷(或一个大厅) 里,对着远处的朋友喊一句话:“我们几点吃饭&#…

作者头像 李华
网站建设 2026/3/4 3:27:02

探索三相PWM整流器的双闭环控制实现

三相PWM整流器,采用双闭环控制,用C语言实现PI控制,SVPWM等模块。在电力电子领域,三相PWM整流器因其能够实现能量双向流动、单位功率因数运行等优点,应用愈发广泛。今天咱们就聊聊基于双闭环控制,并用C语言实…

作者头像 李华
网站建设 2026/3/10 15:10:04

基于MATLAB/Simulink的移相变压器仿真模型探索:Phase_Shift_T

Phase_Shift_T:基于MATLAB/Simulink的移相变压器仿真模型,可实现-25、-15……25的移相。 变压器副边实现36脉波不控整流,变压器网侧电压、阈侧电压以及移相角度可直接设置。 仿真条件:MATLAB/Simulink R2015b最近在研究电力系统相…

作者头像 李华