📚 什么是 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 架构

graph TB subgraph "LangChain 1.0 核心层" A[create_agent] --> B[Agent Runtime] B --> C[Tools] B --> D[Models] B --> E[Memory] B --> F[Middleware] end subgraph "LangGraph 运行时层" B --> G[Persistence] B --> H[Streaming] B --> I[Human-in-the-Loop] end subgraph "模型提供商层" D --> J[OpenAI] D --> K[Anthropic] D --> L[Google] D --> M[其他] end style A fill:#2563eb,color:#fff style B fill:#10b981,color:#fff style G fill:#f59e0b,color:#fff style H fill:#f59e0b,color:#fff style I fill:#f59e0b,color:#fff

LangChain 1.0 构建在 LangGraph 之上,提供了:

  • 高层抽象:简化的 Agent 创建和配置
  • 灵活运行时:持久化、流式输出、状态管理
  • 可扩展性:通过中间件和工具扩展功能

🛠️ 环境准备

系统要求

⚠️ 重要提示

LangChain 1.0 强制要求 Python 3.10 或更高版本。 请确保你的 Python 版本符合要求。

安装 LangChain

Bash
# 创建虚拟环境(推荐)
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 提供商,安装对应的集成包:

Bash
# 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

Python 🟢 基础
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 开始,它使用一个天气查询工具:

Python 🟢 基础
"""
最简单的 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 的核心函数,用于创建 Agent
  • model:指定要使用的 LLM 模型
  • tools:Agent 可以调用的工具列表
  • system_prompt:定义 Agent 的行为和角色
  • invoke():执行 Agent,传入用户消息

预期输出

Text
根据天气查询结果,旧金山今天天气晴朗,阳光明媚!适合外出活动。

🏭 生产级 Agent - 完整示例

现在让我们构建一个功能完整的生产级 Agent,包含以下特性:

  • ✅ 使用 @tool 装饰器定义工具
  • ✅ 运行时上下文注入
  • ✅ 结构化输出格式
  • ✅ 对话记忆管理
  • ✅ 完整的错误处理
Python 🔴 高级
"""
生产级 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)

代码架构说明

graph LR A[用户请求] --> B[Agent] B --> C{需要工具?} C -->|是| D[调用工具] D --> E[get_user_location] D --> F[get_weather_for_location] E --> G[获取结果] F --> G G --> B C -->|否| H[生成响应] B --> H H --> I[返回结构化结果] style B fill:#2563eb,color:#fff style I fill:#10b981,color:#fff

关键特性解析

特性 作用 代码位置
运行时上下文 注入用户信息到工具 ToolRuntime[UserContext]
结构化输出 确保响应格式一致 ToolStrategy(WeatherResponse)
对话记忆 跨对话保持上下文 InMemorySaver()
线程隔离 区分不同用户会话 thread_id

❓ 常见问题

Q1: 如何切换不同的 LLM 提供商?

只需修改模型标识符和对应的 API Key:

Python
# 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 仅用于开发和测试。 生产环境应该使用持久化存储:

Python
# 生产环境:使用 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 进行调试和监控:

Python
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 装饰器提供:

  • 自动生成工具描述(从文档字符串)
  • 类型检查和验证
  • 运行时上下文注入
  • 更好的错误提示

📖 下一步学习

🎯 推荐学习路径

🔗 参考资源