大家好,我是链上杯子(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!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐