
一、是什么
想象你要做一个“会聊天的 AI 小秘书”,它不仅能回答你问题,还能:
• 翻公司内部资料 → 找到答案
• 打开日历 → 帮你订会议室
• 上网 → 查今天天气
• 打开计算器 → 帮你算利润
LangChain 就是帮你把这些动作串起来的“乐高说明书”+“万能胶水”。
它本身不是大模型,而是让你把大模型(ChatGPT、Llama 等)和各种工具(搜索、数据库、计算器)拼在一起,变成“会动手的 AI 应用”。Chain的英文就是链,LangChain的功能顾名思义就是链接起来各种功能,形成一个链式的调用路径。一条线的走下来,无需你手动干预。
LangChina的三大积木模块
1️⃣ Model I/O – 跟大模型说话
把“用户说的话”包装好,送给大模型;再把大模型的回答拆回来。
举例:用户问“今天上海几度?”
这块积木负责把问题转成 GPT 能看懂的格式,再把 GPT 的“25℃”转回人话。
2️⃣ Retrieval – 给大模型配“资料库”
把 PDF、Word、网页切成小片 → 变成向量 → 存进向量库 → 搜最相关的片段给大模型看,避免它胡说八道(这就是 RAG)。
举例:公司规定 PDF 有 100 页,用户问“年假几天?”
该积木先把 100 页切成 200 段,找到“年假规定在第 3 章第 2 段”,再把这段塞进大模型的“眼前”,让它回答时不瞎编。
3️⃣ Chains & Agents – 让 AI 能动手
Chain(固定流程):像“先查资料→再回答问题”的流水线,一步接一步。
Agent(自主决策):让AI自己决定下一步该干什么:该查资料?还是该上网?还是该调用计算器?
举例:用户说“帮我订明天下午 3 点的会议室并通知小王”。
该积木让 AI 先查日历→再预订→再发邮件,全自动化。
把三块积木随意拼,你就能做出会聊天、会查资料、会干活的 AI 应用。LangChain就封装了大量的方法可以直接调用,无需手写,不过你知道了这些原理,自己手写也很好用,由于LangChain包装的就不够灵活,自己实现的可以自行定制。LangChain还能记录history,下一次提问可以直接将history带进去给大模型。
二、如何用
跑通一个“会读 PDF 的聊天机器人”,代码步骤如下所示:
1. 安装
pip install langchain langchain-openai pypdf chromadb
# 2. 准备一份 PDF,例如 company_rule.pdf
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import ConversationalRetrievalChain
from langchain.chat_models import ChatOpenAI
# 3. 把 PDF 切成小片,500个token一组
docs = PyPDFLoader("company_rule.pdf").load()
chunks = RecursiveCharacterTextSplitter(chunk_size=500).split_documents(docs)
# 4. 做成向量库
vectordb = Chroma.from_documents(chunks, OpenAIEmbeddings())
# 5. 创建链
qa = ConversationalRetrievalChain.from_llm(
llm=ChatOpenAI(temperature=0),
retriever=vectordb.as_retriever())
# 6. 聊天
chat_history = []
while True:
q = input("你:")
ans = qa({"question":q, "chat_history":chat_history})
print("AI:", ans["answer"])
chat_history.append((q, ans["answer"]))

跑起来后,你就可以问PDF里面的内容:
“年假几天?” → AI 从 PDF 里找到答案并回答。
三、原理讲解
1️⃣ 把长资料切成小块
像把一本书撕成一页一页,方便快速翻到相关页。
2️⃣ 把文字变成“数字密码”(向量)
用 OpenAI / BGE 模型把每页文字变成一个 1024 维的点,语义相近的点挨得近。
3️⃣ 搜索 + 问答
你提的问题也变成一个点 → 在库里找最近的 N 个点 → 把对应文字喂给大模型 → 大模型组织答案。
4️⃣ Chain vs Agent 必定要理解Chain和Agent的区别
• Chain:像“做菜流程图”,先洗菜→再切菜→再炒。
• Agent:像“会思考的小厨师”,发现没盐了自己去柜子拿。
下面层层拆解下,想象下如果没有LangChain的时候我们如何处理PDF的呢?
- 先把 PDF/网页切成块,按照字数,或者按照页码拆分。
- 调 OpenAI Embedding 把块变成向量
- 把向量塞进向量库(Faiss )
- 用户提问 → 向量化 → 在库里搜 Top-k → 把结果拼成 prompt → 调 gpt → 拿到回答
- 还要写循环、维护历史记录、处理异常、切换模型……
这些步骤每一步都要自己写胶水代码去粘连下一步,LangChain 说:“我来帮你把胶水写好,你只关心搭积木。” 也就是你只需要写model,然后每个模块按照自己的想法摆放顺序后,让LangChain直接连到一起即可。
LangChain 的 5 条核心抽象
下面 5 个词在任何一段 LangChain 代码里都会出现,先混个眼熟。
|
抽象 |
比喻 |
真实作用 |
|
Document |
一张小纸条 |
一段文本 + 元数据(来源、页码等) |
|
VectorStore |
抽屉柜 |
存 & 取向量的地方(Chroma、FAISS、Pinecone…) |
|
Retriever |
图书管理员 |
接收问题 → 在抽屉柜里找出最相关纸条 |
|
Chain |
流水线传送带 |
把“输入 → 若干步骤 → 输出”串起来 |
|
Agent |
带脑子的小秘书 |
先思考“我需要哪几个工具”,再一步步调用 |
一条典型的 RAG Chain 在 LangChain 里到底发生了什么?
下面用伪代码 + 时序图,把刚才 python代码示例拆开:
① 加载 PDF → ② 切分 → ③ 向量化 → ④ 存库 → ⑤ 用户提问 → ⑥ 检索 → ⑦ 拼 prompt → ⑧ 调大模型 → ⑨ 返回答案
复制
┌─────────────┐
│ PyPDFLoader │ ① 把 PDF 变成 List[Document]
└────┬────────┘
│
┌────▼────────┐
│TextSplitter │ ② 切成更小 List[Document]
└────┬────────┘
│
┌────▼────────┐
│OpenAIEmbeddings│ ③ 把每段变成向量
└────┬────────┘
│
┌────▼────────┐
│ Chroma │ ④ 存进向量库(内部调用 FAISS)
└────┬────────┘
│
┌────▼────────┐
│Conversational│ ⑥ Retriever 拿用户问题 → 找 Top-k
│RetrievalChain│ ⑦ 把 Top-k 拼成 Prompt 模板
│ │ ⑧ 调 ChatOpenAI → 拿到 answer
└────┬────────┘
│
⑨ 返回给用户

每一步 LangChain 都帮你写好了“默认模板”,你可以随时换掉其中任意一块。
Chain & Agent 的决策逻辑(重点看源码)
- Chain 的 run() 方法实则就是一个 Python 函数:
- def _call(inputs): docs = self.retriever.get_relevant_documents(inputs[“question”]) context = ”
“.join([d.page_content for d in docs]) prompt = self.prompt_template.format(context=context, question=inputs[“question”]) answer = self.llm(prompt) return {“answer”: answer} - 这就是“流水线”——固定步骤、不拐弯。
- Agent 的 run() 方法则是一个 while 循环:
- while not done: action = self.agent.plan(intermediate_steps) # LLM 决定下一步调哪个工具 observation = tool.run(action.tool_input) # 真正去查 API / 数据库 intermediate_steps.append((action, observation))
- LangChain 内置了 ZeroShotAgent, ReAct, OpenAIFunctionsAgent 等不同策略,它们只是 prompt 模板不同而已。
ZeroShotAgent prompt:“You have access to tools: Search, Calculator… Think step by step.”
OpenAIFunctionsAgent prompt:利用 GPT-3.5/4 的 function_call 原生能力,省掉解析步骤。
Prompt Template 与 Memory 的细节
Prompt Template = 带占位符的字符串
template = """Use the following pieces of context to answer the question.
Context: {context}
Question: {question}
Helpful Answer:"""

LangChain 用 Python 的 str.format() 或 Jinja2 渲染,你可以随时插入 {chat_history}、{today} 等变量。
Memory = 在多次调用之间缓存对话历史
本质是维护一个 List[HumanMessage, AIMessage],在每一次 _call 时把历史拼进 prompt。
不同实现:
• ConversationBufferMemory(全记住,耗 token)
• ConversationSummaryMemory(让 LLM 先总结,省 token,大部分对话用的是这种模式)
•
VectorStoreRetrieverMemory(把历史向量化,按相关性召回)
用户问题 → Prompt Template → LLM → 工具/Retriever → 结果 → Prompt Template → LLM → 回答
↑Memory 提供历史/变量

LangChain 只是把“胶水 + 模板 + 抽象”三件事做到极致,让你 几行代码就能跑通上面整个循环。
还是那句话,AI应用工程师,懂这个是什么会用就行,在日常使用中,如果你需要定制化,说不定都用不着LangChain,或者私人定制一套LangChain。