让大模型读懂你的私有文档:一文讲透 RAG 检索增强生成与Agent智能体落地
RAG
RAG,即Retrieval Augmented Generation,检索增强生成,被誉为当前大模型落地的“黄金架构”。它的核心逻辑非常简单却高效:先检索私有文档,后生成。
在用户提问时,系统先去私有知识库中搜索相关片段,将这些片段作为“上下文”连同问题一起喂给大模型。这样,大模型就能基于事实回答问题,极大地减少了幻觉,提升了专业度。
LangChain 重塑 RAG
一
在 LangChain 生态中,RAG 的核心逻辑通过 Retriever 接口完美落地。
-
外部数据的接入点:LangChain 提供了丰富的 Retriever integrations,让你能轻松连接各种数据源(无论是本地的 PDF/Markdown 文档,还是外部的 API 服务)。 -
打破知识边界:通过调用这些检索器,大模型不再受限于训练数据的截止时间或通用知识库,它获得了动态的“外部记忆”,能够基于你提供的私有数据回答问题,从而真正实现 RAG 的价值——精准、可控、无幻觉。
核心依赖库安装
pip install langchain-text-splitters faiss-cpu langchain_communitypip install dashscope
-
langchain-text-splitters:文本切割成小块
-
faiss-cpu:向量数据库,实现高效检索
-
langchain_community:是连接 LangChain 核心与外部生态的桥梁
-
dashscope: 通义千问系列的官方 Python SDK
实战演练:构建 Agentic RAG 系统
二
本案例将构建一个“校园学生手册问答助手”。
-
输入:一份 student.mdMarkdown 格式的学生手册。 -
能力:用户提问学校纪律等内容,系统自动检索手册内容并回答。 -
架构:DeepSeek (LLM) + DashScope (Embedding) + FAISS (Vector DB) + LangChain Agent。
2.1 通过API调用DeepSeek【DeepSeek 作为推理模型】
import osfrom dotenv import load_dotenvload_dotenv(override=True)# 初始化 DeepSeek 大模型 (推理大脑)from langchain_deepseek import ChatDeepSeekmodel = ChatDeepSeek(model='deepseek-chat',api_key = os.getenv("DEEPSEEK_API_KEY"))question = "你好,请你介绍一下你自己。"result = model.invoke(question)print(result.content)
2.2 使用通义千问的`Embeddings`模型将自然语言转化成词向量
from langchain_community.embeddings import DashScopeEmbeddings#初始化 DashScope Embedding (文本向量化)embed = DashScopeEmbeddings(model="text-embedding-v3", # 使用通义千问 text-embedding-v3 模型dashscope_api_key=os.getenv("DASHSCOPE_API_KEY"))# 简单测试向量化text = "你好,这是一个测试。"query_result = embed.embed_query(text)print(query_result[:5]) # 打印前5个维度,输出如下#[-0.08589579164981842, 0.015449581667780876, -0.09188129007816315, -0.05301441624760628, -0.04971073195338249]
2.3 文本数据处理与向量库构建
-
读取本地学生手册文档,按 Markdown 标题智能切分
# 读取文档file_path = "student.md"with open(file_path, "r", encoding="utf-8") as f:md_content = f.read()md_content#按标题层级切割 (#, ##),保留结构信息from langchain_text_splitters import MarkdownHeaderTextSplitterheaders_to_split_on = [("#", "Header 1"),("##", "Header 2")]markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)md_header_splits = markdown_splitter.split_text(md_content)md_header_splits

-
创建并保存 FAISS 向量库
from langchain_community.vectorstores import FAISSvector_store = FAISS.from_documents(md_header_splits, embedding=embed)vector_store.save_local("student_handbook_db")
此时在本地会出现Faiss向量文件:

-
创建检索器 (Retriever)
# 将 FAISS 向量存储转换为一个 retriever(检索器),并为该检索器设置一些搜索相关的参数。k=1 表示检索时返回 最相似的 3 个文档retriever = vector_store.as_retriever(search_kwargs={'k': 3})
2.4 封装工具与构建 Agent
2.4 封装工具与构建 Agent
这是让系统变“聪明”的关键。我们将检索功能封装为 Tool,并告诉 Agent 何时使用它。
from langchain.tools import tool#定义检索工具@tool(response_format="content_and_artifact")def retrieve_context(query: str):"""当需要查询学生手册、校规、宿舍管理等具体文档内容时使用此工具。"""retrieved_docs = vector_store.similarity_search(query, k=2)serialized = "\n\n".join((f"Source: {doc.metadata}\nContent: {doc.page_content}")for doc in retrieved_docs)return serialized, retrieved_docsprompt = """你是一名乐于助人的校园助手。- 当用户提问涉及:入学、考核、成绩、宿舍、校园生活等具体规章时,**必须**调用 `retrieve_context` 工具检索文档后回答。- 对于闲聊、通用常识或其他无关话题,直接利用你的内部知识回答,**不要**调用工具。"""#创建 Agentfrom langchain.agents import create_agenttools = [retrieve_context]agent = create_agent(model, tools, system_prompt=prompt)#发起测试response = agent.invoke({"messages": [{"role": "user", "content": "请问学校宿舍如何管理?"}]})responseresponse['messages'][-1].content


运行结果解析:当你运行上述代码提问“宿舍如何管理?”时,后台会发生以下流程:
-
思考:Agent 分析用户意图,发现涉及“宿舍管理”,匹配到 Prompt 中的规则。
-
行动:Agent 决定调用 retrieve_context 工具,传入 query。
-
检索:工具内部调用 FAISS,在向量库中搜索相似片段,返回具体的宿舍管理规定文本。
-
生成:Agent 结合检索到的真实文本,组织语言,输出最终答案。
-
这就是 Function Calling 驱动的 Agentic RAG 全流程。
🚀 总结
通过本文,我们理清了 LangChain 中各组件的职责,亲手实现了一个具备“思考 – 检索 – 回答”闭环的RAG智能体。
-
LangChain 提供了标准化的RAG组装方式;
-
FAISS 解决了海量数据的快速记忆问题;
-
Agent 机制则让大模型学会了“按需索取”,不再盲目生成。
你可以将 student.md 替换为公司的员工手册、产品说明书或法律条文,瞬间拥有一个懂业务、会查资料的 AI 专家。
Reference
【1】 赋范空间科技课程
——The End——

夜雨聆风
