尧图精选

腾讯云AI Skills实战:让Agent从对话到执行的能力跃迁

🕒 发布时间:2026/9/8 4:03:34 📁 来源:尧图网络
开篇先交代一个背景我最近在腾讯云上把一个只会“聊天”的 Agent 逐步改造成了能真正干活的“全能选手”。整个过程踩了不少坑也把 AI Skills 这套机制从头到尾摸了一遍。这篇文章不是官方文档的复述而是我从选型、编码、部署到线上调优的完整记录希望给正在折腾 Agent 开发的朋友一条更顺的路径。先说结论Agent 的价值不在于“会说话”而在于“能办事”。而 AI Skills 就是让 Agent 具备办事能力的关键机制——它把模型推理和工具执行解耦让 Agent 可以根据用户意图动态选择并编排一系列可复用的能力模块。这篇文章适合三类人一是刚接触 Agent 开发、想搞清楚 Skills 到底是什么的初学者二是已经跑通 Demo、想在腾讯云上做正式部署的开发者三是想优化现有 Agent 性能、减少 token 消耗和提升响应速度的进阶玩家。1. 先想清楚你的 Agent 为什么需要 Skills很多人在开发 Agent 时会陷入一个误区——一上来就研究 Prompt 怎么写、模型怎么调结果做出来的东西只是个“高级聊天机器人”。用户问一句模型回一段看起来挺聪明但真让它去查数据库、调 API、操作文件就完全不会了。原因很简单大模型本身不具备执行能力它只能生成文本。你问它“帮我查一下这个域名的解析记录”它能给你一段 dig 命令但不会真的去执行。1.1 从“对话”到“行动”Agent 的能力跃迁传统对话系统解决的是“理解”和“生成”问题而 Agent 要解决的是“行动”问题。行动意味着什么意味着 Agent 需要感知外部环境、调用外部工具、处理执行结果并根据结果决定下一步动作。这是一个完整的闭环缺了任何一个环节Agent 都只是“纸上谈兵”。要实现这个闭环最原始的做法是把工具调用直接写死在代码里——if 用户说查天气调用天气 APIif 用户说发邮件调用邮件接口。这种硬编码方式在小规模场景下勉强可用但一旦工具数量增加代码就变成一团乱麻。更致命的是它完全依赖开发者预先穷举所有场景用户的需求稍一变种Agent 就懵了。AI Skills 的出现就是为了解决这个问题。它的思路是把“能力”抽象成独立可复用的模块每个 Skill 封装好执行逻辑、参数定义和触发条件Agent 在收到用户请求后根据意图动态选择合适的 Skill 并编排执行顺序。这就像给 Agent 一个工具箱它自己决定用什么工具、按什么顺序用而不是每换一个工具就重新造一把。1.2 理性评估哪些场景真正适合上 Skills我见过不少人把 Skills 用在不该用的地方。一个简单的 FAQ 问答根本不需要 Skills直接用 Prompt 就能解决但一个需要“查询订单 → 判断状态 → 发起退款 → 通知用户”的多步骤任务纯对话就完全搞不定。结合我这段时间的实践以下场景特别适合引入 AI Skills多步骤业务流程需要串联多个 API 调用且步骤之间有依赖关系需要外部数据支撑的决策Agent 不仅要回答还要基于实时数据给出结论工具链复杂且持续增长业务方会不断新增或调整工具需要灵活的扩展机制要求可观测和可回溯每一步执行都要有日志、有中间结果方便排查问题反过来如果只是简单问答、内容生成或者用户意图非常单一没必要强行上 Skills——那样只会增加系统复杂度响应也会变慢。技术选型永远是从业务需求倒推不是为了炫技而引入更重的架构。2. Skills 机制拆解Agent 是怎么“长出手脚”的我在做开发时有个习惯不管用哪个平台、哪套框架一定要先弄清楚底层机制否则出了问题只能瞎猜。Skills 这套机制看起来是个“黑盒”但拆开看其实并不复杂核心就三块能力描述、参数契约、执行引擎。2.1 Skill 的三个核心要素描述、参数、执行体先看能力描述。模型需要知道“这个 Skill 是干什么的”才能决定什么时候调用它。所以每个 Skill 都要有一个清晰的描述文本而且描述质量直接影响触发准确率。我测试过两种写法效果差距很大# 质量一般的描述 查询订单状态 # 质量较好的描述 根据用户提供的订单号查询物流流转状态适用于用户询问“我的货到哪了”“订单什么情况” 以及“快递为什么还没到”等场景返回包含最新物流节点、时间、地点的结构化信息第二种描述提供了触发场景举例模型更容易理解这个 Skill 的适用边界误召回率明显降低。再说参数契约。每个 Skill 需要定义自己接收哪些参数、参数类型是什么、哪些必填哪些选填。这就像函数的签名契约清楚了模型才知道该怎么填参数。我在定义参数时一般用 JSON Schema一是通用性好二是可以自动做参数校验。最后是执行体。这是 Skill 真正干活的部分就是一段普通的后端代码接收参数、调用外部服务或数据库、返回结构化结果。执行体只关注“怎么执行”不关心“什么时候执行”这个决策交给 Agent 的大脑。2.2 Agent 的决策循环意图识别、Skill 选择、执行反馈Skill 只是零件真正让零件转起来的是 Agent 的决策循环。我在架构设计时把它拆成了四个阶段意图解析接收用户输入结合对话历史提取关键实体和用户目标Skill 匹配根据意图从 Skill 库中检索候选 Skill用相似度或规则进行排序执行编排确定 Skill 的执行顺序和参数映射处理 Skill 间的数据依赖结果综合收集执行结果生成最终回复必要时触发下一轮决策这个循环不是一次性的而是持续迭代的。比如用户说“帮我查一下昨天订单的物流再问一下卖家什么时候补发”这涉及两个 Skill查询物流和发送消息。Agent 需要先执行查询拿到物流信息后再把信息组装成消息发送出去。每一步的执行结果都会影响下一步的决策这就是所谓“全能”的本质——不是模型全能而是决策循环加工具集让它显得全能。2.3 上下文窗口管理为什么 Skill 越多token 消耗越是灾难这是我在实践中最头疼的问题。Skill 的描述、参数 Schema 都要塞进上下文里模型才能知道怎么用。当一个 Agent 挂载 10 个、20 个 Skill 时光 Skill 定义就会占掉大量 token。如果用的是长上下文模型虽然塞得下但成本高、响应慢如果上下文有限Skill 定义太多还会导致模型“记不住”用户真正的问题回答质量直线下降。我的解决方案是动态 Skill 加载。不把所有 Skill 的定义一股脑塞进上下文而是先根据用户问题做一次粗粒度召回只把最相关的 3~5 个 Skill 加载进上下文。具体做法是给每个 Skill 建一个语义索引用户问题进来后先用向量检索或关键词匹配找出候选集然后只对候选集做细节拼接。这样既保证了调用的准确性又不至于把上下文窗口撑爆。加载方式优点缺点适用场景全量加载逻辑简单不会漏token 消耗大响应慢Skill 数量少≤5个全量加载摘要比全量省 token摘要可能遗漏细节Skill 数量中等5~10个检索式动态加载token 省、扩展性好需要维护索引有召回风险Skill 数量多10个如果做检索式动态加载有个细节必须注意召回阶段的质量评估。我一开始用简单的关键词匹配结果用户换个说法就召回不到正确 Skill后来改成向量检索效果好了很多。核心指标看召回率和误召回率——召回率低会导致 Agent 明明有对应能力却不用误召回率高则会让模型在无关 Skill 上消耗注意力。我自己定的目标是召回率不低于 95%误召回率控制在 10% 以内达不到就调整索引策略或 Skill 描述。3. 落地腾讯云云资源规划与开发环境搭建纸上谈兵讲完了接下来是实操。我选择腾讯云作为部署平台有几点考虑一是云服务器和容器服务在同账号内网互通延迟低二是腾讯云的开发者生态和文档比较友好对国内开发者来说网络访问也更稳定三是对象存储、数据库等配套产品线完整后续扩展方便。下面是我的完整搭建过程。3.1 服务器选型与镜像配置第一步是确定服务器规格。Agent 服务的资源消耗主要取决于三块模型调用的网络 IO、Skill 执行的计算逻辑、以及并发请求数。我当时的预估是初期并发不高但 Skill 里有一些数据处理逻辑比较吃 CPU所以配置选了腾讯云轻量应用服务器 2核4G跑 Linux 镜像。这个配置在开发阶段完全够用后续如果并发上来再升级到更高规格。镜像选择上我用的 Ubuntu 22.04 LTS。腾讯云后台可以直接选公共镜像非常方便。创建实例时记得在安全组里放行自己需要用的端口比如后端服务用的 8080、SSH 用的 22。我习惯把常用端口控制在最小暴露面只用 SSH 密钥登录不用密码安全性和便利性都能兼顾。服务器起来之后第一件事是检查系统环境# 更新系统包 sudo apt update sudo apt upgrade -y # 安装基础工具 sudo apt install -y git curl vim python3-pip # 验证 Docker 环境如果计划用容器部署 docker --version开发语言我选的是 Python主要是生态成熟Agent 相关的 SDK 和框架几乎都是 Python 优先。3.2 外网访问准备域名解析与对象存储选型Agent 服务上线后用户要从公网访问这就需要域名和 HTTPS。腾讯云提供免费 SSL 证书申请但前提是你得有一个已经完成备案的域名。这里有个关键点如果你用的是国内地域的服务器域名必须备案才能解析访问否则你会遇到“网络环境异常无法访问”之类的问题。如果你目前没有域名又想在开发阶段快速验证可以买一台境外地域的轻量服务器临时用——但这里说的境外只是为了绕开备案流程不涉及任何网络代理或加速工具的使用。我个人建议正式项目还是用国内地域加备案域名合规性和访问速度都有保障。对象存储方面如果你的 Skill 涉及文件上传、图片处理或数据备份建议直接用腾讯云 COS。它的 SDK 很完善Python 几行代码就能对接from qcloud_cos import CosConfig, CosS3Client secret_id 你的SecretId secret_key 你的SecretKey region ap-guangzhou config CosConfig(Regionregion, SecretIdsecret_id, SecretKeysecret_key) client CosS3Client(config) # 上传文件 with open(agent_log.txt, rb) as f: response client.put_object( Bucketyour-bucket-1250000000, Bodyf, Keylogs/agent_log_20250101.txt )使用 COS 时一定注意权限最小化原则不要用带整个账号权限的密钥。我专门为 Agent 服务创建了一个子账号只授权对应的 Bucket 读写权限这样即使密钥泄露影响面也可控。3.3 开发环境中的依赖管理与环境隔离项目开发中依赖管理最容易乱尤其是 Python 项目一不小心就版本冲突。我的做法是每个 Agent 项目都建独立虚拟环境并把依赖清单写进两个文件requirements.txt和requirements-dev.txt。前者是生产环境运行时需要的依赖后者是开发调试时需要的额外工具。另外一个经验是尽量锁定依赖版本。requirements.txt里不要用numpy1.20这种写法要精确到numpy1.26.4。否则今天能跑的项目过三个月依赖升级后可能就没法运行了。线上出问题最怕的就是“它能跑你跑不起来”锁定版本能从根源上避免这种问题。4. 核心实现从 Skill 定义到完整调用链路环境准备好之后开始写核心代码。这一节我会用一个真实案例——订单物流查询与通知 Agent完整演示 Skill 的定义、注册、调用和结果回传。这个案例覆盖了 Skill 开发最常见的场景直接照着改就能用到自己的业务里。4.1 用 JSON Schema 定义 Skill 参数契约先定义 Skill 的参数结构。订单查询需要两个参数订单号和用户 ID其中订单号必填用户 ID 用于鉴权和查询范围限制。{ name: query_order_logistics, description: 根据订单号查询物流流转信息适用于用户询问订单状态、物流进度等场景, parameters: { type: object, properties: { order_id: { type: string, description: 订单号必填 }, user_id: { type: string, description: 用户ID用于校验订单归属 } }, required: [order_id, user_id] } }这个 Schema 会被封装成模型能理解的工具定义模型根据用户输入自动提取参数值。参数描述写得越清楚模型提取就越准。比如user_id是“用于校验订单归属”模型就知道它是鉴权用的不会瞎传。4.2 Skill 注册与集成如何让自己的能力被 Agent 发现参数契约只是 Skill 的“说明书”真正要让 Agent 能用还得把 Skill 注册到运行时中。不同 Agent 框架的注册方式略有差异但核心逻辑是一样的。我在项目中用的注册方式大概是这样from agent_sdk import AgentRuntime, Skill class QueryOrderLogisticsSkill(Skill): def __init__(self): super().__init__( namequery_order_logistics, description查询订单物流状态返回最新物流节点信息, parameters_schemaquery_order_schema ) async def execute(self, parameters: dict): order_id parameters.get(order_id) user_id parameters.get(user_id) # 校验订单归属 order await db.query_order(order_id, user_id) if not order: return {status: error, message: 订单不存在或无权访问} # 查询物流轨迹 traces await logistics_api.query_traces(order_id) return { status: success, order_id: order_id, latest_trace: traces[-1] if traces else None, all_traces: traces } # 注册到运行时 runtime AgentRuntime() runtime.register_skill(QueryOrderLogisticsSkill())execute方法是 Skill 的核心逻辑接收参数、执行业务动作、返回结构化结果。返回值一般用字典格式方便 Agent 后续组装回复。这里要注意Skill 执行过程中最好不要有需要用户确认的交互步骤所有参数应该由 Agent 在调用前通过多轮对话收集完整。4.3 多轮对话中的 Skill 调用与状态保持Agent 不是一次调用就完事它需要在多轮对话中记住用户的需求并在合适的时机触发 Skill。比如用户先说“帮我查一下订单”Agent 会反问“订单号是多少”用户回复订单号后Agent 再触发查询 Skill。这中间的“上下文保持”是关键。我调试时得出的最佳实践是把对话历史作为上下文传给 Agent 的推理模型同时维护一个“待填充参数槽位”的状态。当 Skill 所需的参数缺失时Agent 主动通过对话向用户收集而不是强行用空值调用。槽位全部填满后再执行 Skill能显著减少错误调用和无效响应。# 槽位维护示例 slot_status { order_id: {filled: False, value: None}, user_id: {filled: True, value: user_123} } # 当所有必填参数填充完毕时才会触发执行 if all(slot[filled] for slot in slot_status.values()): result await skill.execute( {k: v[value] for k, v in slot_status.items()} )这种设计还有一个好处如果用户在对话中途切换了话题Agent 可以自然放下未完成的槽位不用一直纠结之前没填完的参数。4.4 执行结果回传与异常处理Skill 执行完成后结果要回传给 Agent 的推理层由它决定如何组织最终的用户回复。我的做法是结果中同时包含状态码、业务数据和可读消息方便 Agent 直接引用return { status: success, data: { order_id: ORD20240801001, percentage: 65, location: 广州转运中心, eta: 2024-08-03 18:00 }, message: 您的订单正在发往广州转运中心预计明天下午六点前送达 }异常处理上我总结出一个原则Skill 内部异常不要直接抛给用户。外部 API 超时、数据库连接失败这些情况要在 Skill 内部捕获并映射成业务层面的错误信息返回让 Agent 以友好的方式告知用户同时保留原始异常日志供开发排查。否则用户会看到一段技术味十足的错误堆栈体验非常差。5. 部署上线Docker 镜像构建与腾讯云容器服务推送本地开发跑通后接下来的问题是怎么把这个 Agent 服务稳定地部署到腾讯云上这一步我强烈建议用 Docker 容器化。容器化的好处不用我多说——环境隔离、依赖打包、一键启动、集群扩展都是未来线上稳定运行的保障。下面是我完整的镜像构建和推送流程。5.1 使用腾讯云镜像加速与 Dockerfile 编写国内访问 Docker Hub 的速度时快时慢尤其是拉取基础镜像时一个几十 MB 的镜像可能要等半天。腾讯云容器镜像服务提供了镜像加速能力配置一次之后拉取速度会有明显提升。具体地址和方式在腾讯云的控制台里都有指引按说明配好即可。接下来是 Dockerfile 的编写。我的项目结构比较清晰依赖清单在requirements.txt里主程序入口是app.py一个典型的 Dockerfile 长这样FROM python:3.10-slim WORKDIR /app # 先复制依赖文件利用 Docker 缓存 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 再复制代码 COPY . . # 对外开放的端口 EXPOSE 8080 # 启动命令 CMD [python, app.py]有个小技巧值得分享requirements.txt的复制放在代码复制之前这样只要依赖没变重新构建时 pip install 那一步就会命中缓存构建速度快很多。如果你的代码变更频繁这个优化能节省大量时间。5.2 镜像构建与推送到腾讯云容器镜像服务的完整过程镜像构建好之后要推到腾讯云的镜像仓库。先把镜像打上远端仓库的标签然后登录、推送流程如下# 构建镜像 docker build -t my-agent:latest . # 登录腾讯云镜像服务密钥需要提前在控制台创建 docker login --username你的腾讯云账号ID ccr.ccs.tencentyun.com # 打标签 docker tag my-agent:latest ccr.ccs.tencentyun.com/my-namespace/my-agent:latest # 推送 docker push ccr.ccs.tencentyun.com/my-namespace/my-agent:latest推送完成后可以在腾讯云容器镜像服务的控制台里看到镜像。这里建议把镜像版本打上明确的标签比如v1.0.0或20250801不要一直用latest否则回滚时会搞不清楚线上到底是哪个版本。5.3 云主机拉取镜像并运行网络策略与启动参数镜像推送到仓库后在腾讯云服务器上拉取并运行docker pull ccr.ccs.tencentyun.com/my-namespace/my-agent:v1.0.0 docker run -d \ --name my-agent \ --restart always \ -p 8080:8080 \ -e API_KEYyour-api-key \ -e MODEL_NAMEyour-model \ ccr.ccs.tencentyun.com/my-namespace/my-agent:v1.0.0--restart always很重要服务器重启后容器会自动拉起不用手动干预。环境变量通过-e注入避免把密钥写死在镜像里。如果你用的是腾讯云的容器服务还可以配置更细粒度的服务发现、负载均衡、弹性伸缩但前期跑一个容器实例快速验证的话用云服务器加 Docker 是最轻量的方案。5.4 HTTPS 配置与反向代理Agent 服务对外提供接口一定要走 HTTPS。直接在 8080 端口裸奔非常危险请求内容可能会被中间人窃听用户传来的会话数据和业务数据都有泄露风险。我的做法是用 Nginx 作为反向代理把 443 端口的 HTTPS 流量转发到 8080 的容器端口。server { listen 443 ssl; server_name api.example.com; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; 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; } }SSL 证书用腾讯云免费的 DV 证书就够了申请后下载 Nginx 格式的证书文件按上面的配置填好路径即可。如果遇到百度爬虫抓取报错或者移动端访问异常先检查证书链是否完整再检查 Nginx 配置是否正确加载了证书。6. 线上运行的排障实战我从踩坑中总结的经验服务上线只是开始真正的考验是运行时的问题排查。这一节我把实际运维中遇到的典型问题整理出来每一个都是我亲手踩过、反复定位过的。6.1 服务启动失败日志里没有任何错误信息第一次部署时我用 Docker 启动容器发现容器启动后立刻退出了。第一时间docker logs看日志结果什么输出都没有。这种感觉最让人抓狂——不是报错而是“无信息可用”。排查链路是这样的先确认 Dockerfile 的启动命令python app.py是否能直接在前台运行。因为 Docker 容器必须有一个前台进程跑着如果代码里只是加载模型后就退出了容器就会立即终止。我检查后发现app.py里加载模型用了异步方式但没有正确阻塞主线程导致主进程跑完就退出了。解决办法是在代码里加一个定时健康检查任务保持主进程存活import asyncio async def health_check(): while True: await asyncio.sleep(30) logger.info(Agent service is still alive...) if __name__ __main__: asyncio.run(health_check())如果主进程本身没问题再排查是不是端口被占用、环境变量缺失、工作目录不对等原因。一个高效的做法是进入容器内部手动执行启动命令看具体的运行情况docker run -it --entrypoint /bin/bash 镜像ID python app.py这样能看到真实的前台输出比盲猜快很多。6.2 内存持续增长Skill 执行中资源泄漏的定位与修复服务运行平稳后我又发现一个新问题容器内存占用持续增长运行一周后涨了一倍多必须定时重启才敢继续用。这明显是资源泄漏。我先用docker stats确认了容器内存增长的规律然后用 Python 内置的tracemalloc模块排查内存分配热点。最终定位到问题出在一个 Skill 里每次查询物流轨迹时都新建了 HTTP 客户端对象但没有正确关闭连接连接池一直占用着资源。修复方式很简单把 HTTP 客户端改成模块级单例复用连接池import httpx # 模块级复用客户端不要每次请求都新建 _client httpx.AsyncClient(timeout10) async def query_traces(order_id: str): async with _client as client: # 注意用 async with 管理生命周期 resp await client.get(fhttps://api.logistics.com/traces/{order_id}) return resp.json()修完之后内存曲线稳定多了连续运行一个月没有明显攀升。这里要提醒一句只要是做 Python 服务端开发资源占用曲线一定要关注不要等到服务器 OOM 了才来排查。6.3 API 超时导致的“假死”问题第三个坑是 API 超时。接入一个大模型 API 时默认只给了 30 秒超时时间。但模型推理加上网络传输高峰期响应经常超过 30 秒导致 Agent 直接报错表现为“假死”——用户发消息没反应过一会儿收到一个错误提示。解决思路有两个层面。第一层是提高超时时间我把默认超时调到了 60 秒并在配置中心做成可动态调整的参数。第二层是接入流式响应让内容边生成边返回用户不需要等完整内容生成完才看到回复。体验上流式响应明显更好尤其是在生成内容比较长的时候。把流式响应和超时重试策略配合好之后Agent 的可用性大幅提升。如果你做的是面向 C 端的对话产品我更建议优先把流式响应做起来这对用户体验的提升立竿见影。6.4 安全边界与访问控制为什么必须认真对待Agent 能调用工具、能访问数据这意味着权限和安全的边界必须先明确。我在这方面的经验可以浓缩成三条原则最小权限原则Skill 服务只申请当前业务必需的权限。数据库用只读账号云 API 用子账号密钥不要图省事直接给管理员权限。输入校验与参数白名单用户输入的内容必须经过校验才能进入 Skill 执行。尤其是当 Skill 涉及文件操作、命令执行或网络请求时必须做严格的白名单校验防止恶意注入。审计日志每次 Skill 调用都记录调用方、参数、结果、耗时。线上出了问题翻日志是最快的定位方式。这里特别强调一下如果你做的 Agent 会在用户授权下访问个人数据一定要在产品层面明确告知用户数据用途和存储范围。腾讯云在这方面提供了比较完善的合规服务当你需要额外保护措施时可以直接接入。7. 调优实录从 3 秒到 800 毫秒的响应优化之路最后一部分来说说性能调优。我的 Agent 服务最初的端到端响应时间在 3 秒左右经过几轮优化压缩到了 800 毫秒以内用户体验提升非常明显。整个优化过程没有花哨的技巧就是把每一个环节的耗时拉出来逐个击破。7.1 耗时分析先量化再优化我的原则是“不量化不优化”。先用链路追踪把一次完整请求拆开统计每个步骤的耗时环节优化前耗时占比模型推理第一轮意图解析1200ms40%Skill 检索与加载350ms12%Skill 执行业务逻辑外部API800ms27%模型推理第二轮结果综合900ms30%网络传输与其他开销150ms5%从表格能看出来大头在两轮模型推理上加起来超过了 2 秒Skill 检索也占了 350 毫秒说明索引策略还有优化空间。7.2 降低模型推理耗时的几个关键策略模型推理耗时是硬成本你换一个更快的模型或者把提示词压缩到更短都能立刻见效。我这里实践下来最有效的三个策略第一是把系统提示词和 Skill 描述压缩精炼去掉了所有不必要的铺垫语句。上下文越短首 Token 生成速度越快整个推理耗时也随之下滑。第二是引入缓存机制。语义缓存是个好东西idea 是判断用户这次的问题是否和之前某个问题表达的意思一致如果一致直接复用当时的推理结果跳过完整推理链路。比如“查一下我订单到哪了”和“我的快递到哪了”语义上高度接近完全可以命中缓存。第三是用更快的模型处理简单意图。如果 Agent 下一个判断逻辑非常简单比如“这个请求需不需要调用 Skill”直接用小模型跑不用每次都上大模型。我在实践中把三类请求分开简单问答走小模型、中度任务走标准模型、复杂的多步骤编排才上大模型。这种分级策略能明显降低成本。7.3 Skill 检索优化向量化召回与候选集预筛选前面提到我在 Skill 数量增加后改用了动态加载其中检索质量是最大瓶颈。第一版用的是关键词匹配后来换成了向量检索效果更进一步。选型思路是把每个 Skill 的描述和若干典型问题示例编码成向量存入向量索引用户问题进来后先做向量检索取 Top 5 作为候选再把这些候选中与用户意图匹配度最高的 3 个最终加载进上下文。这里有一个容易被忽略的细节向量检索不是万能的要配合关键词强制过滤。比如用户提到了“订单”“支付”这样的业务强关键词直接作为硬条件过滤候选集再用向量做软排序。这能避免向量检索结果和业务逻辑冲突。7.4 并发架构优化从串行到并行很多 Agent 的实现是一次对话只走一条链路遇到需要多个 Skill 的场景就串行执行。比如用户请求“汇总我这周的订单数据并发送到我的邮箱”需要查订单库还要发邮件。如果两个 Skill 之间没有强依赖完全可以并行执行耗时只算最长的那个而不是两者相加。我重构后把 Skill 执行阶段改成了并发调度import asyncio async def execute_skills(skills_params: list): tasks [] for skill_name, params in skills_params: skill skills_map[skill_name] tasks.append(skill.execute(params)) results await asyncio.gather(*tasks, return_exceptionsTrue) return results改动不大但响应时间立竿见影。当然并行执行的前提是 Skill 之间有依赖如果后一个 Skill 需要前一个 Skill 的输出作为输入那就必须串行不能为了快而牺牲正确性。7.5 优化效果汇总经过这几轮优化服务的端到端响应时间从 3 秒降到了 800 毫秒左右。完整的优化效果优化项优化前优化后耗时就减幅度提示词压缩完整长提示词精简提示词35%语义缓存无命中率约30%25%Skill 动态加载全量加载检索 Top3 加载20%模型分级全部走大模型小型/中型/大型分级30%Skill 并行执行串行依赖检测后并行40%这里列出的每个数据都是在我自己的服务上跑出来的不同业务场景会有差异但思路是通用的先量化再针对性优化。如果你现在正在做一个 Agent 项目我的建议是不要急着堆功能先把一个核心链路用 Skills 跑通真正理解“决策-执行-反馈”这个循环再逐步扩展你的 Skill 库。能力不是越多越好而是越精准越好。我这套方案在腾讯云上跑了几周整体稳定后续我还会继续打磨它的记忆机制和多 Agent 协作编排有新的经验再来分享。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →