DeepAgents In Action学习(Second)

Agent 开发的三个层次

在 LangChain 的技术栈中,Agent 开发被划分为三个层次

  • 底层:Agent Runtime(运行时层)--- LangGraph
  • 中间层:Agent Framework(框架层)--- LangChain
  • 上层:Agent Harness(工具层)--- Deep Agents
Harness的作用

看看市面上那些真正能完成复杂任务的 Agent 产品------Claude Code、Manus、Cursor------它们虽然各有特色,但核心能力惊人地相似:

  1. 都有文件系统操作能力:能读写、搜索、编辑文件
  2. 都有任务规划能力:能把大任务拆成小步骤
  3. 都有子任务委派能力:能把部分工作交给子 Agent
  4. 都有上下文管理策略:防止对话过长导致 LLM "失忆"

这些共性不是巧合。当 Agent 面对的任务足够复杂时,这些能力就是必需的。而 Agent Harness 的价值就在于:把这些被验证过的模式固化下来,让你不需要每次都从头实现

Deep Agents 的核心设计理念:Context Engineering

Deep Agents 的解决方案是引入一个虚拟文件系统,让 Agent 像人类一样工作:

  • 需要读文件时,调用 read_file 按需读取
  • 需要记录中间结果时,调用 write_file 写到文件里
  • 需要搜索时,调用 grepglob 查找
  • 大文件只读取需要的部分(offset / limit 参数)

这样,Agent 的上下文里只保留当前步骤真正需要的信息,其余的都存在文件系统中,需要时再取。

更巧妙的是,这个"文件系统"是虚拟的、可插拔的

  • 可以是内存中的临时存储(开发调试用)
  • 可以是本地磁盘(处理真实文件)
  • 可以是持久化数据库(跨会话保持记忆)
  • 可以是远程沙箱(安全执行代码)
  • 甚至可以混合使用(不同路径路由到不同后端)

这就是 Context Engineering------不是把所有信息都喂给 LLM,而是为 LLM 构建一个高效获取和管理信息的基础设施

Deep Agents、Claude Agent SDK、Codex SDK

真正的差异在架构层面:

Deep Agents 的独有优势:

  • 模型灵活性:随时切换模型提供商,不锁定任何厂商。这对企业级应用至关重要
  • 长期记忆(Long-term Memory):通过 Memory Store 实现跨会话、跨线程的持久化记忆。Claude Agent SDK 和 Codex SDK 都不支持这一特性
  • 虚拟文件系统 + 可插拔后端:将文件操作抽象为统一接口,后端可以是内存、磁盘、数据库或沙箱
  • Sandbox-as-Tool 模式:Agent 在本地运行,但可以把特定操作(如代码执行)发送到远程沙箱中执行。这是 Deep Agents 独有的设计
  • 生产部署:通过 LangGraph Platform 部署,配合 LangSmith 实现完整的可观测性

Claude Agent SDK 的独有优势:

  • 与 Claude 模型的深度集成
  • Hooks 系统,便于拦截和控制 Agent 行为
  • 支持自定义 HTTP/WebSocket 层和容器化部署

Codex SDK 的独有优势:

  • OS 级别的沙箱模式(read-onlyworkspace-writedanger-full-access
  • 内置 MCP Server 模式
  • 云端执行环境
实战中如何抉择?
  • 如果你需要模型灵活性和跨会话记忆 → Deep Agents
  • 如果你的团队全面使用 Claude → Claude Agent SDK
  • 如果你的团队全面使用 OpenAI → Codex SDK
  • 如果你需要完整的生产部署和可观测性方案 → Deep Agents + LangSmith
Deep Agents 在整个 LangChain 生态中的地位
创建项目
powershell 复制代码
# 示例
cd D:\Develop\projects\python
# 创建项目名称文件夹
mkdir deepagents-demo
# 进入目录
cd deepagents-demo
# 初始化项目
uv init .
# 添加依赖项
uv add deepagents langchain-openai dotenv tavily-python
# 创建环境变量文件
New-item -type file .env
# 使用文本编辑器编辑.env
API_KEY=sk-sdsaf324erfasdas
MODEL_NAME=zai-org/GLM-5.2
BASE_URL=https://api.siliconflow.cn/v1
TARVILY_API_KEY=lsv2_pt_55ae7b961f3f423e9b366a9s54886489c_c3f874548f4b
代码实战
python 复制代码
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from deepagents import create_deep_agent
from typing import Literal
from tavily import TavilyClient

# 加载.env环境变量信息
load_dotenv()

# 接入模型
model = ChatOpenAI(
    model=os.getenv("MODEL_NAME"),
    api_key=os.getenv("API_KEY"),
    base_url=os.getenv("BASE_URL"),
    temperature=0,
)

# 获取天气工具
def get_weather(city: str) -> str:
    """Get weather for a given city."""
    return f"It's always sunny in {city}!"


common_agent = create_deep_agent(
    model=model,
    tools=[get_weather],
    system_prompt="You are a helpful assistant.",
)

common_result = common_agent.invoke(
    {"messages": [{"role": "user", "content": "北京今天天气怎么样?"}]}
)

print(common_result["messages"][-1].content)

# 计算器    
def calculate(expression: str) -> float:
    """Evaluate a math expression and return the result.

    Args:
        expression: A math expression, e.g. "1 + 2 * 3".
    """
    return eval(expression)

# 
def convert_currency(amount: float, from_currency: str, to_currency: str) -> dict:
    """Convert an amount from one currency to another.

    Args:
        amount: The amount to convert.
        from_currency: The source currency code, e.g. "USD".
        to_currency: The target currency code, defaults to "CNY".
    """
    # 这里用固定汇率做演示;真实场景可接入汇率 API
    rates = {"USD": 7.2, "CNY": 1.0, "EUR": 7.8}
    cny = amount * rates[from_currency]
    return {"amount": round(cny / rates[to_currency], 2), "currency": to_currency}

calculate_agent = create_deep_agent(
    model=model,
    tools=[calculate, convert_currency],
    system_prompt="你是一个计算助手,能帮用户做数学运算和货币换算。",
)

calculate_result = calculate_agent.invoke(
    {"messages": [{"role": "user", "content": "帮我把 100 美元换算成人民币,再用它乘以 1.08 的通胀系数。"}]}
)
print(calculate_result["messages"][-1].content)

# 网络搜索工具
def internet_search(
    query: str,
    max_results: int = 5,
    topic: Literal["general", "news", "finance"] = "general",
    include_raw_content: bool = False,
) -> dict:
    """Perform an internet search for a given query."""
    tavily_client = TavilyClient(api_key=os.getenv("TAVILY_API_KEY"))
    return tavily_client.search(
        query=query,
        max_results=max_results,
        topic=topic,
        include_raw_content=include_raw_content,
    )
    
research_instructions = """你是一位专业的研究员。
你的工作是进行深入研究,然后撰写一份完整的研究报告。

你可以使用 internet_search 工具搜索互联网获取信息。
"""
search_agent = create_deep_agent(
    model=model,
    tools=[internet_search],
    system_prompt=research_instructions,
)

search_result = search_agent.invoke(
    {"messages": [{"role": "user", "content": "什么是 LangGraph?"}]}
)

print(search_result["messages"][-1].content)
相关推荐
梦梦代码精1 小时前
基于UniApp+Vue3+ThinkPHP 8,这套知识付费系统的架构设计有点东西
java·低代码·docker·uni-app·开源·php
-凌凌漆-2 小时前
【freertos】Task创建(v2)
java·开发语言·算法
太子釢2 小时前
用 AI 完整实现 Github 客户端:基于 KMP + SwiftUI + Compose
android·人工智能·ios
牛油果子哥q2 小时前
C++内存模型与深浅拷贝万字详解:栈堆静态内存布局、深浅拷贝底层差异、内存泄漏根治、拷贝崩溃踩坑、手写深拷贝实战
java·开发语言·c++
汪海游龙2 小时前
本地源码还是 Maven 版本?Gradle composite build 双轨依赖的正确接法
android·ci/cd·kotlin
我爱cope2 小时前
【计算机网络 | 数据链路层7:VLAN:一台交换机如何划分多个逻辑局域网?】
网络·学习·计算机网络
k3x1n2 小时前
三星安卓系统BUG排查记录:云闪付、铁路12306、个人所得税、中国移动等App,长期闪退的根本原因分析
android·逆向
babe小鑫2 小时前
2026信管专业学习数据分析的价值
学习·数据挖掘·数据分析
编程圈子3 小时前
电机驱动开发学习25. 弱磁控制与全速域增益调度
驱动开发·学习