Files

55 lines
1.2 KiB
Go

package embedding
import (
"context"
"crypto/sha256"
"encoding/binary"
"math"
)
type FakeProvider struct {
dims int
model string
}
func NewFakeProvider(dims int, model string) *FakeProvider {
if dims <= 0 {
dims = 1536
}
if model == "" {
model = "fake"
}
return &FakeProvider{dims: dims, model: model}
}
func (p *FakeProvider) Dimensions() int { return p.dims }
func (p *FakeProvider) Model() string { return p.model }
func (p *FakeProvider) ProviderName() string { return "fake" }
func (p *FakeProvider) Embed(ctx context.Context, input []string) ([]Vector, error) {
out := make([]Vector, 0, len(input))
for _, text := range input {
select {
case <-ctx.Done():
return nil, ctx.Err()
default:
}
v := make(Vector, p.dims)
seed := sha256.Sum256([]byte(text))
var norm float64
for i := 0; i < p.dims; i++ {
b := sha256.Sum256(append(seed[:], byte(i), byte(i>>8)))
n := binary.BigEndian.Uint32(b[:4])
val := (float64(n%2000000)/1000000.0 - 1.0)
v[i] = float32(val)
norm += val * val
}
if norm > 0 {
scale := float32(1 / math.Sqrt(norm))
for i := range v {
v[i] *= scale
}
}
out = append(out, v)
}
return out, nil
}