大家好,我是Edison。
最近我一直在跟着圣杰的《.NET+AI智能体开发进阶》课程学习MAF开发多智能体工作流,我强烈推荐你也上车跟我一起出发!
上一篇,我们初步学习了Agent Skill的基本概念以及在MAF中实现了一个Agent Skill的案例。本篇,我们来了解下Agent Skill如何集成脚本执行能力。
1 Agent Skill中的执行脚本
根据上一篇我们知道,Agent Skill就是大模型随时翻阅的说明文档,它还可以包含一些资源文件,而脚本就是其中的一种重要资源。- skill/
- ├── SKILL.md # 必需:指令 + 元数据
- ├── scripts/ # 可选:可执行代码
- ├── references/ # 可选:文档资料
- └── assets/ # 可选:模板、资源文件
复制代码 scripts子目录
这些脚本会被放在其所属skill目录下的scripts子目录下,不管它是BASH脚本,PowerShell脚本,又或者是Python/C#代码,只要是Agent所在客户/服务端能够执行的都可以。
总结,Skills不仅让Agent知道处理规则(SKILL.md + references),还能让Agent直接上手处理(scripts)。
工具 vs 技能
工具(Tool)是一种能力,而技能(Skill)是一种知识。比如,自己开发一个PowerShellTools,给模型提供一些run shell的能力,我们通过注册到 ChatOptions.Tools 完成加载。
又如,自己定义一个系统运维Skill,给模型提供一些系统运维的知识,我们通过注册到AIContextProviders完成加载。
知识指导行为,而非工具限定行为。
2 快速开始:MAF中集成Shell执行能力
假设我们有这样一个需求:某企业开发了一个IT助手Agent,它运行在每个员工的笔记本电脑上,可以回答用户关于系统方面的一些问题并加以分析给出建议。
例如,很多员工发现自己的笔记本电脑最近越来越慢了,又或者发现内存一直高负载 等等,在以前员工会直接联系IT部的某位员工,而现在IT部将自身的运维经验封装为了一个Skill并通过Agent直接回复员工。
以终为始,我们的Agent应用的解决方案长这样子:这是一个.NET控制台应用程序,其中有一个skills目录,存放了系统运维领域的知识,这是IT部呕心沥血整理的“宝典”。
系统运维Skill
首先,我们创建这个SKILL.md,内容如下:- ---
- name: system-ops
- description: 系统运维诊断技能。适用于系统健康检查、磁盘空间分析、进程资源监控、故障排查等系统运维场景。包含可执行的诊断脚本。
- ---
- # 系统运维(System Operations)
- ## 可用诊断脚本
- 以下脚本位于本技能的 `scripts/` 目录,可通过 `run_shell` 工具执行:
- | 脚本 | 用途 | 执行命令 |
- |------|------|--------|
- | check-system-info.ps1 | 获取系统基本信息(OS、CPU、内存) |
- | check-disk-usage.ps1 | 检查磁盘使用情况和剩余空间 |
- | check-top-processes.ps1 | 查看 CPU/内存占用 Top 进程 |
- ## 运维检查流程
- 1. **基础检查**:先执行 `check-system-info.ps1` 获取系统概况
- 2. **针对性诊断**:根据用户问题,选择性执行磁盘或进程检查脚本
- 3. **分析报告**:综合脚本输出和故障排查指南,给出诊断结论和建议
- 4. **故障排查**:如需深入排查,参考 [references/troubleshooting-guide.md](references/troubleshooting-guide.md)
- ## 告警阈值
- | 指标 | 正常 | 警告 | 严重 |
- |------|------|------|------|
- | CPU 使用率 | <70% | 70-90% | >90% |
- | 内存使用率 | <80% | 80-95% | >95% |
- | 磁盘使用率 | <70% | 70-90% | >90% |
- | 单进程 CPU | <30% | 30-60% | >60% |
复制代码 由于该Skill还定义了引用的资源,所以我们还需要添加:
(1)参考文件:故障自查指南
说明:这是一个markdown文件。- # 故障排查指南
- ## CPU 持续高负载
- 1. 通过 `check-top-processes.ps1` 识别高占用进程
- 2. 判断是否为预期行为(如编译、数据处理)
- 3. 如为异常进程,建议:
- - 记录进程信息(PID、启动时间、命令行)
- - 联系应用负责人确认
- - 必要时可终止进程:`Stop-Process -Id <PID>`
- ## 内存不足
- 1. 检查物理内存使用率(通过 `check-system-info.ps1`)
- 2. 识别内存大户(通过 `check-top-processes.ps1`)
- 3. 常见原因:
- - 内存泄漏:进程内存持续增长
- - 缓存过多:数据库或应用缓存未限制
- 4. 缓解措施:
- - 重启内存泄漏进程
- - 调整应用缓存配置
- - 考虑扩容
- ## 磁盘空间不足
- 1. 通过 `check-disk-usage.ps1` 确认各盘使用率
- 2. 清理建议(按优先级):
- - 清理临时文件
- - 清理日志文件(保留近 7 天)
- - 清理 NuGet 包缓存:`dotnet nuget locals all --clear`
- 3. 长期方案:配置日志轮转、扩容磁盘
复制代码 (2)脚本文件:PowerShell脚本
说明:这里主要在Windows系统中执行脚本,所以选择了PowerShell。
脚本1:获取系统基本信息- # check-system-info.ps1 — 获取系统基本信息
- Write-Host "=== 系统基本信息 ==="
- Write-Host "计算机名: $env:COMPUTERNAME"
- Write-Host "操作系统: $([System.Runtime.InteropServices.RuntimeInformation]::OSDescription)"
- Write-Host "处理器架构: $([System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture)"
- Write-Host "逻辑处理器数: $([Environment]::ProcessorCount)"
- $os = Get-CimInstance -ClassName Win32_OperatingSystem -ErrorAction SilentlyContinue
- if ($os) {
- $totalMemGB = [math]::Round($os.TotalVisibleMemorySize / 1MB, 2)
- $freeMemGB = [math]::Round($os.FreePhysicalMemory / 1MB, 2)
- $usedMemGB = [math]::Round($totalMemGB - $freeMemGB, 2)
- $memUsagePercent = [math]::Round(($usedMemGB / $totalMemGB) * 100, 1)
- Write-Host ""
- Write-Host "=== 内存信息 ==="
- Write-Host "总内存: ${totalMemGB} GB"
- Write-Host "已使用: ${usedMemGB} GB ($memUsagePercent%)"
- Write-Host "可用: ${freeMemGB} GB"
- }
- Write-Host ""
- Write-Host "=== 系统运行时间 ==="
- $uptime = (Get-Date) - (Get-CimInstance -ClassName Win32_OperatingSystem).LastBootUpTime
- Write-Host "已运行: $($uptime.Days) 天 $($uptime.Hours) 小时 $($uptime.Minutes) 分钟"
复制代码 脚本2:检查系统磁盘使用信息
[code]# check-disk-usage.ps1 — 检查磁盘使用情况Write-Host "=== 磁盘使用情况 ==="Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType=3" | ForEach-Object { $totalGB = [math]::Round($_.Size / 1GB, 2) $freeGB = [math]::Round($_.FreeSpace / 1GB, 2) $usedGB = [math]::Round($totalGB - $freeGB, 2) $usagePercent = if ($totalGB -gt 0) { [math]::Round(($usedGB / $totalGB) * 100, 1) } else { 0 } $status = if ($usagePercent -gt 90) { "
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |