({
chunks,
queryEmbedding,
topK
}: {
chunks: MemoryChunk[];
queryEmbedding: number[];
topK: number;
})
| 213 | } |
| 214 | |
| 215 | export function cosineSimilaritySearch({ |
| 216 | chunks, |
| 217 | queryEmbedding, |
| 218 | topK |
| 219 | }: { |
| 220 | chunks: MemoryChunk[]; |
| 221 | queryEmbedding: number[]; |
| 222 | topK: number; |
| 223 | }): SimilarChunk[] { |
| 224 | // Return empty array if topK is invalid or no chunks are provided |
| 225 | if (topK <= 0 || chunks.length === 0) { |
| 226 | return []; |
| 227 | } |
| 228 | |
| 229 | // Calculate cosine similarity for each chunk |
| 230 | const chunksWithCosineSimilarity: SimilarChunk[] = chunks.map(chunk => ({ |
| 231 | text: chunk.text, |
| 232 | attributes: chunk.attributes, |
| 233 | similarity: cosineSimilarity(chunk.embedding, queryEmbedding) || 0 |
| 234 | })); |
| 235 | |
| 236 | // Sort chunks by similarity (descending order) |
| 237 | chunksWithCosineSimilarity.sort((a, b) => b.similarity - a.similarity); |
| 238 | |
| 239 | // Return top K results |
| 240 | return chunksWithCosineSimilarity.slice(0, topK); |
| 241 | } |
| 242 | |
| 243 | // Get the path of the db file for a memory |
| 244 | export function getMemoryDbPath(memoryName: string): string { |
no outgoing calls
no test coverage detected