注意:本文撰写于 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 的管道语法仍然适用 |
我们逐一介绍。
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)。它取代了旧的 LLMChain、SequentialChain 等。简洁且可组合。
3. 结构化输出
旧方法需要使用 ResponseSchema、StructuredOutputParser,并将格式指令注入到提示中。新方法只需使用 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。如果这对你有帮助,请继续关注 —— 我也会分享这一旅程。
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.