上一篇 下一篇 分享链接 返回 返回顶部

AI搜索上线后变慢怎么办?一套生产环境跑通的性能优化实战指南

发布人:慈云数据-客服中心 发布时间:1小时前 阅读量:2

AI搜索性能优化教程|生产环境实测

在大模型应用从“演示阶段”进入“生产阶段”之后,AI搜索(AI Search / RAG Search / 智能问答搜索)的性能问题会迅速暴露出来:响应慢、召回不稳定、成本高、并发上不去、结果偶尔“答非所问”、上线后监控缺失,甚至用户一多就出现超时。

本文结合生产环境中的真实优化思路,系统梳理一套可落地的AI搜索性能优化方案。内容覆盖:架构拆解、性能瓶颈定位、向量检索优化、关键词检索优化、重排序优化、LLM生成优化、缓存策略、并发与稳定性、监控指标以及上线调优方法。适合正在构建企业知识库问答、智能客服、文档搜索、站内AI搜索、RAG系统的开发者和技术负责人参考。


一、什么是AI搜索?为什么它比传统搜索更复杂?

传统搜索主要依赖关键词匹配,例如倒排索引、BM25、TF-IDF等算法,关注的是“用户输入的词”和“文档中的词”是否匹配。而AI搜索通常引入了向量检索、语义理解、大模型生成,能够理解用户意图,并基于搜索结果生成自然语言答案。

一个典型的AI搜索流程通常如下:

用户问题
  ↓
问题预处理
  ↓
关键词检索 / 向量检索 / 混合检索
  ↓
召回候选文档
  ↓
重排序
  ↓
上下文拼接
  ↓
大模型生成答案
  ↓
返回结果与引用来源

相比传统搜索,AI搜索多了多个耗时环节:

  1. Embedding向量化耗时
  2. 向量数据库检索耗时
  3. 多路召回合并耗时
  4. Rerank重排序耗时
  5. 大模型生成耗时
  6. 上下文组装和Token消耗
  7. 网络调用和服务间通信耗时

因此,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

可以先用轻量规则进行预筛选,再用模型重排序。

例如:

  1. 去重;
  2. 过滤过短或过长片段;
  3. 根据关键词命中加权;
  4. 根据文档更新时间加权;
  5. 选取前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%

主要问题包括:

  1. Rerank输入候选过多;
  2. 上下文片段太多;
  3. Prompt过长;
  4. 缓存体系不完善;
  5. 没有按业务线过滤索引;
  6. 部分高频问题重复调用模型。

优化措施

具体做了以下调整:

  1. 向量召回TopK从100降到40;
  2. BM25召回TopK从100降到40;
  3. Rerank输入从80降到25;
  4. 最终上下文从12段降到5段;
  5. 每个chunk二次裁剪,只保留相关段落;
  6. 增加答案缓存、Embedding缓存、Rerank缓存;
  7. 按业务线和权限进行元数据过滤;
  8. 引入流式输出;
  9. 简化系统Prompt;
  10. 对FAQ类问题使用小模型回答;
  11. Rerank超时后自动降级为融合排序;
  12. 建立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搜索的性能优化是一项系统工程,不是简单调大服务器或更换模型就能解决。真正有效的优化,需要从以下几个方面同时推进:

  1. 检索前优化:查询标准化、查询改写、Embedding缓存;
  2. 索引层优化:合理切分、元数据过滤、向量索引参数调优;
  3. 召回层优化:向量检索与关键词检索结合,提升召回稳定性;
  4. 排序层优化:控制Rerank候选数量,使用缓存和降级;
  5. 生成层优化:减少上下文Token,使用流式输出和模型路由;
  6. 系统层优化:缓存、并发、限流、超时、降级、监控;
  7. 评测层优化:建立真实问题集,用数据驱动迭代。

在生产环境中,最值得优先做的通常是四件事:

  • 减少传给大模型的无效上下文
  • 控制Rerank候选数量
  • 增加多级缓存
  • 建立完整链路监控

当这些基础能力完善后,再进一步做模型选择、索引参数调优、语义切分和个性化排序,整体效果会更加稳定。

AI搜索的目标不是“看起来很智能”,而是在真实业务场景中做到:查得准、答得快、成本可控、结果可信、系统稳定。这也是从Demo走向生产环境的关键分水岭。

目录结构
全文