
如果你最近在关注 Google 的 AI 开发工具可能会注意到一个重要的产品线变动Gemini Gems 将在今年十月正式退役并全面转向名为 “Skills” 的新形态。这绝不仅仅是一个简单的功能改名。对于正在或计划使用 Gemini API 进行应用开发的工程师来说它意味着构建 AI 功能的方式、成本结构乃至整个工程范式都将发生一次关键迭代。很多开发者可能还在疑惑Gems 是什么Skills 又是什么这个变化对我手头的项目有什么影响是利好还是麻烦本文将为你彻底厘清这次转型。我们不会停留在官方新闻稿的表面而是深入技术层面分析其背后的设计逻辑变化并通过一个完整的实战示例展示如何从即将退役的 Gems 模式平滑迁移到全新的 Skills 架构。无论你是正在评估 Gemini API还是已经基于 Gems 构建了原型这篇文章都将提供清晰的迁移路径和实操指南。1. 从 Gems 到 Skills一次关键的范式升级首先我们需要理解 Gems 和 Skills 分别解决了什么问题。Gemini Gems可以理解为 Google 为 Gemini 模型预置的、开箱即用的“技能插件”。你可以把它想象成一个功能丰富的瑞士军刀里面包含了代码生成、文本总结、创意写作等多种固定工具。开发者通过简单的 API 调用或界面选择就能快速获得这些能力。它的核心价值在于“快速启动”降低了 AI 功能集成的初始门槛。然而随着开发者需求的深入Gems 的局限性也逐渐暴露定制化弱Gems 是黑盒其内部提示词Prompt、逻辑流和上下文处理方式对开发者不透明难以针对特定业务场景进行深度优化。集成僵化Gems 通常作为一个整体功能被调用难以将其中的子能力例如仅仅使用它的“信息提取”部分灵活地嵌入到更复杂的应用工作流中。迭代困难由于不可定制当业务逻辑变化或需要效果调优时开发者只能等待 Google 的官方更新自身能动性很小。Skills的推出正是为了解决这些问题。它将 AI 能力的构建单元从一个固定的“功能盒子”Gems拆解为更原子化、可组合、可定制的“技能组件”。你可以把 Skills 理解为“可编程的 Gems”。它的核心转变在于从“使用”到“构建”开发者不再仅仅是功能的消费者而是成为了技能的塑造者。从“黑盒”到“白盒或灰盒”Skills 鼓励或允许开发者定义技能的触发条件、处理逻辑和输出格式。从“单体”到“组合”多个简单的 Skills 可以像乐高积木一样组合起来形成解决复杂问题的 AI 智能体Agent。简单来说这次转型标志着 Gemini 开发者平台从提供“标准化AI功能”转向提供“定制化AI能力基础设施”。对于追求效果、效率和独特性的生产级应用Skills 是更优的长期选择。2. 核心概念对比Gems vs. Skills为了更清晰地理解差异我们通过一个表格来对比两者的核心特征特性维度Gemini Gems (即将退役)Gemini Skills (新范式)本质预封装、固定的AI功能模块可定义、可配置的AI能力单元定制性低。参数调节有限无法修改核心逻辑。高。可定义技能描述、示例、处理逻辑通过Function Calling等。透明度黑盒。内部提示词和逻辑不可见。灰盒/白盒。技能的行为由开发者通过描述和示例来塑造。集成方式通常作为独立端点调用。可作为AI Agent的一部分与其他Skills或工具协同工作。适用场景快速原型验证、通用性强的简单任务。复杂的业务逻辑、需要与外部系统交互、对输出格式有严格要求的生产应用。开发者角色功能调用者。技能设计者与编排者。一个生动的类比 想象你要处理客户支持邮件。Gems 模式你有一个叫“邮件总结”的固定工具。你丢给它一封邮件它返回一段总结。但如果你想让它在总结的同时自动判断邮件情绪并打上标签Gems 可能就无能为力了。Skills 模式你可以创建两个技能Skill_A: 分析邮件情绪和Skill_B: 生成邮件摘要。然后你可以设计一个工作流先调用Skill_A判断情绪再将情绪标签和邮件原文一起交给Skill_B要求它生成带情绪前缀的摘要。你甚至可以定义Skill_B的输出必须是特定的 JSON 格式以便直接存入数据库。Skills 提供了这种灵活性和控制力。3. 环境准备与前置条件在开始动手迁移或创建 Skill 之前你需要确保开发环境就绪。获取 API 密钥 访问 Google AI Studio 创建一个项目并获取你的 Gemini API 密钥。请妥善保管此密钥。选择 SDK/工具Python (推荐)使用官方google-generativeai库。这是功能最全、更新最及时的 SDK。pip install google-generativeaiNode.js使用google/generative-ai包。npm install google/generative-ai其他语言Google 也提供了 Java、Go 等语言的 SDK可根据项目需求选择。直接 HTTP API对于高度定制化的场景你也可以直接调用 RESTful API。IDE 与工具 任何你熟悉的代码编辑器即可如 VS Code, PyCharm。建议准备一个方便测试 API 调用的工具如curl或 Postman。重要提示本文的示例将主要使用Python SDK进行演示因为其语法清晰且能很好地展示 Skills 相关的概念。其他语言的逻辑基本相通。4. 迁移实战从一个 Gems 示例到 Skills 实现假设我们之前使用一个名为TextSummarizerGem假设名称的 Gems 来总结长篇文章。现在我们要将其迁移为一个自定义的ArticleSummarySkill。4.1 旧模式使用 Gems (假设代码)在旧模式下调用可能非常直接但缺乏控制。# 假设的旧版 Gems 调用代码示意 # 注意此代码仅为示意Gemini Gems 的实际API可能有所不同 import google.generativeai as genai genai.configure(api_keyYOUR_API_KEY) model genai.GenerativeModel(gemini-pro) # 指定模型 # 调用一个名为 summarize 的 Gems假设通过某个参数触发 response model.generate_content( f请总结以下文本{long_article_text}, # 可能有一个 tools 或 gems 参数来指定使用某个Gems # gems[TextSummarizerGem] # 假设性参数 ) print(response.text)痛点我们无法控制总结的长度、格式是段落还是要点、是否要忽略引言等。4.2 新模式创建自定义 Skill在 Skills 范式下我们通过精心设计的系统指令System Instruction和示例Few-shot Examples来“教”模型如何执行我们的技能。同时我们可以利用函数调用Function Calling来让技能与外部世界交互。下面我们创建一个更强大的ArticleSummarySkill# 文件路径skills/article_summarizer.py import google.generativeai as genai from typing import Dict, Any, Optional import json class ArticleSummarySkill: 自定义文章总结技能 功能根据要求对输入的文章进行结构化总结。 def __init__(self, api_key: str): genai.configure(api_keyapi_key) # 使用 Gemini 1.5 Pro 或 Flash 等支持长上下文和函数调用的模型 self.model genai.GenerativeModel( model_namegemini-1.5-pro, # 核心通过 system_instruction 定义技能 system_instructionself._get_system_instruction(), # 可以添加工具定义使技能能调用外部函数 tools[self._get_summary_format_tool()] ) def _get_system_instruction(self) - str: 定义技能的系统和行为指令 return 你是一个专业的文章总结助手ArticleSummarySkill。 你的任务是根据用户提供的文章生成高质量、结构化的总结。 你必须遵守以下规则 1. 总结需包含核心论点1-2句、关键论据3-5个要点、结论1句。 2. 语言简洁、客观保留原文关键数据如日期、数字。 3. 如果用户指定了长度如“简短总结”或“详细总结”请相应调整详细程度。 4. 如果用户要求特定格式如“输出为JSON”或“列出要点”你必须严格遵守。 如果用户的问题与文章总结无关请礼貌地指出你只能处理文章总结任务。 def _get_summary_format_tool(self) - Dict[str, Any]: 定义一个工具函数让模型可以请求特定格式的输出 return { function_declarations: [{ name: format_summary, description: 指定总结输出的格式要求。, parameters: { type: OBJECT, properties: { format_type: { type: STRING, description: 所需的格式如 bullet_points, paragraph, json, enum: [bullet_points, paragraph, json] }, max_length: { type: INTEGER, description: 总结的最大长度单词数 } }, required: [format_type] } }] } def summarize(self, article_text: str, user_request: str 请总结这篇文章) - Dict[str, Any]: 执行总结技能的主方法 # 构建对话 chat self.model.start_chat() # 用户消息结合用户请求和文章内容 full_prompt f{user_request}\n\n文章内容如下\n{article_text} response chat.send_message(full_prompt) # 处理响应检查模型是否想调用我们定义的函数 if response.candidates[0].content.parts[0].function_call: fc response.candidates[0].content.parts[0].function_call if fc.name format_summary: # 模型请求了格式化这里我们可以根据请求生成最终总结 # 例如如果请求JSON格式我们可以调整prompt让模型输出JSON format_args fc.args follow_up_prompt f请按照以下要求重新生成总结格式为{format_args[format_type]} if max_length in format_args: follow_up_prompt f长度不超过{format_args[max_length]}词 follow_up_prompt 。\n请直接输出总结内容。 final_response chat.send_message(follow_up_prompt) result_text final_response.text else: result_text response.text else: result_text response.text # 返回结构化的结果 return { skill_name: ArticleSummarySkill, original_request: user_request, summary: result_text, model_used: self.model.model_name } # 使用示例 if __name__ __main__: API_KEY YOUR_ACTUAL_API_KEY # 替换为你的密钥 skill ArticleSummarySkill(API_KEY) # 示例文章此处省略长文本实际使用时替换 sample_article 人工智能AI在软件开发领域的应用正日益深入...这里是长长的文章正文 result skill.summarize( article_textsample_article, user_request请用JSON格式输出详细总结包含核心论点和关键论据字段 ) print(json.dumps(result, indent2, ensure_asciiFalse))代码解读与优势技能封装我们将总结能力封装成了一个类ArticleSummarySkill这是一个可复用、可测试的组件。系统指令_get_system_instruction方法定义了技能的“角色”和“行为准则”这是定制化的核心。你可以在这里注入任何领域知识。函数调用Tools_get_summary_format_tool定义了一个工具。模型在生成过程中可以“主动”调用这个工具来询问用户对格式的偏好尽管本例中我们在用户请求里直接指定了。这展示了 Skill 与外部逻辑交互的能力。结构化输出summarize方法返回一个结构化的字典包含了技能名、原始请求、总结内容和使用模型这非常利于后续的数据处理、日志记录和集成。灵活性通过user_request参数我们可以动态改变总结的要求而无需修改技能内部逻辑。5. 组合技能构建简单 AI AgentSkills 的真正威力在于组合。假设我们还有一个SentimentAnalysisSkill情绪分析技能我们可以轻松地将它们组合起来创建一个能自动分析文章情绪并生成相应摘要的智能体。# 文件路径agents/article_processing_agent.py from skills.article_summarizer import ArticleSummarySkill # 假设我们已有另一个技能 from skills.sentiment_analyzer import SentimentAnalysisSkill class ArticleProcessingAgent: 一个组合了总结和情绪分析技能的简单智能体 def __init__(self, api_key: str): self.summary_skill ArticleSummarySkill(api_key) self.sentiment_skill SentimentAnalysisSkill(api_key) # 假设已实现 def process_article(self, article_text: str) - Dict[str, Any]: 处理文章先分析情绪再根据情绪调整总结语气 # 步骤1分析情绪 sentiment_result self.sentiment_skill.analyze(article_text) # 假设返回 {“sentiment”: “positive”, “confidence”: 0.95} # 步骤2根据情绪定制总结请求 tone_map { positive: 请用积极、赞赏的语气总结这篇文章突出其价值和亮点。, negative: 请用客观、谨慎的语气总结这篇文章注意指出其可能的问题或争议点。, neutral: 请用客观、中立的语气总结这篇文章。 } user_request tone_map.get(sentiment_result[sentiment], 请总结这篇文章) # 步骤3生成总结 summary_result self.summary_skill.summarize(article_text, user_request) # 组合最终结果 final_result { article_metadata: { estimated_sentiment: sentiment_result[sentiment], sentiment_confidence: sentiment_result[confidence] }, summary: summary_result[summary], processing_chain: [SentimentAnalysisSkill, ArticleSummarySkill] } return final_result # 使用智能体 if __name__ __main__: API_KEY YOUR_ACTUAL_API_KEY agent ArticleProcessingAgent(API_KEY) sample_article ... # 你的文章内容 result agent.process_article(sample_article) import pprint pprint.pprint(result)这个简单的Agent展示了 Skills 范式的核心思想通过编排多个单一职责的 Skills构建出能处理复杂流程的智能应用。这比一个庞大而笨重的“全能Gems”要清晰、可维护得多。6. 运行、验证与调试6.1 运行与验证运行上述代码后你应该能得到结构化的输出。验证点包括功能正确性总结是否涵盖了文章核心情绪分析是否合理格式符合性当请求 JSON 格式时输出是否是合法的 JSON能否被json.loads()解析技能遵循指令当要求“用积极语气”时生成的总结词汇是否偏向正面错误处理下一步需要完善如果输入文本为空或 API 调用失败是否有适当的异常处理和用户提示6.2 调试技巧在 Skills 开发中调试至关重要记录完整对话历史在chat.send_message前后打印出chat.history查看模型实际接收和响应的消息序列。检查函数调用如示例所示检查response.candidates[0].content.parts中是否有function_call这能帮你理解模型是否正确地理解了你的工具定义。简化测试先用极短的文本测试技能的基本流程再逐步增加复杂性。使用 AI Studio 进行原型设计Google AI Studio 提供了可视化工具来配置模型指令即 Skill 定义并实时测试效果。你可以先在 Studio 中打磨你的system_instruction再将其复制到代码中。7. 迁移常见问题与排查思路问题现象可能原因排查方式解决方案调用 Gems 的旧代码报错或失效Gems 服务已下线或接口变更。1. 查看官方公告和 API 文档更新日志。2. 检查错误信息确认是否为404或DEPRECATED错误。立即开始迁移计划。根据旧 Gems 功能设计对应的自定义 Skill。自定义 Skill 效果不佳输出不符合预期系统指令System Instruction描述不够清晰、具体或存在歧义。1. 在 AI Studio 中反复测试和优化指令。2. 提供更清晰的示例Few-shot。3. 检查指令中是否有矛盾的要求。细化指令使用“必须”、“禁止”、“格式应为”等明确词汇。为复杂技能添加示例对话。模型不调用定义的函数Tools1. 函数描述不够清晰。2. 对话上下文不足以让模型决定调用函数。3. 模型版本不支持。1. 检查function_declarations中的description和parameters是否描述准确。2. 在用户请求中更明确地暗示需要调用函数。3. 确认使用的模型如gemini-1.5-pro支持函数调用。优化函数描述确保其目的明确。在用户 prompt 中直接要求模型使用特定功能。切换至支持工具调用的最新模型。API 响应慢或超时1. 输入文本过长。2. 网络问题。3. 模型负载高。1. 检查输入 token 长度。2. 测试网络连接。3. 查看 API 状态面板。1. 对长文本考虑分块处理。2. 实现重试机制和超时设置。3. 考虑使用gemini-1.5-flash等更快模型进行推理。无法处理复杂、多步骤任务试图用一个 Skill 解决所有问题。审视任务流程是否可拆分为多个原子化步骤。遵循单一职责原则创建多个简单 Skills并用一个 Agent 或编排逻辑将其串联。8. 最佳实践与工程化建议将 Skills 投入生产环境需要遵循良好的工程实践技能设计原则单一职责一个 Skill 只做好一件事。例如ExtractDatesSkill只负责提取日期SummarizeTextSkill只负责总结。接口明确定义清晰的输入输出。输入是什么格式的文本/数据输出是自然语言还是结构化数据JSON指令精炼系统指令是技能的灵魂。用词要精确、无歧义并包含边界条件处理“如果遇到X则做Y”。配置与秘钥管理永远不要将 API 密钥硬编码在代码中。使用环境变量或安全的配置管理服务。# .env 文件 GEMINI_API_KEYyour_api_key_here# 代码中读取 import os from dotenv import load_dotenv load_dotenv() API_KEY os.getenv(GEMINI_API_KEY)错误处理与健壮性对所有 API 调用进行try-except包装。实现指数退避的重试逻辑以应对暂时的网络或服务故障。为 Skill 设置合理的超时时间。日志与监控记录每个 Skill 调用的输入、输出、耗时和 Token 使用量。这有助于成本核算、性能优化和效果分析。可以结构化日志方便接入 ELK 或 Datadog 等监控系统。版本控制将 Skill 的定义尤其是系统指令像代码一样进行版本控制Git。当修改指令时通过 A/B 测试来评估效果变化避免效果回退。测试为每个 Skill 编写单元测试使用固定的输入检查输出是否符合预期。构建一个涵盖典型、边缘和错误情况的测试用例集。9. 总结与展望Gemini Gems 向 Skills 的转型是 Google 将其大模型能力从“产品功能”向“开发者平台”演进的关键一步。对于开发者而言这短期意味着一些迁移成本但长期来看它带来了前所未有的灵活性和控制力。迁移的核心步骤可以概括为解构分析现有 Gems 提供的功能将其拆解为原子化的任务。定义为每个原子化任务设计一个 Skill编写清晰、具体的系统指令。实现使用 Gemini API 和 SDK 实现这些 Skill 类并处理好输入输出。编排通过 Agent 或业务逻辑代码将多个 Skills 组合起来完成复杂工作流。优化基于测试和用户反馈持续迭代和优化每个 Skill 的指令和逻辑。未来随着 Skills 生态的成熟我们或许会看到Skill 市场开发者可以发布和共享自己训练的高质量 Skills。可视化编排工具像搭积木一样通过拖拽来组合 Skills构建 AI 应用。更复杂的 Agent 框架内置记忆、规划、工具使用等能力的标准化 Agent 框架出现。对于每一位技术决策者和开发者来说现在正是深入理解和拥抱 Skills 范式的最佳时机。建议从一个小而具体的业务场景开始尝试将一个旧的 Gems 思路用自定义 Skill 重新实现亲身体验这种范式带来的差异。这将帮助你在 AI 原生应用开发的浪潮中构建出更强大、更可控、更独特的解决方案。