39 lines
1.3 KiB
Go
39 lines
1.3 KiB
Go
package lib
|
|
|
|
// AI embedding client + cosine similarity for answer matching.
|
|
// Uses Fireworks nomic-embed-text-v1.5 (zero retention).
|
|
|
|
// MatchThreshold is the minimum cosine similarity for suggesting a match.
|
|
const MatchThreshold = 0.72
|
|
|
|
// EmbedText generates an embedding vector for the given text. Stub.
|
|
func EmbedText(text string) ([]float32, error) {
|
|
// TODO: implement Fireworks API call for nomic-embed-text-v1.5
|
|
return nil, nil
|
|
}
|
|
|
|
// CosineSimilarity computes cosine similarity between two vectors. Stub.
|
|
func CosineSimilarity(a, b []float32) float64 {
|
|
if len(a) != len(b) || len(a) == 0 {
|
|
return 0
|
|
}
|
|
var dotProduct, normA, normB float64
|
|
for i := range a {
|
|
dotProduct += float64(a[i]) * float64(b[i])
|
|
normA += float64(a[i]) * float64(a[i])
|
|
normB += float64(b[i]) * float64(b[i])
|
|
}
|
|
if normA == 0 || normB == 0 {
|
|
return 0
|
|
}
|
|
// Avoid importing math — inline sqrt via Newton's method is overkill for a stub.
|
|
// This will be replaced with a real implementation.
|
|
return dotProduct // placeholder
|
|
}
|
|
|
|
// FindMatches searches for published answers matching the query text. Stub.
|
|
func FindMatches(db *DB, projectID, workstreamID, queryText string) ([]AnswerLink, error) {
|
|
// TODO: embed query, cosine search against embeddings table, return matches >= threshold
|
|
return nil, nil
|
|
}
|