
1. 项目缘起与核心定位Agent-Reach 这个名字第一次出现在我视野里的时候我正被一堆零散的 AI Agent 工具链折腾得够呛。那段时间我在同时维护三套不同架构的 Agent 项目一套基于 Python 的轻量级任务编排一套用 Rust 写的高性能推理调度还有一套是给团队内部做 CLI 工具链集成的实验品。每个项目都有自己的配置方式、自己的依赖管理、自己的调试入口切换成本高得离谱。所以当我看到 Agent-Reach 这个标题的时候第一反应就是这大概率是一个试图把 AI Agent 的构建、部署、调用统一到一个 CLI 入口下的工具集。事实也确实如此。Agent-Reach 本质上是一个面向 AI Agent 开发者的命令行工具框架它的核心目标很明确——让你用一条命令就能完成 Agent 的初始化、配置、调试和部署。它不绑定特定的大模型供应商也不强制你使用某种编程语言而是通过一套标准化的 CLI 接口把 Agent 开发过程中最繁琐的那些环节抽象出来。你可以把它理解成 Agent 开发领域的“脚手架 调度器 调试台”三合一工具。这个项目解决的核心问题是什么我总结下来有三个层面。第一是环境碎片化的问题。现在做 AI Agent 开发你可能需要同时接触 Python 环境、Node 运行时、Rust 编译链、各种 API Key 管理、向量数据库连接、工具函数注册等等。Agent-Reach 试图用统一的 CLI 命令把这些东西收拢到一个配置文件里。第二是调试困难的问题。Agent 的行为不像传统程序那样确定它的输出依赖模型、提示词、工具调用链等多个变量。Agent-Reach 提供了交互式的调试模式让你可以逐步追踪 Agent 的决策过程。第三是部署标准化的问题。从本地开发到云端部署中间有一大堆环境差异需要处理Agent-Reach 通过声明式的配置文件来抹平这些差异。适合谁来用如果你刚开始接触 AI Agent 开发想找一个能快速上手的入口Agent-Reach 的 CLI 设计对新手比较友好。如果你已经有一定经验正在被多项目、多环境的切换搞得头疼它的统一配置思路值得参考。如果你是在团队里负责工具链建设的人它的插件化架构和配置管理方式可以直接借鉴。但如果你只是想让 AI 帮你自动发个小红书消息那这个工具可能有点重了杀鸡用牛刀。2. 核心架构拆解与技术选型逻辑2.1 为什么是 CLI 而不是 GUI 或 Web 界面这个问题我在第一次接触 Agent-Reach 的时候就想过。现在市面上做 AI Agent 的平台大多数都在往 Web 界面方向走拖拽式编排、可视化流程、一键部署看起来很美。但 Agent-Reach 选择了 CLI 作为主要交互方式这背后有很实际的考量。CLI 的第一个优势是可组合性。在终端里你可以用管道把 Agent-Reach 的输出传给其他工具可以用 shell 脚本批量执行任务可以把它嵌入 CI/CD 流程。这些在 GUI 里做起来都很别扭。第二个优势是可版本控制。CLI 的配置文件是纯文本可以放进 Git 仓库每次修改都有记录团队协作时冲突解决也方便。第三个优势是远程友好。你通过 SSH 连到服务器上CLI 工具直接就能用不需要额外配置图形界面转发。当然 CLI 也有它的代价。学习曲线比 GUI 陡新手需要记命令和参数。可视化程度低调试复杂 Agent 流程时不如图形界面直观。Agent-Reach 在这方面的补偿方式是提供了丰富的交互式命令和详细的日志输出让你在终端里也能看清楚 Agent 在干什么。2.2 Python 与 Rust 的混合架构Agent-Reach 的技术栈选择很有意思。它的核心调度层和 CLI 解析层用的是 Rust而 Agent 的逻辑编排和工具函数注册部分用的是 Python。这种混合架构在最近的 AI Agent 项目里越来越常见原因也不难理解。Rust 负责的部分是性能敏感且需要高可靠性的。CLI 的启动速度、参数解析、进程管理、网络请求调度这些用 Rust 写出来又快又稳。你敲一条命令Rust 层在毫秒级就能完成解析和路由不会让你等半天。而且 Rust 的内存安全特性意味着长时间运行的 Agent 调度器不容易出现内存泄漏或者崩溃。Python 负责的部分是生态丰富且需要快速迭代的。AI Agent 领域的大部分工具库、模型 SDK、数据处理框架都是 Python 优先的。用 Python 来写 Agent 的业务逻辑可以直接调用现成的库开发效率高。而且 Python 的动态特性让提示词模板、工具函数注册这些需要灵活性的部分写起来很顺手。两层之间的通信通过一个轻量级的 RPC 协议完成。Rust 层启动 Python 子进程通过标准输入输出或者本地 socket 传递消息。这种设计的好处是解耦彻底你可以单独升级 Python 层的逻辑而不影响 CLI 的稳定性反过来也一样。2.3 配置驱动的 Agent 定义方式Agent-Reach 最核心的设计理念是配置驱动。你不需要写大量的代码来定义一个 Agent而是通过一个声明式的配置文件来描述它的行为。这个配置文件通常是一个 YAML 或者 TOML 文件里面定义了 Agent 的名称、使用的模型、可调用的工具、提示词模板、以及各种运行时参数。这种设计的好处是可复用性和可测试性。同一个 Agent 配置可以在不同的环境里运行只需要替换环境相关的变量。配置文件的 diff 也很清晰代码审查时容易看出改了什么。但它的代价是灵活性受限遇到配置文件表达不了的复杂逻辑还是得回到代码层面去扩展。我实际用下来的感受是对于大多数常见的 Agent 场景——比如问答机器人、任务自动化、信息提取——配置驱动的方式覆盖了百分之八十的需求。剩下百分之二十的复杂场景Agent-Reach 提供了插件机制来扩展你可以用 Python 写自定义的工具函数或者决策逻辑然后注册到配置文件里。3. 从零搭建一个 Agent-Reach 项目的完整实操3.1 环境准备与依赖安装在开始之前你需要确保本地环境满足基本要求。Agent-Reach 对系统的要求不算高但也有几个硬性依赖需要提前装好。首先是Rust 工具链。因为 CLI 核心是 Rust 写的你需要安装 rustup 和 cargo。在 Linux 或者 macOS 上一条命令就能搞定curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh安装完成后用rustc --version和cargo --version确认一下版本。建议使用 1.70 以上的稳定版。然后是Python 环境。Agent-Reach 的 Python 层需要 3.9 以上的版本我推荐用 3.10 或者 3.11兼容性最好。如果你系统自带的 Python 版本太老可以用 pyenv 或者 conda 来管理一个独立的环境。这里有个坑要注意不要用系统自带的 Python 直接装依赖容易把系统工具搞崩。一定要用虚拟环境。python3 -m venv agent-reach-env source agent-reach-env/bin/activate虚拟环境激活后安装 Agent-Reach 的 Python 依赖包。通常项目会提供一个 requirements.txt 或者 pyproject.toml直接pip install -r requirements.txt如果网络条件不好可以换用国内镜像源加速pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple最后是Node 运行时。虽然 Agent-Reach 的核心不依赖 Node但有些工具函数或者插件可能需要调用 Node 脚本。建议装一个 LTS 版本的 Node用 nvm 管理比较方便。3.2 初始化项目与配置文件详解环境准备好之后用 Agent-Reach 的初始化命令创建一个新项目agent-reach init my-first-agent这个命令会在当前目录下创建一个名为my-first-agent的文件夹里面包含了一个基础的配置文件、一个示例工具函数、以及一个 README。目录结构大概长这样my-first-agent/ ├── agent.config.yaml ├── tools/ │ └── example_tool.py ├── prompts/ │ └── system_prompt.txt └── README.md核心配置文件agent.config.yaml是整个项目的灵魂。我来逐段拆解一下它的结构。agent: name: my-first-agent version: 0.1.0 description: 一个用于演示的 Agent model: provider: openai name: gpt-4 temperature: 0.7 max_tokens: 2048 tools: - name: get_current_time module: tools.example_tool function: get_current_time description: 获取当前时间 prompts: system: prompts/system_prompt.txt runtime: max_iterations: 10 timeout_seconds: 60 log_level: infoagent段定义了 Agent 的基本元信息这些信息在日志和调试界面里会显示。model段指定了使用的模型供应商和具体模型名称temperature 和 max_tokens 是常见的推理参数。tools段列出了这个 Agent 可以调用的工具函数每个工具需要指定模块路径、函数名和描述。prompts段指向提示词模板文件。runtime段控制运行时的行为比如最大迭代次数、超时时间、日志级别。这里有个经验之谈max_iterations 不要设得太大。我一开始设了 50结果有一次 Agent 陷入了一个循环反复调用同一个工具烧了不少 token。后来改成 10大部分任务都能在 5 次迭代内完成偶尔复杂一点的也就 7 到 8 次。设成 10 既给了足够的空间又能在异常时及时止损。3.3 编写第一个工具函数工具函数是 Agent 与外部世界交互的桥梁。Agent-Reach 的工具函数本质上就是普通的 Python 函数但需要遵循一定的签名规范。# tools/example_tool.py from datetime import datetime def get_current_time(timezone: str Asia/Shanghai) - dict: 获取指定时区的当前时间。 Args: timezone: 时区名称默认为 Asia/Shanghai Returns: 包含当前时间信息的字典 now datetime.now() return { time: now.strftime(%Y-%m-%d %H:%M:%S), timezone: timezone, timestamp: int(now.timestamp()) }这个函数看起来很简单但有几个细节需要注意。第一参数和返回值的类型标注要写清楚。Agent-Reach 会根据类型标注来生成工具的描述信息模型在决定是否调用这个工具时会参考这些信息。第二docstring 要写得像给模型看的说明书。模型会根据 docstring 来判断这个工具是干什么的、什么时候该用。第三返回值最好是结构化的字典方便模型解析和后续处理。写完工具函数后在配置文件里注册它。Agent-Reach 会在启动时动态导入这个模块把函数注册到工具列表里。如果你改了工具函数的代码需要重启 Agent 才能生效。开发阶段可以用--watch参数让 Agent-Reach 监听文件变化自动重载。3.4 提示词模板的设计要点提示词模板决定了 Agent 的“性格”和“行为准则”。Agent-Reach 支持从外部文件加载提示词这样你可以单独修改提示词而不动配置文件。一个基础的 system prompt 大概长这样你是一个乐于助人的 AI 助手。你可以调用工具来获取信息或执行操作。 当用户询问时间相关的问题时调用 get_current_time 工具。 当你不确定答案时诚实地告诉用户你不知道而不是编造信息。 回答要简洁明了避免冗长的解释。写提示词有几个我踩过坑的地方。第一不要写得太长。我一开始写了两千多字的提示词结果模型经常忽略其中的某些指令。后来精简到三百字左右效果反而更好。第二工具调用的触发条件要写明确。不要只说“你可以调用工具”而是要说“当用户问 X 的时候调用 Y 工具”。第三给模型留出拒绝的余地。明确告诉它“不知道就说不知道”可以减少幻觉。3.5 运行与调试一切就绪后用以下命令启动 Agentagent-reach run --config agent.config.yaml这会进入一个交互式的对话界面你可以直接输入问题Agent 会实时响应。调试模式下Agent 会打印出每一步的决策过程包括它收到了什么输入、决定调用哪个工具、工具返回了什么结果、最终生成了什么回复。agent-reach run --config agent.config.yaml --debug调试输出大概长这样[DEBUG] 收到用户输入: 现在几点了 [DEBUG] 模型决策: 调用工具 get_current_time [DEBUG] 工具返回: {time: 2024-01-15 14:30:22, timezone: Asia/Shanghai} [DEBUG] 模型生成回复: 现在是北京时间 2024年1月15日 14点30分。这个调试信息对于排查问题非常有用。如果 Agent 没有按预期调用工具你可以看到是模型决策的问题还是工具注册的问题。如果工具返回了错误你能看到具体的错误信息。4. 进阶用法与性能调优4.1 多 Agent 协作的配置方式单个 Agent 能做的事情有限真正复杂的任务往往需要多个 Agent 分工协作。Agent-Reach 支持在一个项目里定义多个 Agent并配置它们之间的调用关系。agents: - name: researcher model: gpt-4 tools: [web_search, read_url] prompt: prompts/researcher.txt - name: writer model: gpt-4 tools: [format_text] prompt: prompts/writer.txt workflow: - step: research agent: researcher input: {{user_query}} - step: write agent: writer input: {{research.output}}这种配置方式把每个 Agent 的职责分得很清楚researcher 负责搜集信息writer 负责整理成文。workflow 段定义了它们之间的执行顺序和数据传递方式。{{user_query}}和{{research.output}}是模板变量会在运行时被替换成实际的值。我实际用下来多 Agent 协作最适合的场景是任务可以明确分解成多个阶段的情况。如果任务本身就很模糊强行拆成多个 Agent 反而会增加协调成本。另外Agent 之间的数据传递要尽量结构化不要传大段的自然语言否则下一个 Agent 解析起来容易出错。4.2 工具函数的性能优化工具函数是 Agent 执行过程中最耗时的环节之一。一个网络请求可能要几百毫秒一个数据库查询可能要几十毫秒。如果 Agent 在一次任务中调用了多个工具累积的延迟就很可观了。优化的第一个方向是缓存。对于不经常变化的数据比如某个网页的内容、某个 API 的返回结果可以在工具函数里加一层缓存。Agent-Reach 提供了一个内置的缓存装饰器from agent_reach.cache import cached cached(ttl3600) def get_weather(city: str) - dict: # 实际的网络请求逻辑 ...ttl3600表示缓存一小时。这样同一个城市在一小时内重复查询时直接返回缓存结果省掉了网络请求的时间。第二个方向是并行调用。如果 Agent 需要同时获取多个独立的信息可以让这些工具函数并行执行。Agent-Reach 的运行时支持在配置里声明哪些工具可以并行tools: - name: get_weather parallel_group: info_gathering - name: get_news parallel_group: info_gathering同一个 parallel_group 里的工具会被并行调用总的耗时取决于最慢的那个而不是所有耗时的总和。第三个方向是超时控制。给每个工具函数设置合理的超时时间避免因为某个外部服务响应慢而拖垮整个 Agent。在配置文件里可以全局设置也可以针对单个工具设置tools: - name: web_search timeout_seconds: 104.3 日志与可观测性Agent 的行为不像传统程序那样确定所以日志和可观测性特别重要。Agent-Reach 提供了多级别的日志输出从 error 到 debug 都有。生产环境建议用info级别记录关键的决策点和工具调用。开发环境用debug级别可以看到完整的推理过程。如果要做更深入的分析可以把日志输出成 JSON 格式方便导入到日志分析系统里。agent-reach run --config agent.config.yaml --log-format json --log-file agent.log日志里我比较关注的几个字段iteration表示当前是第几轮迭代tool_calls记录了这一轮调用了哪些工具tokens_used记录了消耗的 token 数量latency_ms记录了每一步的耗时。这些数据对于优化 Agent 的性能和成本很有帮助。5. 常见问题与排查技巧实录5.1 工具函数注册失败这是新手最常遇到的问题。现象是 Agent 启动时报错说找不到某个工具或者工具列表里少了某个函数。排查思路分三步。第一步检查模块路径。配置文件里的module字段是相对于项目根目录的路径不是相对于 tools 目录。比如tools/example_tool.py里的函数module 应该写tools.example_tool而不是example_tool。第二步检查函数签名。Agent-Reach 要求工具函数有明确的类型标注和 docstring如果缺少这些注册会失败。第三步检查依赖。如果工具函数导入了某个第三方库而这个库没有安装在当前虚拟环境里导入就会失败。用pip list确认一下依赖是否齐全。5.2 模型不调用工具有时候你明明注册了工具提示词里也写了但模型就是不调用。这个问题通常出在提示词或者工具描述上。工具描述要写得具体。不要写“获取信息”要写“根据关键词搜索网页并返回前五条结果的标题和链接”。模型是根据描述来判断什么时候该用这个工具的描述越具体模型判断越准确。提示词里要给出明确的触发条件。不要写“你可以使用工具”要写“当用户询问实时信息时调用 web_search 工具”。模型需要明确的指令模糊的授权它往往会忽略。检查模型的工具调用能力。不是所有模型都支持 function calling。如果你用的模型不支持Agent-Reach 会退化成让模型输出特定的格式来模拟工具调用效果会差很多。建议使用支持原生 function calling 的模型。5.3 响应速度慢Agent 响应慢的原因可能有很多我整理了一个排查表现象可能原因排查方法解决方案首次响应慢模型冷启动查看日志中的模型加载时间使用预热请求或常驻连接每轮都慢工具调用耗时查看日志中的工具执行时间加缓存或并行调用迭代次数多提示词不清晰查看 debug 日志的决策过程优化提示词减少歧义整体延迟高网络问题测试到模型 API 的网络延迟使用更近的 API 端点我遇到最多的情况是工具调用耗时太长。有一次我的 Agent 需要查询一个外部 API那个 API 平均响应时间要三秒Agent 一轮迭代调用了三次光工具执行就花了九秒。后来加了一层本地缓存重复查询直接返回速度就上来了。5.4 配置文件格式错误YAML 格式对缩进非常敏感一个空格不对就会报错。常见的错误包括用了 Tab 而不是空格、冒号后面没加空格、列表项的缩进不一致。排查这种问题我推荐用agent-reach validate命令。它会检查配置文件的语法和语义给出具体的错误位置和原因。agent-reach validate --config agent.config.yaml如果 validate 通过了但运行还是有问题那可能是配置项的语义问题比如引用了不存在的工具或者提示词文件。这时候仔细看运行时的报错信息通常会指出具体是哪个配置项出了问题。5.5 环境变量与密钥管理Agent 通常需要访问外部服务这就需要管理 API Key 之类的敏感信息。绝对不要把密钥直接写在配置文件里尤其是当配置文件要提交到 Git 仓库的时候。Agent-Reach 支持从环境变量读取密钥。在配置文件里用${ENV_VAR_NAME}的语法引用环境变量model: provider: openai api_key: ${OPENAI_API_KEY}然后在运行前设置环境变量export OPENAI_API_KEYyour-key-here agent-reach run --config agent.config.yaml对于团队协作可以维护一个.env.example文件列出所有需要的环境变量名但不包含实际的值。每个开发者复制一份改成.env填入自己的密钥。.env文件要加到.gitignore里避免误提交。6. 扩展开发与生态集成6.1 自定义插件开发Agent-Reach 的插件机制允许你扩展它的核心功能。插件本质上是一个 Python 包遵循特定的接口规范。你可以用插件来添加新的模型供应商支持、新的工具类型、新的日志后端等等。一个最简单的插件结构my-plugin/ ├── setup.py └── my_plugin/ ├── __init__.py └── provider.py在provider.py里实现 Agent-Reach 定义的 Provider 接口from agent_reach.providers import BaseProvider class MyProvider(BaseProvider): def __init__(self, config): super().__init__(config) def generate(self, prompt, **kwargs): # 调用你的模型服务 ... def get_model_info(self): return {name: my-model, context_window: 4096}然后在配置文件里指定使用这个 providermodel: provider: my_plugin.MyProvider插件开发的关键是理解 Agent-Reach 的接口约定。官方文档里有完整的接口说明但我觉得最有效的方式是直接看内置 provider 的源码照着改一个出来。6.2 与现有工具链的集成Agent-Reach 不是一个孤立的工具它需要和你现有的开发流程配合。我总结了几种常见的集成方式。与 CI/CD 集成。把 Agent 的测试用例写成脚本在 CI 流程里自动运行。Agent-Reach 提供了--non-interactive模式可以接受标准输入并输出结果方便在流水线里调用。echo 现在几点了 | agent-reach run --config agent.config.yaml --non-interactive与监控系统集成。Agent-Reach 的日志可以输出成 JSON 格式直接对接 ELK 或者 Prometheus。关键的指标比如请求量、响应时间、token 消耗量都可以做成监控面板。与版本控制集成。Agent 的配置文件、提示词模板、工具函数代码都应该纳入版本控制。每次修改都提交方便回溯和对比。我习惯在提交信息里写清楚这次修改的目的和预期效果比如“优化搜索工具的提示词减少无效调用”。6.3 性能基准测试在把 Agent 部署到生产环境之前做一轮性能基准测试是很有必要的。你需要知道它在正常负载下的响应时间、并发能力、以及资源消耗。Agent-Reach 提供了一个简单的基准测试命令agent-reach benchmark --config agent.config.yaml --concurrency 10 --requests 100这个命令会模拟 10 个并发用户发送 100 个请求然后输出平均响应时间、P95 响应时间、吞吐量等指标。我实测下来单实例的 Agent-Reach 在普通云服务器上2 核 4G大概能支撑 20 到 30 个并发请求平均响应时间在 2 到 3 秒左右。这个数据受模型 API 的响应速度影响很大如果模型 API 本身就很慢Agent-Reach 这边再怎么优化也有限。如果要支撑更高的并发可以考虑水平扩展。Agent-Reach 本身是无状态的你可以启动多个实例前面挂一个负载均衡。但要注意模型 API 的速率限制别把配额打满了。7. 我踩过的那些坑与经验总结7.1 提示词里的“隐形陷阱”提示词工程看起来简单实际上坑很多。我踩过最典型的一个坑是否定式指令。我在提示词里写“不要编造信息”结果模型反而更容易编造。后来查了一些资料才明白模型对否定词的处理能力比较弱你说“不要想大象”它脑子里反而全是大象。正确的做法是用正面指令替代否定指令。不说“不要编造”而说“只基于工具返回的结果回答如果工具没有返回相关信息就说不知道”。这样模型的行为就明确多了。另一个坑是指令冲突。我在提示词里既写了“回答要详细”又写了“回答要简洁”模型就懵了有时候详细有时候简洁完全看运气。后来我把这些冲突的指令合并成一条“根据问题的复杂程度调整回答长度简单问题一句话回答复杂问题分点说明”。7.2 工具函数的幂等性工具函数最好设计成幂等的也就是说同一个输入多次调用结果应该是一样的或者至少不会产生副作用。我一开始没注意这一点写了一个“发送邮件”的工具函数结果 Agent 在一次任务里重复调用了三次收件人收到了三封一样的邮件。对于有副作用的操作要么在工具函数内部做去重要么在 Agent 层面加限制。Agent-Reach 支持给工具函数设置idempotent: false标记这样运行时会对同一个工具的同一次调用做去重处理。tools: - name: send_email idempotent: false7.3 模型选择的权衡Agent-Reach 支持多种模型供应商选哪个模型是个需要权衡的问题。我整理了一个简单的对比模型优势劣势适用场景GPT-4推理能力强工具调用准确贵速度一般复杂任务对准确性要求高GPT-3.5便宜速度快推理能力弱容易出错简单任务对成本敏感Claude长文本处理好安全性高工具调用生态不如 OpenAI文档分析内容生成本地模型数据不出本地免费需要 GPU效果参差不齐隐私敏感场景实验性质我的建议是先用强模型跑通流程再用弱模型优化成本。开发阶段用 GPT-4 或者 Claude确保逻辑没问题。上线后如果成本压力大再试试用 GPT-3.5 或者更小的模型看看效果能不能接受。很多时候经过精心设计的提示词和工具函数用弱模型也能达到不错的效果。7.4 版本升级的注意事项Agent-Reach 还在快速迭代中版本升级可能会带来不兼容的变更。我在升级时踩过的坑包括配置文件格式变了、工具函数的接口签名改了、CLI 命令的参数名换了。升级前一定要看 changelog了解有哪些 breaking changes。然后在独立的环境里先测试确认没问题再升级生产环境。如果项目对稳定性要求高建议锁定版本号不要用latest标签。pip install agent-reach0.5.2另外升级前备份配置文件和工具函数代码。虽然大多数时候升级是平滑的但万一出了问题有备份可以快速回滚。7.5 社区资源与学习路径Agent-Reach 的官方文档是必读的但文档往往只覆盖了基础用法进阶技巧还得靠社区。我常逛的几个地方项目的 GitHub Issues 区很多问题别人已经踩过坑了相关的技术论坛和讨论群能看到一些非官方的实践分享还有就是在自己的项目里多试多改实践出真知。学习路径上我建议先跑通官方示例再改造成自己的场景最后才是从头搭建复杂项目。不要一上来就搞多 Agent 协作、自定义插件这些高级功能先把单 Agent 加几个工具函数的模式玩熟了再逐步扩展。这样每一步都有正反馈不容易半途而废。内容输出到这里基本上把 Agent-Reach 从定位、架构、实操、调优到避坑的完整链路都覆盖了。如果你正在做 AI Agent 相关的开发或者正在选型 CLI 工具链希望这些经验能帮你少走点弯路。工具本身还在演进我后续也会继续跟进它的新特性和新用法有机会再分享。