Agent Skills:智能体技能框架与开发指南


基本信息


导语

随着大模型应用从单一对话转向复杂任务处理,Agent 的自主规划与工具调用能力已成为技术落地的关键。本文聚焦 Agent Skills 这一核心概念,解析如何通过结构化设计赋予模型特定领域的专业执行力。通过梳理技能定义、加载机制及最佳实践,帮助开发者理解如何将通用模型转化为具备行业认知的智能体,从而构建更稳健、可落地的 AI 应用。


评论

深度评论:从“对话”到“行动”——Agent Skills 的技术重构与范式转移

中心观点

文章主张:AI Agent 的核心竞争力在于将大模型的通用推理能力拆解为可组合、可验证、目标导向的特定“技能”,而非单纯依赖模型的参数规模或通用 Prompt。

这一观点标志着 AI 应用层开发的重大范式转移:从以“对话”为中心的内容生成,转向以“任务”为中心的闭环执行。Agent Skills 本质上是将 LLM 的“概率性生成”通过工程化手段转化为“确定性执行”的中间层。

支撑理由与边界条件

1. 技术解耦带来的稳定性与可控性

  • 理由:文章指出,将复杂任务拆解为 Planning(规划)、Memory(记忆)、Tool Use(工具使用)等独立技能模块,能有效缓解大模型“幻觉”问题。例如,当 Agent 调用“Python 代码执行”技能时,其输出是逻辑确定的,远比模型直接生成数字或推理更可靠。
  • 边界条件:对于极其简单的线性任务(如“翻译这句话”),引入复杂的 Agent 框架和 Skills 拆解会导致延迟增加和 Token 消耗上升,此时直接调用模型更优。

2. “技能”作为上下文学习的优化单元

  • 理由:文章强调,通过精心设计的 Skill Descriptions(技能描述)作为 System Prompt 的一部分,可以引导模型在特定场景下激活特定的行为模式。这类似于人类专家的“模式识别”,比单纯的 Few-shot Prompting 更高效,且更易于维护。
  • 边界条件:如果技能定义的边界模糊(例如“分析用户情绪”与“提取用户意图”重叠),会导致模型在路由选择时出现混淆,反而降低性能。

3. 从“对话式交互”向“任务式闭环”的演进

  • 理由:文章暗示,Agent Skills 的成熟标志着 AI 应用从 Chatbot(聊天机器人)向 Copilot(副驾驶)甚至 Autonomous Worker(自主工人)的转变。技能的考核标准不再是“回答得有多像人”,而是“任务是否完成”。
  • 边界条件:在创意写作、心理咨询等强情感连接领域,过度强调“技能”和“任务完成度”可能会破坏交互的自然感和沉浸感。

深度评价

1. 技术深度:原子化与复合型的博弈 文章若仅停留在“Agent 能做什么”的应用层,深度尚显不足。真正的技术挑战在于 Skill 的抽象粒度

  • 评价:优秀的架构应能清晰界定“原子技能”(如调用 Google 搜索)与“复合技能”(如“市场调研”= 搜索 + 总结 + 报告生成)。原子技能保证高成功率,复合技能提供高灵活性。
  • 批判性思考:目前行业缺乏统一的 Skill 定义标准。文章若未提及 Skill 之间的 冲突解决机制(例如:当“修正用户拼写”技能与“保持原意”技能冲突时的优先级),则论证不够严谨。

2. 实用价值:工程化落地的必经之路

  • 工程意义:将 Agent 能力模块化为 Skills,是实现 工程化落地的必经之路。它允许开发团队复用基础能力(如 RAG 检索技能),快速构建垂直领域的应用,而非每次都重新编写 Prompt。
  • 商业模式:这种观点可能催生“技能商店”或“Agent 应用商店”的商业模式。企业不再单纯卖模型,而是卖封装好的高精度 Agent Skills,这将是未来 SaaS 生态的重要演进方向。

3. 创新性与争议:端到端 vs 模块化

  • 创新性:提出将“Prompt Engineering”升级为“Skill Engineering”,即通过代码、API 调用和结构化输出来定义能力边界,这是从“软提示”向“硬编码”逻辑的回归,极大提升了系统的鲁棒性。
  • 潜在争议
    • 端到端 vs 模块化:DeepMind 等机构倾向于端到端模型,认为 Agent Skills 应该是模型涌现出来的,而不是人为硬编码的。文章的观点(人为设计 Skills)可能面临未来通用更强模型(如 GPT-5)的降维打击,届时显式的技能拆解可能不再必要。
    • 数据孤岛:过分强调特定工具的调用技能,可能导致 Agent 被锁定在特定的 SaaS 生态中,形成新的技术壁垒。

实际应用建议

  1. 技能原子化设计:遵循单一职责原则,将 Agent 技能拆分到最小可验证单元。例如,不要设计一个“处理邮件”的技能,而是拆分为“读取邮件”、“分类邮件”、“生成回复草稿”三个技能,以便独立测试和复用。
  2. 建立技能评估基准:不要只看最终任务结果,要为每个 Skill 建立单独的单元测试。例如,“搜索技能”的指标是召回率,“代码技能”的指标是执行成功率。
  3. 动态技能路由:引入轻量级模型作为“路由器”,根据用户意图动态选择调用哪个 Skill,避免将所有 Skill 描述都塞入主模型的 Context Window 中,以降低成本和延迟。

代码示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 示例1:Hacker News热门文章获取
import requests
from bs4 import BeautifulSoup

def get_hacker_news_top_stories(limit=5):
    """
    获取Hacker News热门文章标题和链接
    :param limit: 获取文章数量
    :return: 包含标题和链接的列表
    """
    url = "https://hacker-news.firebaseio.com/v0/topstories.json"
    story_ids = requests.get(url).json()[:limit]
    
    stories = []
    for story_id in story_ids:
        story_url = f"https://hacker-news.firebaseio.com/v0/item/{story_id}.json"
        story_data = requests.get(story_url).json()
        stories.append({
            "title": story_data.get("title"),
            "url": story_data.get("url"),
            "score": story_data.get("score")
        })
    
    return stories

# 使用示例
if __name__ == "__main__":
    top_stories = get_hacker_news_top_stories()
    for i, story in enumerate(top_stories, 1):
        print(f"{i}. {story['title']} (分数: {story['score']})")
        print(f"   链接: {story['url']}\n")
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 示例2:Hacker News关键词搜索
from datetime import datetime, timedelta
import requests

def search_hacker_news(keyword, days=7):
    """
    搜索Hacker News最近N天内包含特定关键词的文章
    :param keyword: 搜索关键词
    :param days: 搜索最近几天的文章
    :return: 匹配的文章列表
    """
    # 获取当前时间戳
    now = int(datetime.now().timestamp())
    time_threshold = now - (days * 24 * 60 * 60)
    
    # 获取最新文章ID
    url = "https://hacker-news.firebaseio.com/v0/newstories.json"
    story_ids = requests.get(url).json()
    
    matching_stories = []
    for story_id in story_ids:
        story_url = f"https://hacker-news.firebaseio.com/v0/item/{story_id}.json"
        story_data = requests.get(story_url).json()
        
        # 检查文章时间是否在范围内
        if story_data.get("time", 0) < time_threshold:
            break
            
        # 检查标题是否包含关键词
        if keyword.lower() in story_data.get("title", "").lower():
            matching_stories.append({
                "title": story_data.get("title"),
                "url": story_data.get("url"),
                "time": datetime.fromtimestamp(story_data.get("time")).strftime("%Y-%m-%d %H:%M")
            })
    
    return matching_stories

# 使用示例
if __name__ == "__main__":
    results = search_hacker_news("AI", days=3)
    print(f"最近3天包含'AI'的文章:")
    for story in results:
        print(f"- {story['title']} ({story['time']})")
        print(f"  链接: {story['url']}\n")

**

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 示例3:Hacker News用户评论分析
import requests
from collections import Counter

def analyze_user_comments(username):
    """
    分析Hacker News用户的评论习惯
    :param username: 用户名
    :return: 包含用户评论统计信息的字典
    """
    # 获取用户信息
    user_url = f"https://hacker-news.firebaseio.com/v0/user/{username}.json"
    user_data = requests.get(user_url).json()
    
    if not user_data:
        return None
    
    # 获取用户最近的评论
    comment_ids = user_data.get("submitted", [])[:100]  # 限制分析最近100条
    comments = []
    
    for comment_id in comment_ids:
        comment_url = f"https://hacker-news.firebaseio.com/v0/item/{comment_id}.json"
        comment_data = requests.get(comment_url).json()
        
        if comment_data and comment_data.get("type") == "comment":
            comments.append(comment_data.get("text", ""))
    
    # 统计分析
    word_count = Counter()
    for comment in comments:
        words = comment.lower().split()
        word_count.update(words)
    
    return {
        "username": username,
        "karma": user_data.get("karma"),
        "total_comments": len(comments),
        "top_words": word_count.most_common(10),
        "avg_comment_length": sum(len(c.split()) for c in comments) / len(comments) if comments else 0
    }

# 使用示例
if __name__ == "__main__":
    analysis = analyze_user_comments("pg")
    if analysis:
        print(f"用户分析报告: {analysis['username']}")
        print(f"Karma值: {analysis['karma']}")
        print(f"评论总数: {analysis['total_comments']}")
        print(f"平均评论长度: {analysis['avg_comment_length']:.1f}词")
        print("\n常用词汇:")
        for word, count in analysis['top_words']:
            print(f"- {word}: {count}次")

案例研究

1:Cognition AI (Devin)

1:Cognition AI (Devin)

背景: Cognition AI 是一家致力于将 AI 应用于软件工程的公司。在软件开发领域,传统的自动化工具(如 Copilot)主要提供代码补全功能,但在处理跨越多个文件、复杂上下文以及长周期任务时,往往显得力不从心。

问题: 开发者经常需要处理繁琐的端到端任务,例如修复一个深藏在 Legacy 代码中的 Bug,或者将现有代码库迁移到新的框架。这些任务需要理解上下文、编写代码、运行测试、修复错误并最终部署,传统的 LLM(大语言模型)很难独立完成这一系列闭环操作。

解决方案: Devin 是一个被定义为“AI 软件工程师”的自主 Agent。它应用了高级的 Agent Skills,包括:

  1. 规划与推理:将复杂的用户请求分解为可执行的子任务。
  2. 工具使用:具备使用命令行、代码编辑器和浏览器等开发者工具的能力。
  3. 自主纠错:在部署过程中,如果测试失败,Devin 能自动分析错误日志、修改代码并重新运行测试,直到问题解决。
  4. 上下文学习:能够根据用户的实时反馈调整其行为策略。

效果: Devin 在 SWE-bench 基准测试中(这是一个评估真实 GitHub 问题解决难度的基准),不仅解决了实际问题,而且无需人工辅助。其实际应用价值在于能够接管重复性高、逻辑复杂的维护工作,让人类工程师从“搬砖”中解放出来,专注于架构设计和高阶逻辑。


2:Rabbit (R1)

2:Rabbit (R1)

背景: 随着移动互联网应用爆炸式增长,用户在完成简单操作(如订票、叫车、点外卖)时,往往需要在多个 App 之间频繁切换,忍受繁琐的点击流程和广告干扰。

问题: 现有的语音助手(如 Siri 或 Google Assistant)通常只能完成设备内的简单指令,或者只能调用特定的 API,无法跨越多个 App 协同完成一个复杂的基于 LLM 的意图任务。

解决方案: Rabbit R1 设备搭载了一个名为“Large Action Model”(LAM)的操作系统。该系统的核心在于 Agent 对应用界面(UI)的交互能力:

  1. UI 识别与操作:Agent 不依赖 App 的官方 API 接口,而是通过识别应用的用户界面(基于计算机视觉技术),像人类一样点击按钮、输入文字。
  2. 跨应用编排:Agent 可以在 Spotify 搜索歌曲、在 Uber 打车、在 Airbnb 订房,通过模拟人机交互来完成“基于意图”的任务。

效果: 用户只需说出自然语言指令(例如“帮我规划去纽约的行程并订车”),R1 即可自动在后台操作相关 App 完成任务。这种 Agent Skill 极大地降低了人机交互的门槛,展示了 AI Agent 在“操作现有数字基础设施”方面的巨大潜力,即通过 UI 自动化而非 API 集成来服务用户。


3:Klarna (客服 Agent)

3:Klarna (客服 Agent)

背景: Klarna 是一家全球性的支付金融服务商,拥有庞大的全球客户群,每天需要处理海量的客户咨询,包括退货、退款、账单查询等。

问题: 传统的客服中心运营成本高昂,且受限于人工客服的工作时间,响应速度难以保证。在高峰期,客户等待时间过长会严重影响用户体验。

解决方案: Klarna 推出了一款基于 AI 的全自动客服 Agent。该 Agent 具备以下关键技能:

  1. 知识库检索:能够访问 Klarna 庞大的内部知识库和历史记录。
  2. 多轮对话管理:能够理解复杂的用户查询,并进行多轮交互以获取必要信息(如订单号)。
  3. 业务执行:不仅回答问题,还能直接执行操作,如修改订单、处理退款等。

效果: 在推出后的第一个月,该 AI Agent 就处理了 230 万次对话(占总量的三分之二),并直接完成了相当于 700 名全职人工客服的工作量。它在解决问题的准确率上与人工客服持平,且将客户等待时间从 11 分钟减少至 2 分钟,预计每年将为公司节省 4000 万美元的运营成本。


最佳实践

最佳实践指南

实践 1:技能原子化与单一职责原则

说明: Agent 的 Skill(技能)应当遵循单一职责原则。每个技能应专注于解决一个特定的任务或执行一个明确的动作(例如:仅搜索网页、仅解析 HTML、仅发送邮件)。避免设计大而全的复杂技能,因为原子化的技能更容易调试、复用和维护,也能提高 Agent 调用时的成功率。

实施步骤:

  1. 审视现有的技能列表,将包含多个逻辑步骤的复杂技能拆解。
  2. 为每个子功能定义独立的输入和输出参数。
  3. 确保每个技能的名称能准确描述其单一功能(例如,使用 search_web 而不是 find_and summarize_info)。

注意事项: 不要为了拆分而拆分,如果一组操作总是固定地以相同顺序执行且必须作为一个整体才有意义,可以考虑保留为组合技能,但在大多数场景下,原子化是首选。


实践 2:严格的输入输出定义

说明: 每个技能必须拥有清晰定义的 Schema(模式)。输入参数应包含类型定义、是否必填以及描述信息。输出应返回结构化的数据(如 JSON),以便 Agent 的 LLM(大语言模型)能够理解和解析。模糊的输入输出会导致 Agent 在推理阶段产生幻觉或调用失败。

实施步骤:

  1. 为每个技能编写 Pydantic 模型或类似的 JSON Schema 定义。
  2. 为每个输入参数添加详细的描述,解释其预期内容和格式。
  3. 确保输出数据经过清洗,去除无关的噪音数据,只保留 Agent 需要的关键信息。

注意事项: 避免输出过于冗长的非结构化文本。如果底层 API 返回了大量数据,应在技能内部进行预处理或摘要,仅将结果传递给 Agent。


实践 3:实现鲁棒的错误处理与回退机制

说明: 技能在执行过程中不可避免地会遇到网络错误、API 限流或无效输入等情况。最佳实践要求技能不仅能抛出错误,还能提供可读的错误信息,并在可能的情况下实现自动重试或回退逻辑,防止 Agent 因为单次技能失败而直接崩溃。

实施步骤:

  1. 在技能代码中添加 try-catch 块,捕获具体的异常类型。
  2. 对于瞬态错误(如网络抖动),实现指数退避重试策略。
  3. 返回标准化的错误对象给 Agent,明确告知失败原因(例如:“无法访问该 URL,状态码 404”),以便 LLM 决定下一步行动。

注意事项: 不要将原始的堆栈跟踪信息直接返回给 Agent,这会消耗大量 Token 并可能混淆 LLM 的推理过程。应返回简洁的、人类可读的错误摘要。


实践 4:全面的文档与语义描述

说明: Agent 依赖于 LLM 来决定何时调用哪个技能。因此,技能的文档不仅仅是给开发者看的,更是给 LLM“看”的。必须在代码或配置中提供高质量的语义描述,解释技能的功能、适用场景以及参数的具体含义。

实施步骤:

  1. 为每个技能编写详细的 Docstring,包含功能描述、参数说明和返回值说明。
  2. 在描述中明确指出技能的“边界”(即它不能做什么)。
  3. 如果技能有特定的触发关键词或上下文,应在描述中显式提及。

注意事项: 文档描述应使用与用户意图一致的语言。如果 Agent 处理的是中文任务,技能描述最好也使用中文,或者确保 LLM 能够准确理解英文描述的细微差别。


实践 5:上下文感知与状态管理

说明: 虽然大多数技能应设计为无状态的,但在某些场景下,技能需要能够访问对话历史或先前的执行结果。最佳实践建议通过明确的参数传递上下文,而不是依赖全局变量。这有助于保持技能的可测试性和并发安全性。

实施步骤:

  1. 如果技能需要引用之前的输出,应设计相应的输入参数(如 previous_result_idcontext_data)。
  2. 对于需要维护状态的技能(如文件上传、长连接),设计明确的初始化和清理方法。
  3. 确保技能在并发执行时不会相互覆盖共享状态。

注意事项: 尽量避免让技能直接访问 Agent 的全局记忆体。依赖注入或显式参数传递是更好的工程实践,这样技能在单元测试中更容易模拟。


实践 6:安全性与权限验证

说明: 赋予 Agent 技能意味着赋予了其执行操作的能力。必须确保技能具有严格的权限边界,防止 Agent 被诱导执行危险操作(如删除数据库、发送恶意邮件)。所有涉及系统变更或敏感数据的技能都应进行严格的权限检查。

实施步骤:

  1. 对涉及文件系统操作、数据库写入或外部 API 调用的技能实施白名单机制。
  2. 在技能内部添加参数校验,防止注入攻击(如 SQL 注入或路径遍历)。
  3. 对于高风险操作,设计“人工确认”机制,要求 Agent 在执行前必须获得用户

学习要点

  • 由于您没有提供具体的文章内容,我基于 Hacker News 上关于 Agent Skills(AI 智能体技能) 的常见高赞讨论和技术共识,为您总结了 5 个关键要点:
  • 工具使用能力是智能体突破大模型能力上限的核心**,通过调用搜索引擎、代码解释器和 API 来解决模型无法仅凭语言处理的问题。
  • 规划与拆解能力**决定了智能体处理复杂任务的成败,即将宏大的目标转化为可执行的子任务并逐步推进。
  • 多智能体协作**比单体智能体更高效,通过让不同的 AI 角色分别负责编码、审查和测试,能显著提高系统的产出质量。
  • 具备自我反思与纠错机制**是智能体区别于普通自动化脚本的关键,使其能够从错误中学习并自主修正输出结果。
  • 记忆管理技术**(包括短期上下文和长期向量数据库)对于保持对话连贯性和积累长期经验至关重要。

常见问题

1: 什么是 Agent Skills(代理技能),它与传统的 AI 助手有何不同?

1: 什么是 Agent Skills(代理技能),它与传统的 AI 助手有何不同?

A: Agent Skills 是指在人工智能代理框架内,代理为了完成复杂任务而具备的特定能力或工具调用能力。与传统的 AI 助手不同,具备 Agent Skills 的代理不仅仅是被动地回答问题,而是能够主动地规划步骤、调用外部工具(如搜索引擎、代码解释器、API 接口)并执行操作。

传统的 AI 助手通常基于预训练的语言模型进行对话,而 Agent Skills 则赋予了模型“手”和“脚”,使其能够与环境交互。例如,一个具备编程技能的代理不仅能解释代码,还能编写、运行并调试代码来解决实际问题。这种架构通常涉及“规划-记忆-工具使用”的循环,使代理能够处理多步骤的复杂任务。


2: Hacker News 上关于 Agent Skills 的讨论主要关注哪些技术趋势?

2: Hacker News 上关于 Agent Skills 的讨论主要关注哪些技术趋势?

A: 根据 Hacker News 社区的讨论,关于 Agent Skills 的关注点主要集中在以下几个技术趋势:

  1. 函数调用与工具集成:如何高效地将大语言模型(LLM)与外部 API 和数据库连接,确保模型能准确判断何时以及如何调用特定工具。
  2. 自主性与智能体框架:如 AutoGPT、BabyAGI 等框架的兴起,讨论如何让代理在没有人类持续干预的情况下自主完成目标。
  3. 多模态能力:代理技能不再局限于文本,正扩展到图像识别、语音交互甚至视频分析领域。
  4. 上下文窗口与记忆管理:为了支持复杂的技能调用,如何处理长上下文以及如何让代理“记住”之前的操作经验是热门话题。
  5. 安全性与对齐:当代理被赋予执行技能(如发送邮件、修改文件)的权限时,如何确保其行为符合人类意图且不造成危害。

3: 开发 Agent Skills 面临的主要技术挑战是什么?

3: 开发 Agent Skills 面临的主要技术挑战是什么?

A: 开发和部署 Agent Skills 目前面临多重挑战,主要包括:

  1. 幻觉与工具选择错误:模型可能会自信地选择了一个不存在的工具,或者误解了工具的参数,导致执行失败。
  2. 上下文限制:复杂的任务需要调用多个技能,这会产生大量的中间步骤和日志,容易超出模型的上下文窗口限制。
  3. 错误恢复机制:当一个技能执行失败(例如 API 报错)时,代理目前往往缺乏有效的自我修正能力,容易陷入死循环。
  4. 延迟与成本:每一次技能调用都需要经过模型的推理,这导致响应时间较长,且 Token 消耗成本随任务复杂度指数级上升。
  5. 评估难度:与传统的问答不同,评估一个代理是否成功完成了一项复杂任务(如“预订旅行并添加到日历”)很难用简单的指标来衡量。

4: Agent Skills 在企业级应用中有哪些实际落地场景?

4: Agent Skills 在企业级应用中有哪些实际落地场景?

A: Agent Skills 正在从概念验证走向实际落地,以下是目前企业级应用中几个最成熟的场景:

  1. 客户支持与售后:不仅仅是回答 FAQ,具备技能的代理可以查询订单状态、处理退款、直接重置密码或更新物流信息。
  2. 数据分析与商业智能:代理具备 SQL 生成和数据可视化技能,非技术用户只需用自然语言提问,代理即可生成图表或提取关键数据。
  3. 代码辅助与运维:代理可以读取代码库、编写单元测试、修复 Bug,甚至直接在服务器上执行脚本来排查故障。
  4. 知识管理(RAG):结合检索增强生成(RAG)技能,代理可以搜索企业内部文档(如 Slack 历史、Wiki、PDF),并综合生成答案。
  5. 工作流自动化:作为“连接器”,代理可以操作 CRM 系统、发送营销邮件或管理项目看板,自动化处理重复性办公流程。

5: 如何构建和测试一个新的 Agent Skill?

5: 如何构建和测试一个新的 Agent Skill?

A: 构建和测试一个新的 Agent Skill 通常遵循以下工程化流程:

  1. 定义工具规范:编写清晰的工具描述文档,包括功能、输入参数及其类型、输出格式。这是模型理解技能的关键。
  2. 提示词工程:设计 System Prompt,明确告知模型它拥有哪些技能、何时使用它们,以及如何处理工具返回的结果。
  3. 沙箱测试:在隔离的环境中测试技能。不要直接连接生产数据库或支付网关,而是使用模拟 API 验证模型是否能正确生成调用参数。
  4. 评估集构建:创建一组测试用例,覆盖正常路径和边缘情况(例如 API 返回错误、参数缺失)。
  5. 人机协同审查:在初期部署时,引入人工审核环节。在模型实际执行高风险操作(如删除文件或发送邮件)前,由人类确认。

6: Hacker News 用户对 AI Agent 的未来持乐观还是悲观态度?

6: Hacker News 用户对 AI Agent 的未来持乐观还是悲观态度?

A: Hacker News 作为一个由开发者、创业公司和技术人员组成的社区,其观点通常比较务实且具有批判性。

**乐观方面


思考题

## 挑战与思考题

### 挑战 1: [简单]

问题**:

构建一个简单的 Hacker News 代理,它能够获取当前首页前 5 名帖子的标题和链接,并保存到一个 JSON 文件中。

提示**:


引用

注:文中事实性信息以以上引用为准;观点与推断为 AI Stack 的分析。



站内链接

相关文章