Santanu Mohanta

注意:本文撰写于 2026 年 7 月,基于 LangChain 0.3.x 版本。未来版本中 API 可能发生变化 —— 如果某些功能无法正常工作,请查阅 LangChain 文档

当我开始学习 LangChain 时,感到非常困惑。里面有 chains、agents、memory、retrievers、output parsers —— 几十个抽象概念。后来我意识到:其中大部分已经被弃用。

LangGraph(由同一团队开发)已经取代了编排层。但在 LangGraph 节点中,你仍然需要使用 LangChain 的核心构建模块。因此,我总结出了最少需要学习的内容。

以下是全部内容,整合在一个文件中。

真正重要的 4 件事

# 主题 对 LangGraph 的重要性
1 LLM 设置 你需要与模型对话
2 Prompt Templates + LCEL LCEL 的管道语法仍然适用
这是最重要的一点 — LangGraph 的代理是围绕工具调用循环构建的

我们逐一介绍。


1. LLM 设置

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="llama-3.3-70b-versatile",
    temperature=0.0,
    api_key=os.environ["GROQ_API_KEY"],
    base_url="https://api.groq.com/openai/v1",
)

进入全屏模式 退出全屏模式

ChatOpenAI 可与任何兼容 OpenAI 的 API 配合使用。这里我使用 Groq 来免费、快速地调用 Llama 3.3 模型。

2. Prompt Templates + LCEL

from langchain_core.prompts import ChatPromptTemplate

template_string = """将由三个反引号分隔的文本翻译成 {style} 风格。
文本:```

{text}

进入全屏模式 退出全屏模式

"""

prompt_template = ChatPromptTemplate.from_template(template_string)
chain = prompt_template | llm
response = chain.invoke({"style": "formal English", "text": "yo what's up"})```

管道符 (|) 语法被称为 LCEL(LangChain Expression Language)。它取代了旧的 LLMChainSequentialChain 等。简洁且可组合。

3. 结构化输出

旧方法需要使用 ResponseSchemaStructuredOutputParser,并将格式指令注入到提示中。新方法只需使用 Pydantic:

from pydantic import BaseModel, Field

class ReviewInfo(BaseModel):
    """从产品评论中提取的信息。"""
    gift: bool = Field(description="该商品是否作为礼物购买?")
    delivery_days: int = Field(description="需要多少天送达?若未知则为 -1。")
    price_value: list[str] = Field(description="关于价值或价格的句子。")

structured_llm = llm.with_structured_output(ReviewInfo, method="function_calling")
result = (prompt | structured_llm).invoke({"text": review})

print(result.gift)           # True  (真正的布尔值,而非字符串 "true")
print(result.delivery_days)  # 2     (真正的整数)

进入全屏模式 退出全屏模式

各部分职责:

步骤 负责方
将 Pydantic 转换为 JSON Schema LangChain
理解 Schema 并生成 JSON LLM
将 JSON 解析回 Pydantic 对象 LangChain

提示中不再需要格式指令。LLM 不会看到“返回 JSON”的指令 —— 它在底层使用函数调用。

4. 工具调用 — 最重要的一点

这是 LangGraph 自动化的内容。先手动理解它,能让你瞬间掌握 LangGraph。

定义工具 — 只需使用 @tool 装饰器的 Python 函数:

from langchain_core.tools import tool

@tool
def get_current_weather(city: str) -> str:
    """获取指定城市的当前天气。"""
    return {"berlin": "17°C, cloudy"}.get(city.lower(), "No data")

@tool
def get_population(city: str) -> int:
    """获取城市的近似人口。"""
    return {"berlin": 3_700_000}.get(city.lower(), -1)

进入全屏模式 退出全屏模式

@tool 装饰器会将这些函数转换为 BaseTool 对象。docstring 会成为 LLM 用来判断何时调用该工具的描述。

绑定工具并调用:

tools = [get_current_weather, get_population]
llm_with_tools = llm.bind_tools(tools)

messages = [HumanMessage("柏林的天气和人口是多少?")]
ai_response = llm_with_tools.invoke(messages)

print(ai_response.tool_calls)
# [{"name": "get_current_weather", "args": {"city": "Berlin"}, "id": "..."},
#  {"name": "get_population", "args": {"city": "Berlin"}, "id": "..."}]

进入全屏模式 退出全屏模式

LLM 不会执行工具。它返回一个结构化的请求,要求来运行它们。

执行工具并返回结果:

tool_map = {t.name: t for t in tools}

messages.append(ai_response)
for tc in ai_response.tool_calls:
    result = tool_map[tc["name"]].invoke(tc["args"])
    messages.append(ToolMessage(content=str(result), tool_call_id=tc["id"]))

final_response = llm_with_tools.invoke(messages)
print(final_response.content)
# "柏林的天气是 17°C,多云,人口为 370 万。"

进入全屏模式 退出全屏模式

这个循环 —— LLM 决定 → 你执行 → 返回结果 → 重复 —— 正是 LangGraph 的 ToolNode 自动化的内容。


可以跳过的部分

如果你计划使用 LangGraph,无需学习以下遗留的 LangChain 抽象:

  • LLMChain → 已被 LCEL(prompt | llm)取代
  • SequentialChain → 已被 LCEL 管道取代
  • RouterChain → 已被 LangGraph 分支取代
  • ConversationChain → 已被 LangGraph 状态取代
  • AgentExecutor → 已被 LangGraph 代理循环取代

LangChain 与 LangGraph 的关系

LangGraph 不是 LangChain 的替代品 —— 它是建立在 LangChain 之上的:

  • LangChain Core → LLM、提示、工具、消息 (你仍然需要使用这些)
  • LangGraph → 编排层 (控制这些模块如何连接和循环)

LangGraph 于 2024 年初推出,因为 LangChain 最初的代理/链抽象过于僵化 —— 难以自定义,不支持循环或分支,且记忆是附加的而非内置的。


获取代码

全部内容在一个文件中:github.com/santanu2908/langchain-essentials

git clone https://github.com/santanu2908/langchain-essentials.git
cd langchain-essentials
uv sync
# 将 GROQ_API_KEY 添加到 .env
uv run main.py

进入全屏模式 退出全屏模式


接下来:LangGraph。如果这对你有帮助,请继续关注 —— 我也会分享这一旅程。

我是 Santanu Mohanta —— 欢迎在 LinkedInGitHub 上与我联系。