153 lines
4.4 KiB
TypeScript
153 lines
4.4 KiB
TypeScript
/**
|
|
* Basic usage example for the Soulcraft Brainy database
|
|
*/
|
|
|
|
import { BrainyData } from '../brainyData.js'
|
|
|
|
// Example data - word embeddings
|
|
const wordEmbeddings = {
|
|
cat: [0.2, 0.3, 0.4, 0.1],
|
|
dog: [0.3, 0.2, 0.4, 0.2],
|
|
fish: [0.1, 0.1, 0.8, 0.2],
|
|
bird: [0.1, 0.4, 0.2, 0.5],
|
|
tiger: [0.3, 0.4, 0.3, 0.1],
|
|
lion: [0.4, 0.3, 0.2, 0.1],
|
|
shark: [0.2, 0.1, 0.7, 0.3],
|
|
eagle: [0.2, 0.5, 0.1, 0.4]
|
|
}
|
|
|
|
// Example metadata
|
|
const metadata = {
|
|
cat: { type: 'mammal', domesticated: true },
|
|
dog: { type: 'mammal', domesticated: true },
|
|
fish: { type: 'fish', domesticated: false },
|
|
bird: { type: 'bird', domesticated: false },
|
|
tiger: { type: 'mammal', domesticated: false },
|
|
lion: { type: 'mammal', domesticated: false },
|
|
shark: { type: 'fish', domesticated: false },
|
|
eagle: { type: 'bird', domesticated: false }
|
|
}
|
|
|
|
/**
|
|
* Run the example
|
|
*/
|
|
async function runExample() {
|
|
console.log('Initializing vector database...')
|
|
|
|
// Create a new vector database
|
|
const db = new BrainyData()
|
|
await db.init()
|
|
|
|
console.log('Adding vectors to the database...')
|
|
|
|
// Add vectors to the database
|
|
const ids: Record<string, string> = {}
|
|
for (const [word, vector] of Object.entries(wordEmbeddings)) {
|
|
ids[word] = await db.addNoun(vector, metadata[word as keyof typeof metadata])
|
|
|
|
console.log(`Added "${word}" with ID: ${ids[word]}`)
|
|
}
|
|
|
|
console.log('\nDatabase size:', db.size())
|
|
|
|
// Search for similar vectors
|
|
console.log('\nSearching for vectors similar to "cat"...')
|
|
const catResults = await db.search(wordEmbeddings['cat'], { limit: 3 })
|
|
console.log('Results:')
|
|
for (const result of catResults) {
|
|
const word =
|
|
Object.entries(ids).find(([_, id]) => id === result.id)?.[0] || 'unknown'
|
|
console.log(
|
|
`- ${word} (score: ${result.score.toFixed(4)}, metadata:`,
|
|
result.metadata,
|
|
')'
|
|
)
|
|
}
|
|
|
|
// Search for similar vectors
|
|
console.log('\nSearching for vectors similar to "fish"...')
|
|
const fishResults = await db.search(wordEmbeddings['fish'], { limit: 3 })
|
|
console.log('Results:')
|
|
for (const result of fishResults) {
|
|
const word =
|
|
Object.entries(ids).find(([_, id]) => id === result.id)?.[0] || 'unknown'
|
|
console.log(
|
|
`- ${word} (score: ${result.score.toFixed(4)}, metadata:`,
|
|
result.metadata,
|
|
')'
|
|
)
|
|
}
|
|
|
|
// Update metadata
|
|
console.log('\nUpdating metadata for "bird"...')
|
|
await db.updateNounMetadata(ids['bird'], {
|
|
...metadata['bird'],
|
|
notes: 'Can fly'
|
|
})
|
|
|
|
// Get the updated document
|
|
const birdDoc = await db.getNoun(ids['bird'])
|
|
console.log('Updated bird document:', birdDoc)
|
|
|
|
// Delete a vector
|
|
console.log('\nDeleting "shark"...')
|
|
await db.deleteNoun(ids['shark'])
|
|
console.log('Database size after deletion:', db.size())
|
|
|
|
// Search again to verify shark is gone
|
|
console.log('\nSearching for vectors similar to "fish" after deletion...')
|
|
const fishResultsAfterDeletion = await db.search(wordEmbeddings['fish'], { limit: 3 })
|
|
console.log('Results:')
|
|
for (const result of fishResultsAfterDeletion) {
|
|
const word =
|
|
Object.entries(ids).find(([_, id]) => id === result.id)?.[0] || 'unknown'
|
|
console.log(
|
|
`- ${word} (score: ${result.score.toFixed(4)}, metadata:`,
|
|
result.metadata,
|
|
')'
|
|
)
|
|
}
|
|
|
|
console.log('\nExample completed successfully!')
|
|
}
|
|
|
|
// Check if we're in a browser or Node.js environment
|
|
if (typeof window !== 'undefined') {
|
|
// Browser environment
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
const button = document.createElement('button')
|
|
button.textContent = 'Run BrainyData Example'
|
|
button.addEventListener('click', async () => {
|
|
const output = document.createElement('pre')
|
|
document.body.appendChild(output)
|
|
|
|
// Redirect console.log to the output element
|
|
const originalLog = console.log
|
|
console.log = (...args) => {
|
|
originalLog(...args)
|
|
output.textContent +=
|
|
args
|
|
.map((arg) =>
|
|
typeof arg === 'object' ? JSON.stringify(arg, null, 2) : arg
|
|
)
|
|
.join(' ') + '\n'
|
|
}
|
|
|
|
try {
|
|
await runExample()
|
|
} catch (error) {
|
|
console.error('Error running example:', error)
|
|
}
|
|
|
|
// Restore console.log
|
|
console.log = originalLog
|
|
})
|
|
|
|
document.body.appendChild(button)
|
|
})
|
|
} else {
|
|
// Node.js environment
|
|
runExample().catch((error) => {
|
|
console.error('Error running example:', error)
|
|
})
|
|
}
|