
关键词:LangChain, LCEL, Prompt, Agent, 架构设计
大家好,我是飞哥!👋
很多同学问我:“飞哥,我会调 OpenAI 的 API 了,还能和 ChatGPT 聊得很开心,但这离开发一个真正的 AI 应用(App)还有多远?”
答案是:只有一步之遥,但这一步如果不借助工具,你会走得很痛苦。
今天,我们就来聊聊 AI 应用开发领域的“瑞士军刀” —— LangChain。
1. 为什么你需要 LangChain?(Why)
场景:手搓代码的噩梦 😫
想象一下,老板让你做一个“智能周报生成器”。
你需要写代码:
痛点来了:
- 模型切换难:老板突然说“GPT-4 太贵了,换 Claude 3 吧”,你的 API 调用代码得重写。
- 记忆管理累:用户多聊两句,你得自己维护聊天历史列表,一不小心就超长报错。
- 流程太乱:稍微复杂点的逻辑(比如“先总结,再翻译,最后发邮件”),代码就会变成一团乱麻(Spaghetti Code)。
LangChain 的出现,就是为了终结这种混乱。
2. 什么是 LangChain?(What)
我们用三步讲解法来拆解它。
第一步:锚定已知 ⚓️
大家应该都玩过乐高(Lego)积木吧?
如果你有一堆散乱的积木块(各种 API、Prompt、数据源),想拼出一个城堡是很难的。你需要标准的接口、连接件和图纸。
第二步:生动类比 🍔
把开发 AI 应用比作“开一家汉堡店”:
- 大模型 (LLM) 就像一位“顶级大厨”(GPT, Claude)。他脑子很好使,会煎肉饼。
- LangChain 就像“标准化厨房流水线”。
- 它规定了肉饼怎么切(Prompt Template)。
- 它提供了传送带,把面包、肉、菜自动传到大厨手里(Chain)。
- 它还给大厨配了助手,负责去仓库拿货或切菜(Tools/Agents)。
没有 LangChain:你得自己扛着肉去找大厨,还得自己端盘子。
有了 LangChain:你只需要按下“启动按钮”,流水线自动运转。
第三步:提炼骨架 🦴
所以,LangChain 的本质就是:将大模型与外部世界(数据、工具、其他模型)连接起来的“胶水层”框架。
#mermaid-svg-ALUfwMgSrkzZfi6J{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ALUfwMgSrkzZfi6J .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ALUfwMgSrkzZfi6J .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ALUfwMgSrkzZfi6J .error-icon{fill:#552222;}#mermaid-svg-ALUfwMgSrkzZfi6J .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ALUfwMgSrkzZfi6J .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ALUfwMgSrkzZfi6J .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ALUfwMgSrkzZfi6J .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ALUfwMgSrkzZfi6J .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ALUfwMgSrkzZfi6J .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ALUfwMgSrkzZfi6J .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ALUfwMgSrkzZfi6J .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ALUfwMgSrkzZfi6J .marker.cross{stroke:#333333;}#mermaid-svg-ALUfwMgSrkzZfi6J svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ALUfwMgSrkzZfi6J p{margin:0;}#mermaid-svg-ALUfwMgSrkzZfi6J .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-ALUfwMgSrkzZfi6J .cluster-label text{fill:#333;}#mermaid-svg-ALUfwMgSrkzZfi6J .cluster-label span{color:#333;}#mermaid-svg-ALUfwMgSrkzZfi6J .cluster-label span p{background-color:transparent;}#mermaid-svg-ALUfwMgSrkzZfi6J .label text,#mermaid-svg-ALUfwMgSrkzZfi6J span{fill:#333;color:#333;}#mermaid-svg-ALUfwMgSrkzZfi6J .node rect,#mermaid-svg-ALUfwMgSrkzZfi6J .node circle,#mermaid-svg-ALUfwMgSrkzZfi6J .node ellipse,#mermaid-svg-ALUfwMgSrkzZfi6J .node polygon,#mermaid-svg-ALUfwMgSrkzZfi6J .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ALUfwMgSrkzZfi6J .rough-node .label text,#mermaid-svg-ALUfwMgSrkzZfi6J .node .label text,#mermaid-svg-ALUfwMgSrkzZfi6J .image-shape .label,#mermaid-svg-ALUfwMgSrkzZfi6J .icon-shape .label{text-anchor:middle;}#mermaid-svg-ALUfwMgSrkzZfi6J .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ALUfwMgSrkzZfi6J .rough-node .label,#mermaid-svg-ALUfwMgSrkzZfi6J .node .label,#mermaid-svg-ALUfwMgSrkzZfi6J .image-shape .label,#mermaid-svg-ALUfwMgSrkzZfi6J .icon-shape .label{text-align:center;}#mermaid-svg-ALUfwMgSrkzZfi6J .node.clickable{cursor:pointer;}#mermaid-svg-ALUfwMgSrkzZfi6J .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ALUfwMgSrkzZfi6J .arrowheadPath{fill:#333333;}#mermaid-svg-ALUfwMgSrkzZfi6J .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ALUfwMgSrkzZfi6J .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ALUfwMgSrkzZfi6J .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ALUfwMgSrkzZfi6J .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ALUfwMgSrkzZfi6J .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ALUfwMgSrkzZfi6J .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ALUfwMgSrkzZfi6J .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ALUfwMgSrkzZfi6J .cluster text{fill:#333;}#mermaid-svg-ALUfwMgSrkzZfi6J .cluster span{color:#333;}#mermaid-svg-ALUfwMgSrkzZfi6J div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ALUfwMgSrkzZfi6J .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ALUfwMgSrkzZfi6J rect.text{fill:none;stroke-width:0;}#mermaid-svg-ALUfwMgSrkzZfi6J .icon-shape,#mermaid-svg-ALUfwMgSrkzZfi6J .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ALUfwMgSrkzZfi6J .icon-shape p,#mermaid-svg-ALUfwMgSrkzZfi6J .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ALUfwMgSrkzZfi6J .icon-shape rect,#mermaid-svg-ALUfwMgSrkzZfi6J .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ALUfwMgSrkzZfi6J .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ALUfwMgSrkzZfi6J .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ALUfwMgSrkzZfi6J :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
LangChain 核心能力
调度指令
大脑: 思考
记忆: 查资料
手脚: 干活
你的应用 App
LangChain 胶水层
LLM 大模型
外部数据 VectorStore
工具 Tools/API
3. LangChain 的核心组件 (The Toolkit) 🧰
LangChain 提供了六大核心模块,飞哥带你一个个认全:
Model I/O (模型接口):
- 作用:统一了所有大模型的接口。
- 好处:不管你是用 GPT、Claude 还是文心一言,代码写法几乎一样!想换模型?改个参数就行。
Prompt Templates (提示词模板):
- 作用:把 Prompt 变成填空题。
- 例子:"请把 {text} 翻译成 {language}"。你只需要传变量,不用每次手写一长串。
Memory (记忆):
- 作用:让 AI 记住之前的对话。
- 原理:自动把历史聊天记录塞进 Prompt 里,不用你操心。
Chains (链):
- 作用:把多个步骤串起来。
- 例子:步骤A(提取摘要) -> 步骤B(翻译) -> 步骤C(生成邮件)。
Agents (智能体):
- 作用:让 AI 拥有“自主决策权”。
- 区别:Chain 是按死板流程走;Agent 是 AI 自己决定“我现在该去查谷歌,还是该去查数据库”。
4. 怎么用?(How) – 你的第一条 LangChain
我们用最新的 LCEL (LangChain Expression Language) 语法来写一个最简单的应用:“程序员夸夸机”。
它会把用户的丧气话,转化成鼓励的诗句。
🛠️ 环境准备
pip install langchain langchain-openai
💻 代码实战
import os
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# 0. 配置 DeepSeek 环境
# 建议将 Key 放在环境变量中,或者直接在代码里测试
# os.environ["DEEPSEEK_API_KEY"] = "sk-…"
# 1. 搞定大厨 (DeepSeek)
# 💡 DeepSeek 完美兼容 OpenAI 接口,直接用 ChatOpenAI 即可
# ⚠️ 注意:运行前请确保 DEEPSEEK_API_KEY 环境变量已设置,或直接在 api_key 参数中填入你的 Key
model = ChatOpenAI(
model="deepseek-chat", # DeepSeek V3 模型名称
api_key=os.environ.get("DEEPSEEK_API_KEY", "sk-…"), # 优先从环境变量获取
base_url="https://api.deepseek.com" # 🔴 关键!指向 DeepSeek 官方接口地址
)
# 2. 准备配方 (Prompt Template)
# system: 设定人设
# user: 用户的输入占位符
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个富有诗意的程序员鼓励师,请把用户的丧气话改写成一句充满代码哲理的各种编程语言风格的短诗。"),
("user", "{text}")
])
# 3. 准备摆盘 (Output Parser)
# 直接把模型吐出的 Message 对象转成纯字符串
parser = StrOutputParser()
# 4. 组装流水线 (Chain)
# ⭐️ 核心魔法:使用 '|' 管道符连接
# 就像 Linux 命令一样:Prompt 传给 Model,Model 传给 Parser
chain = prompt | model | parser
# 5. 启动!
result = chain.invoke({"text": "我的代码全是 Bug,我不想干了…"})
print(result)
运行结果预览:
AI 回复:
print("Bug 是未被发现的 Feature,")
while True: KeepCoding()
如果你不放弃,
世界终将 return "Hello World"
💡 飞哥小贴士:LCEL 的隐藏大招
你可能会问:“这就完啦?”
当然没有!LCEL 最强的地方在于标准接口。
你只需要把代码中的 .invoke(…) 改成 .stream(…),就能立刻获得像 ChatGPT 那样“打字机式”的流式输出体验,而不需要改动任何业务逻辑!
这就是标准化框架的威力。
🧩 进阶挑战:让夸夸机拥有记忆
上面的代码只能“一问一答”。如果你想让它记住你之前说了什么,只需要加两行代码:
from langchain_core.messages import HumanMessage, AIMessage
from langchain_core.prompts import MessagesPlaceholder
# 1. 改 Prompt:留个位置给历史记录
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个程序员鼓励师…"),
MessagesPlaceholder(variable_name="history"), # <— 关键!
("user", "{text}")
])
# 2. 维护一个列表
history = []
# 3. 循环调用
while True:
msg = input("User: ")
res = chain.invoke({"text": msg, "history": history})
print(res)
# 手动把对话存进去
history.append(HumanMessage(content=msg))
history.append(AIMessage(content=res))
这样,你的 AI 就拥有了短期记忆!
5. 总结 📝
- 一句话记住:LangChain 是大模型的“管家”,它帮大模型打理好了输入、输出、记忆和工具调用,让你专注于业务逻辑。
- 核心三要点:
- Model I/O 让你随意换模型(OpenAI ↔ DeepSeek 无缝切换)。
- Chain 帮你把复杂任务串成流水线。
- Agent 让 AI 能够自主使用工具。
🔮 进阶伏笔:
当你的 Chain 越来越长,出 Bug 了怎么查?以后飞哥会教你用 LangSmith 这个神器来进行可视化调试,把黑盒变成白盒!
下期预告:
有了 LangChain 这个“骨架”,但如果企业里有成千上万份 PDF 文档,AI 怎么读?
下一节,我们将深入 LlamaIndex,看看专门处理数据的“特种兵”是如何工作的!
创作不易,记得👇关注飞哥👇 ,点赞、收藏哦~~,下篇见👋
