做Agent开发这些年,我最大的体会是:单跑一个Agent demo不难,真正难的,是让它稳定、安全、可扩展地跑在云端。之前给公司搭Agent服务,前前后后折腾了好几个月,把云服务器、容器、Redis、对象存储、域名接入、模型API网关这一整套东西都过了一遍。你会发现,Agent本身的代码逻辑可能就几千行,但围绕它的那一层基础设施——也就是常说的Agent Infra——才是决定项目能不能从测试环境走到生产环境的关键。
这篇文章就是基于腾讯云这套生态,把我在实际项目中用到的Agent Infra解决方案和工具链做一个完整梳理。从整体架构设计、核心组件选型、具体配置实操,到后面遇到的坑和排查思路,都会讲到。适合刚准备把Agent项目放到云上的开发者,也适合那些已经跑起来了但总觉得不稳定的团队,照着这篇文章的思路梳理一遍,应该能省下不少踩坑的时间。
1. Agent Infra到底解决什么问题
1.1 从跑通demo到生产运行的差距
很多开发者第一次接触Agent开发,是从一个Python脚本或者一个Notebook开始的:调用大模型API,写几个提示词模板,定义一个工具函数,然后就跑通了。但当你把这个东西部署到云服务器,要支持多个用户、多个会话,要处理并发请求,要在断线后恢复聊天上下文,要记录每次调用的日志,要控制成本,问题就全冒出来了。
模型调用怎么统一走网关?不同的模型服务(不同厂商或者不同版本)怎么切换?会话上下文是放内存里还是放Redis里?用户上传的文件存哪里?Agent的定时任务怎么调度?工具调用会不会被恶意注入?这些都不是写业务代码能解决的,它们统统属于基础设施的范畴。
我自己的体会是:Agent Infra本质上就是给Agent应用盖的一套房——计算资源是地基,数据库和缓存是储物间,网络和安全是门锁,日志监控是摄像头。房子盖不好,里面的家具再好也白搭。
1.2 Agent Infra的三大核心模块
我习惯把Agent的基础设施拆成三个层面来看。
第一是运行环境层,也就是Agent进程本身跑在哪里。本地开发用VSCode就行,但生产环境你要考虑用云服务器直接部署,还是用Docker容器化,还是干脆上Serverless。这个选择直接决定了后续的扩展性和运维成本。
第二是数据与状态层。Agent最麻烦的就是记忆和上下文,一个会话的完整历史可能要几千个token,多个用户同时在线时,这些数据不能在内存里乱丢。所以需要Redis做缓存和短期记忆,需要MySQL存用户信息和会话元数据,需要对象存储放文件和知识库文档,可能还需要向量数据库做长期记忆和知识检索。
第三是接入与调度层。用户的请求从哪里进来?通过域名加HTTPS?通过API网关?Agent内部要调用外部工具、定时执行任务,这些能力也要在这一层统一管理。
这三个层面全部打通了,Agent项目才算真正有了一个可靠的家。
1.3 为什么我在腾讯云上搭建
选择腾讯云,不是因为它多特别,主要是这几点在实际使用中确实顺手:轻量应用服务器和云服务器创建快,几个按键就能搞定;安全组规则比很多平台更直观,端口管理方便;对象存储COS、云数据库、容器镜像服务这些配套服务几乎都能无缝打通,内网访问不用额外操心。还有一点很关键,腾讯云的文档和开发者社区里,关于Agent、AI网关、模型部署的实践案例挺多,遇到坑搜一下基本有参考。
对我来说,云平台的核心价值不是便宜几块钱,而是它的基础设施组件能不能让我少写代码、少踩坑。腾讯云在这一点上做得比较均衡,这也是我把整套Agent Infra方案跑在上面的原因。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 整体架构设计与选型思路
2.1 一套可以直接落地的参考架构
我现在的Agent服务架构大概是这样的,比较简单但够用:
用户请求先经过CDN和负载均衡,进入API网关层;网关做鉴权和限流后,把请求转发到后端的Agent服务集群;Agent服务负责处理会话逻辑、调用大模型API、执行工具函数;过程中会读写Redis(会话缓存)、MySQL(业务数据)、COS(文件与知识库文档);定时任务由单独的任务调度模块负责,可以是容器里的独立Worker,也可以是云平台的定时触发器。
这套架构的好处是每一层都能独立扩展。活动时期流量大了,后端Agent服务多开几个容器实例就行;知识库文件多了,COS自动扩容不用管;会话量上去了,Redis开集群模式。
有人会问,刚起步的项目需要这么复杂吗?我的建议是:至少按这个架构的简化版来搭。哪怕一开始就是一台2核4G的云服务器把所有东西都装上,也要在目录结构上把不同模块分开,否则后续拆分的时候会非常痛苦。
2.2 计算层:云服务器、容器与Serverless怎么选
计算层的选型,我踩过不少坑,这里给大家一个参考。
如果是个人项目、Demo验证、或者团队刚起步,腾讯云的轻量应用服务器是最省事的,价格便宜,自带一些常用的应用镜像,装环境很方便。缺点是规格偏小,遇到高峰会吃力,但拿来起步完全够。
如果项目已经有稳定的用户量,建议上标准云服务器(CVM)加Docker。把Agent服务的镜像构建好,推到腾讯云容器镜像服务,然后在服务器上运行容器,升级的时候只需要拉新镜像、重启容器,比裸机部署清爽太多。我用Docker之后,部署时间从原来的半小时降到了五分钟以内。
如果你的项目流量波动很大,比如白天用户多晚上几乎没人,可以考虑腾讯云云函数(SCF)这类Serverless方案,按调用次数计费,没有流量的时候几乎不花钱。但要注意,Serverless对长连接、WebSocket这类场景支持会弱一些,Agent对话是长连接交互的话,要提前确认清楚。
我的选型总结:起步用轻量,中期用CVM加Docker,流量稳定且有波峰波谷再考虑Serverless或者容器集群。
2.3 数据层:MySQL、Redis、向量数据库的角色分工
Agent系统的数据层,很多人会疏忽,以为一个数据库就够了。实际跑下来你会发现,至少需要三类存储。
MySQL或者说云数据库MySQL,负责用户信息、会话记录、账单记录、知识库的元数据。这类数据要求强一致,关系清晰,MySQL依然是最好用的。
Redis负责会话缓存和短期记忆。Agent每次调用大模型,都要把最近的对话历史带上,这个历史如果每次请求都从MySQL查一遍,性能会很难看。更好的做法是:对话过程中把最近几轮消息缓存在Redis里,会话结束后再整体落库。Redis的过期机制还能很好地处理会话超时清理,不用自己写定时任务。
对象存储COS负责文件类数据。用户上传的文档、图片,Agent知识库里的PDF,大语言模型生成的音频视频文件,这些都应该进COS,不要往MySQL里塞,也不要放在应用服务器的本地磁盘上,否则扩容迁移的时候会非常难受。
如果你的Agent要做真正意义上的长期记忆——比如记住用户的偏好、跨会话的档案信息——建议再引入向量数据库,做语义检索。腾讯云也有向量数据库服务,也可以用开源的Milvus或者ES加向量插件,按团队熟悉程度选。
2.4 网络层:安全组、负载均衡与域名接入
网络层最核心的一点:分清楚云平台安全组和云服务器系统防火墙的区别。
腾讯云的安全组是虚拟机外面的一层网络过滤规则,可以理解为小区门口的保安,能精准控制哪些端口对外可达。但即使你在安全组放行了某个端口,云服务器内部还有一层系统防火墙,比如firewalld或者ufw,它相当于你自己家里的门锁。两层都要配置正确,端口才能真正通。
实际场景中,80、443端口肯定要对外开放,用于Web服务和HTTPS接入。SSH的22端口,建议改成非默认端口,再配合安全组限定只允许你自己的IP访问,否则你在公网上跑两天,就会收到一堆扫描日志。数据库、Redis这类中间件端口,绝对不要暴露到公网,应该只在安全组里放行给云服务器内网网段。
域名方面,我的做法是:主域名走官网或者管理后台,Agent服务用二级域名单独接入,然后统一配置HTTPS证书。二级域名的好处是之后可以无限扩展出不同的子服务,比如api.xxx.com做Agent入口,auth.xxx.com做认证服务,互不干扰。具体怎么配二级域名,后面的实操章节会细说。
3. 核心组件配置实操
3.1 云服务器初始化与安全组端口放行
新买的腾讯云服务器,拿到手第一件事不是急着装环境,而是先把基础配置好。
第一步是登录云控制台,找到这台服务器的安全组。进入安全组规则,添加入站规则。通常需要放行以下端口:80(HTTP)、443(HTTPS)、SSH端口(默认22,建议改掉或限定来源IP)。这里要提醒一句,网上经常有人搜“腾讯云如何开放所有端口”,我的建议是千万别这么干。把所有端口开放出去等于给攻击者开了一扇大门,安全组应该是白名单思路,用哪个端口放哪个。
然后是云服务器内部的防火墙配置。以CentOS系为例:
bash复制systemctl status firewalld
# 如果启用了防火墙,放行需要的端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload
如果是Ubuntu,一般用ufw:
bash复制sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
很多新手把安全组端口放行了,发现还是访问不了,排查半天才发现是系统防火墙没放行。这个知识点我遇到过太多次,所以单独提出来。
再补充一个经验:不要把安全组里的“来源”写成0.0.0.0/0就完事了。如果是管理端口,来源IP精确到你自己公司的出口IP;如果是业务端口,再考虑放开。
3.2 二级域名申请与HTTPS证书接入
很多人搜“腾讯云怎么申请二级域名”,其实二级域名本身不用单独申请,它是你在域名服务商那里通过添加DNS解析记录来创建的。
比如你的主域名是example.com,现在想给Agent服务弄一个agent.example.com。操作步骤是:进入腾讯云域名解析控制台,选择example.com这个域名,点击添加记录;记录类型选A记录,主机记录填agent,记录值填你云服务器的公网IP,TTL默认就行。稍等一会儿,使用ping agent.example.com验证是否生效。
这里有个容易踩的坑:如果服务器IP变了,A记录要同步改,不然域名会指向错误地址。如果以后要接入负载均衡,可以改成CNAME记录指向负载均衡的域名,这样后端IP变化时前端解析不用动。
域名解析生效后,下一步就是HTTPS。在腾讯云可以申请SSL证书,个人博客和初创项目可以用免费的证书。申请下来后,按部署指引配置到Nginx或者负载均衡上。
Nginx配置HTTPS的核心片段类似这样:
nginx复制server {
listen 443 ssl;
server_name agent.example.com;
ssl_certificate /etc/nginx/certs/agent.example.com.crt;
ssl_certificate_key /etc/nginx/certs/agent.example.com.key;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 80;
server_name agent.example.com;
return 301 https://$host$request_uri;
}
配置完后用nginx -t检查语法,再reload。到这里,你的Agent服务就有一个正式、安全的对外入口了。
3.3 Redis安装与密码修改重启异常排查
Redis在Agent架构里太重要了,但它的坑也特别多。我印象最深的一次:在腾讯云服务器上安装Redis后,修改了requirepass密码,再重启Redis就一直起不来,报错日志看得人一头雾水。
后来排查下来,最常见的原因有这么几类:
第一,修改的配置文件根本不是你启动Redis时加载的那个文件。Redis可能有多个配置,有的通过systemd启动时读取的是/etc/redis/redis.conf,有的是通过redis-server /path/to/redis.conf指定的。你先确认启动命令里用的哪个配置,再改哪个。
第二,systemd管理的服务,修改配置后需要先重载守护进程,再重启服务。很多人直接执行systemctl restart redis,但配置文件改动没被正确识别,换个写法:
bash复制systemctl daemon-reload
systemctl restart redis
第三,密码里有特殊字符。比如密码含有#、$、&这种,如果在配置文件中不加引号或者没做转义,解析的时候会被截断。建议设置密码时用纯字母数字或者下划线,等号后面直接跟字符串,不要在password值的附近加多余的引号。
第四,开启了protected-mode,同时bind配置又绑定了外网地址,密码又没设置对,这会导致无论怎么连都会被拒绝。排查时可以先用redis-cli -h 127.0.0.1 -p 6379 -a 你的密码在服务器本机测试,如果本机能连,外网连不上,问题多半出在bind和protected-mode配置上。
修改Redis配置后,我强烈建议先测试再重启:
bash复制redis-cli -a 你的密码 ping
# 正确配置下会返回 PONG
如果返回的是DENIED或者其他错误,就去检查日志。日志位置一般在/var/log/redis/redis-server.log,或者你配置文件中logfile指定的路径。Redis日志很友好,大多数报错原因都能直接看出来。
3.4 Docker部署与镜像服务推送
容器化之后,Agent服务的部署就变成了三步:构建镜像、推送镜像、服务器拉取并运行。
腾讯云的容器镜像服务(TCR)做得很顺手,国内访问速度快,和云服务器内网打通后,拉取镜像基本秒级。使用流程是:
先去腾讯云控制台开通容器镜像服务,创建命名空间和镜像仓库。然后在你本机登录:
bash复制docker login ccr.ccs.tencentcloud.com -u 你的腾讯云账号 -p 刚才设置的访问凭证
注意这里不能用腾讯云登录密码,要在容器镜像服务控制台单独创建一个访问凭证,类似“登录密码”的功能。这一步很多人卡住,还以为是自己账号密码错了。
构建Agent服务的镜像,我习惯用多阶段构建,减少最终镜像体积。比如Python项目,可以这样:
dockerfile复制FROM python:3.11-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --prefix=/install -r requirements.txt
FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /install /usr/local
COPY . .
EXPOSE 8080
CMD ["python", "main.py"]
构建并推送:
bash复制docker build -t ccr.ccs.tencentcloud.com/你的命名空间/agent-service:latest .
docker push ccr.ccs.tencentcloud.com/你的命名空间/agent-service:latest
服务器上运行:
bash复制docker pull ccr.ccs.tencentcloud.com/你的命名空间/agent-service:latest
docker stop agent-service || true
docker rm agent-service || true
docker run -d --name agent-service \
-p 8080:8080 \
--env-file .env \
--restart=always \
ccr.ccs.tencentcloud.com/你的命名空间/agent-service:latest
服务器上记得先docker login,否则拉取私有镜像会报权限错误。拉取和更新流程可以用一个部署脚本包起来,避免手动执行太多命令漏掉步骤。
3.5 对象存储COS的接入与上传问题
COS在Agent项目里主要干三件事:存放用户上传的附件、存放知识库文档、存放Agent生成的结果文件。
创建存储桶时,访问权限一般选“私有读写”,不要选“公有读”。AI应用的数据通常涉及用户隐私,公有读风险太大。需要对外分享文件时,用腾讯云提供的预签名URL功能,生成一段有时效的链接给客户端,过期自动失效,安全又灵活。
开发时上传文件到COS,官方提供了完善的SDK,Python示例大致是这样的:
python复制from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
secret_id = '你的SecretId'
secret_key = '你的SecretKey'
region = 'ap-guangzhou'
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key)
client = CosS3Client(config)
response = client.upload_file(
Bucket='your-bucket-1250000000',
LocalFilePath='local_file.txt',
Key='agent-files/local_file.txt'
)
把SecretId和SecretKey放在环境变量里,不要硬编码到代码仓库。团队协作时,密钥一旦泄露,攻击者就能访问你整个存储桶,到时候就不是文件丢失的问题了。
常见的一个上传报错是“Access Denied”,大多数是因为子账号没有对应存储桶的操作权限。去访问管理 CAM 里给子账号赋予COS的读写权限,或者检查密钥所属账号和存储桶是否在同一个主账号下。
4. Agent框架选型与部署实践
4.1 主流Agent开发框架横向对比
Agent开发现在框架很多,选错了后面写业务逻辑会很难受。我梳理过几个主流选择,各有各的使用场景。
Dify适合产品原型、知识库问答、可视化工作流编排,它对非技术人员也友好,快速搭建一版可用产品,首选它。FastGPT的特点是在知识库实战上非常扎实,中文场景支持好。LangChain适合需要大量自定义代码、深度控制每一步逻辑的团队,灵活性最高,但上手成本也高,代码里容易藏坑。Coze(扣子)适合快速接各种插件和工具,但需要看清楚是不是托管版本,自托管要考虑模型服务商是否支持配置成自己的API。
还有一类是偏底层能力的Agent开发框架,比如微软的Semantic Kernel,以及各种轻量级Agent SDK。这些更适合需要深度嵌入现有工程体系的团队。
我的选择建议很简单:你团队里谁写代码最强,就选他最有把握的框架。框架本身的功能都能靠工程能力补,但如果你选了一个没人能驾驭的框架,出了问题连排查的人都没有,那就糟糕了。
4.2 Agent记忆与上下文管理的落地
记忆是整个Agent系统里最容易被做砸的部分。技术社区里搜索“Agent记忆”的开发者特别多,因为这个东西直接决定用户体验。
短期记忆,我指的是单次会话内要传给大模型的上下文。实现上就是一个消息列表,每次请求前把系统提示词、最近N轮对话、可能的工具触发结果,组装好传给模型。这里要注意token上限问题,超过模型上下文长度后,常用的策略是滚动窗口,保留系统提示和最近几轮,丢掉最早的内容。如果直接用Redis存最近的几十条消息,这个逻辑写起来很顺手。
长期记忆,指的是跨会话的用户偏好、历史事实。比如用户之前说过自己是做餐饮行业的,下次对话Agent应该记得。实现上不能把全量历史都塞给模型,要按需召回。常规做法是维护用户档案,每轮对话结束后用模型提取关键信息写入档案;下一次对话开始时,把档案作为额外的上下文注入。更高级的用法是接向量数据库,把用户的历史对话切成片段做向量化,收到新问题时先做一次相似度检索,再带着检索结果去生成回答。
这个方案跑起来之后,用户的感知是比较明显的,“这AI居然记得我上次说过的话”。但也要注意,长期记忆涉及用户隐私,必须给用户提供清除记忆的入口,合规上不能省。
4.3 工具调用的设计规范与安全边界
Agent的价值在于能调用工具,但工具调用也是最容易被攻击的地方。最近的Agent安全讨论中,一个核心话题就是“提示注入攻击”:攻击者想办法在对话里藏一段指令,让Agent调用不该调用的工具。
我设计工具调用规范时,会遵循几个原则。
第一,工具权限最小化。每个工具只能做一件事,不要做一个“万能执行器”。比如数据分析工具就不能让Agent自己决定去执行任意Python代码,而是封装好固定的查表、绘图函数,参数只接受明确的输入。
第二,工具的敏感操作一律加人工确认。比如发送邮件、执行支付、删除数据,这些操作即使Agent请求了,也要在流程里加一道用户确认的步骤,不能让Agent自行完成。
第三,模型输出要先校验再执行。大模型的输出不是可靠代码,不能直接拿来拼接成命令执行。解析出工具名和参数后,要检查参数类型、检查参数值是否在允许范围内,然后才真正调用。
第四,密钥和凭证统一通过环境变量或者密钥管理系统注入,工具函数内部不硬编码任何口令。这样即使某个工具被攻破,攻击者能拿到的东西也是有限的。
这些规范看起来麻烦,但真正上线后你会发现,它们帮你挡住了大量莫名其妙的线上事故。
5. 常见问题与排查速查表
5.1 网络与注册类问题
有朋友反馈,在腾讯云注册时提示“您所处的网络环境异常,无法进行注册”。遇到这个提示,通常是当前网络出口IP被安全风控判定为风险来源。解决方法是先切换网络环境试一次,比如手机热点换一个运营商;如果是在公司网络环境下,换到家庭网络再试试。也可以等一段时间后再操作,风控是动态的。这个提示和你的地理位置、IP信誉有关,不是账号本身被拉黑,所以不用太焦虑。
还有一类问题出在域名解析后访问不了。用ping命令确认解析是否生效,如果ping不通,检查A记录的IP和云服务器公网IP是否一致;如果ping通了但访问不了,检查云服务器上对应端口是否在监听,以及安全组有没有放行对应端口。
5.2 中间件与部署类问题
Redis相关的问题,密码修改后重启失败,是最多人踩的坑。我前面已经详细拆过原因,这里再补充一个排查方向:查看Redis的systemd单元文件中ExecStart命令,确认它指定的是哪个配置文件。很多人以为自己在改Redis配置,其实改了一个根本不生效的文件。
Docker部署问题里,最常见的报错是拉取镜像时卡住或者超时。腾讯云容器镜像服务在云服务器上拉取一般很快,如果卡住,检查一下服务器和镜像仓库是否在同一地域,跨地域访问网络质量会差一些。另外一个经常出现的问题是docker login登录成功后,拉取远端镜像又报“unauthorized”,那是因为没有退出旧的登录状态,可以先docker logout再重新登录。
5.3 Agent服务运行类问题
Agent服务运行中,会出现一个让人头疼的报错:agent execution terminated due to error。这个报错信息非常泛,看到它第一反应不应该去猜代码逻辑,而是先排查基础设施。
我遇到过的几个原因:模型API调用超时,上游接口响应太慢而Agent服务自身的超时时间设置太短;上下文过长超过了模型的最大token限制;工具调用返回了异常格式的数据,导致Agent解析失败;Redis连接池耗尽,无法继续存取消息。
排查方法就是先看日志。Agent服务要有完整日志,每次请求的记录、每次模型调用的耗时和返回状态、每次工具调用的输入输出,这些都要记。我一般把日志输出到腾讯云日志服务CLS,搜索关键词很方便。如果要深入排查,需要做一个调用链追踪,记录请求经过的每个环节耗时,一眼就能看出瓶颈在哪。
6. 上线前后的几点经验
6.1 成本控制
Agent项目的成本主要是三块:云服务器、模型调用、存储与网络。很多团队只盯着服务器价格,结果账单出来被模型调用费用吓了一跳。
模型调用费用控制有几个思路:一是用缓存,相同或相似的用户请求先查Redis缓存,命中就直接返回,不重复调模型;二是模型分级,简单的意图识别用便宜的小模型,复杂的生成任务才调用大模型;三是设置频率限制和配额,防止某个用户的极端使用把预算打穿;四是利用腾讯云的按量付费和优惠策略,把业务低谷期的成本压下来。
服务器成本上,如果业务比较稳定,包年包月比按量付费划算;如果只有白天跑,晚上可以停机节省费用,或者直接考虑弹性伸缩方案,高峰期加节点,低谷期回收节点。
6.2 监控与告警
Agent服务的监控和传统Web服务不太一样,除了CPU、内存、磁盘这些常规指标,还要重点监控模型调用的成功率、平均延迟、token消耗量。你这周token消耗量突然翻倍,不一定代表业务增长,可能是某个用户开始恶意刷接口了。
腾讯云的云监控可以设置告警规则,服务器CPU超过80%告警、磁盘空间不足告警、Redis内存使用率高告警,这些都是保底项。再往上走,建议把Agent的每一次模型调用、工具调用记录到日志服务,用关键词分析最近调用是否有异常失败。出现连续失败时能第一时间收到通知,好过用户投诉了你才知道系统挂了。
6.3 安全加固
Agent系统攻击面比一般Web应用大很多。模型输入不可控,工具调用又可能造成实际影响,所以安全要多花精力。
服务器层面,做到前面说的:SSH端口改非默认、安全组最小化开放、定期更新系统补丁。应用层面,做到三点:第一,所有包含敏感信息的接口都加鉴权,Agent对话接口也不例外,用户身份要从请求头里校验,不能只靠前端隐藏。第二,用户上传的文件要做类型和大小校验,防恶意文件上传。第三,日志脱敏,模型输入输出里可能包含用户隐私和密钥,打印日志时要把身份证号、手机号、密钥字段打码。
其实做完这套加固之后,我的一个体会是:Agent基础设施的安全,就是传统基础设施安全加上AI特有的输入输出安全,两者缺一不可。把这两块都做扎实,Agent服务的稳定性和安全性才会有保障。每次上线前我都会按这个清单过一遍,踩过两次坑之后你就知道这些都是用真金白银换来的教训。
