AI Agent火了,这已经是技术圈不用争辩的事实。但我这一年多帮好几个团队把Agent从Demo推到生产环境,发现一个扎心的规律:Agent能不能跑起来,取决于模型能力;Agent能不能稳定跑下去,取决于基础设施。 大多数团队的问题不是模型不够聪明,而是底层的算力规划、数据管道、日志追踪、状态存储根本跟不上Agent的调用方式。这篇文章我想把Agent对基础设施的真实诉求拆开聊一聊,包括怎么估算算力、怎么设计数据层、怎么用ES搭一套Agent日志分析管道,以及那些不跑生产根本发现不了的坑。
适合看这篇的,是已经在做Agent应用、或者准备把Agent放进业务系统里的后端和基础设施团队。我会尽量把原理和实操都写透,你不需要额外去哪里查资料,照着这个思路去搭建,能省掉很多折腾时间。
1. Agent负载与传统后端负载的显著差异
1.1 “请求-响应”模型的三个假设,在这里全部失效
我们过去十几年做后端服务,所有的架构设计都建立在三个假设之上:请求是短连接且无状态的、响应时间是可控的、流量特征是可以提前压测的。Web应用、微服务、网关、限流,全是围绕这套模型演进的。Agent一进来,这三个假设全部被颠覆。
Agent的一次任务,不是“一个请求进来、一个响应出去”就结束了。它会经历:理解用户意图、拆解子任务、选择工具、调用外部API、拿到返回结果后再做一轮推理判断、决定下一步动作,中间还可能有回溯、纠错、重试。这个链路不再是“后端-数据库”的简单往返,而是多次调用大模型、多次调用工具、多次进行IO等待的复杂编排。你的网关如果按传统接口超时时间设置,比如20秒或者30秒,大概率会频繁切断Agent的长任务执行;你的连接池如果按传统接口的并发量来设计,也会很快被占满。
更麻烦的是,传统后端的压力模型基本是“读多写少”或者“写多读少”,还带一点可预测的峰谷。Agent任务的压力模型是“突发式、长尾式”的。一个用户可能在某几分钟内同时触发三个子任务,每个子任务又各自调模型、调工具;下一个小时可能完全没人用。如果你的基础设施是按照均值去买的,那么峰值来的时候必然崩;按照峰值去买,那么大部分时间都在浪费成本。
1.2 Token才是新的计费与容量单位
传统的容量规划看QPS(每秒查询数)、看并发连接数,Agent的容量规划核心指标变成了每秒Token消耗量(Token per second)。原因很简单:大模型推理的成本和压力,本质上是Token在推动。
我给你算一笔账。一个中等强度的Agent任务,系统提示词(System Prompt)大概1500到2000个Token;用户每次输入按300到500个Token算;Agent为了完成一个任务,通常要进行2到4轮工具调用。每一轮工具调用,Agent都要把历史对话、工具返回的结果、当前待处理的问题重新组织成完整的Prompt喂给模型。假设每一轮Prompt是2000到4000个Token,模型输出是500到1000个Token。你算一下,一次完整任务消耗的Token总数经常在1万到5万之间,这还只是中等复杂度。如果你的Agent任务涉及大量文档检索、长上下文分析,Token消耗可以轻松超过10万。
这就意味着,一个只有100个真实用户的Agent产品,一天的Token消耗可能相当于传统高并发接口读写几百万条数据产生的数据量。而传统业务里,我们衡量容量用的是“磁盘IOPS”“数据库连接数”“接口RT”,这些指标在Agent场景下都是间接的。真正决定你成本上限和扩容节奏的,是Token吞吐量。
所以,在给Agent做基础设施规划时,第一条建议就是:把所有业务的容量模型,从“预估QPS”切换成“预估日均Token消耗和峰值Token速率”。没有这个数字,后面所有算力规划都是拍脑袋。
1.3 长连接与多轮状态:基础设施要重新做“连接”管理
还有一个容易被忽视的变化是连接模型。以前的HTTP接口是无状态的,服务端不需要记住调用方是谁,请求来了处理完就断开,负载均衡随便转发到任何一个实例都行。Agent不行,尤其是交互式的、面向C端用户的Agent,它需要维持多轮会话状态。
用户在对话框里连续提问,Agent要记住前几轮聊了什么、用户确认了什么、已经完成了哪些步骤。这意味着服务端必须维护会话状态,而且状态可能不止在Redis里的一串JSON,还包括对话的Token历史记录、工具调用的上下文、Agent的规划步骤,甚至包括用户的临时授权凭证。如果网关随便把同一个会话的请求负载均衡到不同实例,而这个实例没有共享状态,那么Agent就会“失忆”,用户就会明显感觉到这个AI产品是个半成品。
我们的做法是:为Agent专门设计一套“会话亲和”的路由策略,同一个Session ID固定路由到同一组实例,同时把会话状态持久化到共享存储,而不是放在进程内存里。进程内存存放状态在Demo阶段完全没问题,但一旦实例重启、滚动发布、弹性伸缩,内存态就会全部丢失,连带用户会话一起丢。这一步是很多从Demo上生产的团队第一个踩的坑。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算力层:GPU容量规划不能只看模型显存
2.1 AI Agent推理集群的容量构成
如果你决定自建推理集群,而不是完全使用商业API,那么第一个要纠正的认知是:GPU容量不等于模型权重的体积。
很多团队拿着“7B模型大概需要14GB显存(fp16)”这种估算去买卡,结果一跑并发就OOM,还以为是代码泄漏或者推理框架配错了。实际上,模型权重只是静态占用,推理过程中还有两个动态大头:KV Cache(键值缓存)和中间激活值(Activation Memory)。其中KV Cache对Agent场景的影响最大,因为它和上下文长度、并发请求数成正比。
我先用最简单的语言解释KV Cache是什么。大模型生成Token时,需要不断引用前面已经生成过的Token的注意力信息,为了不每次从头开始重新计算,推理框架会把之前Token的Key和Value向量缓存起来,这个缓存就是KV Cache。它不随模型一起加载,而是每个并发请求各自独立占用的临时存储。你的并发数越高、每个请求的上下文越长,KV Cache占用的显存就越多。
2.2 KV Cache的估算方法
这里我给一个具体的估算案例。以Llama-3-8B这种体量的模型为例,它有32层Transformer、8个KV Heads、Head Dimension为128,使用fp16精度。每个Token的KV Cache占用可以这样算:
- 每一层:2(Key+Value)× 8(KV Heads)× 128(Head Dim)× 2字节 = 4KB
- 32层:128KB
- 平均上下文长度4000 Token:128KB × 4000 = 512MB
也就是说,一个并发请求的KV Cache就占了大约512MB显存。当你有100个并发请求时,KV Cache就需要50GB显存。加上模型权重本身的16GB(fp16),你至少要消耗66GB。一张80GB的A100/H100,看起来能装下8B模型,实际在4K上下文的假设下,最多只能支撑大概110个并发请求,而且这还没算推理框架、CUDA环境、中间激活值预留的冗余空间。
现在再回头看很多团队的方案:只买了一张24GB的消费级显卡就想跑8B模型的线上Agent服务,并发一旦超过几个请求,KV Cache立刻撑爆。这就是为什么我反复强调,看单卡能不能装下模型没有意义,要看单位并发上下文的整体显存占用。实际生产环境中,建议大家预留20%-30%的显存余量,别把显存算到100%满负荷,以免遇到长上下文请求突然打爆显存。
2.3 推理框架选型与吞吐优化
模型部署方式决定了Agent的吞吐上限。很多人初学阶段用HuggingFace Transformers的默认管道加载模型做推理,这在原型验证时没有问题,但直接放到生产环境就是灾难。Transformers默认动态地做推理,没法高效批处理,10个并发请求可能只能顺序执行,GPU利用率低得可怜,延迟还高得吓人。
请把自建推理方案建立在vLLM、SGLang、TensorRT-LLM这类专业推理引擎上。这些引擎有一个关键技术叫Continuous Batching(连续批处理),可以理解为“边做边插队”:一个请求生成完当前Token,只要还有空闲算力,就能立刻插入其他请求的生成任务,而不是像早期Naive Batching那样必须凑满一批同时开始、同时完成。实测下来,vLLM对8B模型能做到不错的单卡吞吐,配合PagedAttention管理KV Cache,显存利用效率会高很多。
如果你部署的是70B级别以上的大模型,那么还需要考虑张量并行(Tensor Parallelism)和模型量化。我的建议是:4张卡以内的推理,优先把GPU显存和NVLink的带宽用来减少KV Cache的压力;超过这一规模,再考虑多卡并行。
还有一个生产细节:如果允许用纯CPU做稀疏的、低并发的任务调度,而把GPU全部留给高并发模型推理,这条“CPU/GPU分工”的路线值得推荐。Agent任务里很多子步骤(比如文本清理、模板展开、工具调用的序列化)并不需要GPU,完全可以拆出去跑在一组廉价的CPU Serverless实例上,减少GPU的无效占用。
3. 数据层:从存储业务数据到存储Agent的“状态与记忆”
3.1 知识库与向量检索:RAG是Agent的地基
Agent不能只靠模型参数里的知识回答业务问题,绝大多数业务场景必须引入RAG。RAG把企业文档、产品手册、历史工单、私有知识库切成小块,做向量化之后存入向量数据库,Agent每次回答前先做检索,把相关的文本片段拼到Prompt里,再让模型生成答案。
这个链路里,最容易被低估的是“文档切分”和“向量化”本身带来的工程复杂度。不同格式的文档要解析、清洗、去噪;PDF里可能是扫描件,需要OCR;Word和Markdown的结构要保留标题层级;代码仓库可能要按函数切块而不是按字符数盲目切分。等这些文档管道跑起来之后,你才会真正意识到,基础设施团队要维护的不只是“数据库”,而是一整套知识工程管道。
在向量数据库选型上,很多团队会陷入“谁能力强选谁”的纠结,我的建议更务实:
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 数据结构简单、量级小于百万、已有PostgreSQL | pgvector | 少一套系统,借助PG已有运维体系,成本最低 |
| 已有ES且量级不大、日志检索引擎标配 | ES的dense_vector/kNN | 复用现有集群,少引入一个组件,适合日志+KGR(生成式检索)分层 |
| 千万级以上向量、高并发检索、需要多租户隔离 | Milvus/Qdrant | 专业向量库,性能好,但需要额外运维成本 |
| 纯内部工具、数据量很小、不想管任何服务 | 内存向量索引(如FAISS) | 单机推理方案,配合Python脚本可以做极轻量知识问答 |
我没有提到把各类商业向量数据库当成唯一答案,因为Agent场景下检索链路不是“只有向量”一种解法。**混合检索(BM25关键词召回 + 向量召回 + Rerank重排)**效果会比纯向量好得多。原因很简单:文档里的专业名词、SKU编号、单据号往往是精确匹配,向量模型对这种短文本精确匹配并不擅长。基础设施团队在设计知识库检索时,要一开始就预留“双路召回”的架构空间。
3.2 Agent运行轨迹的事件溯源设计
Agent还有一类数据是传统业务系统从来没有认真对待过的——Agent运行时的事件流。一次Agent请求,经历了一次用户输入、多次模型推理、多次工具调用,每次都有输入输出、耗时、Token消耗、错误码。这些事件按时间顺序串起来,就是Agent的“大脑皮层活动记录”。
要支撑Agent的调试、审计、回放和效果评估,我推荐用**Event Sourcing(事件溯源)**的思维来设计存储模型。它的核心原则是:Agent的任何状态变化都表示为一条不可变事件,追加写日志分区,而不是去更新某一行状态记录。
比如一个会话过程,可以记录这些事件:
UserMessageReceived:用户说了什么AgentPlanCreated:Agent规划了哪些步骤ToolCallStarted:要调哪个工具,参数是什么ToolCallFinished:工具返回了什么LlmRequestStarted/LlmResponseReceived:模型调用延迟、Token数、返回内容AgentContextDelta:上下文窗口如何被压缩、更新
这些事件记录下来之后,你才能回答三个核心问题:这个Agent为什么给出这个回答?这次失败是模型的问题还是工具的问题?上一版Prompt上线后对任务成功率的影响是什么?
传统的数据存储思路是“把最终状态存下来”,对应到Agent就是“把对话摘要存下来”。这当然也能用,但是当你想做线上问题定位时就会发现,缺少整个决策过程,你无法判断是哪个环节出了问题。事件流存储是Agent基础设施里成本最低却能换取最大调试自由度的一环。
3.3 缓存与状态存储的选型
Agent的短期状态(Session State),比如当前上下文摘要、执行中的任务状态、临时凭证,我倾向于放在Redis,原因很简单:延迟低、TTL过期机制成熟、社区生态好。但不要只放Redis一类内存型存储。Redis一旦重启、主从切换,短期状态丢失,用户正在进行的Agent交互就会中断。生产上可靠一点的做法是:Redis存热状态,同时把状态快照异步落到MySQL/PostgreSQL,这样即使Redis丢数据,也能从快照恢复。
长期记忆(Long-Term Memory)就更有意思了。Agent要记住用户偏好、过往对话的重要结论、历史任务的完整记录,这些结构化记忆应该放进传统数据库,而非向量库。例如:
- 用户是谁、权限范围是什么 → 常规关系表
- 用户过去问过哪些问题、Agent给过什么答复 → 普通历史表,按用户ID索引
- 需要做相似推荐/回忆起某段上下文语义 → 向量化后进向量库
很多团队把“长期记忆”和“向量数据库”划等号,这是不对的。向量库擅长“找到相似的语义内容”,但Agent的记忆首先要精确、可查、有状态,传统数据库依然是主干,向量库是补充。
4. 可观测性实战:用ES REST API搭建Agent日志分析管道
4.1 Agent日志和传统日志的区别
大部分人接触的日志系统,是为传统服务设计的:每行日志是短小精悍的文本,比如访问日志、错误堆栈、数据库慢查询。Agent的日志完全不是这个量级。一次Agent任务可能产生几万到几十万字符的结构化日志,里面包含完整Prompt、模型输出、工具调用参数、执行时间线。
日志内容变长了几十倍,这对任何日志系统都是压力。如果没有合理的Mapping设计和采样策略,ES集群会先被打爆。我的经验是分两层来存:
- 结构化指标层:每一轮Agent运行的关键字段,抽成短小精悍的JSON文档,进ES。这里存储的是session_id、agent_name、event_type、tool_name、token消耗、延迟、状态码、错误类型、用时等字段。这层主要服务于监控、聚合和告警。
- 原始内容层:完整的Prompt、模型输出、工具入参出参,写入对象存储(OSS/S3),用一条
raw_log_id关联到ES中的结构化文档。出了问题需要人肉查看完整链路时,再按ID去对象存储拉取原始内容。
这样设计的好处是:ES索引的体积能控制住,查询性能不会因为Text字段巨大而劣化;同时你保留了完整的审计与调试能力,只是把“低频访问的大字段”移到了更便宜的存储上。
4.2 索引Mapping设计:字段类型坑与解决方案
给出一个我实际在用的索引设计参考。我会用Elasticsearch中Data Stream/Index做演示,读者可以根据自己公司选型(阿里云ES、Elastic Cloud、自建)做微调:
json复制PUT /agent-log
{
"mappings": {
"properties": {
"session_id": { "type": "keyword" },
"agent_name": { "type": "keyword" },
"user_id": { "type": "keyword" },
"timestamp": { "type": "date" },
"event_type": { "type": "keyword" },
"tool_name": { "type": "keyword" },
"tool_args": { "type": "object", "enabled": false },
"tool_result": { "type": "object", "enabled": false },
"llm_prompt_tokens": { "type": "integer" },
"llm_completion_tokens": { "type": "integer" },
"llm_latency_ms": { "type": "integer" },
"status": { "type": "keyword" },
"error_type": { "type": "keyword" },
"error_msg": { "type": "text" },
"raw_log_ref": { "type": "keyword" }
}
}
}
这里有个非常经典的坑:tool_args和tool_result这两个字段存的是JSON对象,如果正常做Mapping,ES会把它当成复杂对象自动展开建立索引,字段数量会爆炸,而且几乎没人会拿它做搜索。我把它们设为"enabled": false,意思是ES只负责保存这个JSON,不索引、不搜索。你需要原始内容时直接用_source取出来就行。这样既保存了完整信息,又不会让索引变得臃肿。
另外一个高频坑是字段类型。很多团队用Logstash或Filebeat默认方式把日志灌进ES,session_id会被识别为text类型,term查询查不出来,只能跑到match,结果还会因为分词器把一串带下划线和数字的ID拆得七零八落。所以Mapping里凡是ID类字段必须显式设置为keyword。
4.3 常用分析场景的ES查询实操
下面几个查询是我在生产环境里用得最频繁的,全部基于REST API,可以直接在Kibana Dev Tools或curl里跑。
场景一:还原单个Agent会话的完整决策轨迹
这是排查线上问题的第一步。用户说“Agent回答错了”,你要看它内部到底怎么想的、调了哪些工具、模型输出发生了什么变化:
json复制GET /agent-log/_search
{
"query": {
"bool": {
"filter": [
{ "term": { "session_id": "sess_20250101_abc123" } },
{ "term": { "agent_name": "ticket-assistant" } }
],
"must": [
{ "range": { "timestamp": { "gte": "now-24h" } } }
]
}
},
"sort": [
{ "timestamp": "asc" }
]
}
这里要注意:sort指定按时间升序,这样你看到的就是一个Agent从开始到结束的完整时间线。如果你加了size限制,最好放大到200条以上,因为一次Agent任务的事件日志可能远超10条。
场景二:统计每个工具的成功率、延迟、Token消耗
判断工具层是否有问题,用Terms聚合:
json复制GET /agent-log/_search
{
"size": 0,
"query": {
"bool": {
"filter": [
{ "term": { "event_type": "tool_call" } },
{ "range": { "timestamp": { "gte": "now-7d" } } }
]
}
},
"aggs": {
"by_tool": {
"terms": { "field": "tool_name", "size": 30 },
"aggs": {
"by_status": {
"terms": { "field": "status" }
},
"avg_latency": { "avg": { "field": "llm_latency_ms" } },
"total_completion_tokens": { "sum": { "field": "llm_completion_tokens" } }
}
}
}
}
这个查询返回的就是一张工具调用质量报表:哪个工具调用最频繁、成功率是多少、平均延迟多长、消耗的Token占比多大。看到结果后,你可能会发现某个工具虽然只占总调用量的5%,却消耗了20%的Token,这是因为模型把大段返回结果都带进了下一轮上下文,这时候你就应该优化工具返回结果的摘要策略。
场景三:定位Token消耗大户
按用户维度或者按Agent维度聚合Token消耗,能够直观发现成本黑洞:
json复制GET /agent-log/_search
{
"size": 0,
"query": {
"range": { "timestamp": { "gte": "now-30d" } }
},
"aggs": {
"by_user": {
"terms": { "field": "user_id", "size": 20 },
"aggs": {
"total_tokens": {
"sum": {
"script": {
"source": "doc['llm_prompt_tokens'].value + doc['llm_completion_tokens'].value"
}
}
},
"total_tasks": { "value_count": { "field": "session_id" } }
}
}
}
}
这类查询不需要每次实时跑。更稳妥的做法是设置一个定时任务,每小时把聚合结果写入一个“成本汇总索引”,然后给业务方出每日报表。实时查询整个月的原始索引,在大数据量下是很快就会卡死的。
ES在Agent可观测性里的定位,是“结构化指标查询引擎”,它的职责是回答“发生了什么、频率多高、耗时多少、成本多少”。至于“为什么会这样”,往往需要把日志链路导出到外部,配合Prompt Diff、结果评估之类的工具做推理分析。
5. 生产环境中的高发问题与排查经验
5.1 重试风暴:Agent故障时的放大效应
传统服务也会重试,但通常由程序员显式编写,次数和间隔都可控。Agent的重试是模型自己决定的——工具调用超时后,模型可能判断“这次失败没关系,我换个参数再试一次”,然后自动发起下一次工具调用。这个行为本身是智能的,但也极其危险。
想象一个上游系统正在经历故障,响应变慢或者返回错误。传统架构下,Nginx网关和微服务框架自带熔断降级,下游挂了你还能快速地返回错误页。Agent架构下,一个Agent发现调用工单系统失败,它会思考“是不是我的请求格式不对”,然后换一种说法再试一次;还不行,它可能会生成新的参数再试;又不行,它可能去找另一个备用工具,试图绕过去。结果就是:上游的每一次故障,在Agent这层会被放大成3倍甚至5倍以上的请求量,而且全部集中在故障窗口内,造成比原始故障更大规模的雪崩。
我们的处理策略有两个层面。第一,Agent运行时层面必须加“重试预算”:每个Agent任务里,同一个工具调用的最大失败次数固定为2到3次;一旦超过,Agent必须停止该工具调用并转入替代流程,而不是无限自我修正。第二,基础设施层面要把Agent执行引擎和外部服务之间做成标准的“熔断器”:连续N次失败时,直接快速失败,让Agent的规划器尽快拿到错误信号,而不是卡在那里反复重试。
5.2 上下文膨胀:延迟和成本的双重打击
多轮Agent会话天然会把历史上下文越堆越长。不少团队做Demo的时候,直接用一个List把对话历史全部放到Prompt里,前几轮效果不错,到第20轮、第30轮就崩了——不是模型崩,是时间延迟和成本崩了。
你来看这个逻辑:传统产品,用户用一次花一次API的钱。Agent产品,假设每轮都携带全部历史,那么第10轮的请求成本可能是第1轮的5倍;历史越长每次请求的延迟越高,因为模型需要“读”的Token越多;处理长上下文的推理速度还更慢,KV Cache占用也更大(第2节已经算过它多贵)。更麻烦的是,模型往往会“迷失在中间”,太长的上下文反而降低回答质量。
解决上下文膨胀,我推荐一套组合拳。第一招是滚动摘要(Rolling Summary):每三轮对话之后,让模型把前面三轮对话压缩成一段简短摘要,放进上下文里,替代原始对话记录。第二招是关键信息抽取:对用户相关的历史信息(比如姓名、偏好、订单号),拉到专门的Memory存储里,只在需要的时候插入Prompt,而不是把全量对话历史都塞进去。第三招是给上下文窗口设定硬上限,超过阈值就强制触发一轮摘要。
这样做的效果很明显:单轮请求的Token消耗能从上万压到三四千,延迟和成本双双下降,而且回答更聚焦了。这一步对任何生产级Agent来说都是刚需。
5.3 日志存储爆炸与成本治理
前面讲的ES分层存储,能缓解日志量暴涨的问题,但还不够。Agent日志比普通接口日志大10倍到50倍,不治理的话,ES集群的磁盘会被Prompt全文轰炸占满。
我的治理三板斧:
第一,字段裁剪。很多字段平时根本不需要,不要默认全量采集。可以只保留必须的字段,其余做成“可追加”的模式,出现线上问题时再通过埋点在线上临时开启全量收集。
第二,采样策略。线上Debug级别日志在正常运行时采样1%,或者只采样错误和慢链路;完整原始Prompt和工具结果一律发对象存储。
第三,生命周期管理。ES索引按天滚动,超过30天的索引自动Close或删除;有些合规要求需要留存90天,那就把数据转存到廉价的冷存储里,ES里只保留热数据。
这三板斧下来,一般能把ES集群的存储成本压到原来的1/3以下。你可能觉得丢掉数据会影响调试,但事实上,绝大多数数据在你真正需要它之前就已经没有价值了,真正需要精读的日志可能只占千分之一。
6. 基础设施跟进的合理路径:从日志分析Agent开始
6.1 为什么先做“日志分析Agent”最合适
聊完了Agent对基础设施的压力,很多团队会陷入一个误区:赶紧买GPU、上推理集群、搭向量库,一步到位。我的建议恰恰相反:如果团队刚开始做Agent,第一个生产级Agent项目,优先做内部工具——尤其是“日志分析Agent”,而不是直接面向C端用户的客服或助手。
为什么?因为日志分析这个场景,能让你用最低的成本把Agent基础设施的每一层都练一遍:
- 你需要接入大量日志数据,要处理数据管道、索引设计、时序聚合,这是Elasticsearch/ClickHouse的活;
- 你让Agent通过ES REST API去分析日志,它可以识别错误模式、统计错误率、查询慢查询、用自然语言生成排查建议,这需要让Agent学会调用工具的完整链路;
- 日志数据是内部数据,不涉及面向用户的体验风险和隐私问题,出错了影响面小;
- 日志分析的结果可以直接反馈给基础设施团队,形成一个“用Agent优化Agent设施”的闭环。
实际效果也验证了这点。我们内部搭的日志分析Agent,接入了ES的REST接口,用户问“今天早上订单服务报了什么错”,Agent会自己把查询翻译成ES DSL,调用ES搜索接口,再基于聚合结果生成可读的报告。这个Agent本身就是一个工具调用型Agent的典型案例,它训练了我们的基础设施团队:如何设计ES Mapping、如何控制查询超时、如何管理Token预算、如何给Agent加可观测性。
6.2 最便宜的启动方案
如果你的预算不多,甚至一张GPU都还没买,也可以先把基础设施跑通。
最便宜且具备可行性的启动方案是:
- 直接使用商业大模型API(不管是国内各家,还是海外API),先不碰自建推理,省去GPU运维成本。
- 数据层用已有的PostgreSQL + pgvector,或者干脆先用ES(现在很多公司已经有ES集群)存日志和向量,不额外引入Milvus。
- Agent框架先用Python写,固定调用两三个工具,其中之一就是ES REST API。
- 可观测性先把结构化日志写入ES,把监控告警接入现有Prometheus或类似体系。
这套方案的硬件成本几乎为零,完整跑一遍Agent开发、日志分析、故障排查的闭环。等日均Token消耗真正到了六位数级别,再开始评估是否要自建推理。
6.3 渐进式改造路线图
当业务已经验证成功、用户量和Token消耗都上来之后,基础设施的升级建议分三步走,每一步都有明确的收益验证:
第一步:加固可观测性。 把第4节的ES日志分析落地成常态化的监控看板,做到任意一次Agent任务都能按session追到完整轨迹,所有异常都能在5分钟内定位到具体环节。没有这一步,后面的一切优化都是盲人摸象。
第二步:改造数据管道。 建立RAG知识库的更新、评估、回滚机制,引入事件溯源存储;如果每天Token消耗已经很高,再考虑用缓存层缓存重复工具调用的结果,减少模型重复推理。这个阶段你要做的,是把Agent“越用越慢、越用越贵”的趋势踩住。
第三步:按需建设推理集群。 当每日Token消耗稳定后,你手里已经有了准确的Token速率曲线、峰值并发、平均上下文长度和成本模型,这时候再决定买什么卡、用哪种推理引擎、要不要引入量化,完全可以数据驱动。
我在实际项目中见过太多团队,第一步还没做完就直接跳到第三步,GPU买回来了、模型部署好了,却发现日志查不了、状态存不住、用户会话会丢,最后还是乖乖回头补课。基础设施的节奏,宁可慢一步,也不要跳步。
最后提醒一句:AI Agent的壁垒,从来不只是提示词写得好不好、框架用得溜不溜。真正拉开差距的,是当Agent频繁出错时你能不能快速定位,当Token成本翻倍时你能不能从容扩容,当会话状态失效时你能不能保证用户不感知。这些才是支撑AI Agent走得更远的基础。
