DeerFlow 2.0 深度解析:当字节跳动遇上智能体编排——从 60K Star 看国产 AI Agent 的工程革命
一句话总结:DeerFlow 2.0 不是又一个 ChatGPT 套壳,而是字节跳动用工程思维重新定义 AI Agent 运行时的野心之作。它用 LangGraph 做骨架、Docker 做沙盒、MCP 做协议,构建了一个真正能让 AI "干活" 的工业化平台。
一、背景:为什么你的 AI 助手总是"半途而废"?
1.1 当前 AI Agent 的三大痛点
2024-2025 年,AI Agent 概念火爆,但落地效果却差强人意。作为开发者,你是否遇到过这些场景:
场景一:任务中断
用户:帮我调研一下新能源汽车市场,写一份 50 页的行业报告
Agent:好的,正在搜索...
[10分钟后]
Agent:抱歉,由于上下文限制,我无法完成这个任务
场景二:工具混乱
Agent:我需要调用搜索工具
[调用成功]
Agent:现在需要调用计算器
[调用成功]
Agent:让我再搜索一下...
[无限循环,Token 爆炸]
场景三:安全隐患
Agent:我帮你执行这段代码
[执行 rm -rf /]
系统:💥
这些问题背后,反映了当前 AI Agent 开发的三大核心痛点:
| 痛点 | 具体表现 | 根本原因 |
|---|---|---|
| 上下文迷失 | 长任务执行到一半"失忆" | 缺乏持久化记忆机制 |
| 工具调度混乱 | 重复调用、无效循环 | 缺乏智能编排层 |
| 安全风险 | AI 生成代码直接执行 | 缺乏隔离执行环境 |
1.2 从 OpenClaw 到 DeerFlow:一场关于"Harness"的竞赛
2025 年初,OpenClaw(龙虾)以 19 万 Star 的现象级表现,定义了"个人 AI 助手"的形态。但 OpenClaw 本质上是一个会话式工具——它擅长对话,却不擅长执行复杂任务。
2026 年,AI 行业开始意识到:真正的瓶颈不在模型能力,而在工程架构。
Princeton NLP 的一项实验极具启发性:
同一个 GPT-4,只换了外部环境接口,SWE-bench 性能提升了 64%。模型没变,训练数据没变,提升全部来自模型之外的工程层。
这就是 Agent Harness(智能体 harness/ harness 层) 的概念——它相当于给 AI 大模型装上了一个"智能身体",让模型从"只会聊天"进化为"能执行复杂任务"的超级智能体。
在这个赛道上,字节跳动推出了 DeerFlow 2.0,GitHub 60K+ Star,发布当日登顶 Trending 榜首。
二、核心概念:DeerFlow 2.0 是什么?
2.1 定位:从"研究帮手"到"全能数字员工"
DeerFlow 1.0 是一个深度研究框架,专注于学术调研和信息检索。而 DeerFlow 2.0 是一次"从零开始的重写"——代码没有一点共用,核心目标是构建一个能够自主完成复杂任务的全能型 SuperAgent 编排框架。
官方给它的定义是:
"智能体时代的操作系统"
这个定位很精准。就像操作系统管理硬件资源、调度进程一样,DeerFlow 管理 AI 工具、调度 Agent、维护状态、保障安全。
2.2 五大核心能力
DeerFlow 2.0 的架构设计围绕五大核心能力展开:
┌─────────────────────────────────────────────────────────────┐
│ DeerFlow 2.0 架构全景 │
├─────────────────────────────────────────────────────────────┤
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 模块化技能 │ │ 子智能体 │ │ 沙盒隔离 │ │
│ │ 组合系统 │ │ 并行执行 │ │ 执行环境 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ 智能上下文 │ │ 长期记忆 │ │
│ │ 管理系统 │ │ 系统 │ │
│ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
2.2.1 模块化技能组合(Modular Skills)
DeerFlow 2.0 内置了一套可插拔的技能系统:
| 技能 | 功能 | 使用场景 |
|---|---|---|
research | 深度研究 | 学术调研、市场分析 |
report-generation | 报告生成 | 自动生成结构化文档 |
slide-creation | PPT 制作 | 演示文稿生成 |
web-page | 网页生成 | 静态网站构建 |
image-generation | 图片生成 | 配图、图表制作 |
video-generation | 视频生成 | 多媒体内容创作 |
技能按需加载,不会一次性占用大量上下文,这对 Token 敏感的模型非常友好。
2.2.2 子智能体并行执行(Sub-Agents)
复杂任务很少能一次完成。DeerFlow 2.0 引入了子智能体编排机制:
# 伪代码示例:任务分解与并行执行
class TaskOrchestrator:
def execute_complex_task(self, task):
# 1. 任务分解
sub_tasks = self.decompose(task)
# 2. 并行执行
results = await asyncio.gather(
*[self.spawn_sub_agent(t) for t in sub_tasks]
)
# 3. 结果聚合
return self.aggregate(results)
主 Agent 将任务拆解为多个可并行执行的小任务,全程保持逻辑连贯。
2.2.3 沙盒隔离环境(Sandbox)
安全是生产级 Agent 的底线。DeerFlow 2.0 采用 Docker 容器隔离 技术:
# docker-compose.yml 示例
version: '3.8'
services:
agent-sandbox:
image: deerflow/sandbox:latest
container_name: agent-${TASK_ID}
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
cap_add:
- CHOWN
- SETGID
- SETUID
read_only: true
tmpfs:
- /tmp:noexec,nosuid,size=100m
network_mode: none # 可选:隔离网络
每个任务在独立的容器中执行,即使 AI 生成了恶意代码,也无法影响宿主机。
2.2.4 智能上下文管理(Context Management)
DeerFlow 2.0 实现了智能上下文压缩机制:
class ContextManager:
def __init__(self, max_tokens=8000):
self.max_tokens = max_tokens
self.history = []
def add_message(self, message):
# 1. 添加新消息
self.history.append(message)
# 2. 检查 Token 限制
total_tokens = self.count_tokens(self.history)
# 3. 智能压缩
while total_tokens > self.max_tokens:
# 优先压缩早期、低优先级消息
self.compress_oldest_low_priority()
total_tokens = self.count_tokens(self.history)
通过优先级排序和智能摘要,确保关键信息不丢失。
2.2.5 长期记忆系统(Long-term Memory)
这是 DeerFlow 2.0 最具革命性的特性之一。它解决了传统 AI "边做边忘"的问题:
class LongTermMemory:
"""
跨会话留存用户画像、偏好及任务关键信息
"""
def store_user_preference(self, user_id, key, value):
"""存储用户偏好"""
self.vector_db.upsert(
id=f"{user_id}:pref:{key}",
vector=self.embed(value),
metadata={"type": "preference", "key": key}
)
def recall_relevant_context(self, user_id, query, top_k=5):
"""召回相关上下文"""
query_vector = self.embed(query)
return self.vector_db.search(
vector=query_vector,
filter={"user_id": user_id},
top_k=top_k
)
用户画像、任务历史、中间结果都被持久化存储,下次对话时自动加载。
三、架构分析:DeerFlow 2.0 的技术内核
3.1 整体架构图
┌─────────────────────────────────────────────────────────────────────┐
│ DeerFlow 2.0 架构 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 应用层 (Application) │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ Web UI │ │ CLI │ │ API │ │ Slack │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 编排层 (Orchestration) │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ LangGraph 状态机引擎 │ │ │
│ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │
│ │ │ │ Node │ │ Edge │ │ State │ │ Graph │ │ │ │
│ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │ │
│ │ └─────────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 能力层 (Capabilities) │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ Skills │ │ Tools │ │ Memory │ │ Sandbox │ │ │
│ │ │ 技能系统 │ │ 工具集 │ │ 记忆系统 │ │ 沙盒 │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 协议层 (Protocol) │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ MCP (Model Context Protocol) │ │ │
│ │ │ 标准化工具调用接口,支持第三方扩展 │ │ │
│ │ └─────────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 模型层 (Models) │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ GPT-4 │ │ Claude │ │ Gemini │ │ 国产大模型 │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
3.2 核心技术栈
| 层级 | 技术选型 | 选型理由 |
|---|---|---|
| 工作流引擎 | LangGraph | 状态机驱动的 Agent 编排,支持循环和条件分支 |
| LLM 框架 | LangChain | 成熟的工具调用和链式调用抽象 |
| 隔离环境 | Docker/K8s | 工业级容器化方案,安全隔离 |
| 通信协议 | MCP | 标准化的模型上下文协议 |
| 向量存储 | LanceDB/Chroma | 轻量级、高性能的向量检索 |
| 持久化 | PostgreSQL/Redis | 关系型 + KV 混合存储 |
3.3 LangGraph 状态机详解
LangGraph 是 DeerFlow 2.0 的核心编排引擎。它把 Agent 的执行流程抽象为状态机:
from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated
import operator
class AgentState(TypedDict):
"""定义 Agent 状态结构"""
messages: Annotated[list, operator.add] # 消息历史
next_step: str # 下一步动作
tool_calls: list # 待执行的工具调用
results: dict # 执行结果
memory: dict # 记忆数据
# 创建状态机
workflow = StateGraph(AgentState)
# 定义节点(状态)
def agent_node(state: AgentState):
"""Agent 决策节点"""
response = llm.invoke(state["messages"])
return {"messages": [response], "next_step": "tool_executor"}
def tool_executor(state: AgentState):
"""工具执行节点"""
results = execute_tools(state["tool_calls"])
return {"results": results, "next_step": "agent"}
def memory_manager(state: AgentState):
"""记忆管理节点"""
memory = recall_or_store(state)
return {"memory": memory}
# 添加节点
workflow.add_node("agent", agent_node)
workflow.add_node("tool_executor", tool_executor)
workflow.add_node("memory_manager", memory_manager)
# 定义边(状态转移)
workflow.add_edge("agent", "memory_manager")
workflow.add_conditional_edges(
"memory_manager",
lambda state: state["next_step"],
{
"tool_executor": "tool_executor",
"end": END
}
)
workflow.add_edge("tool_executor", "agent")
# 设置入口
workflow.set_entry_point("agent")
# 编译执行
app = workflow.compile()
这种设计的优势在于:
- 可视化:状态转移图一目了然
- 可调试:每个节点的输入输出都可追踪
- 可扩展:新增节点只需注册到图中
- 容错性:单节点失败不影响整体流程
3.4 MCP 协议:开放生态的基石
MCP(Model Context Protocol)是 Anthropic 提出的开放标准,DeerFlow 2.0 原生支持:
# MCP Server 示例:自定义工具
from mcp.server import Server
from mcp.types import Tool, TextContent
app = Server("my-custom-tool")
@app.list_tools()
async def list_tools() -> list[Tool]:
return [
Tool(
name="weather",
description="获取指定城市的天气信息",
inputSchema={
"type": "object",
"properties": {
"city": {"type": "string"}
},
"required": ["city"]
}
)
]
@app.call_tool()
async def call_tool(name: str, arguments: dict):
if name == "weather":
city = arguments["city"]
weather = await fetch_weather(city)
return [TextContent(type="text", text=weather)]
# 启动服务
if __name__ == "__main__":
app.run()
通过 MCP,开发者可以轻松扩展 DeerFlow 的能力,实现"一次编写,随处使用"。
四、代码实战:从零搭建 DeerFlow 2.0 应用
4.1 环境准备
# 1. 克隆仓库
git clone https://github.com/bytedance/deerflow.git
cd deerflow
# 2. 安装依赖
pip install -e ".[all]"
# 3. 配置环境变量
cp .env.example .env
# 编辑 .env,填入你的 API Keys
4.2 配置文件
# config.yaml
deerflow:
# 模型配置
model:
provider: openai
name: gpt-4-turbo-preview
temperature: 0.7
max_tokens: 4000
# 记忆配置
memory:
type: lancedb
path: ./data/memory
embedding_model: text-embedding-3-small
# 沙盒配置
sandbox:
type: docker
image: deerflow/sandbox:latest
timeout: 300 # 5分钟
memory_limit: 512m
cpu_limit: 1.0
# 技能配置
skills:
- name: research
enabled: true
- name: report-generation
enabled: true
- name: web-page
enabled: true
# MCP 配置
mcp:
servers:
- name: filesystem
command: npx
args: ["-y", "@modelcontextprotocol/server-filesystem", "/allowed/path"]
- name: fetch
command: uvx
args: ["mcp-server-fetch"]
4.3 基础用法:单 Agent 任务
from deerflow import Agent, Task
# 创建 Agent
agent = Agent.from_config("config.yaml")
# 定义任务
task = Task(
description="调研 2026 年 AI Agent 领域的发展趋势",
output_format="markdown_report", # 输出格式
max_iterations=50, # 最大迭代次数
tools=["web_search", "web_fetch", "file_write"] # 可用工具
)
# 执行任务
result = await agent.execute(task)
# 获取结果
print(result.content) # 报告内容
print(result.files) # 生成的文件
print(result.token_usage) # Token 消耗统计
4.4 进阶用法:多 Agent 协作
from deerflow import Workflow, SubAgent
import asyncio
# 创建工作流
workflow = Workflow()
# 定义子 Agent
@workflow.agent(name="researcher")
class Researcher(SubAgent):
"""研究员 Agent:负责信息收集"""
system_prompt = """
你是一个专业的研究员,擅长从多个来源收集信息并整理成结构化数据。
你的输出应该包含:关键发现、数据来源、置信度评估。
"""
tools = ["web_search", "academic_search", "news_search"]
@workflow.agent(name="writer")
class Writer(SubAgent):
"""写手 Agent:负责内容创作"""
system_prompt = """
你是一个专业的技术写手,擅长将研究数据转化为易读的文章。
你的文章应该有清晰的结构、生动的例子和深度的洞察。
"""
tools = ["file_read", "file_write", "image_search"]
@workflow.agent(name="editor")
class Editor(SubAgent):
"""编辑 Agent:负责质量把控"""
system_prompt = """
你是一个严格的编辑,负责检查文章的准确性、逻辑性和可读性。
如果发现问题,请明确指出并给出修改建议。
"""
tools = ["file_read", "grammar_check", "fact_check"]
# 定义工作流
def content_pipeline(topic: str):
"""内容生产流水线"""
# 步骤1:并行研究
research_tasks = [
workflow.call("researcher", f"研究 {topic} 的技术原理"),
workflow.call("researcher", f"研究 {topic} 的应用场景"),
workflow.call("researcher", f"研究 {topic} 的市场趋势")
]
research_results = asyncio.gather(*research_tasks)
# 步骤2:整合写作
draft = workflow.call(
"writer",
f"基于以下研究结果撰写文章:\n{research_results}"
)
# 步骤3:编辑审核
feedback = workflow.call("editor", f"审核这篇文章:\n{draft}")
# 步骤4:根据反馈修改(循环直到通过)
while not feedback.approved:
draft = workflow.call(
"writer",
f"根据编辑反馈修改文章:\n反馈:{feedback.comments}\n原文:{draft}"
)
feedback = workflow.call("editor", f"重新审核:\n{draft}")
return draft
# 执行流水线
article = asyncio.run(content_pipeline("DeerFlow 2.0"))
4.5 实战案例:自动化财报分析
from deerflow import Agent
from deerflow.skills import ResearchSkill, ReportSkill
import asyncio
class FinancialAnalyzer:
"""财报分析自动化 Agent"""
def __init__(self):
self.agent = Agent(
skills=[ResearchSkill, ReportSkill],
sandbox_enabled=True
)
async def analyze(self, company: str, quarter: str):
"""
分析指定公司的季度财报
Args:
company: 公司名称或股票代码
quarter: 季度,如 "2026-Q1"
"""
# 任务定义
task = f"""
请完成以下财报分析任务:
目标公司:{company}
分析季度:{quarter}
需要完成的工作:
1. 搜索并下载 {company} 的 {quarter} 财报
2. 提取关键财务指标(营收、利润、现金流等)
3. 与上一季度和去年同期进行对比分析
4. 识别主要业务亮点和风险点
5. 生成一份专业的分析报告(包含图表)
输出要求:
- 报告格式:Markdown
- 包含数据可视化(使用 matplotlib 生成图表)
- 字数不少于 3000 字
"""
# 执行分析
result = await self.agent.execute(task)
return {
"report": result.content,
"charts": [f for f in result.files if f.endswith(('.png', '.jpg'))],
"data": [f for f in result.files if f.endswith('.csv')],
"token_usage": result.token_usage,
"execution_time": result.duration
}
# 使用示例
async def main():
analyzer = FinancialAnalyzer()
# 分析多家公司
companies = ["Apple", "Microsoft", "NVIDIA"]
for company in companies:
print(f"正在分析 {company}...")
result = await analyzer.analyze(company, "2026-Q1")
print(f"分析完成!")
print(f" - 报告长度:{len(result['report'])} 字符")
print(f" - 生成图表:{len(result['charts'])} 张")
print(f" - Token 消耗:{result['token_usage']['total']}")
print(f" - 执行时间:{result['execution_time']:.2f} 秒")
print()
if __name__ == "__main__":
asyncio.run(main())
五、性能优化:让 DeerFlow 跑得更快
5.1 Token 消耗优化
DeerFlow 2.0 相比同类框架在 Token 效率上有显著优势。根据社区测试数据:
| 任务 | DeerFlow 2.0 | OpenClaw | 节省比例 |
|---|---|---|---|
| 花卉信息整理 | 15 万 Token | 30 万 Token | 50% |
| 行业调研报告 | 80 万 Token | 150 万 Token | 47% |
| 代码生成任务 | 25 万 Token | 45 万 Token | 44% |
优化策略:
# 1. 智能上下文压缩
class TokenOptimizer:
def compress_context(self, messages, max_tokens=6000):
"""智能压缩上下文"""
# 保留系统消息和最近对话
system_msgs = [m for m in messages if m.role == "system"]
recent_msgs = messages[-10:] # 最近10条
# 对早期消息进行摘要
old_msgs = messages[:-10]
if old_msgs:
summary = self.summarize(old_msgs)
return system_msgs + [summary] + recent_msgs
return messages
# 2. 工具调用批处理
async def batch_tool_calls(calls):
"""批量执行工具调用,减少往返次数"""
return await asyncio.gather(*[
execute_tool(call) for call in calls
])
# 3. 结果缓存
from functools import lru_cache
@lru_cache(maxsize=1000)
def cached_search(query: str):
"""缓存搜索结果"""
return perform_search(query)
5.2 并发执行优化
import asyncio
from concurrent.futures import ThreadPoolExecutor
class ConcurrentExecutor:
"""并发执行优化器"""
def __init__(self, max_workers=10):
self.executor = ThreadPoolExecutor(max_workers=max_workers)
self.semaphore = asyncio.Semaphore(max_workers)
async def execute_parallel(self, tasks):
"""并行执行任务"""
async with self.semaphore:
return await asyncio.gather(*tasks)
def execute_in_thread(self, func, *args):
"""在线程池中执行阻塞操作"""
loop = asyncio.get_event_loop()
return loop.run_in_executor(self.executor, func, *args)
# 使用示例
executor = ConcurrentExecutor(max_workers=20)
# 并行处理多个子任务
sub_tasks = [
analyze_section(section)
for section in report_sections
]
results = await executor.execute_parallel(sub_tasks)
5.3 沙盒性能调优
# docker-compose.prod.yml
version: '3.8'
services:
deerflow-sandbox:
image: deerflow/sandbox:latest
# 资源限制
deploy:
resources:
limits:
cpus: '2.0'
memory: 1G
reservations:
cpus: '0.5'
memory: 256M
# 性能优化
security_opt:
- seccomp:./seccomp-profile.json # 自定义 seccomp
# 缓存挂载
volumes:
- type: tmpfs
target: /tmp
tmpfs:
size: 500M
mode: 1777
- pip-cache:/root/.cache/pip
# 网络优化
network_mode: bridge
dns:
- 8.8.8.8
- 8.8.4.4
volumes:
pip-cache:
六、总结与展望
6.1 DeerFlow 2.0 的核心价值
通过本文的深度解析,我们可以总结出 DeerFlow 2.0 的四大核心价值:
| 维度 | 价值 | 具体表现 |
|---|---|---|
| 工程化 | 生产级稳定性 | Docker 沙盒、状态机编排、错误恢复 |
| 效率 | Token 优化 | 智能上下文管理、工具批处理、结果缓存 |
| 扩展性 | 开放生态 | MCP 协议、模块化技能、多模型支持 |
| 智能化 | 自主执行 | 子 Agent 协作、长期记忆、任务分解 |
6.2 与竞品的对比
| 特性 | DeerFlow 2.0 | OpenClaw | Claude Code | LangGraph |
|---|---|---|---|---|
| 开源 | ✅ | ✅ | ❌ | ✅ |
| 沙盒隔离 | ✅ Docker | ❌ | ✅ | ❌ |
| 子 Agent | ✅ | ❌ | ❌ | ✅ |
| 长期记忆 | ✅ | ⚠️ 有限 | ❌ | ⚠️ 需自建 |
| MCP 支持 | ✅ | ❌ | ❌ | ⚠️ 需适配 |
| 企业级 | ✅ | ❌ | ✅ | ⚠️ |
| 国内支持 | ✅ | ⚠️ | ❌ | ⚠️ |
6.3 适用场景
推荐使用 DeerFlow 2.0 的场景:
- 需要执行复杂、多步骤任务的自动化流程
- 对安全性有要求的企业级应用
- 需要长期记忆和个性化交互的助手
- 多 Agent 协作的复杂系统
可能不适合的场景:
- 简单的单次问答(杀鸡用牛刀)
- 对延迟极度敏感的实时应用
- 资源受限的边缘设备
6.4 未来展望
DeerFlow 2.0 的发布标志着国产 AI Agent 框架进入了一个新阶段。我们可以期待:
- 生态扩展:更多官方和社区 Skills 的发布
- 性能提升:更高效的 Token 使用和更快的执行速度
- 多模态支持:图像、视频、音频的深度集成
- 企业特性:审计日志、权限管理、合规认证
- 国产模型适配:与文心一言、通义千问等深度集成
6.5 给开发者的建议
如果你是 AI Agent 开发者,建议:
- 从小做起:先用单 Agent 完成简单任务,再逐步引入多 Agent 协作
- 重视安全:始终启用沙盒模式,特别是在执行用户输入的代码时
- 监控成本:Token 消耗是实际成本,使用 DeerFlow 的优化特性可以显著降低费用
- 参与社区:DeerFlow 是开源项目,贡献 Skills 和反馈问题都能让生态更好
参考资料
关于作者:程序员茄子,关注 AI 工程化与开源技术。相信好的技术应该被深入理解,而不仅仅是被使用。
本文约 8500 字,阅读时间约 25 分钟。如果对你有帮助,欢迎点赞、收藏、转发。