@xiaohui-wang/mcpadvisor
Version:
MCP Advisor & Installation - Find the right MCP server for your needs
96 lines (95 loc) • 2.78 kB
JavaScript
/**
* 可写内存向量引擎实现
* 提供基于内存的向量搜索和写入功能
*/
import logger from '../../../utils/logger.js';
/**
* 可写内存向量引擎实现
*/
export class WritableInMemoryVectorEngine {
entries = [];
/**
* 构造函数
*/
constructor() {
logger.info('Writable in-memory vector engine initialized');
}
/**
* 添加向量条目
*/
async addEntry(id, vector, data) {
try {
this.entries.push({ id, vector, data });
logger.debug(`Added vector entry for server: ${data.title}`);
}
catch (error) {
this.handleError(error, 'adding vector entry');
}
}
/**
* 向量相似度搜索
*/
async search(queryVector, limit = 10) {
try {
// 计算每个条目与查询向量的相似度
const results = this.entries.map(entry => {
const similarity = this.calculateCosineSimilarity(queryVector, entry.vector);
return {
...entry.data,
similarity,
};
});
// 按相似度排序并限制结果数量
const sortedResults = results
.sort((a, b) => b.similarity - a.similarity)
.slice(0, limit);
logger.debug(`Found ${sortedResults.length} results from in-memory search`);
return sortedResults;
}
catch (error) {
this.handleError(error, 'in-memory search');
}
}
/**
* 清除所有向量数据
*/
async clear() {
try {
this.entries = [];
logger.info('Cleared all in-memory vector entries');
}
catch (error) {
this.handleError(error, 'clearing vector entries');
}
}
/**
* 计算余弦相似度
*/
calculateCosineSimilarity(vecA, vecB) {
// 确保向量长度相同
const length = Math.min(vecA.length, vecB.length);
// 计算点积
let dotProduct = 0;
let normA = 0;
let normB = 0;
for (let i = 0; i < length; i++) {
dotProduct += vecA[i] * vecB[i];
normA += vecA[i] * vecA[i];
normB += vecB[i] * vecB[i];
}
// 避免除以零
if (normA === 0 || normB === 0) {
return 0;
}
// 计算余弦相似度
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
}
/**
* 统一错误处理
*/
handleError(error, operation) {
const message = error instanceof Error ? error.message : String(error);
logger.error(`Error in ${operation}: ${message}`);
throw error;
}
}