1. 引言什么是 Agent Skills在当今的 AI 应用开发中智能体Agent已成为连接大语言模型LLM与现实世界任务的关键桥梁。而Agent Skills智能体技能则是赋予智能体执行特定、可复用任务的能力模块。你可以把它想象成给一个“大脑”LLM安装的“手”和“工具包”。为什么需要 Skills模块化将复杂任务拆解为独立的技能便于开发、测试和复用。专业化每个技能专注于一件事如搜索、计算、调用 API效果更佳。可扩展可以像搭积木一样为智能体组合不同的技能来完成复杂工作流。本教程将采用LangChain框架带你从零开始手把手创建、组合并使用 Agent Skills。即使你是初学者也能跟着代码一步步实现。2. 环境准备与工具安装首先确保你的开发环境已就绪。2.1 创建项目并安装依赖打开终端执行以下命令# 创建项目目录mkdiragent-skills-tutorialcdagent-skills-tutorial# 创建虚拟环境推荐python-mvenv venv# 激活虚拟环境# Windows:venv\Scripts\activate# macOS/Linux:sourcevenv/bin/activate# 安装核心依赖pipinstalllangchain langchain-openai python-dotenv2.2 配置 API 密钥我们需要一个 LLM 作为智能体的“大脑”。这里使用 OpenAI 的模型。在项目根目录创建.env文件并填入你的 OpenAI API Key# .env OPENAI_API_KEYsk-your-openai-api-key-here然后在代码中加载环境变量# config.pyimportosfromdotenvimportload_dotenv load_dotenv()OPENAI_API_KEYos.getenv(OPENAI_API_KEY)assertOPENAI_API_KEY,请检查 .env 文件中的 OPENAI_API_KEY 配置3. 创建你的第一个 Skill计算器我们从最简单的开始——创建一个能进行数学计算的技能。3.1 定义 Skill 函数一个 Skill 本质上是一个可被智能体调用的函数。我们创建一个calculator_skill.py文件# skills/calculator_skill.pyimportmathimportredefcalculate(expression:str)-str: 计算数学表达式。 支持加减乘除、乘方、括号及常见数学函数。 Args: expression (str): 数学表达式如 2 3 * (4 - 1) Returns: str: 计算结果或错误信息 # 安全考虑移除可能危险的字符只保留数学表达式允许的字符safe_expressionre.sub(r[^0-9\-*/().^πesincoqrtanlg\s],,expression)try:# 替换常见的数学常数和函数为 Python 可识别的形式safe_expressionsafe_expression.replace(^,**).replace(π,math.pi)safe_expressionsafe_expression.replace(sin,math.sin).replace(cos,math.cos).replace(tan,math.tan)safe_expressionsafe_expression.replace(log,math.log10).replace(ln,math.log)safe_expressionsafe_expression.replace(sqrt,math.sqrt)# 使用 eval 计算注意在生产环境中应对输入做更严格的限制或使用安全库resulteval(safe_expression,{__builtins__:{}},{math:math})returnf计算结果{expression}{result}exceptExceptionase:returnf计算错误无法解析表达式 {expression}。错误详情{e}3.2 将函数包装为 LangChain ToolLangChain 通过Tool类将函数封装成智能体可识别的工具。# skills/calculator_tool.pyfromlangchain.toolsimportToolfrom.calculator_skillimportcalculate calculator_toolTool(nameCalculator,funccalculate,description用于计算数学表达式。输入应为一个字符串格式的数学表达式。 支持运算符, -, *, /, ** (乘方), ()。 支持函数sin, cos, tan, log (以10为底), ln (自然对数), sqrt。 支持常数π (pi)。 示例输入2 * (3 5), sin(π/2), sqrt(16)。)现在你的第一个 Skill——计算器就创建好了它已经可以被智能体调用了。4. 创建第二个 Skill网络搜索智能体经常需要获取最新信息。我们使用DuckDuckGoSearchRun来创建一个搜索技能。4.1 安装搜索依赖并创建工具pipinstallduckduckgo-search# skills/search_tool.pyfromlangchain.toolsimportDuckDuckGoSearchRun search_toolDuckDuckGoSearchRun(nameWebSearch,description在互联网上搜索最新信息。当你需要回答关于实时事件、新闻、最新数据或未知领域的问题时请使用此工具。 输入应为明确的搜索查询词。)5. 组装智能体并测试技能有了技能Tool之后我们需要创建一个智能体并把这些技能“装配”给它。5.1 初始化 LLM 和工具列表# agent/assemble_agent.pyfromlangchain_openaiimportChatOpenAIfromskills.calculator_toolimportcalculator_toolfromskills.search_toolimportsearch_toolimportconfig# 1. 初始化 LLM智能体的大脑llmChatOpenAI(modelgpt-4o-mini,# 或 gpt-3.5-turboopenai_api_keyconfig.OPENAI_API_KEY,temperature0# 降低随机性使输出更确定)# 2. 组装工具列表tools[calculator_tool,search_tool]5.2 创建并运行智能体LangChain 提供了高级的create_react_agent来快速构建一个能使用工具的智能体。# agent/run_agent.pyfromlangchainimporthubfromlangchain.agentsimportcreate_react_agent,AgentExecutorfromagent.assemble_agentimportllm,tools# 3. 拉取一个预设的 ReAct 提示词模板prompthub.pull(hwchase17/react)# 4. 创建智能体agentcreate_react_agent(llm,tools,prompt)# 5. 创建执行器agent_executorAgentExecutor(agentagent,toolstools,verboseTrue,# 打印详细的思考过程便于调试handle_parsing_errorsTrue# 优雅处理解析错误)# 6. 运行测试if__name____main__:# 测试计算技能result1agent_executor.invoke({input:请计算 15 的平方加上 20 除以 4 等于多少})print(\n--- 测试1 结果 ---)print(result1[output])# 测试搜索技能result2agent_executor.invoke({input:今天北京天气怎么样})print(\n--- 测试2 结果 ---)print(result2[output])# 测试组合技能需要推理和计算result3agent_executor.invoke({input:搜索一下欧元对人民币的最新汇率然后计算100欧元能换多少人民币})print(\n--- 测试3 结果 ---)print(result3[output])运行python agent/run_agent.py你将看到智能体一步步思考因为verboseTrue决定调用哪个工具并最终给出答案。6. 进阶创建自定义复杂 Skill天气预报让我们创建一个更复杂、更实用的 Skill通过调用公开 API 获取天气预报。6.1 定义天气 Skill 函数这里我们使用open-meteo.com的免费 API。# skills/weather_skill.pyimportrequestsimportjsonfromtypingimportDict,Anydefget_weather(city:str)-str: 根据城市名获取当前天气情况。 Args: city (str): 城市名称如 北京, Shanghai Returns: str: 格式化后的天气信息字符串 # 第一步将城市名转换为经纬度使用地理编码APIgeocode_urlfhttps://geocoding-api.open-meteo.com/v1/search?name{city}count1try:geo_responserequests.get(geocode_url,timeout10)geo_datageo_response.json()ifnotgeo_data.get(results):returnf错误未找到城市 {city} 的地理信息。locationgeo_data[results][0]latitudelocation[latitude]longitudelocation[longitude]city_namelocation[name]# 第二步用经纬度获取天气weather_url(fhttps://api.open-meteo.com/v1/forecast?flatitude{latitude}longitude{longitude}fcurrent_weathertrue)weather_responserequests.get(weather_url,timeout10)weather_dataweather_response.json()currentweather_data[current_weather]temperaturecurrent[temperature]wind_speedcurrent[windspeed]weather_codecurrent[weathercode]# 将天气代码转换为描述简化版weather_desc_decode_weather_code(weather_code)return(f{city_name}当前天气\nf- 温度{temperature}°C\nf- 天气状况{weather_desc}\nf- 风速{wind_speed}km/h)exceptrequests.exceptions.RequestExceptionase:returnf网络请求错误{e}except(KeyError,json.JSONDecodeError)ase:returnf解析API响应时出错{e}def_decode_weather_code(code:int)-str:将 WMO 天气代码转换为描述性文字。weather_map{0:晴朗,1:大部分晴朗,2:局部多云,3:多云,45:有雾,48:有雾,51:小雨,61:雨,80:阵雨,95:雷暴,}returnweather_map.get(code,未知)6.2 包装为 Tool 并更新智能体# skills/weather_tool.pyfromlangchain.toolsimportToolfrom.weather_skillimportget_weather weather_toolTool(nameGetWeather,funcget_weather,description获取指定城市的当前天气情况。输入应为城市名称例如 北京 或 New York。)更新你的assemble_agent.py将weather_tool加入工具列表# agent/assemble_agent.py (更新后)fromlangchain_openaiimportChatOpenAIfromskills.calculator_toolimportcalculator_toolfromskills.search_toolimportsearch_toolfromskills.weather_toolimportweather_tool# 新增importconfig llmChatOpenAI(modelgpt-4o-mini,openai_api_keyconfig.OPENAI_API_KEY,temperature0)# 现在有三个技能了tools[calculator_tool,search_tool,weather_tool]再次运行智能体试试问它“上海和北京的天气哪个更暖和”7. 技能组合与工作流设计真正的威力在于技能的组合。智能体可以自主决定调用多个技能来完成复杂任务。7.1 示例旅行规划助手假设用户问“我计划下周末去杭州旅行帮我查一下杭州的天气并计算一下如果酒店每晚500元住3晚需要多少钱”智能体的思考链ReAct会是Thought: 用户需要两个信息杭州天气和住宿费用。我需要先获取天气再计算费用。Action: 调用GetWeather输入“杭州”。Observation: 获得杭州天气结果。Thought: 现在需要计算住宿费用500元/晚 * 3晚。Action: 调用Calculator输入“500 * 3”。Observation: 获得计算结果1500。Thought: 我已经获得了所有信息可以组织最终答案了。Final Answer: 给出包含天气和费用的完整回答。你不需要手动编写这个流程create_react_agent和 LLM 会协作自动完成。8. 调试与最佳实践8.1 处理错误解析错误设置handle_parsing_errorsTrue。工具错误在你的 Skill 函数内部做好异常捕获返回友好的错误信息。超时为网络请求设置合理的timeout。8.2 编写清晰的工具描述description字段至关重要它是 LLM 决定是否以及如何调用该工具的主要依据。描述应明确工具的用途和边界。说明输入格式和示例。指出何时使用和何时不使用。8.3 项目结构建议保持清晰的代码结构有利于维护agent-skills-tutorial/ ├── .env ├── config.py ├── skills/ # 存放所有技能 │ ├── __init__.py │ ├── calculator_skill.py │ ├── calculator_tool.py │ ├── search_tool.py │ ├── weather_skill.py │ └── weather_tool.py ├── agent/ # 智能体组装与运行 │ ├── __init__.py │ ├── assemble_agent.py │ └── run_agent.py └── README.md9. 下一步扩展你的技能库你已经掌握了创建和使用 Agent Skills 的核心流程。可以尝试创建更多技能数据库查询技能连接 MySQL/PostgreSQL执行 SQL。文件操作技能读写本地文件总结 PDF/Word 内容。邮件发送技能通过 SMTP 发送邮件。专属 API 技能连接你的企业内部系统。记住原则一个技能一个职责。保持简单和专注你的智能体就会越来越强大。10. 完整代码仓库本教程的所有代码已整理在一个 GitHub 仓库中你可以直接克隆并运行git clone https://github.com/your-username/agent-skills-tutorial.git注请将仓库地址替换为你自己的。仓库中应包含.env.example文件供参考。希望这篇“傻瓜式”教程能帮你顺利入门 Agent Skills 的世界。动手修改代码、添加新技能是学习的最佳方式。祝你构建出功能强大的智能体