J'Blog

2 课 · 核心

语义检索

基于 Chroma 向量库,与 Workspace 知识库分离。用自然语言描述你想查的内容。 非管理员每人每天可检索 5 次(消耗站点 AI 配额)。

Agent 与 create_agent

原文:Agent 与 create_agent

一句话

Agent 是一个模型在循环中调用工具直到任务完成的系统,而 create_agent 是 LangChain 中用于构建 Agent 的高度可配置 harness。

什么时候翻这页

当你需要构建能够自主调用工具完成任务的智能体时,或者当你需要配置 Agent 的行为、添加中间件扩展功能时。

核心概念

  • Agent: 一个模型在循环中调用工具直到任务完成的系统
  • Harness: 围绕 Agent 循环的一切:模型、提示词、工具和任何塑造其行为的中间件
  • create_agent: 高度可配置的 Agent 构建函数
  • Middleware: 用于扩展 Agent 行为的组件,每个中间件处理一个关注点,在适当时机钩入 Agent 循环
  • Tools: Agent 可以调用的函数或操作
  • Model: Agent 使用的底层语言模型
  • Retriever: 用于从知识库中检索相关信息

怎么做

创建基本 Agent

from langchain.agents import create_agent

agent = create_agent("openai:gpt-5.4", tools=tools)

配置核心组件

# 指定模型
agent = create_agent("openai:gpt-5.4", tools=tools)

# 设置系统提示
agent = create_agent(
    "openai:gpt-5.4",
    tools=tools,
    system_prompt="You are a helpful assistant. Be concise and accurate.",
)

# 使用结构化输出
from pydantic import BaseModel

class Answer(BaseModel):
    summary: str
    confidence: float

agent = create_agent("openai:gpt-5.4", tools=tools, response_format=Answer)

# 指定名称
agent = create_agent("openai:gpt-5.4", tools=tools, name="research_assistant")

调用 Agent

from langchain_core.utils.uuid import uuid7
from langgraph.checkpoint.memory import InMemorySaver

agent = create_agent(
    model="openai:gpt-5.4",
    tools=[],
    checkpointer=InMemorySaver(),
)

config = {"configurable": {"thread_id": str(uuid7())}}

# 初始调用
result = agent.invoke(
    {"messages": [{"role": "user", "content": "What's the weather in San Francisco?"}]},
    config=config,
)

# 后续对话(保持历史)
result = agent.invoke(
    {"messages": [{"role": "user", "content": "What about tomorrow?"}]},
    config=config,
)

流式处理

from langchain.messages import AIMessage, HumanMessage

for chunk in agent.stream({
    "messages": [{"role": "user", "content": "Search for AI news and summarize the findings"}]
}, stream_mode="values"):
    latest_message = chunk["messages"][-1]
    if latest_message.content:
        if isinstance(latest_message, HumanMessage):
            print(f"User: {latest_message.content}")
        elif isinstance(latest_message, AIMessage):
            print(f"Agent: {latest_message.content}")
    elif latest_message.tool_calls:
        print(f"Calling tools: {[tc['name'] for tc in latest_message.tool_calls]}")

配置中间件

# 文件系统中间件
from deepagents.backends import StateBackend
from deepagents.middleware import FilesystemMiddleware

agent = create_agent(
    model="anthropic:claude-sonnet-4-6",
    tools=[search],
    middleware=[FilesystemMiddleware(backend=StateBackend())],
)

# 上下文管理中间件
from deepagents.backends import StateBackend
from deepagents.middleware import FilesystemMiddleware, MemoryMiddleware, SkillsMiddleware, SummarizationMiddleware

backend = StateBackend()
model = "anthropic:claude-sonnet-4-6"

agent = create_agent(
    model=model,
    tools=[search],
    middleware=[
        FilesystemMiddleware(backend=backend),
        SummarizationMiddleware(model=model, backend=backend),
        MemoryMiddleware(backend=backend, sources=["./AGENTS.md"]),
        SkillsMiddleware(backend=backend, sources=["./skills/"]),
    ],
)

# 规划和委托中间件
from deepagents.backends import StateBackend
from deepagents.middleware import FilesystemMiddleware
from deepagents.middleware.subagents import SubAgentMiddleware
from langchain.agents import create_agent
from langchain.agents.middleware import TodoListMiddleware

agent = create_agent(
    model="openai:gpt-5.4",
    tools=[search],
    middleware=[
        FilesystemMiddleware(backend=backend),
        TodoListMiddleware(),
        SubAgentMiddleware(
            backend=backend,
            subagents=[
                {
                    "name": "researcher",
                    "description": "Searches and returns a structured summary.",
                    "system_prompt": "Use the search tool to research the question and summarize key points.",
                    "tools": [search],
                    "model": "anthropic:claude-sonnet-4-6",
                    "middleware": [],
                }
            ],
        ),
    ],
)

# 容错中间件
from langchain.agents.middleware import ModelRetryMiddleware, ToolRetryMiddleware

agent = create_agent(
    model="openai:gpt-5.4",
    tools=[search],
    middleware=[
        ModelRetryMiddleware(max_retries=3),
        ToolRetryMiddleware(max_retries=2),
    ],
)

# 护栏中间件
from langchain.agents.middleware import PIIMiddleware

agent = create_agent(
    model="openai:gpt-5.4",
    tools=[search],
    middleware=[PIIMiddleware("email")],
)

# 转向中间件
from langchain.agents.middleware import HumanInTheLoopMiddleware

agent = create_agent(
    model="openai:gpt-5.4",
    tools=[search],
    middleware=[HumanInTheLoopMiddleware(interrupt_on={"write_file": True})],
)

命令 / API 速查

  • create_agent(model, tools, system_prompt=None, response_format=None, name=None, middleware=None): 创建 Agent
  • agent.invoke(messages, config=None, context=None): 调用 Agent
  • agent.stream(messages, config=None, stream_mode="values"): 流式调用 Agent
  • FilesystemMiddleware(backend): 文件系统中间件
  • SummarizationMiddleware(model, backend): 摘要中间件
  • MemoryMiddleware(backend, sources): 记忆中间件
  • SkillsMiddleware(backend, sources): 技能中间件
  • SubAgentMiddleware(backend, subagents): 子代理中间件
  • ModelRetryMiddleware(max_retries): 模型重试中间件
  • ToolRetryMiddleware(max_retries): 工具重试中间件
  • PIIMiddleware(types): PII 中间件
  • HumanInTheLoopMiddleware(interrupt_on): 人在循环中间件

与 LangGraph / RAG 手册的联系

  • LangGraph 提供了 Agent 的底层运行时编排,而 LangChain 的 create_agent 是更高层次的封装
  • RAG 可以作为 Agent 的工具使用,通过 retriever 增强 Agent 的知识获取能力
  • LangGraph 的状态管理概念与 Agent 的 thread_id 和上下文管理有相似之处

初学者易错点

  1. 忘记配置 checkpointer 导致无法保持对话历史
  2. 没有正确传递 thread_id 导致不同对话之间历史混乱
  3. 中间件配置顺序不当导致行为不符合预期
  4. 工具函数定义不清晰导致 Agent 无法正确调用
  5. 系统提示词过于复杂或模糊导致 Agent 行为不一致

相关词条

官方原文:https://docs.langchain.com/oss/python/langchain/agents