【AI应用开发】用户会话多、并发高,Agent 服务如何做性能优化?缓存怎么做?
【AI应用开发】用户会话多、并发高Agent 服务如何做性能优化缓存怎么做目录Agent 服务的性能瓶颈缓存策略全览异步与并发优化LLM 层优化架构层优化完整高并发架构1. Agent 服务的性能瓶颈一次 Agent 调用 N 次 LLM API 调用 M 次工具调用 典型耗时组成: LLM 推理: 1-3s × 2-5次 2-15s 工具执行: 0.1-2s × 2-5次 0.2-10s RAG 检索: 0.2-0.5s × 1-3次 0.2-1.5s 总延迟: 3-25 秒/次对话用户感知非常慢 高并发瓶颈: 1. LLM API 限流: 多数 API 有 RPM/TPM 限制 2. 长连接占用: Agent 执行时间长连接不释放 3. 内存膨胀: 每会话上下文消耗内存 4. 无缓存: 同样问题每次重新完整执行2. 缓存策略全览2.1 多层缓存架构L1: 精确匹配缓存 (Redis, TTL5min) ↓ 未命中 L2: 语义相似缓存 (向量库, TTL30min) ↓ 未命中 L3: 部分结果缓存 (工具调用结果, TTL10min) ↓ 未命中 L4: 实际执行2.2 L1: 精确匹配缓存importhashlibimportredisimportjsonclassExactMatchCache:精确匹配缓存 —— 完全相同的输入直接返回缓存def__init__(self,redis_client,ttl300):self.redisredis_client self.ttlttldef_normalize(self,text:str)-str:标准化输入# 去除多余空格、统一大小写中文不需、去除标点变化textre.sub(r\s, ,text.strip())returntextdefget(self,user_input:str)-Optional[str]:获取缓存keyfcache:exact:{hashlib.md5(self._normalize(user_input).encode()).hexdigest()}cachedself.redis.get(key)returnjson.loads(cached)ifcachedelseNonedefset(self,user_input:str,response:str):写入缓存keyfcache:exact:{hashlib.md5(self._normalize(user_input).encode()).hexdigest()}self.redis.setex(key,self.ttl,json.dumps(response,ensure_asciiFalse))definvalidate(self,pattern:str*):批量失效缓存keysself.redis.keys(fcache:exact:{pattern})ifkeys:self.redis.delete(*keys)# 不缓存的场景NO_CACHE_PATTERNS[r我的.*订单,# 个性化查询rORD-\d{4}-\d{5},# 具体订单号r查询.*积分|余额,# 实时数据]2.3 L2: 语义相似缓存classSemanticCache:语义相似缓存 —— 意思相同的不同问法命中缓存def__init__(self,vector_store,redis_client,similarity_threshold0.92,ttl1800):self.vector_storevector_store self.redisredis_client self.thresholdsimilarity_threshold self.ttlttlasyncdefget(self,user_input:str,session_id:str)-Optional[str]:语义检索缓存query_embeddingawaitself._get_embedding(user_input)# 搜索相似的已缓存问题resultsself.vector_store.search(query_embedding,k1,filter{type:semantic_cache})ifresultsandresults[0][score]self.threshold:cache_keyresults[0][metadata][cache_key]cachedself.redis.get(cache_key)ifcached:# 更新访问时间self.redis.expire(cache_key,self.ttl)returnjson.loads(cached)returnNoneasyncdefset(self,user_input:str,response:str):写入语义缓存embeddingawaitself._get_embedding(user_input)cache_keyfcache:semantic:{hashlib.md5(user_input.encode()).hexdigest()}# 存储响应self.redis.setex(cache_key,self.ttl,json.dumps(response,ensure_asciiFalse))# 存储向量用于语义检索self.vector_store.add(idcache_key,vectorembedding,metadata{type:semantic_cache,cache_key:cache_key,original_query:user_input[:200],timestamp:time.time()})asyncdef_get_embedding(self,text):# 实际的 embedding 调用returnawaitself.embedding_client.encode(text)2.4 L3: 工具调用结果缓存classToolResultCache:工具调用结果缓存 —— 同一工具参数的结果缓存def__init__(self,redis_client,default_ttl600):self.redisredis_client self.default_ttldefault_ttl# 不同工具的缓存 TTLself.ttl_map{search_knowledge_base:1800,# 知识库30分钟query_product:300,# 商品信息5分钟query_inventory:60,# 库存1分钟query_order:0,# 订单不缓存实时变化query_user:0,# 用户信息不缓存}defget(self,tool_name:str,args:dict)-Optional[dict]:获取工具结果缓存ttlself.ttl_map.get(tool_name,-1)ifttl0:returnNone# 该工具不缓存# 构建缓存 keycache_keyself._build_key(tool_name,args)cachedself.redis.get(cache_key)returnjson.loads(cached)ifcachedelseNonedefset(self,tool_name:str,args:dict,result:dict):缓存工具结果ttlself.ttl_map.get(tool_name,self.default_ttl)ifttl0:returncache_keyself._build_key(tool_name,args)self.redis.setex(cache_key,ttl,json.dumps(result,ensure_asciiFalse))def_build_key(self,tool_name:str,args:dict)-str:构建缓存 keyargs_strjson.dumps(args,sort_keysTrue,ensure_asciiFalse)args_hashhashlib.md5(args_str.encode()).hexdigest()returnftool_cache:{tool_name}:{args_hash}definvalidate_tool(self,tool_name:str):使某个工具的所有缓存失效keysself.redis.keys(ftool_cache:{tool_name}:*)ifkeys:self.redis.delete(*keys)2.5 缓存集成到 AgentclassCachedAgent:集成缓存的 Agentdef__init__(self,llm,tools):self.llmllm self.toolstools self.exact_cacheExactMatchCache(redis_client)self.semantic_cacheSemanticCache(vector_store,redis_client)self.tool_cacheToolResultCache(redis_client)self.stats{cache_hit:0,cache_miss:0}asyncdefrun(self,user_input:str,session_id:str):# 1. 精确缓存exactself.exact_cache.get(user_input)ifexact:self.stats[cache_hit]1returnexact self.stats[cache_miss]1# 2. 语义缓存semanticawaitself.semantic_cache.get(user_input,session_id)ifsemantic:self.stats[cache_hit]1returnsemantic# 3. 实际执行带工具缓存responseawaitself._execute_with_tool_cache(user_input)# 4. 写入缓存self.exact_cache.set(user_input,response)awaitself.semantic_cache.set(user_input,response)returnresponseasyncdef_execute_with_tool_cache(self,user_input):带工具缓存的执行messages[{role:user,content:user_input}]forstepinrange(15):responseawaitself.llm.chat(messages,toolsself.tools)ifresponse.finish_reasonstop:returnresponse.contentfortcinresponse.tool_calls:# 检查工具缓存cached_resultself.tool_cache.get(tc.name,tc.args)ifcached_result:resultcached_result logger.info(f工具缓存命中:{tc.name})else:# 执行工具resultawaitself._execute_tool(tc)# 缓存结果self.tool_cache.set(tc.name,tc.args,result)messages.append({role:tool,content:json.dumps(result,ensure_asciiFalse)})3. 异步与并发优化3.1 会话内工具并行asyncdefexecute_parallel_tools(self,tool_calls:list)-list:并行执行互不依赖的工具调用# 检查工具之间有无依赖independentself._filter_independent(tool_calls)iflen(independent)1:# 并行执行tasks[self._execute_tool(tc)fortcinindependent]resultsawaitasyncio.gather(*tasks,return_exceptionsTrue)fortc,resultinzip(independent,results):ifisinstance(result,Exception):logger.error(f工具{tc.name}执行失败:{result})returnresultselse:# 单个工具直接执行return[awaitself._execute_tool(tool_calls[0])]def_filter_independent(self,tool_calls):过滤出互不依赖的工具调用# 简单规则: 如果工具类别不同就认为可并行# 实际可根据工具间数据依赖判断categories[self.tools[tc.name].categoryfortcintool_calls]iflen(set(categories))len(categories):returntool_calls# 全部可并行returntool_calls[:1]# 保守只并行第一个3.2 跨会话异步处理classAsyncAgentService:异步 Agent 服务def__init__(self,max_concurrent50):self.semaphoreasyncio.Semaphore(max_concurrent)self.agent_poolAgentPool(min_size5,max_size20)asyncdefchat(self,user_input:str,session_id:str):异步聊天接口asyncwithself.semaphore:# 并发控制agentawaitself.agent_pool.acquire()try:responseawaitagent.run(user_input,session_id)returnresponsefinally:awaitself.agent_pool.release(agent)classAgentPool:Agent 实例池复用 LLM 连接def__init__(self,min_size5,max_size20):self.poolasyncio.Queue()self.min_sizemin_size self.max_sizemax_size self.current_size0asyncdefacquire(self):获取 Agent 实例try:returnself.pool.get_nowait()exceptasyncio.QueueEmpty:ifself.current_sizeself.max_size:self.current_size1returnself._create_agent()returnawaitself.pool.get()asyncdefrelease(self,agent):归还 Agent 实例awaitself.pool.put(agent)4. LLM 层优化classLLMOptimizer:LLM 层优化staticmethoddefuse_small_model_for_simple_tasks(user_input,intent):简单任务用小模型省钱快ifintentin[chitchat,simple_fact]:returngpt-4o-mini# 快 5x便宜 20xelifintentin[procedure,faq]:returngpt-4o# 平衡else:returngpt-4o# 复杂任务才用最好的staticmethoddefstreaming_response(generator):流式输出 —— 用户更快看到第一个字forchunkingenerator:yieldchunk.contentstaticmethoddefprompt_compression(messages,max_tokens8000):压缩 Prompt —— 移除冗余内容# 保留 system prompt 最近 N 轮 工具结果摘要compressed[messages[0]]# system prompt# 最近的消息recentmessages[-10:]# 压缩过长的工具返回formsginrecent:ifmsg[role]toolandlen(str(msg[content]))1000:msg[content]str(msg[content])[:1000]...[已截断]compressed.append(msg)returncompressedstaticmethoddefestimate_and_control_tokens(messages):Token 预估与控制totalsum(len(str(m.get(content,)))//4forminmessages)iftotal12000:# 触发压缩returnLLMOptimizer.prompt_compression(messages)returnmessages5. 架构层优化# 推荐的高并发架构 ┌──────────┐ │ Nginx │ (负载均衡 限流) └─────┬────┘ │ ┌───────────┼───────────┐ ▼ ▼ ▼ ┌─────────┐ ┌─────────┐ ┌─────────┐ │Agent服务 │ │Agent服务 │ │Agent服务 │ (水平扩展) │ 实例 1 │ │ 实例 2 │ │ 实例 3 │ └────┬────┘ └────┬────┘ └────┬────┘ │ │ │ └───────────┼───────────┘ │ ┌───────────┼───────────┐ ▼ ▼ ▼ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ Redis │ │ Milvus │ │ LLM API │ │ (缓存) │ │ (向量库)│ │ (多Key) │ └─────────┘ └─────────┘ └─────────┘ classScaledAgentService:水平扩展的 Agent 服务def__init__(self):# 多 LLM API Key 轮转突破 RPM 限制self.llm_keys[sk-key1,sk-key2,sk-key3]self.current_key_idx0# 限流器self.rate_limiterTokenBucket(rate100,capacity200)defget_llm_client(self):轮转 API Keykeyself.llm_keys[self.current_key_idx]self.current_key_idx(self.current_key_idx1)%len(self.llm_keys)returnLLMClient(api_keykey)asyncdefhandle_request(self,user_input,session_id):处理请求带限流ifnotself.rate_limiter.consume():return{error:服务繁忙请稍后重试,retry_after:5}returnawaitself.agent.chat(user_input,session_id)classTokenBucket:令牌桶限流器def__init__(self,rate:int,capacity:int):self.raterate self.capacitycapacity self.tokenscapacity self.last_refilltime.time()defconsume(self,tokens1):self._refill()ifself.tokenstokens:self.tokens-tokensreturnTruereturnFalsedef_refill(self):nowtime.time()elapsednow-self.last_refill self.tokensmin(self.capacity,self.tokenselapsed*self.rate)self.last_refillnow6. 完整高并发架构关键数值总结优化手段延迟降低并发提升精确缓存100% (命中时)极高语义缓存80-90%极高工具缓存20-40%中异步并行30-50%50%小模型分流60-80%100%流式输出感知 50%不变水平扩展不变N倍线性API Key 轮转不变N倍落地建议第一阶段立即可做: ✅ Redis 精确缓存 → 热点问题零延迟 ✅ 异步并行工具调用 → 减少 30% 延迟 ✅ 流式输出 → 用户感知更快 第二阶段一周内: ✅ 工具结果缓存 → 减少重复 API 调用 ✅ 语义缓存 → 覆盖相似问法 ✅ 小模型分流 → 降低 LLM 成本 第三阶段生产加固: ✅ 多 API Key 轮转 → 突破 RPM 限制 ✅ 水平扩展 负载均衡 ✅ Token 预算 Prompt 压缩

相关新闻

Coding Agent真实编码工具:从代码生成到工程实践的关键跨越

Coding Agent真实编码工具:从代码生成到工程实践的关键跨越

1. 项目概述:为什么“真实的编码工具”是Coding Agent的命门? 如果你和我一样,折腾过不少所谓的“Coding Agent”,从早期的代码补全插件到如今能“理解”需求的AI助手,那你肯定也踩过这个坑:Agent在Demo里看…

2026/8/8 13:49:36 阅读更多 →
基于JSP的高校选课系统设计与实现

基于JSP的高校选课系统设计与实现

1. 项目背景与核心需求通识教育选课系统是高校教务管理中的重要组成部分,它直接关系到教学资源的合理分配和学生的个性化发展。作为计算机专业的毕业设计选题,采用JSP技术实现这类系统具有典型的教学意义和实践价值。我去年指导过一组学生完成类似的系统…

2026/8/8 13:29:25 阅读更多 →
Mac键盘F键功能切换全攻略:从系统设置到Karabiner-Elements进阶定制

Mac键盘F键功能切换全攻略:从系统设置到Karabiner-Elements进阶定制

1. 项目概述:为什么Mac用户都想改掉这个键? 如果你刚用上MacBook或者iMac,头几天最不习惯的,除了那个“反人类”的单键鼠标,恐怕就是键盘最上面那一排功能键了。想调个屏幕亮度?按F1、F2没反应,…

2026/8/8 11:41:23 阅读更多 →

最新新闻

微信机器人框架

微信机器人框架

E云管家平台是一款基于VX功能强大的机器人框架 支持二次开发,调用简单,上手迅速,做业务方便,无需关注版本问题,也无需用户必须下载PC电脑。仅需扫码授权即可二次开发使用服务 目前服务支持以下接口: 1.发送文本消息 2.发送文件 3.发送图片消息 4.发送视频消息 5.发送语音消息…

2026/8/8 17:35:18 阅读更多 →
一年砸下110亿美元,比红杉还凶:美国政府成了AI圈最猛的投资人

一年砸下110亿美元,比红杉还凶:美国政府成了AI圈最猛的投资人

你能想象美国政府下场"炒股"吗?不是那种买点国债收利息的保守操作,而是像风投机构一样,直接给一家家芯片公司砸真金白银换股权。据不完全统计,美国政府针对 Intel、GlobalFoundries、xLight 等11家AI芯片及上游公司&…

2026/8/8 17:35:18 阅读更多 →
SavvyCAN:跨平台CAN总线分析的终极免费解决方案

SavvyCAN:跨平台CAN总线分析的终极免费解决方案

SavvyCAN:跨平台CAN总线分析的终极免费解决方案 【免费下载链接】SavvyCAN QT based cross platform canbus tool 项目地址: https://gitcode.com/gh_mirrors/sa/SavvyCAN 你是否正在寻找一款功能全面、免费且跨平台的CAN总线分析工具?SavvyCAN正…

2026/8/8 17:35:18 阅读更多 →
深入理解 SQL 语句执行顺序:从原理到实战

深入理解 SQL 语句执行顺序:从原理到实战

一、引言:为什么需要理解 SQL 执行顺序?SQL 作为与数据库交互的核心语言,其书写顺序(SELECT ... FROM ... WHERE ...)与数据库引擎的实际执行顺序存在显著差异。这种差异是许多 SQL 性能问题和逻辑错误的根源。理解 SQ…

2026/8/8 17:35:18 阅读更多 →
5步掌握Stable Diffusion WebUI Forge中的ControlNet:从零到精准控制的艺术

5步掌握Stable Diffusion WebUI Forge中的ControlNet:从零到精准控制的艺术

5步掌握Stable Diffusion WebUI Forge中的ControlNet:从零到精准控制的艺术 【免费下载链接】stable-diffusion-webui-forge 项目地址: https://gitcode.com/GitHub_Trending/st/stable-diffusion-webui-forge Stable Diffusion WebUI Forge作为AUTOMATIC11…

2026/8/8 17:35:18 阅读更多 →
MySQL聚簇索引与非聚簇索引:核心差异与性能对比

MySQL聚簇索引与非聚簇索引:核心差异与性能对比

引言在MySQL数据库优化中,索引设计是提升查询性能的关键。聚簇索引和非聚簇索引作为两种核心的索引实现方式,在存储引擎层面有着本质的区别。理解这两种索引的工作原理和差异,对于设计高效的数据库架构至关重要。本文将从存储逻辑、查询性能和…

2026/8/8 17:34:18 阅读更多 →

日新闻

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

当下AI应用飞速普及,无数企业下场搭建智能体系统,可落地阶段难题接踵而至:上下文无限堆积频繁爆栈、AI工具调用准确率低下、Token成本居高不下、企业数据权限混乱暗藏安全隐患……很多团队卡在架构搭建环节,空有前沿技术概念&…

2026/8/8 0:00:07 阅读更多 →
PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码 【免费下载链接】php-qrcode A PHP QR Code generator and reader with a user-friendly API. 项目地址: https://gitcode.com/gh_mirrors/ph/php-qrcode 在当今数字时代,二维码已…

2026/8/8 0:00:08 阅读更多 →
UniApp微信小程序隐私保护组件开发:从原理到实战

UniApp微信小程序隐私保护组件开发:从原理到实战

1. 项目缘起:为什么我们需要一个隐私保护通用组件?最近在维护一个基于uniapp开发的微信小程序矩阵时,我遇到了一个非常棘手的问题。随着平台对用户隐私保护的要求越来越严格,几乎每一个新版本发布,或者在某些特定机型&…

2026/8/8 0:00:08 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/8 17:02:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/8 8:58:26 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/7 23:24:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/8 17:02:44 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/7 23:54:54 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/8 17:02:44 阅读更多 →