大模型很强。
但如果你只是:
llm.invoke("帮我写点东西")
那你做的不是系统,只是调用接口。
真正的工程问题是:
- 多步骤推理怎么组织?
- 外部数据怎么接入?
- 工具怎么安全调用?
- 对话怎么长期记忆?
- 结果怎么结构化输出?
这才是 LangChain 解决的问题。
目录
- LangChain 到底解决什么问题?
- 环境搭建:DeepSeek + LiteLLM
- LCEL 新范式:Prompt | LLM | Parser
- 流式输出如何实现?
- RAG:检索链路如何接入?
- 记忆机制的新写法
- Agent 与工具调用
- 一个完整对话系统示例
- LangChain 在工程里的真实价值
一、LangChain 到底解决什么问题?
单独的 LLM 像一个聪明的大脑。
但它没有:
- 手(不能执行函数)
- 眼睛(不能实时查资料)
- 记忆库(上下文有限)
- 任务调度系统(不会组织复杂流程)
LangChain 的本质,是一套可组合的 LLM 编排框架。
它不增强模型能力,它增强:
- 可控性
- 可组合性
- 可扩展性
- 工程稳定性
二、环境搭建:DeepSeek + LiteLLM
安装:
pip install langchain langchain-openai langchain-community python-dotenv -i https://mirrors.aliyun.com/pypi/simple/
pip install -U litellm
.env 文件:
DEEPSEEK_API_KEY=sk-xxx
DEEPSEEK_BASE_URL=https://api.deepseek.com
DEEPSEEK_MODEL=deepseek-chat
初始化模型:
from langchain_openai import ChatOpenAI
import os
llm = ChatOpenAI(
model=os.getenv("DEEPSEEK_MODEL"),
openai_api_key=os.getenv("DEEPSEEK_API_KEY"),
openai_api_base=os.getenv("DEEPSEEK_BASE_URL"),
temperature=0.7
)
这里有个工程重点:
LangChain 不直接适配所有模型,它通过 LiteLLM 做统一接口抽象。
这一步是“工程层”的关键。
三、LCEL:Prompt | LLM | Parser
旧版 LLMChain 已经被弃用。
现在的标准写法是 LCEL(LangChain Expression Language)。
核心结构:
Prompt → Model → OutputParser
代码示例:
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
prompt = ChatPromptTemplate.from_messages([
("system", "你是一位技术专家,用通俗语言解释概念。"),
("user", "{concept}")
])
chain = prompt | llm | StrOutputParser()
result = chain.invoke({"concept": "量子纠缠"})
print(result)
为什么必须要 Parser?
因为:
模型输出是 Message 对象 工程系统需要字符串或结构化 JSON
没有 Parser,工程不可控。
四、流式输出(Streaming)
真实应用里,你不可能等 10 秒再一次性输出。
只需要把 .invoke() 换成 .stream():
for chunk in chain.stream({"concept": "递归神经网络"}):
print(chunk, end="", flush=True)
流式输出是:
- 聊天机器人
- WebSocket 应用
- 实时界面
的基础能力。
五、RAG:检索增强生成
LangChain 把 RAG 拆成清晰的流水线:
文档加载 → 文本切片 → 向量化 → 向量存储 → 检索器
示意结构:
DocumentLoader
↓
TextSplitter
↓
Embeddings
↓
VectorStore
↓
Retriever
↓
LLM
关键点在于:
Retriever 现在是一个“可嵌入链的组件”。
不只是数据库查询,而是可参与推理流程。
六、记忆机制的新写法
旧版 ConversationBufferMemory 已经不推荐。
现在的写法是:
- ChatMessageHistory
- RunnableWithMessageHistory
记忆不再是链的属性。
而是一个独立的存储系统,通过 session_id 区分用户。
核心代码:
with_message_history = RunnableWithMessageHistory(
chain,
get_session_history,
input_messages_key="question",
history_messages_key="history",
)
这意味着:
记忆可以持久化到 Redis / PostgreSQL。
工程级对话系统必须这样做。
七、Agent 与工具调用
智能体的本质是:
- LLM 判断是否需要调用工具
- 调用工具
- 观察结果
- 再决定下一步
创建工具:
from langchain.agents import create_tool_calling_agent
agent = create_tool_calling_agent(llm, tools, prompt)
核心机制是:
模型 → 决策 → Tool Call → 观察 → 最终回答
LangChain 现在推荐用 LangGraph 构建复杂 Agent。
因为多步骤推理本质是“状态机”。
八、一个完整的对话系统示例
带记忆的聊天机器人核心结构:
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个乐于助人的 AI 助手。"),
MessagesPlaceholder(variable_name="history"),
("human", "{question}")
])
chain = prompt | llm
然后通过 RunnableWithMessageHistory 管理会话。
结果就是:
AI 记得你叫小明。
这不是魔法,是工程结构。
九、LangChain 在工程里的真实价值
很多人误解 LangChain 是“封装模型”。
其实它解决的是:
- 多步骤流程编排
- 工具安全调用
- RAG 标准化接入
- 会话管理
- 可测试结构
它让你从:
“写 Prompt 的人”
变成:
“设计 AI 系统架构的人”
这才是核心。
结尾
LangChain 不是模型。
它是 LLM 应用的“操作系统”。
当你真正用 LCEL 构建:
Prompt → 检索 → 工具 → 记忆 → 输出
你会发现,大模型只是其中一层。
真正决定系统稳定性的,是结构。
而结构,才是工程能力的分水岭。