智能体技能开发实战:从天气查询到多模态输出

发布时间:2026/9/12 9:45:12

智能体技能开发实战:从天气查询到多模态输出 1. 什么是Agent SkillsAgent Skills智能体技能本质上是一组可复用的功能模块让AI智能体具备完成特定任务的能力。就像给机器人安装不同的工具包——拧螺丝需要电动起子切割金属需要激光刀每个技能都对应着解决某类问题的专业工具。在实际开发中一个完整的Skill通常包含三个核心组件意图识别理解用户想要什么比如查天气对应天气查询技能逻辑处理执行具体操作调用API、计算数据、操作设备等结果格式化将输出调整为人类可读的格式语音/文字/图表2. 开发环境准备2.1 基础工具链推荐使用Python 3.8作为开发语言配合以下工具包pip install semantic-kernel0.9.6b1 # 微软开源的SK框架 pip install python-dotenv # 环境变量管理注意建议使用虚拟环境隔离依赖避免版本冲突。可通过python -m venv myenv创建。2.2 项目结构规划典型技能项目的目录结构应保持模块化skills/ ├── weather/ # 技能名称 │ ├── __init__.py # 空文件标识Python包 │ ├── config.json # 技能参数配置 │ └── skill.py # 核心逻辑实现 └── calendar/ # 另一个技能 kernel.py # 技能调度中枢3. 技能开发实战天气查询案例3.1 定义技能元数据在weather/config.json中声明技能基础信息{ skill_name: WeatherQuery, description: 提供全球城市天气查询服务, endpoint: /weather, parameters: [ { name: location, type: string, required: true, description: 城市名称如北京 }, { name: unit, type: enum, options: [celsius, fahrenheit], default: celsius } ] }3.2 核心逻辑实现在skill.py中编写业务代码import requests from datetime import datetime class WeatherSkill: def __init__(self, api_key): self.base_url https://api.weatherapi.com/v1 self.api_key api_key async def get_current_weather(self, location: str, unit: str celsius) - str: 获取实时天气数据 params { key: self.api_key, q: location, aqi: no } try: resp requests.get(f{self.base_url}/current.json, paramsparams) data resp.json() temp data[current][temp_ unit[:1]] condition data[current][condition][text] update_time datetime.strptime( data[current][last_updated], %Y-%m-%d %H:%M ).strftime(%m月%d日 %H:%M) return f{location}当前天气{condition}温度{temp}度{unit}数据更新时间{update_time} except Exception as e: return f天气查询失败{str(e)}3.3 技能注册与测试在kernel.py中集成技能from semantic_kernel import Kernel from skills.weather.skill import WeatherSkill import os kernel Kernel() weather_skill WeatherSkill(os.getenv(WEATHER_API_KEY)) # 注册技能到内核 kernel.register_skill( skill_nameweather, skill_instanceweather_skill, description提供天气查询功能 ) # 测试调用 async def test_skill(): result await kernel.run_skill_function( skill_nameweather, function_nameget_current_weather, input_params{location: 上海, unit: celsius} ) print(result) if __name__ __main__: import asyncio asyncio.run(test_skill())4. 高级功能实现技巧4.1 多模态输出支持扩展技能使其支持富文本响应from typing import Dict, Any import matplotlib.pyplot as plt import io import base64 def generate_weather_card(data: Dict[str, Any]) - Dict[str, str]: 生成带图表的天气卡片 fig, ax plt.subplots(figsize(6, 3)) ax.bar([温度, 湿度, 风速], [data[temp], data[humidity], data[wind_kph]]) plt.tight_layout() buf io.BytesIO() plt.savefig(buf, formatpng) buf.seek(0) img_base64 base64.b64encode(buf.read()).decode(utf-8) return { text: f{data[location]}天气简报, image: fdata:image/png;base64,{img_base64}, quick_replies: [三天预报, 空气质量, 灾害预警] }4.2 技能组合调用实现多技能协作的旅行规划场景async def plan_trip(kernel: Kernel, destination: str): 组合调用天气、地图、翻译等技能 weather await kernel.run_skill_function( weather, get_current_weather, {location: destination} ) attractions await kernel.run_skill_function( map, get_top_attractions, {city: destination, limit: 5} ) return { weather: weather, attractions: attractions, advice: await generate_tips(kernel, destination) }5. 性能优化与生产部署5.1 缓存策略实现使用Redis缓存高频查询结果import redis from functools import wraps redis_client redis.StrictRedis(hostlocalhost, port6379, db0) def cache_weather(ttl: int 3600): 天气数据缓存装饰器 def decorator(func): wraps(func) async def wrapper(location: str, *args, **kwargs): cache_key fweather:{location.lower()} cached redis_client.get(cache_key) if cached: return cached.decode() result await func(location, *args, **kwargs) redis_client.setex(cache_key, ttl, result) return result return wrapper return decorator # 使用示例 cache_weather(ttl1800) async def get_current_weather(self, location: str, unit: str): # 原有实现...5.2 容器化部署Dockerfile配置示例FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . ENV WEATHER_API_KEY${API_KEY} EXPOSE 8000 CMD [gunicorn, -w 4, -k uvicorn.workers.UvicornWorker, kernel:app]6. 避坑指南与经验总结6.1 常见错误排查API限流问题现象突然返回429错误解决方案实现令牌桶算法限流from ratelimit import limits, sleep_and_retry sleep_and_retry limits(calls30, period60) def call_api(): # API调用代码编码问题中文字符乱码时确保所有文件头部添加# -*- coding: utf-8 -*-6.2 性能优化技巧批量处理对城市列表查询改造为批量接口预处理对静态数据如城市编码表启动时加载到内存异步化使用aiohttp替代requests实现并发请求import aiohttp async def batch_query(locations: list): async with aiohttp.ClientSession() as session: tasks [fetch_one(session, loc) for loc in locations] return await asyncio.gather(*tasks)6.3 技能商店发布制作技能包的标准流程压缩项目目录zip -r weather_skill.zip skills/weather/生成校验文件sha256sum weather_skill.zip checksum.txt编写使用说明README.md包含技能功能描述参数说明示例调用代码依赖项列表
延伸阅读

更多相关文章

2026/9/8 6:18:44

央企合同治理新规:穿透式监管与智能合同管理实践

1. 央企合同治理新规深度解读最近一份编号46的监管文件在央企系统内引发广泛讨论,这份关于合同治理的新规最引人注目的就是提出了"穿透式监管"这一创新理念。作为在央企法务部门工作十余年的从业者,我深刻感受到这不仅是简单的流程调整&#x…

2026/9/10 8:10:42

整理infrared热点(二)

#long-distance-relationship #突然很确信我们有些地方有点像蜘蛛侠与格温 三、具有尺度和位置敏感性的红外小目标检测Infrared Small Target Detection with Scale and Location Sensitivity 插曲 去了解一下特征融合-发现是深度学习里的 【极致中配】Stanford CS231N 计算…

2026/9/11 2:02:12

TMS320F28xx硬件设计实战:从电源、时钟到PCB布局的可靠性指南

1. 项目概述:从芯片到稳定系统,硬件设计的挑战与应对在嵌入式控制领域,尤其是电机驱动、数字电源和新能源逆变器这些对实时性和可靠性要求极高的场景,德州仪器(TI)的TMS320F28xx/F28xxx系列数字信号控制器&…

2026/9/12 9:40:20

配套C++代码实现(完全符合GESP四级考纲,零基础友好)

所有代码都只用四级要求的基础语法(数组、循环、cin/cout),没有任何超纲内容,注释全是大白话,孩子照着敲就能直接运行出正确结果。 1. 编程题1:3行3列矩阵主对角线求和 #include using namespace std;in…

2026/9/12 9:40:20

TensorRT-LLM Qwen3 三步提速实测

TensorRT-LLM Qwen3 三步提速实测 【免费下载链接】TensorRT-LLM TensorRT LLM provides users with an easy-to-use Python API to define Large Language Models (LLMs) and supports state-of-the-art optimizations to perform inference efficiently on NVIDIA GPUs. Tens…

2026/9/12 9:40:19

SpringBoot+Vue智能健康管理系统设计与实现

1. 项目概述:企业级智能推荐卫生健康系统这个基于SpringBootVueMyBatis的卫生健康管理系统,本质上是一个融合了医疗健康数据管理与智能推荐算法的综合平台。我在实际医疗信息化项目实施中发现,传统健康管理系统最大的痛点在于:它们…

2026/9/12 9:35:19

PICO XR渲染报错renderPassIndex越界解决方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码