ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

腾讯云Agent+Skills实战:把聊天式AI养成全能数字员工

腾讯云Agent+Skills实战:把聊天式AI养成全能数字员工 你有没有遇到过这种情况让 AI 查一个 API 用法、写一段营销文案它回答得头头是道可一旦让它独立做完一个任务比如生成一个可运行的前端页面、画出一张准确的技术架构图、把几百个文档里的核心数据整理成表它就开始“一本正经地胡说八道”。原因很简单单纯靠提示词的聊天式 Agent缺少了真实干活需要的“技能”。我最近在腾讯云上做了一个持续迭代的全能 Agent 项目把 Agent、腾讯云、AI、Skills 这四个关键词串成了一条完整链路目标是把只会“纸上谈兵”的对话式模型养成一个能接手重复工作的数字员工。这篇文章不聊虚的把我从框架选型、云环境准备到 Skill 文件编写、API 服务暴露的完整过程以及那些文档里不会写清楚的坑一次性摊开说。如果你想自己动手养一个能写代码、能审代码、能画结构图、能在私有知识库里查资料的全能 Agent又不想只是拿 Web UI 玩两分钟就吃灰这篇实践笔记可以直接当参考手册抄作业。它会帮你节省至少一到两周的试错时间。1. 全能 Agent 到底是什么先拆掉概念滤镜再动手1.1 Agent 的核心结构里Skills 是哪一块拼图我见过不少朋友被 Agent 这个词搞得又兴奋又茫然听起来像个能独立工作的数字员工可实际用起来多数产品不过是包了一层好看的对话框。真正的 Agent 要能感知任务、拆解计划、调用工具、检查结果并在一个循环里反复迭代直到任务完成。如果把 Agent 拆开看它需要三个基础部件大脑也就是大语言模型的推理能力负责理解用户意图、制定步骤手脚也就是被封装好的工具和 API负责执行真实操作比如读文件、请求外部接口、执行代码技能库也就是把某一类工作流沉淀下来的 Skill 集合它让 Agent 不用每次从头推理该怎么干而是能直接照着一套经过验证的流程干活。Skills 恰恰是“纸条上的经验”。打个比方一个新人入职后光靠聪明是不够的他需要一份之前同事留下的“操作手册”里面写清楚了常见需求的处理步骤、禁忌事项和输出格式。Skills 就是给 Agent 的这类操作手册。没有 Skills 的 Agent 像第一天上班的新人什么都能聊两句一碰到具体业务就要反复请示有了 Skills 的 Agent 像干了半年的熟手拿到需求就能按流程产出稳定结果。在腾讯云上我选择的架构是云服务器负责承载 Agent 服务模型接口负责推理文件系统按目录组织 Skills外部 API 全部通过安全组和网关控制访问。这套架构的出发点很简单——我不想让 Agent 只活在陪我聊天的那条命令行里而是希望它能通过 HTTP 接口被其他系统调用成为真正能跑在云上的服务。1.2 为什么在云端“养成”而不是跑在本地笔记本上很多人问我就本地开发为什么非要把 Agent 放到云端去养我的回答通常是你想养一个能干活的 Agent它大概率要处理长时间任务。本地笔记本睡眠、断网、IP 变更、进程被杀任何一个意外都会让任务夭折。而在云上养 Agent几个好处非常明显7x24 小时在线支持异步任务队列可以跑那些需要几分钟甚至更久的批量处理云服务器有固定公网 IP 和域名能接 API 网关方便团队协作和外部调用GPU 实例和大内存实例可以按需升降配跑数据量大的任务时不会把开发机卡死数据文件、Skill 文件、模型日志可以持久化存储不会因为合上电脑就丢状态。我在腾讯云上的实际操作路径是开一台云服务器作为 Agent 的运行底座把代码、模型 API Key、Skills 目录全部放在服务器里再通过一个轻量的 FastAPI 服务把 Agent 能力包装成标准 HTTP 接口。前端同学可以调用这个接口生成页面原型运营同学可以调用另一个接口做批量文档分类。只要接口保持稳定Agent 就从一个“实验玩具”变成了团队能依赖的内部工具。1.3 设定边界全能不等于全自动需要提前泼一盆冷水全能 Agent 不是把提示词写长一点就能实现的。我最终实现的这套体系中“全能”体现在覆盖场景广但每个场景都通过明确的 Skill 和确定的输入输出边界来约束。真正接到复杂需求时Agent 负责的是执行前半段例如生成代码初稿、做信息检索、做格式转换把结果交给人来确认而不是完全甩手不管。这个边界会让成功率高出很多。2. 腾讯云环境准备从一台空机器到能跑 Agent 的底座2.1 机型选择与初始化配置在养 Agent 这件事上很多人的第一个错误是直接奔着最高配置去。实际上先要看任务类型如果主要跑文本推理、调用云端大模型 APICPU 实例就足够如果要在本地跑开源模型做微调或向量化才需要带 GPU 的实例。我在腾讯云上的选择是先用一台轻量级云服务器做原型验证等整体链路跑通之后再评估是否升级。初期配置清单可以参考资源项我的选择说明云服务器2核4G轻量应用服务器跑 FastAPI 服务和轻量任务绰绰有余系统镜像Ubuntu 22.04 LTS生态软件全兼容性好数据存储系统盘 50GB 对象存储 COSSkills 放在系统盘大文件放 COS域名已备案域名 免费 SSL 证书给 API 一个稳定的 HTTPS 入口安全组只放行 22/80/443 和指定服务端口最小化暴露原则不图省事开全部端口初始化系统时我习惯按这套标准流程走一遍。先通过 SSH 登录主机更新软件源然后安装 Docker 和 docker-compose。虽然我最后用 systemd 直接托管 Python 服务但 Docker 主要用于隔离一些临时跑的 Python 脚本比如专门执行 Agent 生成代码的沙箱容器。# 登录云主机后首先是基础环境更新 sudo apt update sudo apt upgrade -y # 安装 Docker用于隔离 Agent 执行的不可信代码 curl -fsSL https://get.docker.com | sudo sh sudo systemctl enable --now docker # 安装 Python 3.11 和 Node.js 18这是大部分 Skill 的执行环境 sudo apt install -y python3.11 python3.11-venv nodejs npm注意Docker 在整个体系里主要用来作为代码执行沙箱。Agent 生成前端代码后要运行npm install和构建命令直接在宿主机跑会有依赖污染和安全风险。放进容器里执行宿主机不会被动过根基。这套经验是从一次事故中得来的早期我直接让 Agent 执行了一个含大量依赖的构建脚本结果它往系统目录里写了一大堆乱七八糟的文件最后只能重置机器重来。2.2 安全组按需放行而不是“开放所有端口”网上会有人告诉你“把安全组设置成 0.0.0.0/0 全放通省得麻烦”。这是一个极其危险的思路。Agent 服务一旦暴露在公网就面临着被扫描和探测的风险尤其当你把 API Key 写在服务配置中时一个配置失误就可能让密钥泄露。我的做法是只放行必要端口并且把 SSH 端口源地址锁定在我的办公网络 IP 上。至少需要放行的端口是22 端口用于 SSH 登录80 和 443 端口用于 HTTP/HTTPS 访问一个自定义高位端口例如 8000作为 Agent API 服务的内部调用端口。如果使用 Nginx 反代也可以只放行 80/443服务端口不直接暴露公网。安全组配置完成后还需要在服务器防火墙层面再确认一遍。腾讯云的安全组相当于云平台外层的门禁Ubuntu 自带的 UFW 是系统内层的门禁。两层都要检查少一层都可能踩坑。我曾经遇到过安全组已经放行 8000 端口但外部依然无法访问的情况排查半天才发现是 UFW 没开放对应端口直接把请求挡在了门外。2.3 域名与 HTTPS给小 Agent 一个稳定入口没有域名的 Agent 服务也能用公网 IP 访问但后续你会遇到不少麻烦IP 变更导致前端配置失效、明文 HTTP 传输在部分浏览器中被拦截、无法在某些即时通信平台中让回调地址稳定触发。所以最好像我一样把服务放到了一个域名下。域名解析本身不复杂进入腾讯云 DNSPod 控制台添加一条 A 记录将 API 子域指向云服务器公网 IP。等解析生效后用 Caddy 或 Nginx 做反向代理并自动申请证书。这里我推荐 Caddy因为 Caddy 会在配置里自动完成 HTTPS 证书申请和续期免去了手动管理证书的麻烦。# Caddy 配置文件示例 agent.example.com { reverse_proxy 127.0.0.1:8000 }把上面的内容写入 Caddyfile然后启动 Caddy 即可。Caddy 会自动申请证书并维持 HTTPS。此时你的 Agent 服务就有了一个稳定的加密入口后面的 API 调用都可以基于这个域名进行。2.4 模型接口的准备云端大模型 API 比本地模型更适合快速迭代Agent 的推理能力来自大模型接口。我在腾讯云上主要使用混元大模型的 OpenAI 兼容接口同时也测试过通过兼容网关接入 DeepSeek、通义千问等。这里有一个很关键的实践建议立项初期不要纠结于“必须用某个家的最强模型”而应该把调用层抽象成 OpenAI 风格接口这样随时可以切换不同模型做对比测试。模型选择对 Agent 整体成功率的影响非常大但具体选哪家取决于你的场景。我的经验是代码生成类场景优先选择代码能力强的模型长文档分析场景优先选择上下文窗口大、检索能力强的模型如果要在本地离线跑再考虑开源模型部署。初期多备几个 API Key做一个简单的模型路由配置。例如在config.yaml中维护以下内容models: code_model: provider: tencent model_name: hunyuan-code api_base: https://api.hunyuan.cloud.tencent.com/v1 chat_model: provider: openai_compatible model_name: gpt-4o-mini api_base: https://api.openai.com/v1这样切模型只需要改配置不需要改 Agent 核心代码。3. Skills 的设计规范让 Agent 从“会聊天”到“会干活”3.1 参考 Claude Code Skills 的目录结构Skills 的概念在 Agent 生态中越来越普及Anthropic 官方发布的 Claude Code Skills 文档算是一个标准参考。它的核心思想很简单把技能定义成一个带元信息的 Markdown 文件目录Agent 在启动时扫描这些目录就能知道它拥有哪些技能。我在腾讯云实践时参考了 Claude Code Skills 的目录设计并结合自己的项目需求做了简化。一个典型 Skill 目录结构如下/workspace/agent/skills/ └── frontend-builder/ ├── SKILL.md ├── templates/ │ ├── basic.html │ └── admin.html └── assets/ └── style.cssSKILL.md 是核心里面用 YAML front matter 写了技能的 name 和 description正文则写清楚使用该技能时应该遵循的步骤。模拟官方格式的最简版本是--- name: frontend-builder description: 根据用户描述生成一个可直接在浏览器打开的前端页面。 --- # Frontend Builder Skill ## 步骤 1. 提取用户对页面功能、风格、布局的需求。 2. 优先复用 templates 目录下的模板文件。 3. 生成后必须在本地用浏览器预览检查脚本报错。 4. 最终交付单个 html 文件路径写入 output/ 目录。 ## 禁忌 - 不要使用需要后端服务的接口除非用户明确说明。 - 不要生成内联的 eval 代码。这个文件的价值在于Agent 不需要每次从零设计流程。它扫描到description后看到用户需求和 frontend-builder 匹配就会加载正文的步骤。对模型来说步骤越具体执行越稳定。3.2 一个 Skill 应该包含哪些信息才不容易翻车我在编写 Skills 时总结了一套完整性原则总共六个字段缺一不可name技能的短名称尽量用英文小写和中划线description说明技能适用场景写清楚什么时候用、什么时候不用描述要包含足够的触发关键词但又不要过于宽泛步骤核心的执行流程必须按顺序编号步骤粒度尽量小每个步骤只交代一个动作输入要求告诉 Agent 在执行前需要确认哪些输入信息不满足时应该向用户反问输出规范包括交付文件的路径、格式、命名规则避免 Agent 随意发挥禁忌清单把历史踩过的坑写进去例如“不要在未备份的情况下覆盖已有文件”。我见过很多人写 Skill 时只写了简单的“你会做XX”几句话效果很差。因为描述性知识无法约束模型行为模型需要的是可执行的操作序列。你在 Skill 中写“认真检查代码”它不知道“认真”是什么你写“必须在 Node 18 环境运行 npm run build如果构建失败截取最后 10 行错误日志并针对性修复”它就知道自己该怎么做了。3.3 Skill 的粒度怎么把握拆小而非凑大“全能 Agent”不代表你只要写一个大而全的 Skill把前端、后端、架构图、文档检索全部堆进去。我最初犯过的错误就是试图写一个“开发助手终极版”的 Skill结果每次调用模型都不知道该走哪条分支输出结果混乱不堪。后来我把大 Skill 拆分成了 10 多个小 Skill每个只负责一个明确领域效果立刻提升。用表格来呈现我自己维护的技能分类Skill 名称场景核心能力frontend-builder生成页面原型HTML/CSS/JS 组装code-reviewer代码审查检查安全、性能、可维护性问题structure-diagram架构图/拓扑图生成生成 Graphviz DOT 或 SVGdoc-searcher私有知识库检索文档解析、关键词定位、摘要生成># agent_service.py —— 精简版示意 from fastapi import FastAPI, HTTPException, Header from pydantic import BaseModel import openai import yaml app FastAPI() class AgentRequest(BaseModel): skill: str task: str def load_skill(skill_name: str) - str: skill_path f/workspace/agent/skills/{skill_name}/SKILL.md try: with open(skill_path, r, encodingutf-8) as f: return f.read() except FileNotFoundError: raise HTTPException(status_code404, detailSkill not found) def call_llm(system_prompt: str, user_prompt: str) - str: client openai.OpenAI( api_keyyour-api-key, base_urlhttps://api.hunyuan.cloud.tencent.com/v1 ) resp client.chat.completions.create( modelhunyuan-code, messages[ {role: system, content: system_prompt}, {role: user, content: user_prompt} ], temperature0.2 ) return resp.choices[0].message.content app.post(/api/agents/run) async def run_agent(req: AgentRequest, authorization: str Header(None)): if authorization ! Bearer your-secret-token: raise HTTPException(status_code401, detailInvalid token) skill_content load_skill(req.skill) result call_llm(skill_content, req.task) return {status: success, result: result}这个服务的代码量不大但把一个关键问题解决了Skills 内容被放在系统提示词中模型在执行时会严格遵循 SKILL.md 里的步骤。用户不需要在请求中重复告诉 Agent 怎么干活只需要说“用 frontend-builder 生成一个登录页”服务端就会自动把该技能的详细步骤附加进去。5.3 调用链路的安全与权限控制Agent 对外提供服务之后权限控制成了最重要的事。如果任何人都能向你的服务发送请求攻击者就能滥用你的模型接口产生大量费用甚至通过构造恶意提示词让你的 Agent 执行危险的系统命令。我在前面代码中已经用了简单的 Bearer Token 做鉴权。如果团队比较大建议升级到腾讯云 API 网关由网关做统一的签名校验和限流。生产环境我建议做三层防护云安全组只放行 80/443API 网关做签名校验未通过签名的请求直接拒绝应用层再做一次鉴权并针对每个调用方配置独立的 API Key。同时对 Agent 可能执行的命令做白名单控制。如果 Agent 能直接在服务器上执行任意 shell 命令相当于把一个能写代码的 AI 放进了你的生产环境风险是非常高的。我的做法是代码执行类操作全部放到 Docker 容器内容器没有挂载宿主机的敏感目录只挂载一个专门的工作目录。这样即使 Agent 的代码生成结果有安全漏洞也不能直接访问宿主机上的 SSH 私钥和数据库配置。5.4 长时间任务怎么处理队列化与回调Agent 执行复杂任务时一个 HTTP 请求可能十几秒甚至几分钟都完成不了。直接用同步请求很容易在网关层超时。我在实践后采用了异步任务模式客户端提交任务后服务端立刻返回一个task_idAgent 在后台线程或独立 worker 中执行任务执行完成后通过回调 URL 通知客户端或者让客户端轮询结果接口。# 异步任务接口示意 from fastapi import BackgroundTasks app.post(/api/agents/async_run) async def async_run(req: AgentRequest, background_tasks: BackgroundTasks): # 生成一个唯一的 task_id 并保存任务状态 task_id str(uuid.uuid4()) task_store[task_id] {status: running, result: None} background_tasks.add_task(run_agent_in_background, task_id, req) return {task_id: task_id, status: running} app.get(/api/agents/task/{task_id}) async def get_task(task_id: str): task task_store.get(task_id) if not task: raise HTTPException(status_code404, detailTask not found) return task第一次我把任务跑在后台线程里后来任务量增大我就把它拆成了独立的 worker 进程配合 Redis 做任务队列。如果你的团队规模不大后台线程就能扛住最初的需求当并发请求上来后再平滑迁移到队列方案。6. 常见报错与排查经验我踩过的坑你直接避雷6.1 Skills 加载不上Agent 表现像失忆症状Skill 文件明明写好了但 Agent 在执行任务时完全不按 Skill 里定义的流程走像是根本不知道有这个文件存在。原因通常是以下三种Skill 目录路径配置不对Agent 服务读取的不是你以为的那个路径SKILL.md 里的 front matter 有格式错误yaml 解析失败导致技能被跳过模型一次能接收的上下文有限当系统提示词太长时Skill 内容被截断。排查思路是先打开服务日志确认收到请求后服务端是否打印了“Skill loaded: xxx”如果没有就要检查路径和 yaml 格式。我强烈建议在加载 Skill 后立刻将 Skill 名称和字符数打印到日志中这样能快速确认加载是否成功。一个小技巧把 Skill 的description写得和用户请求高度相关可以明显提升模型主动加载 Skill 的概率。例如description里写“当用户要求生成架构图、拓扑图、流程图时使用”比只写“structure-diagram”要有效得多。6.2 Agent 执行到一半超时或报 “agent execution provider did not respond in time”这个报错我在各种 Agent 框架中见过太多次了。字面意思是 Agent 在执行过程中没有得到某个执行提供者的及时响应。出现它通常不是你的代码问题而是任务链条中超时配置太短或者模型调用本身太慢。我处理超时问题的三步法检查是否是因为单次模型调用时间过长把超时时间从 30 秒调整到 120 秒判断是不是任务步骤太多把任务拆小让 Agent 每轮只做一件小事检查模型 API 是否出现限流限流往往是这类报错的隐藏原因。我遇到最多的情况是模型输出过长被截断。比如让 Agent 生成一个完整页面时输出 token 达到上限响应被中断。解决方案是把输出任务改成“分步写文件”先写 HTML再写 CSS 和 JS最后合并。不要指望一次生成 5000 行代码让 Agent 分模块生成既避免超时又能让每个模块都更可控。6.3 安全组端口放行了但从外网依然访问不了腾讯云安全组放行 8000 端口后公网依然无法访问这是新手最容易碰到的组合问题。我梳理出的完整检查顺序是检查项操作服务是否在监听ss -tlnp | grep 8000腾讯云安全组规则确认入站规则放行TCP:8000系统防火墙 UFWsudo ufw status进程是否绑定 0.0.0.0检查 App 启动参数不要绑定 127.0.0.1有一个隐蔽的坑是FastAPI 默认启动时绑定的地址可能是127.0.0.1等于只能本机访问。我在正式启动时使用了uvicorn agent_service:app --host 0.0.0.0 --port 8000加上--host 0.0.0.0才能让外部流量进入。如果你用 Docker 启动服务还需要注意端口映射-p 8000:8000。6.4 API Key 泄露事件一次日志引发的教训有一段时间我把所有模型调用的请求体打到了日志里包括系统提示词和用户输入。表面是为了调试方便结果有一次日志文件被导出后内部审核发现里面有模型 API Key 的明文。幸好在腾讯云控制台及时发现并重置了密钥没有造成实质损失。从那以后我做了三件事所有密钥只保存在环境变量或独立的密钥管理文件中代码日志中禁止打印请求头在日志输出前加一层脱敏函数用正则替换掉 Key 字段云账号开启二次验证和异地登录提醒。如果你是个人开发者自己用你可能觉得这些措施麻烦。但当你把 Agent 部署到云上并且允许团队使用时这些安全习惯是必须养成的。Agent 处理的数据越敏感安全投入就越必要。6.5 模型输出的结果里有幻觉内容怎么降低概率即使有了 Skill 约束模型在文档检索场景中还是有概率输出编造的内容。例如让 patent-assistant 整理某技术方案的有益效果时模型可能把“能提高效率 30%”这种没有依据的数字直接写进去。幻觉问题在 Agent 落地中几乎无法彻底消除只能通过机制设计来抑制。我采用的方法是在 Skill 中显式增加“数据真实性要求”例如要求所有量化数据必须来自输入文档原文如果原文没有提供填写“待验证”而不是凭空编造。同时在输出层加了一个校验步骤让模型自己检查一遍输出内容是否都有文档依据。这个“自查”步骤虽然在推理成本上会多花一点时间但能显著降低幻觉引起的错误。另外给 Agent 检索用的文档也要做结构化切片。不要把整本几百页的技术文档一股脑塞进上下文而应当先按标题或段落做切片再用关键词匹配或向量检索的方式只把相关片段注入提示词。文档切片的质量直接影响输出质量这一步不能偷懒。写在最后的一点实际操作体会把 Agent、腾讯云、AI、Skills 这套组合真正跑通之后我最大的体会是一个 Agent 是否“全能”不取决于底层模型有多么聪明而取决于你是否给它准备了一套边界清晰、步骤完整的技能库。模型本身是通用推理引擎Skills 才是让它适应具体领域的最佳途径。如果要把这个项目继续往下推我建议你先从一个最常用的场景切入不要一开始就试图覆盖所有任务。把单个 Skill 打磨到能稳定交付结果再逐步扩展。另外别忘了定期检查云端服务的日志和安全配置保持“小步快跑、随时回滚”的节奏这样你养的 Agent 才能真正从玩具变成生产力工具。
返回列表