AI搜索上线后变慢怎么办?一套生产环境跑通的性能优化实战指南
AI搜索性能优化教程|生产环境实测
在大模型应用从“演示阶段”进入“生产阶段”之后,AI搜索(AI Search / RAG Search / 智能问答搜索)的性能问题会迅速暴露出来:响应慢、召回不稳定、成本高、并发上不去、结果偶尔“答非所问”、上线后监控缺失,甚至用户一多就出现超时。
本文结合生产环境中的真实优化思路,系统梳理一套可落地的AI搜索性能优化方案。内容覆盖:架构拆解、性能瓶颈定位、向量检索优化、关键词检索优化、重排序优化、LLM生成优化、缓存策略、并发与稳定性、监控指标以及上线调优方法。适合正在构建企业知识库问答、智能客服、文档搜索、站内AI搜索、RAG系统的开发者和技术负责人参考。
一、什么是AI搜索?为什么它比传统搜索更复杂?
传统搜索主要依赖关键词匹配,例如倒排索引、BM25、TF-IDF等算法,关注的是“用户输入的词”和“文档中的词”是否匹配。而AI搜索通常引入了向量检索、语义理解、大模型生成,能够理解用户意图,并基于搜索结果生成自然语言答案。
一个典型的AI搜索流程通常如下:
用户问题
↓
问题预处理
↓
关键词检索 / 向量检索 / 混合检索
↓
召回候选文档
↓
重排序
↓
上下文拼接
↓
大模型生成答案
↓
返回结果与引用来源
相比传统搜索,AI搜索多了多个耗时环节:
- Embedding向量化耗时
- 向量数据库检索耗时
- 多路召回合并耗时
- Rerank重排序耗时
- 大模型生成耗时
- 上下文组装和Token消耗
- 网络调用和服务间通信耗时
因此,AI搜索的优化不能只盯着某一个环节,而应该从端到端链路出发,逐层拆解。
二、生产环境中的典型性能问题
在生产环境中,我们经常会遇到以下几类问题。
1. 首次响应时间过长
用户输入问题后,需要等待5秒、8秒甚至更久才能看到答案。对于搜索类产品来说,这种体验非常差。用户对于搜索的心理预期通常是“秒级响应”,如果AI搜索比普通搜索慢太多,很容易造成流失。
2. 检索结果不稳定
同样的问题,有时能找到正确答案,有时找不到;或者召回的片段相关性不高,导致大模型最终生成的回答不准确。这类问题往往不是模型生成本身造成的,而是检索链路质量不足。
3. 并发上不去
测试环境中单人使用很流畅,但一旦进入生产环境,几十个用户同时查询,就出现响应时间飙升、接口超时、请求堆积。这通常与向量库性能、模型服务限流、线程池配置、连接池配置、缓存策略有关。
4. 成本不可控
每次请求都调用Embedding模型、Rerank模型和大语言模型,Token消耗持续上涨。尤其是当上下文拼接过长、召回文档过多、重排序候选集过大时,成本会非常高。
5. 结果可解释性不足
AI搜索如果只返回一段生成答案,而没有引用来源,用户很难判断答案是否可信。在生产环境中,特别是企业知识库、法律、金融、医疗、政务场景,答案可追溯非常重要。
三、端到端性能指标设计
优化之前,必须先定义指标。没有指标,就无法判断优化是否有效。
建议至少监控以下指标:
| 指标 | 含义 | 建议目标 |
|---|---|---|
| P50延迟 | 50%请求的响应时间 | 1~3秒 |
| P90延迟 | 90%请求的响应时间 | 3~6秒 |
| P99延迟 | 极端慢请求延迟 | 尽量小于10秒 |
| 检索耗时 | 向量检索、关键词检索耗时 | 小于300ms |
| Rerank耗时 | 重排序模型耗时 | 小于500ms~1500ms |
| LLM首Token时间 | 大模型开始输出的时间 | 小于2秒 |
| 总Token数 | Prompt和Completion总消耗 | 越低越好 |
| 命中缓存率 | 查询缓存或答案缓存命中率 | 20%~60% |
| 召回准确率 | 正确文档是否被召回 | 越高越好 |
| 答案满意率 | 用户反馈或人工评测 | 持续提升 |
生产环境中建议对每一次请求记录链路日志,例如:
{
"query": "如何重置管理员密码?",
"query_rewrite_ms": 38,
"embedding_ms": 72,
"vector_search_ms": 114,
"keyword_search_ms": 46,
"rerank_ms": 623,
"context_build_ms": 19,
"llm_first_token_ms": 1280,
"llm_total_ms": 3680,
"total_ms": 4620,
"prompt_tokens": 3120,
"completion_tokens": 486,
"cache_hit": false
}
有了这些数据,才能知道真正的瓶颈在哪里。
四、优化一:问题预处理与查询改写
很多AI搜索系统一开始就直接把用户输入送去向量检索,但生产环境中用户输入往往非常不规范,例如:
- “这个怎么弄?”
- “不能登录”
- “报错了”
- “上次那个配置在哪里?”
- “有没有相关说明?”
这类问题太短或上下文不足,会导致召回质量较差。
1. 查询标准化
可以在检索前进行轻量处理:
- 去除无意义符号
- 统一大小写
- 繁简转换
- 同义词替换
- 领域词纠正
- 去除停用词
- 补充上下文信息
例如:
原始问题:登录不了咋办?
标准化后:用户无法登录系统的排查方法是什么?
标准化后的查询更适合检索。
2. 查询改写
对于复杂问题,可以调用小模型或规则进行查询改写。注意,查询改写不一定要用大模型,很多场景下规则和领域词典已经足够。
例如:
用户问题:发票开错了怎么办?
改写查询:
1. 发票信息错误如何处理
2. 发票作废流程
3. 发票重开申请方法
然后将多个查询并行检索,再合并结果。这样可以提升召回率。
3. 生产环境建议
查询改写本身也会增加耗时,因此建议:
- 简单问题不改写;
- 低置信度问题才改写;
- 改写使用小模型;
- 改写结果缓存;
- 改写数量控制在2~4个以内。
五、优化二:Embedding向量化性能优化
Embedding是AI搜索的重要环节。用户问题需要转成向量,文档也需要提前转成向量,才能进行语义检索。
1. 文档向量提前离线生成
生产环境中,文档入库时就应该完成切分、清洗、Embedding生成和索引写入,而不是查询时动态处理文档。
推荐流程:
文档上传
↓
文本抽取
↓
文本清洗
↓
文档切分
↓
Embedding生成
↓
写入向量数据库
↓
写入元数据索引
这样用户查询时只需要对问题生成Embedding即可。
2. 查询Embedding缓存
很多用户问题具有重复性,尤其是客服、帮助中心、企业内部知识库场景。例如:
- “怎么修改密码”
- “如何开发票”
- “退款多久到账”
- “怎么绑定手机号”
这些问题可以缓存Embedding结果。
缓存Key可以使用标准化后的query:
embedding_cache:{normalized_query}
缓存内容为向量数组,设置合理过期时间,例如7天、30天。对于高频问题,也可以永久缓存。
3. 选择合适的Embedding模型
Embedding模型并非越大越好。生产环境需要平衡:
- 语义效果
- 向量维度
- 推理速度
- 调用成本
- 是否支持中文
- 是否支持领域术语
如果业务主要是中文知识库,应优先选择中文表现较好的Embedding模型。向量维度越高,理论上表达能力更强,但检索和存储成本也会增加。实际生产中,应通过评测集比较,而不是凭感觉选择模型。
4. 批量生成Embedding
对于文档入库和批量更新,应使用批处理,避免一条一条调用模型。批处理可以显著提升吞吐量,减少网络开销。
六、优化三:文档切分策略优化
文档切分直接影响召回质量和Token成本。切得太大,召回片段包含太多无关信息;切得太小,又可能丢失上下文。
1. 常见切分方式
| 切分方式 | 优点 | 缺点 |
|---|---|---|
| 固定长度切分 | 实现简单 | 容易截断语义 |
| 按段落切分 | 保留自然结构 | 段落长短不一 |
| 按标题层级切分 | 适合文档型知识库 | 依赖文档结构 |
| 语义切分 | 质量较高 | 实现复杂、成本较高 |
2. 推荐策略
生产环境中建议使用“结构化切分 + 滑动窗口”的方式。
例如:
- 每个chunk控制在300~800中文字符;
- 相邻chunk保留50~150字符重叠;
- 保留标题、章节、来源、更新时间等元数据;
- 对表格、代码块、FAQ进行特殊处理;
- 不要把多个无关段落强行拼在一起。
示例:
{
"doc_id": "user_manual_001",
"chunk_id": "user_manual_001_023",
"title": "管理员密码重置",
"section": "账号管理 > 密码管理",
"content": "如果管理员忘记密码,可以由超级管理员在后台进行重置……",
"source_url": "https://example.com/docs/account",
"updated_at": "2025-01-08"
}
元数据不仅能用于展示引用,也能用于过滤和排序。
七、优化四:向量检索性能优化
向量检索是AI搜索的核心环节。生产环境中,向量库的选择、索引参数、过滤条件和TopK设置都会影响性能。
1. 控制TopK大小
很多系统默认TopK设置过大,例如一次召回100条甚至200条。这样会增加检索、重排序和上下文拼接成本。
推荐配置:
向量召回TopK:20~50
关键词召回TopK:20~50
Rerank输入TopK:20~40
最终进入LLM上下文:3~8
也就是说,不要把大量候选文档直接塞给大模型。应该先召回,再筛选,再重排序,最后只保留最相关的少量片段。
2. 使用元数据过滤
如果用户问题明确属于某个业务范围,可以先过滤再检索。例如:
- 产品类型
- 地区
- 用户角色
- 文档类型
- 更新时间
- 权限范围
示例:
只在「售后服务」分类下检索
只检索当前用户有权限访问的文档
只检索最近一年更新过的文档
这不仅提升准确率,也能减少搜索空间,提升性能。
3. 合理设置索引参数
不同向量数据库使用不同的近似最近邻索引,例如HNSW、IVF、PQ等。一般来说:
- HNSW召回效果好,查询快,但内存占用较高;
- IVF适合大规模数据,但需要合理训练和分桶;
- PQ能降低存储成本,但可能损失精度。
如果使用HNSW,需要重点关注:
M:图连接数,影响召回和内存
efConstruction:建索引质量
efSearch:查询时搜索范围
通常efSearch越大,召回越好,但查询越慢。生产中需要根据评测集找到平衡点。
4. 分片与冷热数据
当文档量很大时,可以按业务线、租户、时间等维度分片。对于历史数据或低频访问数据,可以放入冷索引;高频知识库放在热索引中。这样能减少单次检索压力。
八、优化五:混合检索提升召回质量
单纯依赖向量检索并不总是最优。向量检索擅长语义相似,但对于精确词、编号、错误码、产品型号、法规条款等场景,关键词检索更可靠。
例如:
错误码 E10037 如何解决?
合同编号 ABC-2024-0912
GB/T 35273 对应什么要求?
这些问题如果只用向量检索,可能不如BM25准确。
推荐使用混合检索
向量检索 + BM25关键词检索 + 元数据过滤 + RRF融合排序
RRF(Reciprocal Rank Fusion)是一种简单有效的融合算法。它不依赖不同检索系统的分数尺度,适合将多个排序结果合并。
基本思想是:
score = 1 / (k + rank)
一个文档在多个检索列表中排名越靠前,最终得分越高。
生产环境中,混合检索通常能显著提升召回稳定性,尤其适合企业知识库和客服问答场景。
九、优化六:Rerank重排序优化
Rerank模型用于对召回候选文档进行精细排序。它通常比向量检索更准确,但也更耗时。
1. 控制Rerank候选数量
不要把100条候选都送去重排序。推荐:
召回候选:40条以内
Rerank输入:20~30条
最终保留:3~8条
如果Rerank模型延迟较高,可以进一步降低候选数量,或者只在低置信度情况下启用。
2. 分层Rerank
可以先用轻量规则进行预筛选,再用模型重排序。
例如:
- 去重;
- 过滤过短或过长片段;
- 根据关键词命中加权;
- 根据文档更新时间加权;
- 选取前20条进入Rerank。
这样能减少模型负担。
3. Rerank缓存
对于高频问题,可以缓存Rerank结果。缓存Key可以包括:
rerank_cache:{query_hash}:{index_version}
注意必须包含索引版本,否则文档更新后可能返回旧结果。
十、优化七:上下文构建与Token控制
很多AI搜索系统慢,并不是检索慢,而是传给大模型的上下文太长。上下文越长:
- Prompt Token越多;
- 模型处理越慢;
- 成本越高;
- 干扰信息越多;
- 答案越容易跑偏。
1. 只传最相关片段
最终进入LLM的片段建议控制在3~8个,每个片段控制在合理长度。如果一个chunk过长,可以二次截取与问题最相关的段落。
2. 去重和合并
同一篇文档的相邻chunk可能重复,需要合并或去重。否则会浪费Token。
3. 明确提示词结构
推荐Prompt结构如下:
你是企业知识库问答助手。请严格基于给定资料回答问题。
如果资料中没有答案,请回答“根据现有资料无法确认”。
用户问题:
{question}
参考资料:
[1] {chunk_1}
[2] {chunk_2}
[3] {chunk_3}
回答要求:
1. 先给出直接答案;
2. 必要时分步骤说明;
3. 不要编造资料中不存在的信息;
4. 在关键结论后标注引用编号。
这类结构可以减少幻觉,提高可解释性。
4. 限制输出长度
如果业务场景是搜索,不是长文写作,可以限制输出长度。例如:
回答控制在300字以内
如需步骤,最多列出5步
输出越短,首屏体验越好,成本也更低。
十一、优化八:LLM调用性能优化
大语言模型通常是AI搜索链路中最耗时、最昂贵的部分。
1. 使用流式输出
即使总生成时间不变,流式输出也能显著改善用户体验。用户不需要等待完整答案生成,可以先看到第一段内容。
关键指标是:
首Token时间,而不是完整响应时间
如果首Token能控制在1~2秒,用户感知会好很多。
2. 模型分级
并不是所有问题都需要最强模型。可以按问题复杂度分级:
| 场景 | 推荐模型 |
|---|---|
| FAQ类简单问题 | 小模型 |
| 明确文档问答 | 中等模型 |
| 多文档综合分析 | 强模型 |
| 高风险领域回答 | 强模型 + 严格引用 |
通过路由策略,可以显著降低成本和延迟。
3. 答案缓存
对于高频问题,可以缓存最终答案。缓存需要注意:
- 包含知识库版本;
- 包含用户权限信息;
- 包含语言和地区;
- 设置合理过期时间;
- 文档更新后主动失效。
缓存Key示例:
answer_cache:{tenant_id}:{user_role}:{query_hash}:{kb_version}
4. 降低Prompt复杂度
有些系统Prompt非常长,包含大量规则、角色设定和示例,导致每次调用都消耗大量Token。生产环境建议将Prompt压缩到必要内容,不要把所有规则都塞进去。
十二、优化九:缓存体系设计
缓存是生产环境性能优化中最有效的手段之一。AI搜索可以设计多级缓存。
1. 查询级缓存
缓存标准化后的问题、改写结果、Embedding结果。
2. 检索结果缓存
缓存某个query在某个索引版本下的TopK结果。
3. Rerank结果缓存
缓存重排序后的候选文档顺序。
4. 答案缓存
缓存最终生成结果,适用于高频稳定问题。
5. 缓存失效策略
缓存最容易出问题的地方是“旧答案”。因此必须设计失效机制:
- 文档更新后更新kb_version;
- 按租户隔离缓存;
- 按权限隔离缓存;
- 重要知识变更后主动清理;
- 设置TTL自动过期。
一个简单的缓存链路如下:
用户问题
↓
命中答案缓存?是 → 直接返回
↓ 否
命中检索缓存?是 → 进入上下文构建
↓ 否
执行检索与重排序
↓
调用LLM生成
↓
写入答案缓存
十三、优化十:并发、限流与降级
AI搜索上线后,必须考虑并发和稳定性。
1. 异步并行
多个检索通道可以并行执行:
向量检索
关键词检索
历史问答检索
热门问题检索
不要串行执行所有步骤。并行可以显著缩短总耗时。
2. 设置超时
每个环节都应该设置超时:
| 环节 | 超时建议 |
|---|---|
| Embedding | 300ms~1000ms |
| 向量检索 | 200ms~800ms |
| Rerank | 500ms~2000ms |
| LLM首Token | 2s~5s |
| 总请求 | 8s~15s |
超时后应进入降级流程,而不是无限等待。
3. 降级策略
例如:
- Rerank超时:使用融合排序结果;
- 向量检索失败:使用关键词检索;
- LLM超时:返回搜索结果摘要;
- 强模型不可用:切换到备用模型;
- 缓存可用:返回缓存答案并标记更新时间。
4. 限流与队列
对于模型服务,必须设置限流。否则流量突增时,可能导致整体服务雪崩。可以按租户、用户、接口设置QPS限制,并对低优先级请求排队或拒绝。
十四、生产环境实测优化案例
以下是一个企业知识库AI搜索系统的优化过程。数据规模约为:
文档数量:12万篇
切分chunk:约180万个
日均查询:8万次
峰值QPS:60+
主要语言:中文
检索方式:向量检索 + BM25 + Rerank + LLM生成
优化前表现
| 指标 | 优化前 |
|---|---|
| P50总延迟 | 6.8秒 |
| P90总延迟 | 12.4秒 |
| P99总延迟 | 21秒以上 |
| 平均Prompt Token | 5200 |
| Rerank候选数 | 80 |
| 最终上下文片段 | 12 |
| 缓存命中率 | 8% |
| 用户满意率 | 71% |
主要问题包括:
- Rerank输入候选过多;
- 上下文片段太多;
- Prompt过长;
- 缓存体系不完善;
- 没有按业务线过滤索引;
- 部分高频问题重复调用模型。
优化措施
具体做了以下调整:
- 向量召回TopK从100降到40;
- BM25召回TopK从100降到40;
- Rerank输入从80降到25;
- 最终上下文从12段降到5段;
- 每个chunk二次裁剪,只保留相关段落;
- 增加答案缓存、Embedding缓存、Rerank缓存;
- 按业务线和权限进行元数据过滤;
- 引入流式输出;
- 简化系统Prompt;
- 对FAQ类问题使用小模型回答;
- Rerank超时后自动降级为融合排序;
- 建立P50、P90、P99和Token监控看板。
优化后表现
| 指标 | 优化前 | 优化后 |
|---|---|---|
| P50总延迟 | 6.8秒 | 2.7秒 |
| P90总延迟 | 12.4秒 | 5.9秒 |
| P99总延迟 | 21秒+ | 9.8秒 |
| 首Token时间 | 3.6秒 | 1.4秒 |
| 平均Prompt Token | 5200 | 2100 |
| Rerank平均耗时 | 2.1秒 | 720ms |
| 缓存命中率 | 8% | 37% |
| 单次平均成本 | 100% | 46% |
| 用户满意率 | 71% | 84% |
从结果看,性能优化并不是单点突破,而是多环节共同作用。尤其是控制候选数量、减少上下文Token、增加缓存、引入流式输出,对整体体验改善非常明显。
十五、AI搜索优化检查清单
上线前可以按以下清单逐项检查。
检索层
- [ ] 是否使用混合检索?
- [ ] 是否设置合理TopK?
- [ ] 是否支持元数据过滤?
- [ ] 是否评估过召回率?
- [ ] 是否处理了错误码、编号、专有名词?
文档层
- [ ] 文档是否清洗?
- [ ] chunk大小是否合理?
- [ ] 是否保留标题和来源?
- [ ] 是否处理表格、代码块、FAQ?
- [ ] 文档更新后索引是否同步?
模型层
- [ ] Embedding是否缓存?
- [ ] Rerank候选是否过多?
- [ ] 是否使用流式输出?
- [ ] 是否按问题复杂度选择模型?
- [ ] Prompt是否过长?
系统层
- [ ] 是否有端到端链路日志?
- [ ] 是否监控P50/P90/P99?
- [ ] 是否设置超时?
- [ ] 是否有降级策略?
- [ ] 是否有缓存失效机制?
- [ ] 是否按权限隔离数据?
十六、常见误区
误区一:只要换更强的大模型就能解决问题
很多AI搜索的错误并不是生成模型造成的,而是检索阶段没有找到正确资料。如果召回内容错了,再强的大模型也只能基于错误上下文生成答案。
误区二:把更多文档塞进Prompt就更准确
上下文越多不一定越好。无关内容越多,模型越容易受到干扰,还会增加成本和延迟。正确做法是提高检索和重排序质量,把最相关的少量内容给模型。
误区三:只关注平均耗时
平均耗时可能掩盖长尾问题。生产环境更应该关注P90、P99,因为真正影响用户体验的往往是慢请求。
误区四:忽视权限和数据隔离
企业知识库中,不同用户可能拥有不同文档权限。如果AI搜索没有做好权限过滤,可能导致敏感信息泄露。
误区五:上线后不做评测集
AI搜索需要持续评测。建议维护一套真实问题集,包含标准答案、正确引用文档、难度等级和业务分类。每次调整模型、索引、切分策略,都要跑评测,避免“感觉变好了,实际变差了”。
十七、总结
AI搜索的性能优化是一项系统工程,不是简单调大服务器或更换模型就能解决。真正有效的优化,需要从以下几个方面同时推进:
- 检索前优化:查询标准化、查询改写、Embedding缓存;
- 索引层优化:合理切分、元数据过滤、向量索引参数调优;
- 召回层优化:向量检索与关键词检索结合,提升召回稳定性;
- 排序层优化:控制Rerank候选数量,使用缓存和降级;
- 生成层优化:减少上下文Token,使用流式输出和模型路由;
- 系统层优化:缓存、并发、限流、超时、降级、监控;
- 评测层优化:建立真实问题集,用数据驱动迭代。
在生产环境中,最值得优先做的通常是四件事:
- 减少传给大模型的无效上下文
- 控制Rerank候选数量
- 增加多级缓存
- 建立完整链路监控
当这些基础能力完善后,再进一步做模型选择、索引参数调优、语义切分和个性化排序,整体效果会更加稳定。
AI搜索的目标不是“看起来很智能”,而是在真实业务场景中做到:查得准、答得快、成本可控、结果可信、系统稳定。这也是从Demo走向生产环境的关键分水岭。