Perplexica搜索算法:BM25与向量搜索结合
概述
Perplexica作为一款开源的AI驱动搜索引擎,其核心搜索算法采用了传统信息检索技术与现代向量搜索的巧妙结合。本文将深入解析Perplexica如何将BM25(Best Matching 25)算法与向量相似度搜索相结合,为用户提供精准、高效的搜索体验。
搜索架构概览
Perplexica的搜索系统采用分层架构,结合了多种搜索技术:
BM25算法在Perplexica中的应用
BM25算法原理
BM25是基于概率检索框架的经典算法,其核心公式为:
$$ \text{BM25}(D, Q) = \sum_{i=1}^{n} \text{IDF}(q_i) \cdot \frac{f(q_i, D) \cdot (k_1 + 1)}{f(q_i, D) + k_1 \cdot (1 - b + b \cdot \frac{|D|}{\text{avgdl}})} $$
其中:
- $f(q_i, D)$:词项$q_i$在文档$D$中的频率
- $|D|$:文档长度
- $\text{avgdl}$:平均文档长度
- $k_1$, $b$:可调参数
Perplexica中的BM25实现
Perplexica通过SearxNG元搜索引擎获取初始搜索结果,这些结果已经经过BM25算法的初步排序:
// SearxNG搜索接口实现
export const searchSearxng = async (
query: string,
opts?: SearxngSearchOptions
) => {
const searxngURL = getSearxngApiEndpoint();
const url = new URL(`${searxngURL}/search?format=json`);
url.searchParams.append('q', query);
// 添加搜索选项
if (opts?.engines) {
url.searchParams.append('engines', opts.engines.join(','));
}
const res = await axios.get(url.toString());
return {
results: res.data.results,
suggestions: res.data.suggestions
};
};
向量搜索技术
嵌入向量生成
Perplexica使用多种嵌入模型将文本转换为高维向量:
// 相似度计算实现
const computeSimilarity = (x: number[], y: number[]): number => {
const similarityMeasure = getSimilarityMeasure();
if (similarityMeasure === 'cosine') {
return cosineSimilarity(x, y) as number;
} else if (similarityMeasure === 'dot') {
return dot(x, y);
}
throw new Error('Invalid similarity measure');
};
支持的距离度量
| 度量方法 | 公式 | 特点 | 适用场景 |
|---|---|---|---|
| 余弦相似度 | $\cos(\theta) = \frac{A \cdot B}{|A| |B|}$ | 方向敏感性 | 文本语义匹配 |
| 点积相似度 | $A \cdot B = \sum_{i=1}^{n} A_i B_i$ | 幅度敏感性 | 相关性排序 |
混合排序算法
三级优化模式
Perplexica提供了三种优化模式,每种模式采用不同的排序策略:
1. 速度模式(Speed)
if (optimizationMode === 'speed' || this.config.rerank === false) {
// 主要依赖BM25排序结果
return docsWithContent.slice(0, 15);
}
特点:
- 优先使用SearxNG的BM25排序结果
- 最小化向量计算开销
- 响应时间最快
2. 平衡模式(Balanced)
} else if (optimizationMode === 'balanced') {
const [docEmbeddings, queryEmbedding] = await Promise.all([
embeddings.embedDocuments(docsWithContent.map(doc => doc.pageContent)),
embeddings.embedQuery(query)
]);
// 计算向量相似度并重排序
const similarity = docEmbeddings.map((docEmbedding, i) => {
const sim = computeSimilarity(queryEmbedding, docEmbedding);
return { index: i, similarity: sim };
});
return similarity
.filter(sim => sim.similarity > (this.config.rerankThreshold ?? 0.3))
.sort((a, b) => b.similarity - a.similarity)
.slice(0, 15)
.map(sim => docsWithContent[sim.index]);
}
特点:
- BM25初筛 + 向量精排
- 兼顾速度与精度
- 可配置的重排序阈值
3. 质量模式(Quality)
// 质量模式采用更复杂的多阶段排序
private async rerankDocs(
query: string,
docs: Document[],
fileIds: string[],
embeddings: Embeddings,
optimizationMode: 'speed' | 'balanced' | 'quality'
) {
// 多源数据融合排序
const filesData = fileIds.map(file => {
// 文件内容向量化处理
const embeddingsPath = filePath + '-embeddings.json';
const embeddings = JSON.parse(fs.readFileSync(embeddingsPath, 'utf8'));
return {
fileName: content.title,
content: c,
embeddings: embeddings.embeddings[i]
};
}).flat();
// 综合排序逻辑
// ...
}
特点:
- 多阶段深度排序
- 支持文件内容向量搜索
- 最高精度但计算开销最大
算法性能对比
各模式性能特征
| 优化模式 | 响应时间 | 精度 | 计算复杂度 | 适用场景 |
|---|---|---|---|---|
| 速度模式 | ⚡️ 快 | ⭐️⭐️⭐️ | $O(n)$ | 实时搜索、简单查询 |
| 平衡模式 | ⚡️⚡️ 中等 | ⭐️⭐️⭐️⭐️ | $O(n \log n)$ | 一般搜索、混合查询 |
| 质量模式 | ⚡️⚡️⚡️ 慢 | ⭐️⭐️⭐️⭐️⭐️ | $O(n^2)$ | 复杂查询、学术搜索 |
重排序阈值配置
// 可配置的重排序阈值
rerankThreshold: number; // 默认0.3
// 应用阈值过滤
.filter(sim => sim.similarity > (this.config.rerankThreshold ?? 0.3))
阈值设置建议:
- 高精度场景:0.4-0.6
- 平衡场景:0.3-0.4
- 召回率优先:0.2-0.3
实际应用案例
学术搜索模式
academicSearch: new MetaSearchAgent({
activeEngines: ['arxiv', 'google scholar', 'pubmed'],
queryGeneratorPrompt: prompts.academicSearchRetrieverPrompt,
responsePrompt: prompts.academicSearchResponsePrompt,
rerank: true,
rerankThreshold: 0, // 学术搜索要求更高精度
searchWeb: true,
summarizer: false,
}),
Web搜索模式
webSearch: new MetaSearchAgent({
activeEngines: [],
queryGeneratorPrompt: prompts.webSearchRetrieverPrompt,
responsePrompt: prompts.webSearchResponsePrompt,
rerank: true,
rerankThreshold: 0.3, // 通用web搜索平衡阈值
searchWeb: true,
summarizer: true,
}),
技术优势与创新
1. 动态混合排序
Perplexica的创新之处在于根据查询复杂度和用户选择的优化模式,动态调整BM25和向量搜索的权重比例。
2. 多源数据融合
支持网页内容、本地文件、学术论文等多种数据源的统一向量化处理和排序。
3. 可配置的相似度度量
提供余弦相似度和点积相似度两种度量方式,适应不同的搜索场景需求。
最佳实践建议
配置优化
# config.toml 配置示例
[GENERAL]
SIMILARITY_MEASURE = "cosine" # 或 "dot"
KEEP_ALIVE = "true"
[API_ENDPOINTS]
SEARXNG = "http://localhost:8080"
性能调优
- 速度模式:适合实时对话和简单事实查询
- 平衡模式:适合一般知识查询和内容检索
- 质量模式:适合学术研究、深度分析等场景
阈值调整
根据具体应用场景调整rerankThreshold:
- 高精度需求:提高阈值(0.4+)
- 高召回需求:降低阈值(0.2-0.3)
- 一般应用:保持默认0.3
总结
Perplexica通过巧妙结合BM25算法和向量搜索技术,实现了既保持传统检索效率又具备现代语义理解能力的混合搜索系统。这种架构设计使得Perplexica能够在不同场景下灵活调整搜索策略,为用户提供从快速响应到深度分析的全方位搜索体验。
其三级优化模式的设计理念体现了对搜索质量与性能平衡的深刻理解,而可配置的相似度度量和重排序阈值则为不同应用场景提供了充分的定制空间。这种技术架构不仅适用于Perplexica项目本身,也为其他需要结合传统检索和现代AI技术的搜索系统提供了有价值的参考。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



