本节笔记针对 LangChain v1.0 的发展历程以及安装和快速构建一个智能体出发,让我们更深入的了解 LangChain 的各个模块,对它有个大体的认知。

一、LangChain的发展节点与历程

LangChain 的存在,是为了成为最易于上手的大语言模型(LLM)开发工具,同时兼具灵活性与生产环境可用性。

1.1 特点

LangChain 由以下几个核心信念驱动:

  • 大型语言模型(LLM)是一项出色且强大的新技术。
  • 当 LLM 与外部数据源结合时,其能力会更上一层楼。
  • LLM 将重塑未来应用的形态——具体而言,未来的应用将越来越具备智能体(agentic)特性。
  • 目前,这场变革仍处于非常早期的阶段。
  • 构建这类智能体应用的原型虽易,但打造足够可靠、可投入生产的智能体仍极具挑战。

借助 LangChain,我们有两个核心侧重点:

  1. 助力开发者使用最优秀的模型
    不同提供商的 API 接口、模型参数和消息格式各不相同。标准化这些模型的输入输出是我们的核心重点,让开发者能够轻松切换到最新的尖端模型,避免被单一供应商锁定。

  2. 简化模型编排复杂流程的难度
    模型不应仅用于文本生成——还应被用于编排更复杂的流程,与其他数据和计算资源交互。LangChain 简化了工具定义(让 LLM 可动态调用),同时助力非结构化数据的解析与访问。

1.2 发展历程

鉴于该领域的快速变化,LangChain 也在不断演进。以下是 LangChain 多年来的简要发展时间线,它始终与 LLM 应用开发的演进同步:

  1. 2022-10-24

    v0.0.1

    在 ChatGPT 发布前一个月,LangChain 以 Python 包的形式推出,包含两个核心组件:
    - LLM 抽象层
    - “链(Chains)”——即针对常见场景预设的计算步骤。例如检索增强生成(RAG):先执行检索步骤,再执行生成步骤。

    “LangChain” 的名称源于“Language”(语言模型相关)和“Chains”(链)的结合。

  2. 2022-12

    LangChain 新增首批通用智能体(general purpose agents)。
    这些智能体基于 ReAct 论文(ReAct 代表 Reasoning and Acting,即“推理与行动”)构建,利用 LLM 生成表示工具调用的 JSON,再通过解析该 JSON 确定要调用的工具。

  3. 2023-01

    OpenAI 发布“聊天补全(Chat Completion)”API。
    在此之前,模型接收字符串并返回字符串;而在聊天补全 API 中,模型演进为接收消息列表并返回消息。其他模型提供商纷纷跟进,LangChain 也随之更新以支持消息列表格式。
    LangChain 发布 JavaScript 版本。
    LLM 和智能体将改变应用的构建方式,而 JavaScript 是应用开发者的主流语言。

  4. 2023-02

    围绕开源的 LangChain 项目,LangChain 公司正式成立。
    其核心目标是“让智能体无处不在”。团队意识到,尽管 LangChain 是关键基础(让 LLM 开发易于上手),但还需要其他配套组件的支持。

  5. 2023-03

    OpenAI 在其 API 中新增“函数调用(function calling)”功能。
    该功能允许 API 明确生成表示工具调用的负载。其他模型提供商纷纷跟进,LangChain 也随之更新,将函数调用作为工具调用的首选方式(替代原有的 JSON 解析方式)。

  6. 2023-06

    LangSmith 作为闭源平台发布,提供可观测性(observability)和评估(evals)功能。
    构建智能体的核心痛点是确保其可靠性,而 LangSmith 正是为解决这一需求而生。LangChain 也随之更新,实现与 LangSmith 的无缝集成。

  7. 2024-01

    v0.1.0
    LangChain 发布首个非 0.0.x 版本(v0.1.0)。
    行业已从原型开发阶段迈向生产落地阶段,因此 LangChain 进一步聚焦稳定性提升。

  8. 2024-02

    LangGraph 作为开源库发布。
    早期的 LangChain 有两个核心侧重点:LLM 抽象层,以及面向常见应用的高阶入门接口;但它缺少低阶编排层,无法让开发者精确控制智能体的执行流程——LangGraph 应运而生。
    在构建 LangGraph 时,我们借鉴了 LangChain 的开发经验,新增了经实践验证必需的功能:流式传输、持久化执行、短期记忆、人机协作(human-in-the-loop)等。

  9. 2024-06

    LangChain 拥有超过 700 个集成项。
    集成功能从核心 LangChain 包中拆分出来,要么迁移到独立的专属包(核心集成项),要么归入 langchain-community 包。

  10. 2024-10

    LangGraph 成为构建复杂 AI 应用(不止单次 LLM 调用)的首选方式。
    随着开发者试图提升应用的可靠性,他们需要比高阶接口更强的控制能力——LangGraph 提供了这种低阶灵活性。LangChain 中的大多数链和智能体被标记为弃用,并提供了迁移至 LangGraph 的指南。LangGraph 中仍保留一个高阶抽象:智能体抽象层,它基于 LangGraph 低阶能力构建,与 LangChain 中的 ReAct 智能体拥有相同接口。

  11. 2025-04

    模型 API 向多模态方向演进。
    模型开始支持接收文件、图片、视频等输入。我们相应更新了 langchain-core 的消息格式,让开发者能够以标准化方式指定这些多模态输入。

  12. 2025-10-20

    v1.0.0
    LangChain 发布 1.0 版本,包含两项重大变更:

    1. 彻底重构了 langchain 中的所有链和智能体——现在仅保留一个高阶抽象:基于 LangGraph 构建的智能体抽象层。该抽象层最初诞生于 LangGraph,现迁移至 LangChain 核心包。
    2. 对于仍在使用旧版 LangChain 链/智能体且暂不打算升级的用户(注:我们建议升级),可通过安装 langchain-classic 包继续使用旧版功能。

此外,还推出了标准化的消息内容格式:模型 API 已从返回仅含简单字符串内容的消息,演进为返回更复杂的输出类型——推理块(reasoning blocks)、引用(citations)、服务端工具调用等。LangChain 也相应升级了消息格式,以实现跨提供商的标准化支持。

二、安装 LangChain

安装 LangChain 包:

# 使用pip安装
pip install -U langchain  # 需要 Python 3.10 及以上版本

# 使用uv安装
uv add langchain  # 需要 Python 3.10 及以上版本

LangChain 提供了与数百个大语言模型(LLM)和数千个其他工具的集成能力,这些集成功能分布在独立的提供商(provider)包中。例如:

# pip安装
# 安装 OpenAI 集成
pip install -U langchain-openai

# 安装 Anthropic 集成
pip install -U langchain-anthropic

# uv安装
# 安装 OpenAI 集成
uv add langchain-openai

# 安装 Anthropic 集成
uv add langchain-anthropic

三、快速入门

本教程将在几分钟内带你从简单设置过渡到功能完备的AI智能体。

3.1 构建基础智能体

首先创建一个能回答问题并调用工具的简单智能体。该智能体将使用 Claude Sonnet 4.5 作为语言模型,一个基础的天气查询函数作为工具,以及一个简单的提示词来指导其行为。

对于本示例,你需要先创建 Anthropic 账户并获取 API 密钥,然后在终端中设置 ANTHROPIC_API_KEY 环境变量。

from langchain.agents import create_agent

def get_weather(city: str) -> str:
    """获取指定城市的天气。"""
    return f"{city}的天气总是晴天!"

agent = create_agent(
    model="claude-sonnet-4-5-20250929",
    tools=[get_weather],
    system_prompt="你是一个乐于助人的助手",
)

# 运行智能体
agent.invoke(
    {"messages": [{"role": "user", "content": "旧金山的天气怎么样?"}]}
)

3.2 构建实际应用智能体

接下来,构建一个实用的天气预报智能体,展示关键的生产级概念:

  • 详细的系统提示词,优化智能体行为
  • 创建集成外部数据的工具
  • 模型配置,确保响应一致性
  • 结构化输出,保证结果可预测
  • 会话记忆,支持类聊天交互
3.2.1 创建并运行完整功能智能体

让我们逐步拆解实现过程:

  1. 定义系统提示词

    系统提示词定义了智能体的角色和行为,需具体且可执行:

    SYSTEM_PROMPT = """你是一位擅长说双关语的专业天气预报员。你可以使用以下两个工具:
    
    - get_weather_for_location:用于获取特定地点的天气
    - get_user_location:用于获取用户所在位置
    
    如果用户询问天气,请确保确认地点。如果能从问题中判断用户指的是自己所在位置,请使用 get_user_location 工具获取其位置。"""
    
  2. 创建工具

    工具允许模型通过调用你定义的函数与外部系统交互。工具可依赖运行时上下文,也能与智能体记忆交互。

    注意下方的 get_user_location 工具如何使用运行时上下文:

    from dataclasses import dataclass
    from langchain.tools import tool, ToolRuntime
    
    @tool
    def get_weather_for_location(city: str) -> str:
        """获取指定城市的天气。"""
        return f"{city}的天气总是晴天!"
    
    @dataclass
    class Context:
        """自定义运行时上下文 schema。"""
        user_id: str
    
    @tool
    def get_user_location(runtime: ToolRuntime[Context]) -> str:
        """根据用户ID获取用户信息。"""
        user_id = runtime.context.user_id
        return "佛罗里达" if user_id == "1" else "旧金山"
    

    工具需具备完善的文档说明:其名称、描述和参数名将成为模型提示词的一部分。LangChain 的 @tool 装饰器会添加元数据,并支持通过 ToolRuntime 参数实现运行时注入。

  3. 配置模型

    根据使用场景设置语言模型的参数:

    from langchain.chat_models import init_chat_model
    
    model = init_chat_model(
        "claude-sonnet-4-5-20250929",
        temperature=0.5,
        timeout=10,
        max_tokens=1000
    )
    
  4. 定义响应格式

    如果需要智能体的响应符合特定结构,可选择性定义结构化响应格式:

    from dataclasses import dataclass
    
    # 此处使用 dataclass,也支持 Pydantic 模型
    @dataclass
    class ResponseFormat:
        """智能体的响应 schema。"""
        # 必须包含的双关语响应
        punny_response: str
        # 可选:天气相关的有趣信息(如有)
        weather_conditions: str | None = None
    
  5. 添加记忆功能

    为智能体添加记忆功能以维持交互过程中的状态,使其能够记住之前的对话和上下文:

    from langgraph.checkpoint.memory import InMemorySaver
    
    checkpointer = InMemorySaver()
    

    生产环境中,请使用持久化检查点(checkpointer),将数据存储到数据库。详见「添加和管理记忆」章节。

  6. 创建并运行智能体

    现在将所有组件组装成智能体并运行:

    agent = create_agent(
        model=model,
        system_prompt=SYSTEM_PROMPT,
        tools=[get_user_location, get_weather_for_location],
        context_schema=Context,
        response_format=ResponseFormat,
        checkpointer=checkpointer
    )
    
    # `thread_id` 是特定对话的唯一标识
    config = {"configurable": {"thread_id": "1"}}
    
    response = agent.invoke(
        {"messages": [{"role": "user", "content": "外面的天气怎么样?"}]},
        config=config,
        context=Context(user_id="1")
    )
    
    print(response['structured_response'])
    # 输出:
    # ResponseFormat(
    #     punny_response="佛罗里达依然是‘阳光灿烂’的一天!阳光全天都在播放‘射线电台’热门歌曲!我得说,这天气太适合‘阳光庆典’了!如果你盼着下雨,恐怕这个想法已经‘泡汤’了——预报依旧‘晴朗’无比!",
    #     weather_conditions="佛罗里达的天气总是晴天!"
    # )
    
    # 注意:可使用相同的 `thread_id` 继续对话
    response = agent.invoke(
        {"messages": [{"role": "user", "content": "谢谢!"}]},
        config=config,
        context=Context(user_id="1")
    )
    
    print(response['structured_response'])
    # 输出:
    # ResponseFormat(
    #     punny_response="‘雷霆万钧’地不客气!帮你掌握最新天气动态向来‘轻而易举’。我只是在‘云里雾里’等着,随时准备在你需要时‘ shower ’你更多预报(双关:既指‘提供’也指‘淋浴’)。祝你在佛罗里达的阳光下度过‘阳光灿烂’的一天!",
    #     weather_conditions=None
    # )
    
  7. 完整代码整合

    from dataclasses import dataclass
    from langchain.agents import create_agent
    from langchain.chat_models import init_chat_model
    from langchain.tools import tool, ToolRuntime
    from langgraph.checkpoint.memory import InMemorySaver
    
    # 定义系统提示词
    SYSTEM_PROMPT = """你是一位擅长说双关语的专业天气预报员。你可以使用以下两个工具:
    
    - get_weather_for_location:用于获取特定地点的天气
    - get_user_location:用于获取用户所在位置
    
    如果用户询问天气,请确保确认地点。如果能从问题中判断用户指的是自己所在位置,请使用 get_user_location 工具获取其位置。"""
    
    # 定义上下文 schema
    @dataclass
    class Context:
        """自定义运行时上下文 schema。"""
        user_id: str
    
    # 定义工具
    @tool
    def get_weather_for_location(city: str) -> str:
        """获取指定城市的天气。"""
        return f"{city}的天气总是晴天!"
    
    @tool
    def get_user_location(runtime: ToolRuntime[Context]) -> str:
        """根据用户ID获取用户信息。"""
        user_id = runtime.context.user_id
        return "佛罗里达" if user_id == "1" else "旧金山"
    
    # 配置模型
    model = init_chat_model(
        "claude-sonnet-4-5-20250929",
        temperature=0
    )
    
    # 定义响应格式
    @dataclass
    class ResponseFormat:
        """智能体的响应 schema。"""
        # 必须包含的双关语响应
        punny_response: str
        # 可选:天气相关的有趣信息(如有)
        weather_conditions: str | None = None
    
    # 设置记忆功能
    checkpointer = InMemorySaver()
    
    # 创建智能体
    agent = create_agent(
        model=model,
        system_prompt=SYSTEM_PROMPT,
        tools=[get_user_location, get_weather_for_location],
        context_schema=Context,
        response_format=ResponseFormat,
        checkpointer=checkpointer
    )
    
    # 运行智能体
    # `thread_id` 是特定对话的唯一标识
    config = {"configurable": {"thread_id": "1"}}
    
    response = agent.invoke(
        {"messages": [{"role": "user", "content": "外面的天气怎么样?"}]},
        config=config,
        context=Context(user_id="1")
    )
    
    print(response['structured_response'])
    # 输出:
    # ResponseFormat(
    #     punny_response="佛罗里达依然是‘阳光灿烂’的一天!阳光全天都在播放‘射线电台’热门歌曲!我得说,这天气太适合‘阳光庆典’了!如果你盼着下雨,恐怕这个想法已经‘泡汤’了——预报依旧‘晴朗’无比!",
    #     weather_conditions="佛罗里达的天气总是晴天!"
    # )
    
    # 注意:可使用相同的 `thread_id` 继续对话
    response = agent.invoke(
        {"messages": [{"role": "user", "content": "谢谢!"}]},
        config=config,
        context=Context(user_id="1")
    )
    
    print(response['structured_response'])
    # 输出:
    # ResponseFormat(
    #     punny_response="‘雷霆万钧’地不客气!帮你掌握最新天气动态向来‘轻而易举’。我只是在‘云里雾里’等着,随时准备在你需要时‘ shower ’你更多预报(双关:既指‘提供’也指‘淋浴’)。祝你在佛罗里达的阳光下度过‘阳光灿烂’的一天!",
    #     weather_conditions=None
    # )
    

恭喜!你现在拥有了一个具备以下能力的AI智能体:

  • 理解上下文并记忆对话内容
  • 智能使用多个工具
  • 以一致的格式提供结构化响应
  • 通过上下文处理用户特定信息
  • 在多轮交互中维持对话状态

今天的内容就到这里了,我们下期再见!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐