@forge-ml/rag
Version:
A RAG (Retrieval-Augmented Generation) package for Forge ML
55 lines (54 loc) • 1.87 kB
JavaScript
import { TurbopufferClient } from "./client";
class TurbopufferVectorStore {
client;
constructor({ apiKey, namespace }) {
this.client = new TurbopufferClient({ apiKey, namespaceId: namespace });
}
async createIndex() {
// Turbopuffer doesn't require explicit index creation
// The namespace is created on first use
}
async addEmbedding(embedding) {
await this.client.upsert({
vectors: [this.createVector(embedding)],
distance_metric: "cosine_distance",
});
}
async storeEmbeddings(embeddings) {
const vectors = embeddings.map(this.createVector);
console.log("vectors", vectors);
await this.client.upsert({
vectors: vectors,
distance_metric: "cosine_distance",
});
}
async queryEmbeddings(params) {
let filters = undefined;
if (params.documentIds && params.documentIds.length > 0) {
filters = ["Or", params.documentIds.map(id => ["documentId", "Eq", id])];
}
const results = await this.client.query({
vector: params.query,
top_k: params.k,
distance_metric: "cosine_distance",
filters: filters,
include_attributes: ["documentId"],
include_vectors: false,
});
return results.map(match => ({
chunkId: match.id.toString(),
documentId: match.attributes?.documentId?.toString() ?? "",
score: 1 - (match.dist ?? 0), // Convert distance to similarity score
}));
}
createVector(embedding) {
return {
id: embedding.chunkId,
vector: embedding.embedding,
attributes: {
documentId: embedding.documentId,
},
};
}
}
export default TurbopufferVectorStore;