《2026 LangChain零基础入门:用AI应用框架快速搭建智能助手》第7课:RAG 入门 —— 让AI读你的本地文档再回答问题,构建个人知识库助手
大家好,我是链上杯子(CSDN:链上杯子)。
失业一年了,天天想着怎么翻身。上节课给AI加了各种工具后,我最想实现的还是“让它读我的笔记、文章、PDF,再精准回答问题”。以前问模型,它只能靠训练数据;现在用 RAG(Retrieval-Augmented Generation),AI 可以先从本地文档里“找答案”,再生成回复。第一次看到它直接引用我自己写的笔记回答问题,感觉像给自己造了个私人知识库管家。
本课目标:
学会使用 LangChain 的 RAG 流程:文档加载 → 切分 → 向量化 → 检索 → 生成。
学完这节课,你就能构建一个“读本地文件 + 智能问答”的个人知识库助手,实现“问我笔记里的内容”不再靠死记硬背。
环境准备(额外安装)
在你的 venv 里运行以下命令(如果还没装):
pip install langchain-text-splitters langchain-community faiss-cpu sentence-transformers pypdf
faiss-cpu:本地向量数据库(简单高效)sentence-transformers:免费中文/英文嵌入模型pypdf:读取 PDF(如果用 txt 则不需要)
准备几个测试文档:
- 在项目目录下新建
my_notes/文件夹,放 2–3 个 txt 或 pdf 文件(例如笔记、文章、读书摘抄)
核心代码实战
1. 完整 RAG 流程(从文档到问答)
from langchain_openai import ChatOpenAI
from langchain_community.document_loaders import DirectoryLoader, TextLoader, PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.chains import RetrievalQA
import os
# 初始化大模型
llm = ChatOpenAI(
openai_api_key="", # ←←← 这里替换成你的 DeepSeek API Key
openai_api_base="https://api.deepseek.com/v1",
model="deepseek-chat",
temperature=0.3 # RAG 建议低温度,更准确
)
# 步骤1:加载本地文档(支持 txt / pdf / 目录)
loader = DirectoryLoader(
"my_notes/", # 你的文档文件夹
glob="**/*", # 加载所有文件
loader_cls=TextLoader, # 默认 txt;pdf 用 PyPDFLoader
# 如果全是 pdf,可改成 loader_cls=PyPDFLoader
)
docs = loader.load()
print(f"加载了 {len(docs)} 个文档")
# 步骤2:文档切分(大段切成小块,便于检索)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=800, # 每块约 800 字符
chunk_overlap=100, # 重叠 100 字符,避免断句
separators=["\n\n", "\n", "。", "!", "?", " ", ""]
)
chunks = text_splitter.split_documents(docs)
print(f"切分成 {len(chunks)} 个小块")
# 步骤3:向量化 + 存入本地向量库(用免费中文嵌入模型)
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
vectorstore = FAISS.from_documents(chunks, embeddings)
print("向量库构建完成")
# 步骤4:构建 RAG 链(检索 + 生成)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff", # 简单把检索到的文档塞进 Prompt
retriever=vectorstore.as_retriever(search_kwargs={"k": 4}), # 取最相似的 4 块
return_source_documents=True # 返回来源,便于验证
)
# 测试问答
query = "我笔记里关于失恋的建议写了什么?"
result = qa_chain.invoke({"query": query})
print("问题:", query)
print("\nAI 回答:")
print(result["result"])
print("\n引用来源(前两个):")
for doc in result["source_documents"][:2]:
print("- " + doc.page_content[:200] + "...")
运行后,AI 会先从你的笔记里检索相关段落,再生成答案,并告诉你引用了哪些部分。
小知识点:
DirectoryLoader:批量加载文件夹文档RecursiveCharacterTextSplitter:智能切分中文文档(优先按段落、句子、标点)HuggingFaceEmbeddings:免费本地嵌入模型(支持中文)FAISS:高效本地向量数据库RetrievalQA:最简单 RAG 链,检索 → 塞 Prompt → 生成
2. 更精准版 —— 加 Prompt 模板 + 来源引用
from langchain.prompts import PromptTemplate
# 自定义 RAG Prompt(中文)
rag_prompt = PromptTemplate.from_template(
"""你是一个基于文档的智能助手。请严格根据以下检索到的内容回答问题,不要编造信息。如果信息不足,就说“我没有找到相关内容”。
检索到的内容:
{context}
问题:{question}
回答:"""
)
# 替换默认 chain 的 prompt
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(search_kwargs={"k": 5}),
return_source_documents=True,
chain_type_kwargs={"prompt": rag_prompt}
)
# 测试
result = qa_chain.invoke({"query": "我之前记了哪些 Python 学习建议?"})
print(result["result"])
3. 互动问答版 + 自动保存向量库
print("=== 个人知识库问答(输入 'quit' 退出) ===")
# 保存向量库(下次可直接加载,避免重复嵌入)
vectorstore.save_local("my_vector_index")
# 下次加载:
# vectorstore = FAISS.load_local("my_vector_index", embeddings, allow_dangerous_deserialization=True)
while True:
question = input("问我笔记里的内容:").strip()
if question.lower() == "quit":
break
result = qa_chain.invoke({"query": question})
print("\nAI 回答:")
print(result["result"])
print("\n(引用来源数量:{})".format(len(result["source_documents"])))
小练习(2 道)
练习1(基础)
在你的 my_notes/ 放 3–5 个 txt 文件(随便写点笔记、文章)。
运行第1段代码,问:“笔记里关于‘目标’或‘计划’的内容是什么?”
观察 AI 是否正确引用你的原话。
练习2(进阶)
修改 rag_prompt,增加一句:“回答时请标注来源,例如 [来源1]。”
在回答后手动添加来源标记。
再问一个长问题,看 AI 是否更严谨、不胡编。
本课小结
本课学习了 RAG 完整流程:加载文档 → 切分 → 嵌入 → 向量检索 → 生成答案。
RAG 让 AI “基于你的私有数据”回答问题,大幅降低幻觉,是构建个人知识库、内部问答系统的最核心技术。
下节预告
下一课(完结篇):小项目实战 + 部署 —— 构建网页版个人知识库 AI 助手,用 Streamlit 做界面,部署到免费云平台。
欢迎在评论区贴出你的 RAG 运行截图、问答效果、或笔记文件夹结构~
如果觉得这篇有用,欢迎点赞或关注,一起玩转 LangChain!
更多推荐


所有评论(0)