AI 绘画关键词推荐站的性能优化笔记
做一个 AI 绘画关键词推荐网站时,最容易踩的坑不是模型本身,而是把'能跑'直接当成了'能扛'。我们最初的版本就是这样:用户输入一句描述,系统要去全量关键词库里做相似度计算,结果慢、准度一般,关键词一多,机器也开始吃不消。
先看瓶颈在哪
早期方案用的是最朴素的关键词匹配,问题很快就暴露出来了。
- 查询延迟高:比如用户输入'星空下的城市夜景',系统要扫完整个关键词库,平均响应时间超过 2 秒
- 推荐不够准:TF-IDF 能做词面匹配,但理解不了'赛博朋克'和'未来主义'这种语义关系
- 资源消耗大:关键词库涨到 10 万+ 后,内存占用明显上去了,磁盘 I/O 也开始拖后腿
本质上还是三件事叠在一起:词向量维度太大,频繁读库没有节流,缓存也没立起来。尤其是 BERT 一上来,模型本身就不便宜,后面如果没有索引和缓存兜底,性能很难看。
方案怎么选
我们对比了几种常见做法:
| 方案 | 准确率 | 查询延迟 | 内存占用 | 适合场景 |
|---|---|---|---|---|
| TF-IDF | 62% | 120ms | 低 | 小规模精确匹配 |
| Word2Vec | 78% | 200ms | 中 | 中等规模语义搜索 |
| BERT+FAISS | 89% | 350ms | 高 | 大规模精准语义搜索 |
最后还是选了 BERT+FAISS。它不是最省资源的方案,但在关键词推荐这个场景里,语义效果更重要;单次查询慢一点可以接受,前提是后面有索引和缓存把它拉回来。
核心实现
1. 用 BERT 做向量化,再交给 FAISS 建索引
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
# 初始化 BERT 模型
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
# 生成关键词向量
keywords = ["赛博朋克", "水墨风格", "浮世绘"] # 10 万 + 关键词
keyword_vectors = model.encode(keywords)
# 生成 384 维向量
# 构建 FAISS 索引
dimension = keyword_vectors.shape[1]
index = faiss.IndexFlatIP(dimension) # 内积相似度
index.add(keyword_vectors)
faiss.write_index(index, "keyword_vectors.faiss")
这一步解决的是'不要每次都现算'。关键词向量离线算好,在线只做检索,压力会小很多。

