让小雅读你的资料:RAG
把你的笔记、文档喂给它,它就能答"你的私货"了
小雅现在能记住"你是谁",但它有个尴尬的盲区:它没读过你的东西。
你问它"我上周课程笔记里记的那个部署命令是啥?"——它两眼一抹黑,因为这些笔记从来没进过它的脑子。
这一节,我们给小雅一项杀手锏本领:让它读你的资料。喂给它你的笔记、文档、产品手册,它就能基于你的私货来回答,还能告诉你答案出自哪一段。这招的名字,叫 RAG。
为什么不能"把资料直接塞给它"?
你可能想:那把 100 页文档全贴进对话不就行了?
不行——还记得那块白板(上下文窗口) 吗?100 页根本写不下;就算写得下,又贵又慢,它还容易抓不住重点。
聪明的办法不是"全塞",而是“用哪段、才翻哪段”。
这就像开卷考试:
- 笨办法:把整本书背下来(塞满白板)——做不到,也没必要。
- 聪明办法:拿到题目,先翻到相关的那一两页,再照着答。
RAG 干的就是这件事:先检索、再回答。
RAG 三步:切块 → 检索 → 生成
RAG(检索增强生成)听着唬人,其实就三步:
- 切块:把你的资料切成一小段一小段,存进一个"资料库"。
- 检索:你一提问,系统先从资料库里捞出最相关的几小段。
- 生成:把"你的问题 + 捞出来的那几段"一起交给小雅,让它照着这几段来回答。
关键好处有两个:
- 不再瞎编:它的答案有据可依(就是捞出来的那几段),幻觉大大减少。
- 能用私有知识:你的笔记、内部文档,它都能答——这是通用大模型给不了的。
🙌 动手:给小雅建一个"资料库"
扣子里这个能力叫知识库:
- 在小雅的编排页,找到 知识库,新建一个。
- 上传几份你的资料(课程笔记、一份说明文档、几篇文章都行),平台会自动帮你切块、入库。
- 把这个知识库关联给小雅。
- 提一个只有你资料里才有答案的问题,比如"我笔记里写的那个一键部署命令是什么?"
- 看小雅从你的资料里捞出原文、据此回答——好的平台还会标出答案来自哪一段。
✅ 学完这步,你已经能把小雅变成任何一份资料的问答专家了——产品手册、课程讲义、公司制度,喂进去就能问。
🔧 上手:30 行写一个能跑的迷你 RAG
下面这段 Python 复制即可运行,把上面三步全做了。嵌入用本地中文模型(免 API、免 VPN,首次自动下载约 100MB),生成用 DeepSeek:
# pip install sentence-transformers openai
from sentence_transformers import SentenceTransformer, util
from openai import OpenAI
embedder = SentenceTransformer("BAAI/bge-small-zh-v1.5") # 本地中文嵌入模型
client = OpenAI(api_key="你的KEY", base_url="https://api.deepseek.com")
# ① 切块:你的资料切成一段段(真实项目从文件读,这里手写几段演示)
chunks = [
"一键部署命令是 bash deploy.sh,部署前要先备份数据库。",
"项目用 Next.js + Prisma,数据库是 MySQL。",
"课程分 5 章,从'什么是智能体'到'多智能体与上线'。",
]
# ② 入库:每段算成向量(归一化,便于算余弦相似度)
chunk_vecs = embedder.encode(chunks, normalize_embeddings=True)
def rag_answer(question: str, k: int = 2) -> str:
# ③ 检索:问题也算成向量,找最相近的 k 段
q_vec = embedder.encode(question, normalize_embeddings=True)
scores = util.cos_sim(q_vec, chunk_vecs)[0]
top = scores.argsort(descending=True)[:k]
context = "\n".join(f"- {chunks[i]}" for i in top)
print("🔍 检索到:\n", context)
# ④ 生成:问题 + 检索到的原文一起喂给模型,要求"只据此作答"
prompt = (f"只根据下面的资料回答问题,并说明依据;资料没有就说不知道。\n"
f"资料:\n{context}\n\n问题:{question}")
return client.chat.completions.create(
model="deepseek-chat", messages=[{"role": "user", "content": prompt}]
).choices[0].message.content
print("💬 答:", rag_answer("一键部署的命令是什么?"))
运行结果: 它会先打印检索到的那两段原文,再给出"是 bash deploy.sh,依据是第 1 段资料;另外记得先备份数据库"这种有据可查的回答。
第 ③ 步那个"按含义找最相近的几段"到底怎么算的?——下一节我们专门拆开那张神奇的"意思地图"。
RAG 的上限,卡在"能不能检索到对的那几段"。如果资料切得太碎/太大、或问题和资料用词差太远,可能捞错段落,小雅就会"一本正经地答偏"。
两个习惯能救命:① 资料尽量结构清晰;② 让它给出处——这样你一眼能看出它是"有据"还是"瞎编"。
我想用 RAG 做一个能回答『我自己资料』的助手。请帮我想:①我手头有哪些资料适合喂给它 ②怎么组织/命名这些资料检索效果更好 ③有哪些问题适合用来测试它检索得准不准。
现在的小雅,能读你的资料、据此回答、还给出处了——它从"懂你这个人"进化到"懂你的事"。学完这节,你已经能把任何一份资料变成一个问答助手。
但有个神奇的地方还没解释:你上传了 100 页,它怎么精准地翻到相关那一两段的?它可不是按关键词死磕——你问"怎么上线",它能找到写着"部署流程"的那段,哪怕一个字都没对上。
它是按"意思"在找。下一节,我们揭开这背后那张奇妙的"意思地图"——嵌入与向量。放心,不堆数学,只讲直觉。
