ARTICLE DETAIL

资讯详情

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

腾讯云上构建全能Agent:AI Skills与基础设施实战指南

腾讯云上构建全能Agent:AI Skills与基础设施实战指南 “全能 Agent”这个词圈内聊得很多但真正跑到生产环境里能稳定干活、不三天两头抽风的其实不多。我不是说框架难选——什么 LangChain、AutoGen、字节的 Coze、微软的 Semantic Kernel各有各的拥趸——而是大部分人把注意力全放在“Agent 怎么编排”上反而忽略了基础设施这一层。尤其是当你要跑一个稍微复杂一点的 Agent比如要接好几个工具、要调用不同的模型、要处理记忆、要定时任务触发你很快就会碰到几个非常现实的问题云服务器怎么配置才稳、API 密钥怎么管理才不乱、模型能力怎么统一切换、Skills 怎么沉淀成可复用的资产。这篇文章我就拿腾讯云当底座把我自己打磨一个可用级 Agent 的完整过程拆开给你看包括 AI Skills 的最佳实践方式希望对你正在折腾的 Agent 项目有点帮助。1. 项目拆解与核心思路1.1 “全能”这个词到底意味着什么先说清楚Agent 说穿了就是“大模型 规划能力 工具调用”的组合体。规划能力目前靠模型本身的推理水平比如 Claude、GPT、DeepSeek 这些工具调用靠 Function Calling 或 MCP 这类协议而 Skills你把它们理解成“预制的技能包”就行——每个 Skill 都是一段精心设计过的提示词、参数说明、工具逻辑甚至包含一段代码它们可以被 Agent 灵活调用。“全能”不是让 Agent 什么都知道而是让它具备处理多种任务的能力链路。比如我的几个典型场景根据一个模糊的项目描述自动生成代码初稿然后跑测试并返回结果报告。定时抓取一批资讯页面抽取结构化信息写进数据库再推送到企业微信。用户用自然语言问某个业务指标Agent 自动写 SQL、查库、解释结果。这三件事看起来天差地别但抽象出来都是同一套逻辑理解指令 → 拆解为子任务 → 调用对应 Skill → 汇总结果。所以我的做法是不为了某一个场景单独造一个 Agent而是把全部能力拆成可复用的 Skills然后用一个调度核心把它们串起来。这个调度核心负责理解意图、选择技能、管理上下文、兜底异常。1.2 为什么底座选腾讯云而不是本地最开始我是在本地 Mac 上跑 Agent 原型的。多轮对话、调几个 API没问题。但一旦接入真实业务三个痛点马上暴露网络环境不稳API 调用超时频繁重试逻辑写多了代码又难看。本地开发机的 IP 经常变出于安全考虑模型服务、数据库、推送服务都要做 IP 白名单烦不胜烦。定时任务必须要有一个 7x24 小时在线的执行环境。所以把底座迁到腾讯云主要是图三点稳定、可控、生态顺手。轻量应用服务器或者 CVM 都可以看你要不要碰 Docker 和 K8s。我自己的配置是 4C8G 的 CVM跑一个 Agent 调度服务 Redis PostgreSQL毫无压力。而且腾讯云安全组规则改起来真的很方便哪个端口开、哪个 IP 能访问图形化界面里点几下就完事不用像传统机房那样还得跟网络管理员申请、审批、排期。1.3 为什么用 AI Skills 而不是“一把梭”式 Agent圈里有个常见误区把一堆工具函数全部塞给 Agent让模型自己选。看起来灵活实际上一旦工具超过十个模型的选择准确率就会明显下降而且每次请求都要把所有工具的描述塞进上下文Token 消耗大得吓人。AI Skills 的思路恰恰相反它把“工具集合 调用方式 触发条件”打包成一个独立单元。Agent 第一层只需要做意图分发然后加载对应的 Skill把上下文交给 Skill 内部逻辑处理。这个分层带来的好处非常直接上下文精简模型理解更准。工具描述不需要全量暴露按需加载。Skill 可以独立迭代、复用、分享。权限控制更清晰每个 Skill 可以绑定单独的密钥和访问边界。所以我才说AI Skills 是 Agent 从“玩具”走向“工具”的关键一步。腾讯云上的 AI Skills 生态给了很多现成的 Skill 模板配置好就能用这一点后面专门讲。2. 环境准备与工具选型2.1 先搞定服务器和基础组件我要在腾讯云上部署 Agent 服务首先选的是轻量应用服务器。具体操作就不赘述了无非是选镜像、设密码、绑定密钥几分钟的事。真正值得花时间的是初始化环境更新系统包Ubuntu 22.04 执行apt update apt upgrade -y。安装 Docker 和 Docker Compose我推荐用官方脚本安装注意别用 Ubuntu 自带源里的老旧版本。安装 Nginx 作为反向代理后面要挂域名和 HTTPS 证书。装一个 Redis用于 Agent 的短期记忆和队列任务缓存。这不是“配置越多越好”而是每个组件都有明确用途。Docker 是为了隔离不同模块比如 Agent 核心、数据库、定时任务器各跑一个容器Nginx 是做流量的统一入口Redis 负责处理会话级的记忆数据。这里给一个我整理过的组件清单组件版本选择用途Docker24.0容器化运行各服务Nginx1.24反向代理与 SSL 终止Redis7.x短期记忆、任务队列PostgreSQL15长期业务数据、用户画像Python3.11Agent 调度核心开发语言Node.js20部分工具脚本与前端面板2.2 域名申请与解析很多 Agent 项目初期只是在本地调试等要对外开放 API 或者接微信/企微回调时域名就绕不开了。如果你不想用裸 IP 暴露服务最好去申请一个二级域名。腾讯云控制台里操作路径是搜索“域名注册”先有一个顶级域名比如 example.com再在解析设置里加一条 A 记录指向服务器的公网 IP主机记录填agent这样agent.example.com就指向你的机器了。二级域名不只是记忆方便更是为了后续接 HTTPS 证书。用 Lets Encrypt 就行免费且有自动续期脚本。腾讯云也有免费的 SSL 证书可以申请在“SSL 证书”控制台里创建验证域名所有权后下载 Nginx 版本证书配置到 Nginx 的server块里。启用 HTTPS 之后你的 Agent API 才不会被运营商或者中间设备干扰。2.3 端口开放和安全组配置关于“如何开放所有端口”我见过太多人一上来就把安全组全部放通图省事结果服务器被扫描、被挖矿、被勒索的案例遍地都是。我的原则是只开业务需要的端口。比如22 端口SSH 管理。建议改成非默认端口并只允许你当前办公出口 IP 访问。80、443Web 和 HTTPS 流量。5432PostgreSQL绝对不建议对公网开放。要用数据库就走 Docker 内部网络或者 SSH 隧道。6379Redis同上不要公网暴露。可以在安全组里只允许本机 IP 或内网 IP 访问并且设置密码这个坑后面单独讲。腾讯云安全组的操作在“防火墙”或“安全组”里规则是即时生效的。每开一个端口都想想它是不是真的需要外部访问。没有公网需求的一律绑到云服务器内网 IP 上。3. 核心实战一步步做一个可复用的 AI Skill3.1 AI Skills 的构建逻辑腾讯云 AI Skills 你可以理解为“云端技能工厂”它的核心思路是把你日常反复在用的一套提示词逻辑、参数定义和工具调用方式固化下来。一个 Skill 通常包含这几个部分触发描述告诉 Agent“什么情况下应该选这个技能”。输入参数定义调用该技能需要哪些变量比如query、limit、format。执行逻辑可以是大模型直接生成的响应也可以是调用外部 API 的代码逻辑。输出格式定义返回给上层 Agent 的结构化内容。我第一次构建 Skill 时容易犯一个错把逻辑做得太复杂什么都能干结果模型经常误触发。后来养成的习惯是一个 Skill 只专注于一个任务类型。比如“代码审查”就是一个 Skill“生成单元测试”是另一个 Skill“运行测试并返回覆盖率”又是另一个。颗粒度更小触发正确率明显上升。3.2 一个案例构建“URL 内容提取”Skill这个 Skill 的需求很常见给 Agent 一个链接Agent 需要抓取网页正文提取关键信息并结构化输出。用腾讯云 AI Skills 来构建步骤如下。首先进入腾讯云开发者平台的 AI Skills 页面点击创建。模板选择“自定义”。Skill 名称写url_content_extractor描述写“提取指定 URL 页面的正文内容去除广告和导航噪音输出标题、摘要和正文纯文本”。在输入参数部分我定义两个字段url类型string必填。max_length类型int选填控制正文最大字符数默认 5000。接着是执行逻辑。这里我选择用 Python 代码块而不是直接让大模型生成长文本理由很实际网页抓取是确定性工作用代码做更稳。我写了一个基础的抓取逻辑用requests获取页面配合BeautifulSoup解析再通过一个简单的正则清理文本噪音。代码大致是这个感觉import requests from bs4 import BeautifulSoup import re def handler(event, context): url event.get(url) if not url.startswith(http): return {error: invalid url} resp requests.get(url, timeout15, headers{ User-Agent: Mozilla/5.0 (compatible; AgentSkill/1.0) }) resp.encoding resp.apparent_encoding soup BeautifulSoup(resp.text, html.parser) for tag in soup([script, style, nav, footer, aside]): tag.decompose() title soup.title.get_text(stripTrue) if soup.title else content soup.get_text(separator\n) content re.sub(r\n{2,}, \n, content).strip() max_length event.get(max_length, 5000) return { title: title, content: content[:max_length], url: url, status: ok }最后配置输出。我让 Skill 返回 JSON 对象包含title、content、url。这样上层 Agent 可以直接引用output.title或者output.content作为后续步骤的输入。这个 Skill 构建完成之后在 Agent 的编排界面里配置“URL 内容提取”为可用技能并在系统提示词里加一句“当用户需要了解某个网页内容时使用技能 url_content_extractor 获取页面内容。”跑几轮测试准确率非常高。而且最大的收益是以后新建别的 Agent只需要把这个 Skill 挂上去不用重新写抓取逻辑这就是复用价值。3.3 Skill 调优上下文窗口与 Token 控制AI Skill 实践中最容易忽略的就是 Token 管理。你以为模型返回 5000 字很爽但整个上下文长度会很快爆掉。我的经验是Skill 的输出不要一股脑全喂给主模型而是要考虑“层级摘要”。比如抓取内容如果正文太长可以先让 Skill 内部用一个小模型比如 DeepSeek 或者混元 Turbo做一次摘要再把摘要返回给上层 Agent而不是返回全文。这么做的好处是既节省 Token又保留核心信息。腾讯云 AI Skills 里其实可以配置是否使用模型后处理也支持在 Skill 代码里直接调用模型 API 做二次加工这个灵活度是够的。另外触发描述写不好Skill 就废了。大模型是根据描述来决策的描述太泛或者太窄都会导致误触发或漏触发。我总结了一个模板当用户需要获取某个网页、文章或链接的内容并进行分析时使用。如果用户直接提供了 URL或者上下文中包含 URL调用此技能。不适用于本地文件读取。这比简单写“网页内容提取”要好很多因为模型能看到更详细的触发条件判别就更准。4. 把 Agent 跑起来部署与流程打通4.1 用 Docker 部署你的 Agent 服务写好的 Agent 调度核心我有一个标准做法容器化。Docker 的好处不只是镜像一致更在于你可以把 Agent 服务、Worker 任务、API 网关拆开部署互不干扰。我的 Dockerfile 大概是这样的基于 PythonFROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [uvicorn, main:app, --host, 0.0.0.0, --port, 8080]构建镜像然后推送到腾讯云容器镜像服务 TCR 上。推送过程其实跟在 Docker Hub 类似但注意要先在腾讯云控制台创建命名空间和镜像仓库拿到仓库地址后执行docker login ccr.ccs.tencentcloud.com -u 你的腾讯云账号ID --password 访问令牌 docker tag agent-core:latest ccr.ccs.tencentcloud.com/命名空间/agent-core:latest docker push ccr.ccs.tencentcloud.com/命名空间/agent-core:latest推送完之后服务器上用docker pull拉下来跑。如果是用轻量应用服务器甚至可以直接在控制台用“镜像”方式部署但我个人更习惯命令行可控性强。4.2 开放端口与反向代理配置Agent 服务在容器内监听 8080 端口外部访问肯定不能直接裸奔。我用 Nginx 做一层反向代理同时绑好之前申请的二级域名server { listen 80; server_name agent.example.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name agent.example.com; ssl_certificate /etc/nginx/ssl/agent.crt; ssl_certificate_key /etc/nginx/ssl/agent.key; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }配置完nginx -s reload再用浏览器访问https://agent.example.com/docs如果你用的是 FastAPI自带 Swagger 文档就能看到 Agent 服务活着。这一步跑通了你就有了一个可以被外部调用的 Agent 入口。4.3 用 LiteLLM Proxy 管理多模型调用一个真正生产级的 Agent 很少只绑一家模型。我的用法是主逻辑用 Claude复杂推理能力强工具调用和轻量任务用 DeepSeek性价比高本地回退模型用 Qwen离线可用。但如果代码里每家 SDK 都写一遍维护成本高得吓人。所以我在中间层架了一个LiteLLM Proxy。它能统一所有模型的调用格式只留一个 OpenAI 兼容的/chat/completions接口后面接什么模型都行。LiteLLM 的配置也有讲究我拆开聊。先创建一个config.yamlmodel_list: - model_name: claude-sonnet litellm_params: model: anthropic/claude-3-5-sonnet-20241022 api_key: os.environ/ANTHROPIC_API_KEY - model_name: deepseek-chat litellm_params: model: deepseek/deepseek-chat api_key: os.environ/DEEPSEEK_API_KEY - model_name: qwen-turbo litellm_params: model: openai/qwen-turbo api_base: https://dashscope.aliyuncs.com/compatible-mode/v1 api_key: os.environ/DASHSCOPE_API_KEY然后用 Docker 跑docker run -d \ --name litellm-proxy \ -p 4000:4000 \ -v $(pwd)/config.yaml:/app/config.yaml \ -e ANTHROPIC_API_KEYsk-ant-xxx \ -e DEEPSEEK_API_KEYsk-deepseek-xxx \ ghcr.io/berriai/litellm:main-latest \ --config /app/config.yaml之后我的 Agent 代码里只需要配一个 base_urlhttp://127.0.0.1:4000模型名写claude-sonnet或者deepseek-chat具体背后是谁LiteLLM 帮我转。如果某个模型 API 挂了我直接在 LiteLLM 配置里切换 fallbackAgent 代码一行不用动。我个人强烈建议所有跑 Agent 的人都接一层 LiteLLM Proxy因为它还顺带解决了 API Key 管理问题Token 只在服务器上配置不会散落到 Agent 配置文件里安全等级高一大截。5. 常见问题与排查技巧实录5.1 修改 Redis 密码后一直重启失败这是我踩得比较深的一个坑。场景描述跟很多网友一样在腾讯云服务器上装 Redis修改了密码之后重启服务结果一直启动失败报错信息让人一头雾水。排查思路分三步第一步看日志。journalctl -u redis-server -n 50如果输出里有# Warning: no config file specified或者Failed listening on port多半是配置路径问题。第二步看权限。Redis 的配置文件如果属主不是redis用户会拒绝启动。执行chown redis:redis /etc/redis/redis.conf修复。第三步看语法。requirepass这行后面如果密码包含特殊字符比如、#有些版本会解析错导致启动失败。解决办法是密码用纯字母数字组合或者用单引号括起来。但最隐蔽的一个坑是你改了密码但 systemd 单元文件里可能使用了 EnvironmentFile而那个文件里存的是旧密码。Redis 服务无法做身份验证和持久化于是进程反复被拉起又崩掉。我的建议是改密码时不要只改/etc/redis/redis.conf检查一下/etc/redis/下有没有其他被 include 的配置文件全部统一。还有一个安全意识改完 Redis 密码后必须立刻重启所有依赖 Redis 的服务否则连接池里旧的连接凭据可能被缓存导致 Agent 读写记忆报错。5.2 Agent 执行突然中断execution terminated due to error这个报错很多做 Agent 开发的人都见过。原因五花八门但我遇到最多的三类超时Agent 内部调用外部 API 没有设置 timeout或者设长了比如 120 秒云端网关先掐断了连接。解决办法是把每个子调用都设置明确的 timeout比如 15 秒让 Agent 快速失败并走重试或降级逻辑。上下文超限对话轮次太多历史记录把 Token 撑爆。我的做法是加一个“滚动摘要机制”当对话超过一定轮数把前面的内容用一个小模型压缩成摘要只保留最近几轮完整对话。工具返回异常代码类工具抛了异常而 Agent 没有捕获导致整条流程崩了。我给每个 Skill 的执行逻辑都包了一层 try-except并强制返回结构化错误信息避免中断上游。5.3 腾讯云注册提示网络环境异常这个不是在服务器上而是很多新用户第一次注册腾讯云时遇到的。控制台提示“您所处的网络环境异常无法进行注册”通常是因为当前网络出口 IP 被风控标记常见于公司共用出口、某些云主机 IP、或者频繁切换地区的动态 IP。解决办法不复杂换成家庭宽带或者手机热点再清一下浏览器缓存尤其不能开隐身模式又叠加代理类插件。注册成功后再回到需要操作的网络环境一般不影响后续使用。我自己帮别人处理过几回基本都是这么解掉的。5.4 端口明明开了外部还是访问不了排查顺序是先看安全组有没有放行 → 再看系统防火墙ufw / firewalld有没有挡 → 最后看服务有没有监听 0.0.0.0 而不是 127.0.0.1。分享一个命令三板斧curl -I http://127.0.0.1:8080 # 本地通不通 ss -tlnp | grep 8080 # 监听地址是什么 ufw status # Ubuntu 防火墙是否放行安全组在腾讯云控制台看系统防火墙用ufw allow 8080/tcp放行监听地址如果是127.0.0.1要改配置为0.0.0.0但搭配 Nginx 反代时保持本地监听反而更安全。要分清楚外部访问走 443Nginx内部服务只需要 127.0.0.1。6. 从“能用”到“好用”的几个进阶实践6.1 给 Agent 加上长短期记忆Agent 的记忆是个容易翻车的话题。我的实现方案是分两层短期记忆天然放 Redis以session_id为 key存最近 N 轮对话。TTL 设置成 30 分钟过期就自动清理避免越积越多。长期记忆存在 PostgreSQL 的user_profile表里存用户偏好、历史任务截图、常驻上下文。每次对话开始时读取对话结束时更新关键字段。这里注意所有写入记忆的数据都走 LLM 先做一轮“情感提炼”比如把用户一句“我还是喜欢简洁的回答”变成结构化偏好verbosity: low不要直接存大段原文。6.2 Agent 安全别让你的 Skill 裸奔在做 Agent 开发时很多人只关注功能忽略安全。比如一个“执行Shell命令”的 Skill如果不做白名单限制Agent 被恶意提示注入后就可能变成一台被远程控制的肉鸡。我的原则是危险操作类 Skill 默认不挂载给普通用户只允许管理员触发。所有 Skill 调用都校验来源身份内部 API 必须携带签名 Token。外部请求进来时先走一层独立的“内容安全过滤”逻辑识别提示注入、越权指令等异常。我自己搭过一个“输入防火墙”本质上就是用一个小模型分类判断用户意图是正常请求还是恶意注入。虽然不能做到 100% 防住但能拦截掉一大批常规攻击。6.3 把 Skill 沉淀进团队资产库最后说一个长期受益的习惯每当我稳定跑通一个 Skill我不会让它只留在自己的 Agent 里而是把它导入团队或者私有仓库打个版本标签写清触发条件和输出结构。这样下一个 Agent 项目要用到同类功能时直接复用不用重新踩一遍坑。腾讯云 AI Skills 在这一块做得不错支持把 Skill 发布到企业空间内共享也可以设置不同的访问权限。团队里其他人用的时候AI 自动匹配最合适的 Skill效果比我单独去教他们写提示词好太多。写在最后从零开始把一个 Agent 项目养起来整个过程最大的体会是真正决定上限的不是某个模型多聪明而是你把周围的基础设施垫得有多稳。腾讯云给我的感受就是省心——安全组、域名、容器镜像、SSL 证书这些东西在控制台里都能快速操作省下来的时间可以更多花在 Agent 本身的规划和 Skill 打磨上。AI Skills 这套玩法也帮我彻底告别了“一个 Agent 一套代码”的低效循环。最后分享一个小技巧每次改动 Agent 或者新增 Skill先在测试环境完整跑一遍核心链路再做配置备份。尤其记得备份 Redis 配置和 Nginx 配置这两样东西出问题的时候最让人头疼。希望我的这些实操经验能帮你少走几个弯路。
返回列表