第一章:LangChain 简介¶
什么是 LangChain?¶
LangChain 是一个用于开发大语言模型(LLM)应用的框架,它提供了:
- 模型集成:统一接口对接多种 LLM(OpenAI、Anthropic、DeepSeek 等)
- 提示词管理:模板化和优化提示词
- LCEL 链式调用:声明式语法组合多个操作
- 记忆系统:维护对话上下文
- Agent 系统:让 LLM 自主使用工具完成任务
- RAG 支持:检索增强生成的一站式解决方案
LangChain 0.3+ 重要变化¶
LangChain 0.3 版本进行了重大重构:
包结构变化¶
# 旧版本(0.2 及之前)
pip install langchain
# 新版本(0.3+)- 模块化安装
pip install langchain # 核心包
pip install langchain-openai # OpenAI 集成
pip install langchain-anthropic # Anthropic 集成
pip install langchain-community # 社区集成
pip install langchain-core # 核心接口(自动安装)
废弃的 API¶
| 旧 API | 新 API | 说明 |
|---|---|---|
LLMChain |
LCEL (prompt \| llm) |
使用 LCEL 语法 |
initialize_agent |
create_react_agent 等 |
使用新的 Agent 创建函数 |
AgentExecutor + 旧 agent |
LangGraph | 复杂 Agent 推荐使用 LangGraph |
ConversationChain |
LCEL + Memory | 使用 LCEL 组合 |
RetrievalQA |
LCEL + Retriever | 使用 LCEL 组合 |
LCEL 成为核心¶
LCEL(LangChain Expression Language)是 0.3+ 的核心语法:
# 旧方式
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt)
result = chain.run(topic="Python")
# 新方式(LCEL)
chain = prompt | llm | output_parser
result = chain.invoke({"topic": "Python"})
核心概念¶
1. Runnable 接口¶
所有 LCEL 组件都实现 Runnable 接口:
from langchain_core.runnables import RunnableLambda
# 所有 Runnable 都支持这些方法
runnable.invoke(...) # 同步调用
runnable.ainvoke(...) # 异步调用
runnable.batch([...]) # 批量调用
runnable.abatch([...]) # 异步批量
runnable.stream(...) # 流式输出
runnable.astream(...) # 异步流式
2. 模型类型¶
| 类型 | 说明 | 示例 |
|---|---|---|
| Chat Model | 消息列表 → AIMessage | ChatOpenAI, ChatAnthropic |
| LLM | 字符串 → 字符串 | OpenAI(已不推荐,用 Chat Model) |
| Embeddings | 字符串 → 向量 | OpenAIEmbeddings |
3. 消息类型¶
from langchain_core.messages import (
SystemMessage,
HumanMessage,
AIMessage,
ToolMessage
)
messages = [
SystemMessage("你是一个助手"),
HumanMessage("你好"),
AIMessage("你好!有什么可以帮助你的?"),
]
4. 提示词模板¶
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个{role}"),
("human", "{input}")
])
# 格式化
formatted = prompt.invoke({"role": "翻译官", "input": "Hello"})
5. 输出解析器¶
from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()
# AIMessage → str
安装配置¶
安装¶
# 核心包 + OpenAI 集成
pip install langchain langchain-openai
# 其他模型
pip install langchain-anthropic # Claude
pip install langchain-google-genai # Gemini
pip install langchain-community # 社区模型
# 向量数据库
pip install langchain-milvus
pip install langchain-chroma
# 文档处理
pip install langchain-text-splitters
pip install langchain-community # 包含 document loaders
配置 API Key¶
import os
# 方式 1:直接设置
os.environ["OPENAI_API_KEY"] = "sk-xxx"
# 方式 2:使用 .env 文件
from dotenv import load_dotenv
load_dotenv() # 自动加载 .env 文件
# 方式 3:直接传给模型
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(api_key="sk-xxx")
.env 文件示例¶
快速示例¶
最简单的链¶
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# 1. 定义组件
prompt = ChatPromptTemplate.from_template("讲一个关于{topic}的笑话")
llm = ChatOpenAI(model="gpt-4o-mini")
parser = StrOutputParser()
# 2. 组装链(LCEL 语法)
chain = prompt | llm | parser
# 3. 调用
result = chain.invoke({"topic": "程序员"})
print(result)
流式输出¶
带系统提示的对话¶
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个{role},回答要{style}"),
("human", "{input}")
])
chain = prompt | llm | parser
result = chain.invoke({
"role": "资深程序员",
"style": "简洁专业",
"input": "什么是 Python 的 GIL?"
})
支持的模型¶
OpenAI¶
from langchain_openai import ChatOpenAI
# 标准 OpenAI
llm = ChatOpenAI(model="gpt-4o")
# Azure OpenAI
llm = ChatOpenAI(
azure_endpoint="https://xxx.openai.azure.com/",
azure_deployment="gpt-4",
api_key="xxx",
api_version="2024-02-15-preview"
)
Anthropic Claude¶
from langchain_anthropic import ChatAnthropic
llm = ChatAnthropic(model="claude-3-5-sonnet-20241022")
DeepSeek¶
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="deepseek-chat",
base_url="https://api.deepseek.com/v1",
api_key="sk-xxx"
)
通义千问¶
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="qwen-turbo",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key="sk-xxx"
)
智谱 AI¶
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="glm-4",
base_url="https://open.bigmodel.cn/api/paas/v4",
api_key="xxx"
)
项目结构建议¶
langchain-project/
├── app/
│ ├── __init__.py
│ ├── main.py # 入口
│ ├── chains/ # 自定义链
│ │ └── __init__.py
│ ├── agents/ # Agent 定义
│ │ └── __init__.py
│ ├── tools/ # 自定义工具
│ │ └── __init__.py
│ └── prompts/ # 提示词模板
│ └── __init__.py
├── .env # 环境变量
├── pyproject.toml # 依赖管理
└── README.md
LangChain vs 直接调用 API¶
| 特性 | 直接调用 API | LangChain |
|---|---|---|
| 模型切换 | 修改代码 | 统一接口,一行切换 |
| 提示词管理 | 手动拼接 | 模板化、可复用 |
| 链式调用 | 手动编排 | LCEL 声明式语法 |
| 流式输出 | 手动处理 | 内置支持 |
| 记忆系统 | 自己实现 | 开箱即用 |
| 工具调用 | 手动解析 | 自动处理 |
| RAG | 自己搭建 | 完整工具链 |
适用场景¶
- ✅ 聊天机器人和对话系统
- ✅ 文档问答(RAG)
- ✅ 代码生成和分析
- ✅ 数据提取和处理
- ✅ Agent 自动化任务
- ✅ 智能助手
小结¶
本章学习了:
- ✅ LangChain 0.3+ 的重大变化
- ✅ 废弃 API 与新 API 对照
- ✅ LCEL 核心语法
- ✅ 安装和配置
- ✅ 支持的模型
下一章¶
第二章:快速开始 - 深入学习 LangChain 的核心功能。