什么是LangChain & LangGraph

安装 | LangChain 中文文档

持久化 | LangChain 中文文档

学习 | LangChain 中文文档

  • LangChain:帮助您快速开始使用任何您选择的模型提供商来构建智能体。
  • LangGraph:允许您通过低级别编排、内存和**人工干预支持(human-in-the-loop support)来控制自定义智能体的每一步。您可以使用持久化执行(durable execution)**来管理长时间运行的任务。

关系如下:

组件 说明
LangChain 提供基础工具:LLM 调用、Prompt 管理、工具调用(Tool)、记忆、Agent 架构等。是构建 AI 应用的“乐高积木”。
LangGraph 在 LangChain 基础上扩展了 状态管理 + 图流程控制,支持复杂工作流(如循环、并行、条件分支)。它使用 LangChain 的组件,但提供更高阶的执行模型。
DeepAgent 是一个基于 LangChain + LangGraph 构建的 智能体框架,用于实现自动化任务代理(例如网页浏览、决策、多步推理)。

LangChain有各种开发的组件以及简单,通用的工具和类,底层来自于LangGraph,提供通用智能体开发和逻辑链工作流的智能体开发,而DeepAgent专注构建超复杂智能体。

结构类似于:在这里插入图片描述

安装langchain

使用pip或uv的形式,建议使用uv,如何安装及使用uv参考:

pip install -U langchain
uv add langchain

LangChain 提供对数百种 LLM 和数千种其他集成的支持。这些集成存在于独立的提供者包中。例如:

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

# 安装 Anthropic 集成
pip install -U langchain-anthropic
# 安装 OpenAI 集成
uv add langchain-openai

# 安装 Anthropic 集成
uv add langchain-anthropic

环境配置

安装管理环境变量的包

# 管理环境变量的包
pip install dotenv

dotenv的使用:
在项目根目录创建.env配置文件以及一个config.py文件,.env文件格式如下:

DEEPSEEK_API_KEY=xxx
DEEPSEEK_BASE_URL=xxx
DEEPSEEK_TEXT_MODEL=xxx

以下是一个简单的config.py示例:

import os
from dotenv import load_dotenv

load_dotenv(override=True)
# LLM配置
# deepseek
DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY")
DEEPSEEK_BASE_URL = os.getenv("DEEPSEEK_BASE_URL")
DEEPSEEK_TEXT_MODEL = os.getenv("DEEPSEEK_TEXT_MODEL")
# 数据库参数
DB_CONFIG = {
    "host": os.getenv("DB_HOST"),
    "port": os.getenv("DB_PORT"),
    "username": os.getenv("DB_USERNAME"),
    "password": os.getenv("DB_PASSWORD"),
    "database": os.getenv("DB_DATABASE")
}

uv包管理

在项目根目录创建pyproject.toml文件:

[project]
name = "your-project-name"
version = "0.1.0"
requires-python = "你的py版本要求" 例:">=3.11"
dependencies = []

然后运行

uv add requests

如果之前有requirements.txt,使用

uv add -r requirements.txt

使用 uv remove 可以删除依赖项

uv remove requests

需要导入虚拟环境时,也只需要 pyproject.toml 文件,并执行:

uv sync

以上命令会根据 pyproject.toml 自动创建或更新虚拟环境,方便快捷

你可以选择修改uv缓存目录(默认c盘)来消除link-mode警告:

setx UV_CACHE_DIR "D:\Workspace\Environments\VirtualEnvs\UV"
uv cache clean

初识模型

langchain框架提供基础工具:LLM 调用、Prompt 管理、工具调用(Tool)、记忆、Agent 架构等。是构建 AI 应用的“乐高积木”。

智能体可以视作一个能自主使用工具获取知识并处理请求的语言模型,智能体将语言模型与工具结合,创建能够对任务进行推理、决定使用哪些工具并迭代寻求解决方案的系统。

模型是整个智能体的核心,接下来介绍几种常用的创建对话模型的方法:

基础创建

使用统一接口init_chat_model从任何受支持的提供者初始化聊天模型。这是通用的创建一个聊天模型的方法,共有以下参数:

参数名 (PARAMETER) 类型 (TYPE) 默认值 (DEFAULT) 描述 (DESCRIPTION)
model `str None` None
model_provider `str None` None
configurable_fields `Literal[‘any’] list[str] tuple[str, …]
config_prefix `str None` None
**kwargs Any 传递给底层聊天模型 __init__ 方法的额外关键字参数。常见参数包括: • temperature:控制输出随机性 • max_tokens:最大输出 token 数 • timeout:请求超时时间(秒) • max_retries:最大重试次数 • base_url:自定义 API 地址 • rate_limiter:限流器实例 具体支持参数请参考各模型提供商的集成文档。

安全提示:若设置 configurable_fields="any",则包括 api_keybase_url 等敏感字段都可能在运行时被修改,存在安全风险。建议在接收不可信输入时显式指定 configurable_fields=(...)

实际应用中,以下参数是常用的:

  • model: 模型名称或 ID(如 gpt-4oclaude-3-5-sonnet-20241022),建议使用带版本的固定标识以确保生产稳定性。
  • model_provider: 模型提供商(如 openaianthropicgoogle_vertexai),若未在 model 中通过前缀指定,建议显式设置以避免推断错误。
  • temperature: 控制输出随机性
  • max_tokens: 最大输出 token 数
  • timeout: 请求超时时间(秒),建议设为 3060,避免因 LLM 服务延迟导致系统阻塞。
  • max_retries: 请求失败时的最大重试次数,生产环境推荐 23 次,平衡容错与延迟。
  • base_url: 自定义 API 端点地址,用于私有部署、代理或云平台(如 Azure OpenAI)集成。
  • api_key: 访问模型 API 的密钥,应通过安全方式(如环境变量或密钥管理服务)注入,禁止硬编码。

具体可参考模型提供商的需求进行配置,以下以通义为例:

大模型服务平台百炼控制台

from langchain.chat_models import init_chat_model

from config import QWEN_TEXT_MODEL, QWEN_API_KEY, QWEN_BASE_URL

chat_model = init_chat_model(
    model = QWEN_TEXT_MODEL,
    api_key = QWEN_API_KEY,
    base_url = QWEN_BASE_URL,
    model_provider="openai",
    max_retries = 3,
    timeout = 30,
    max_tokens = 8096
)

print(chat_model.invoke("你好,介绍一下你自己"))

截至2025/12/10支持的模型提供商包括:anthropic、huggingface、bedrock、upstage、google_vertexai、openai、fireworks、mistralai、ibm、cohere、xai、google_anthropic_vertex、google_genai、bedrock_converse、perplexity、groq、azure_ai、azure_openai、ollama、deepseek、together

若不清楚当前提供商是否受支持(如qwen),可以测试看看报错model_provider=“qwen”。

使用openai一般就行,几乎所有的模型提供商都兼容OpenAI的API

其他方法

init_chat_model作为最基础的构建模型的方法是通用的,但是在langchain社区提供了许多构建模型的提供商特供方法,如ChatOpenAI,访问以下网址查看所有可用聊天模型:
聊天模型(Chat models) | LangChain 中文文档

这里以deepseek为例

from langchain_deepseek import ChatDeepSeek

model = ChatDeepSeek(
    model="...",
    temperature=0,
    max_tokens=None,
    timeout=None,
    max_retries=2,
    # api_key="...",
    # other params...
)

提供商提供的集成将包含提供商所支持的更强大的功能以及更方便的使用,如你无需在使用ChatDeepSeek时设置base_url等

对话

必须调用聊天模型以生成输出。主要有三种调用方法,每种方法适用于不同的用例。

Invoke

调用模型的最直接方法是使用 invoke() 传入单个消息或消息列表。

response = model.invoke("为什么鹦鹉有五颜六色的羽毛?")
print(response)

可以传递对话历史,详细内容将在下文讲解

from langchain.messages import HumanMessage, AIMessage, SystemMessage

conversation = [
    {"role": "system", "content": "你是一个将英语翻译成法语的有用助手。"},
    {"role": "user", "content": "翻译:我喜欢编程。"},
    {"role": "assistant", "content": "J'adore la programmation."},
    {"role": "user", "content": "翻译:我喜欢构建应用程序。"}
]

response = model.invoke(conversation)
print(response)
Stream

大多数模型可以在生成时流式传输其输出内容,请具体参考提供商文档。通过逐步显示输出,流式传输显著改善了用户体验,尤其是对于较长的响应。

调用 stream() 返回一个迭代器,它在生成时逐块产生输出。您可以使用循环实时处理每个块:

for chunk in model.stream("为什么鹦鹉有五颜六色的羽毛?"):
    print(chunk.text, flush=True)

通常,使用循环实时处理每个块:

for chunk in model.stream("天空是什么颜色?"):
    for block in chunk.content_blocks:
        if block["type"] == "reasoning" and (reasoning := block.get("reasoning")):
            print(f"推理:{reasoning}")
        elif block["type"] == "tool_call_chunk":
            print(f"工具调用块:{block}")
        elif block["type"] == "text":
            print(f"内容块: {block["text"]}")
        else:
            ...

这在搭建前端页面显示中很有用,比如deepseek的深度思考内容与结果的分别展示。

智能体

智能体将语言模型与工具结合,创建能够对任务进行推理、决定使用哪些工具并迭代寻求解决方案的系统。

create_agent 提供了一个生产就绪的智能体实现。
智能体会一直运行,直到满足停止条件——即模型输出最终结果或达到迭代次数限制。

在这里插入图片描述
先通过一个实例认识一下智能体的基本构建

from langchain.agents import create_agent

agent = create_agent(
    model=basic_model,  # 默认模型
    tools=tools
)

智能体必须包含model(上文的模型)以及工具(可以为空),这里我们先通过一个示例看看智能体的效果:

from langchain.tools import tool
from langchain.agents import create_agent


@tool
def search(query: str) -> str:
    """搜索信息。"""
    return f"结果:{query}"

@tool
def get_weather(location: str) -> str:
    """获取位置的天气信息。"""
    return f"{location} 的天气:晴朗,72°F"


agent = create_agent(
    model,
    tools=[search, get_weather],
    system_prompt="你是一个有帮助的助手。请简洁准确。"
)

result = agent.invoke(
    {"messages": [{"role": "user", "content": "旧金山天气如何?"}]}
)
from langchain_core.messages import HumanMessage, AIMessage, ToolMessage

# 假设 result 是你 Graph 的输出,例如 result = graph.invoke(...)
for message_group in result.values():
    for msg in message_group:
        if isinstance(msg, HumanMessage):
            print(f"👤 用户输入: {msg.content}")

        elif isinstance(msg, AIMessage):
            # 检查是否有工具调用
            if msg.tool_calls:
                print("🤖 模型调用了工具:")
                for tool_call in msg.tool_calls:
                    print(f"  - 工具名称: {tool_call['name']}")
                    print(f"    参数: {tool_call['args']}")
                    print(f"    调用ID: {tool_call['id']}")
            else:
                # 没有工具调用,说明是最终回复
                print(f"💬 模型回复: {msg.content}")

        elif isinstance(msg, ToolMessage):
            print(f"🔧 工具 '{msg.name}' 返回: {msg.content}")
            # 可选:打印 tool_call_id 用于调试
            # print(f"    (对应调用ID: {msg.tool_call_id})")

        else:
            # 兜底:打印未知类型消息
            print(f"❓ 未知消息类型: {type(msg).__name__} | 内容: {msg}")

结果为:

👤 用户输入: 旧金山天气如何?
🤖 模型调用了工具:
  - 工具名称: get_weather
    参数: {'location': '旧金山'}
    调用ID: call_362a360c22414cf7828fe1
🔧 工具 'get_weather' 返回: 旧金山 的天气:晴朗,72°F
💬 模型回复: 旧金山天气晴朗,温度为72°F。

因此可以看到,当使用create_agent后,会自动帮你创建一个能调用工具的智能体并尝试通过工具解答问题

当然,结合langchain提供的核心组件,我们将能够构建出更加强大的智能体。

接下来将会逐步进入到langGraph并根据需求逐步进行组件讲解。

下一节预告:搭建官方测试环境与langgraph初识
end

Logo

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

更多推荐