关于 langchain-agents
langchain-agents 是一项介绍使用 LangChain、LangGraph 和 DeepAgents 构建 Agent 的技能,面向开发者。内容涵盖从简单工具调用到多 Agent 控制流、状态管理和上下文处理,并强调采用较新的接口。
主要功能
- 01使用 create_agent 构建工具调用 Agent
- 02使用 DeepAgents 处理规划与委派
- 03用 LangGraph 定制路由和状态
- 04通过子 Agent 分担任务
- 05修剪或压缩对话上下文
- 06配置持久化与结构化输出
适用场景
- 01构建搜索或问答 Agent
- 02实现多步骤研究工作流
- 03设计监督者与子 Agent 协作
- 04管理长对话中的上下文
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ langchain-ai/ skills-benchmarks --skill langchain-agents安装后在 Claude Code 中输入/langchain-agents确认已加载。
详细介绍
<quick_start>
重要: 使用现代抽象。create_sql_agent、create_tool_calling_agent、create_react_agent 等旧版辅助工具已过时。
只需简单的工具调用 Agent? → create_agent
from langchain.agents import create_agent
graph = create_agent(model="anthropic:claude-sonnet-4-5", tools=[search], system_prompt="...")
适用于: 基础 ReAct 循环、工具调用 Agent、简单问答机器人。
需要规划 + 文件系统 + 子 Agent? → create_deep_agent
from deepagents import create_deep_agent
agent = create_deep_agent(model=model, tools=tools, backend=FilesystemBackend())
适用于: 研究 Agent、复杂工作流、多步骤规划。
需要自定义控制流 / 多 Agent / 高级上下文? → LangGraph(见下文) 适用于: 自定义路由逻辑、监督者模式、专用状态管理、非标准工作流。
从简单开始: 先使用基础 ReAct 循环构建。只有在用例需要时才增加复杂度。 </quick_start>
<create_agent>
使用 create_agent(推荐)
from langchain_anthropic import ChatAnthropic
from langchain.agents import create_agent
from langchain_core.tools import tool
@tool
def my_tool(query: str) -> str:
"""Tool description that the model sees."""
return perform_operation(query)
model = ChatAnthropic(model="claude-sonnet-4-5")
agent = create_agent(
model=model,
tools=[my_tool],
system_prompt="Your agent behavior and guidelines."
)
result = agent.invoke({"messages": [("user", "Your question")]})
适用模式: SQL Agent、搜索 Agent、问答机器人、工具调用工作流。
示例:计算器 Agent
@tool
def calculate(expression: str) -> str:
"""Evaluate a mathematical expression safely."""
try:
allowed = set('0123456789+-*/(). ')
if not all(c in allowed for c in expression):
return "Error: Invalid characters"
return str(eval(expression))
except Exception as e:
return f"Error: {e}"
@tool
def convert_units(value: float, from_unit: str, to_unit: str) -> str:
"""Convert between common units."""
conversions = {
("km", "miles"): 0.621371,
("miles", "km"): 1.60934,
}
factor = conversions.get((from_unit, to_unit), None)
return f"{value * factor:.2f} {to_unit}" if factor else "Conversion not supported"
agent = create_agent(
model=ChatAnthropic(model="claude-sonnet-4-5"),
tools=[calculate, convert_units],
system_prompt="You are a helpful calculator assistant."
)
快速参考
from langchain.agents import create_agent
agent = create_agent(model=model, tools=[my_tool], system_prompt="...")
result = agent.invoke({"messages": [("user", "question")]})
</create_agent>
### 从头构建基础 Agentfrom langgraph.graph import StateGraph, START, END
from langgraph.prebuilt import ToolNode
from typing import TypedDict, Annotated
from langgraph.graph.message import add_messages
class State(TypedDict):
messages: Annotated[list, add_messages]
tools = [search_tool]
tool_node = ToolNode(tools)
def agent(state: State):
return {"messages": [model.bind_tools(tools).invoke(state["messages"])]}
def route(state: State):
return "tools" if state["messages"][-1].tool_calls else END
workflow = StateGraph(State)
workflow.add_node("agent", agent)
workflow.add_node("tools", tool_node)
workflow.add_edge(START, "agent")
workflow.add_conditional_edges("agent", route)
workflow.add_edge("tools", "agent")
app = workflow.compile()
循环: Agent → 工具 → Agent → END
ToolMessages:关键细节
实现自定义工具执行时,必须为每次工具调用创建一个 ToolMessage:
from langchain_core.messages import ToolMessage
def custom_tool_node(state: State) -> dict:
last_message = state["messages"][-1]
tool_messages = []
for tool_call in last_message.tool_calls:
result = execute_tool(tool_call["name"], tool_call["args"])
# CRITICAL: tool_call_id must match!
tool_messages.append(ToolMessage(
content=str(result),
tool_call_id=tool_call["id"]
))
return {"messages": tool_messages}
Commands:通过更新进行路由
from langgraph.types import Command
from typing import Literal
def router(state: State) -> Command[Literal["research", "write", END]]:
if needs_more_context(state):
return Command(update={"notes": "Starting research"}, goto="research")
return Command(goto=END)
# Human-in-loop
def ask_user(state: State) -> Command:
response = interrupt("Please clarify:")
return Command(update={"messages": [HumanMessage(content=response)]}, goto="continue")
<context_management>
策略 1:委派给子 Agent
模式: 将工作交给子 Agent,只返回摘要。
researcher_subgraph = build_researcher_graph().compile()
def main_agent(state: State) -> Command:
if needs_research(state["messages"][-1]):
result = researcher_subgraph.invoke({"query": extract_query(state)})
return Command(
update={"context": state["context"] + f"\n{result['summary']}"},
goto="respond"
)
return Command(goto="respond")
策略 2:渐进式消息裁剪
模式: 移除旧消息,但保留系统消息和近期上下文。
def trim_messages(messages: list, max_messages: int = 20) -> list:
system_msgs = [m for m in messages if isinstance(m, SystemMessage)]
conversation = [m for m in messages if not isinstance(m, SystemMessage)]
return system_msgs + conversation[-max_messages:]
def agent_with_trimming(state: State) -> dict:
trimmed = trim_messages(state["messages"], max_messages=15)
return {"messages": [model.invoke(trimmed)]}
策略 3:通过摘要进行压缩
模式: 总结旧上下文,近期消息保持原样。
def compress_history(state: State) -> dict:
messages = state["messages"]
if len(messages) > 30:
old, recent = messages[:-10], messages[-10:]
summary = model.invoke([HumanMessage(content=f"Summarize:\n{format_messages(old)}")])
return {"messages": [SystemMessage(content=f"Previous:\n{summary.content}")] + recent}
return {"messages": messages}
</context_management>
<multi_agent>
监督者模式
from langgraph.graph import StateGraph, START, END
from langgraph.types import Command
from typing import TypedDict, Annotated, Literal
from langgraph.graph.message import add_messages
class AgentState(TypedDict):
messages: Annotated[list, add_messages]
next_agent: str
def supervisor(state: AgentState) -> Command[Literal["billing", "technical", END]]:
last_msg = state["messages"][-1].content.lower()
if "invoice" in last_msg or "payment" in last_msg:
return Command(goto="billing")
elif "error" in last_msg or "not working" in last_msg:
return Command(goto="technical")
return Command(goto=END)
def billing_agent(state: AgentState) -> dict:
return {"messages": [billing_model.invoke(state["messages"])]}
def technical_agent(state: AgentState) -> dict:
return {"messages": [tech_model.invoke(state["messages"])]}
workflow = StateGraph(AgentState)
workflow.add_node("supervisor", supervisor)
workflow.add_node("billing", billing_agent)
workflow.add_node("technical", technical_agent)
workflow.add_edge(START, "supervisor")
workflow.add_edge("billing", END)
workflow.add_edge("technical", END)
app = workflow.compile()
</multi_agent>
### 使用 Checkpointer + Store 实现持久化from langgraph.checkpoint.memory import MemorySaver
from langgraph.store.memory import InMemoryStore
checkpointer = MemorySaver() # Thread-level state
store = InMemoryStore() # Cross-thread memory
app = graph.compile(checkpointer=checkpointer, store=store)
app.invoke(
{"messages": [HumanMessage("Hello")]},
config={"configurable": {"thread_id": "user-123"}}
)
结构化输出
from pydantic import BaseModel, Field
class ResearchOutput(BaseModel):
summary: str = Field(description="3-sentence summary")
sources: list[str] = Field(description="Source URLs")
confidence: float = Field(description="0-1 confidence score")
model_with_structure = model.with_structured_output(ResearchOutput)
def structured_research(state: State) -> dict:
result = model_with_structure.invoke(state["messages"])
return {"research": result.model_dump()}
DeepAgents:开箱即用
from deepagents import create_deep_agent
from deepagents.backends import CompositeBackend, FilesystemBackend, StoreBackend
backend = CompositeBackend({
"/workspace/": FilesystemBackend("./workspace"),
"/memories/": StoreBackend(store)
})
agent = create_deep_agent(
model=model,
tools=[search, scrape],
subagents=[researcher_agent, analyst_agent],
backend=backend
)
DeepAgents 提供: 文件系统(自动上下文文件)、规划(任务拆分)、子 Agent(委派)、记忆(持久化)。
- [LangGraph 文档](https://docs.langchain.com/langgraph) - [create_agent](https://docs.langchain.com/oss/python/langchain/agents) - [DeepAgents](https://docs.langchain.com/oss/python/deepagents/overview) - [LangGraph 101 多 Agent](https://github.com/langchain-ai/langgraph-101/blob/main/notebooks/LG201/multi_agent.ipynb) - [深度研究示例](https://github.com/langchain-samples/deep_research_101)