487924e345
- Move IRagRepository, EfRagRepository, and VectorSerializer from rag-api/Data to rag-data/Repositories - Add rag-api-models ProjectReference to rag-data.csproj for model type availability - Delete rag-api/Data folder (no longer needed; all data access is now in rag-data) - This aligns RAG with email-api and other services: all data code in the data project Pattern: rag-api (API logic) → rag-data (repository, EF entities, migrations) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
32 lines
919 B
C#
32 lines
919 B
C#
namespace Rag.Data.Repositories;
|
|
|
|
public static class VectorSerializer
|
|
{
|
|
public static byte[] ToBytes(float[] vector)
|
|
{
|
|
var bytes = new byte[vector.Length * sizeof(float)];
|
|
Buffer.BlockCopy(vector, 0, bytes, 0, bytes.Length);
|
|
return bytes;
|
|
}
|
|
|
|
public static float[] FromBytes(byte[] bytes)
|
|
{
|
|
var vector = new float[bytes.Length / sizeof(float)];
|
|
Buffer.BlockCopy(bytes, 0, vector, 0, bytes.Length);
|
|
return vector;
|
|
}
|
|
|
|
public static double CosineSimilarity(float[] a, float[] b)
|
|
{
|
|
if (a.Length == 0 || a.Length != b.Length) return 0;
|
|
double dot = 0, magA = 0, magB = 0;
|
|
for (var i = 0; i < a.Length; i++)
|
|
{
|
|
dot += a[i] * b[i];
|
|
magA += a[i] * a[i];
|
|
magB += b[i] * b[i];
|
|
}
|
|
return magA == 0 || magB == 0 ? 0 : dot / (Math.Sqrt(magA) * Math.Sqrt(magB));
|
|
}
|
|
}
|