LangChain + DeepSeek 实战拆解:从 LCEL 到智能体,如何真正“做出”一个可控 AI 系统?
大模型很强。
但如果你只是:
```python
llm.invoke("帮我写点东西")
```
那你做的不是系统,只是调用接口。
真正的工程问题是:
* 多步骤推理怎么组织?
* 外部数据怎么接入?
* 工具怎么安全调用?
* 对话怎么长期记忆?
* 结果怎么结构化输出?
这才是 LangChain 解决的问题。
---
## 目录
1. LangChain 到底解决什么问题?
2. 环境搭建:DeepSeek + LiteLLM
3. LCEL 新范式:Prompt | LLM | Parser
4. 流式输出如何实现?
5. RAG:检索链路如何接入?
6. 记忆机制的新写法
7. Agent 与工具调用
8. 一个完整对话系统示例
9. LangChain 在工程里的真实价值
---
## 一、LangChain 到底解决什么问题?
单独的 LLM 像一个聪明的大脑。
但它没有:
* 手(不能执行函数)
* 眼睛(不能实时查资料)
* 记忆库(上下文有限)
* 任务调度系统(不会组织复杂流程)
LangChain 的本质,是一套**可组合的 LLM 编排框架**。
它不增强模型能力,它增强:
* 可控性
* 可组合性
* 可扩展性
* 工程稳定性
---
## 二、环境搭建:DeepSeek + LiteLLM
安装:
```bash
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
```
初始化模型:
```python
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
```
代码示例:
```python
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()`:
```python
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 区分用户。
核心代码:
```python
with_message_history = RunnableWithMessageHistory(
chain,
get_session_history,
input_messages_key="question",
history_messages_key="history",
)
```
这意味着:
记忆可以持久化到 Redis / PostgreSQL。
工程级对话系统必须这样做。
---
## 七、Agent 与工具调用
智能体的本质是:
1. LLM 判断是否需要调用工具
2. 调用工具
3. 观察结果
4. 再决定下一步
创建工具:
```python
from langchain.agents import create_tool_calling_agent
agent = create_tool_calling_agent(llm, tools, prompt)
```
核心机制是:
模型 → 决策 → Tool Call → 观察 → 最终回答
LangChain 现在推荐用 LangGraph 构建复杂 Agent。
因为多步骤推理本质是“状态机”。
---
## 八、一个完整的对话系统示例
带记忆的聊天机器人核心结构:
```python
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 → 检索 → 工具 → 记忆 → 输出
你会发现,大模型只是其中一层。
真正决定系统稳定性的,是结构。
而结构,才是工程能力的分水岭。
- 点赞
- 收藏
- 关注作者
评论(0)