🚀 LangChain 1.0 快速开始
从零开始学习 LangChain 1.0,构建你的第一个 AI Agent。 10 分钟内从 Hello World 到生产级 Agent。
📚 什么是 LangChain?
LangChain 是一个开源框架,用于构建基于大语言模型(LLM)的 AI 应用程序。 它提供了一套标准化的接口和工具,让你能够快速构建智能 Agent、聊天机器人、RAG 系统等应用。
- 模型无关:支持 OpenAI、Anthropic、Google 等多家 LLM 提供商
- 工具集成:Agent 可以使用自定义工具与外部系统交互
- 记忆管理:支持短期和长期记忆,实现上下文感知对话
- 生产就绪:内置持久化、流式输出、错误处理等企业级特性
LangChain 1.0 的核心变化
| 方面 | LangChain 0.x | LangChain 1.0 |
|---|---|---|
| Agent 创建 | 多个函数,API 不统一 | 统一的 create_agent() |
| 运行时 | 基于 Python 执行 | 基于 LangGraph 运行时 |
| 中间件 | 不支持 | 完整的中间件系统 |
| 包结构 | 单一大包 | 精简核心 + langchain-classic |
| Python 版本 | 3.8+ | 3.10+ (强制要求) |
🏗️ LangChain 1.0 架构
LangChain 1.0 构建在 LangGraph 之上,提供了:
- 高层抽象:简化的 Agent 创建和配置
- 灵活运行时:持久化、流式输出、状态管理
- 可扩展性:通过中间件和工具扩展功能
🛠️ 环境准备
系统要求
LangChain 1.0 强制要求 Python 3.10 或更高版本。 请确保你的 Python 版本符合要求。
安装 LangChain
# 创建虚拟环境(推荐)
python3.10 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 安装 LangChain 1.0
pip install -U langchain
# 验证安装
python -c "import langchain; print(f'LangChain version: {langchain.__version__}')"
安装模型集成包
根据你使用的 LLM 提供商,安装对应的集成包:
# Anthropic (Claude)
pip install langchain-anthropic
# OpenAI (GPT)
pip install langchain-openai
# Google (Gemini)
pip install langchain-google-genai
# 或者一次性安装多个
pip install langchain-anthropic langchain-openai langchain-google-genai
配置 API Key
import os
# 方式 1:直接在代码中设置(不推荐用于生产环境)
os.environ["ANTHROPIC_API_KEY"] = "your-api-key-here"
os.environ["OPENAI_API_KEY"] = "your-api-key-here"
# 方式 2:从 .env 文件加载(推荐)
from dotenv import load_dotenv
load_dotenv() # 自动加载 .env 文件中的环境变量
在项目根目录创建 .env 文件存储 API Key:
ANTHROPIC_API_KEY=sk-ant-xxx
OPENAI_API_KEY=sk-xxx
GOOGLE_API_KEY=xxx
记得将 .env 添加到 .gitignore!
👋 Hello World - 你的第一个 Agent
让我们从最简单的 Agent 开始,它使用一个天气查询工具:
"""
最简单的 LangChain Agent 示例
功能:使用自定义工具查询天气
"""
from langchain.agents import create_agent
# 定义一个简单的工具函数
def get_weather(city: str) -> str:
"""获取指定城市的天气信息"""
return f"{city} 今天天气晴朗,阳光明媚!"
# 创建 Agent
agent = create_agent(
model="claude-sonnet-4-5-20250929", # 指定模型
tools=[get_weather], # 提供工具列表
system_prompt="你是一个友好的天气助手", # 系统提示词
)
# 调用 Agent
response = agent.invoke({
"messages": [{"role": "user", "content": "旧金山今天天气怎么样?"}]
})
# 打印结果
print(response["messages"][-1].content)
create_agent():LangChain 1.0 的核心函数,用于创建 Agentmodel:指定要使用的 LLM 模型tools:Agent 可以调用的工具列表system_prompt:定义 Agent 的行为和角色invoke():执行 Agent,传入用户消息
预期输出
根据天气查询结果,旧金山今天天气晴朗,阳光明媚!适合外出活动。
🏭 生产级 Agent - 完整示例
现在让我们构建一个功能完整的生产级 Agent,包含以下特性:
- ✅ 使用
@tool装饰器定义工具 - ✅ 运行时上下文注入
- ✅ 结构化输出格式
- ✅ 对话记忆管理
- ✅ 完整的错误处理
"""
生产级 LangChain Agent 示例
功能:智能天气助手,支持用户位置识别、结构化输出、对话记忆
"""
import os
from dataclasses import dataclass
from langchain.tools import tool, ToolRuntime
from langchain.chat_models import init_chat_model
from langchain.agents import create_agent
from langchain.agents.structured_output import ToolStrategy
from langgraph.checkpoint.memory import InMemorySaver
# ==================== 第1步:定义上下文 ====================
@dataclass
class UserContext:
"""用户上下文,包含用户信息"""
user_id: str
# ==================== 第2步:定义工具 ====================
@tool
def get_user_location(runtime: ToolRuntime[UserContext]) -> str:
"""获取用户的当前位置"""
user_id = runtime.context.user_id
# 模拟从数据库查询用户位置
locations = {"1": "佛罗里达", "2": "旧金山", "3": "北京"}
return locations.get(user_id, "未知位置")
@tool
def get_weather_for_location(city: str) -> str:
"""查询指定城市的天气信息
Args:
city: 城市名称
Returns:
天气信息描述
"""
# 模拟天气 API 调用
weather_data = {
"佛罗里达": "炎热潮湿,温度 32°C",
"旧金山": "凉爽多雾,温度 18°C",
"北京": "晴朗干燥,温度 25°C"
}
return weather_data.get(city, f"{city} 天气晴朗")
# ==================== 第3步:定义输出格式 ====================
@dataclass
class WeatherResponse:
"""结构化的天气响应格式"""
punny_response: str # 幽默的回复
weather_conditions: str | None = None # 天气状况(可选)
# ==================== 第4步:配置模型 ====================
# 设置 API Key
os.environ["ANTHROPIC_API_KEY"] = "your-api-key-here"
# 初始化模型
model = init_chat_model(
"claude-sonnet-4-5-20250929",
temperature=0.5, # 控制创造性
timeout=10, # 超时时间(秒)
max_tokens=1000 # 最大输出长度
)
# ==================== 第5步:配置记忆 ====================
# 使用内存存储(生产环境建议使用数据库)
checkpointer = InMemorySaver()
# ==================== 第6步:定义系统提示词 ====================
SYSTEM_PROMPT = """你是一个友好且幽默的天气助手。
你的职责:
1. 使用 get_user_location 工具获取用户位置
2. 使用 get_weather_for_location 工具查询天气
3. 用轻松幽默的语气回复用户
4. 必须返回结构化的 WeatherResponse 格式
回复风格:简洁、友好、带点俏皮话。"""
# ==================== 第7步:创建 Agent ====================
agent = create_agent(
model=model,
system_prompt=SYSTEM_PROMPT,
tools=[get_user_location, get_weather_for_location],
context_schema=UserContext, # 上下文类型
response_format=ToolStrategy(WeatherResponse), # 输出格式
checkpointer=checkpointer # 记忆管理
)
# ==================== 第8步:使用 Agent ====================
if __name__ == "__main__":
# 配置:指定对话线程 ID
config = {"configurable": {"thread_id": "user_session_001"}}
# 第一次对话
print("=== 第一次对话 ===")
response1 = agent.invoke(
{"messages": [{"role": "user", "content": "外面天气怎么样?"}]},
config=config,
context=UserContext(user_id="2") # 用户 ID 为 2(旧金山)
)
print(response1["messages"][-1].content)
# 第二次对话(Agent 会记住上下文)
print("\n=== 第二次对话 ===")
response2 = agent.invoke(
{"messages": [{"role": "user", "content": "需要带伞吗?"}]},
config=config, # 使用相同的 thread_id
context=UserContext(user_id="2")
)
print(response2["messages"][-1].content)
代码架构说明
关键特性解析
| 特性 | 作用 | 代码位置 |
|---|---|---|
| 运行时上下文 | 注入用户信息到工具 | ToolRuntime[UserContext] |
| 结构化输出 | 确保响应格式一致 | ToolStrategy(WeatherResponse) |
| 对话记忆 | 跨对话保持上下文 | InMemorySaver() |
| 线程隔离 | 区分不同用户会话 | thread_id |
❓ 常见问题
Q1: 如何切换不同的 LLM 提供商?
只需修改模型标识符和对应的 API Key:
# OpenAI
model = init_chat_model("gpt-4", model_provider="openai")
# Anthropic (Claude)
model = init_chat_model("claude-sonnet-4-5-20250929", model_provider="anthropic")
# Google (Gemini)
model = init_chat_model("gemini-2.0-flash", model_provider="google-genai")
Q2: InMemorySaver 适合生产环境吗?
不适合。InMemorySaver 仅用于开发和测试。 生产环境应该使用持久化存储:
# 生产环境:使用 SQLite
from langgraph.checkpoint.sqlite import SqliteSaver
checkpointer = SqliteSaver.from_conn_string("checkpoints.db")
# 生产环境:使用 PostgreSQL
from langgraph.checkpoint.postgres import PostgresSaver
checkpointer = PostgresSaver.from_conn_string("postgresql://...")
Q3: 如何查看 Agent 的执行过程?
集成 LangSmith 进行调试和监控:
import os
# 配置 LangSmith
os.environ["LANGSMITH_API_KEY"] = "your-langsmith-key"
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_PROJECT"] = "my-project"
# 之后运行的 Agent 会自动发送追踪数据到 LangSmith
Q4: 工具函数必须使用 @tool 装饰器吗?
不是必须的,但强烈推荐。@tool 装饰器提供:
- 自动生成工具描述(从文档字符串)
- 类型检查和验证
- 运行时上下文注入
- 更好的错误提示