read :semantic_search do
argument :query, :string, allow_nil?: false
prepare before_action(fn query, context ->
case InterimIq.Embeddings.OpenAiEmbeddingModel.generate([query.arguments.query], []) do
{:ok, [search_vector]} ->
Ash.Query.filter(
query,
vector_cosine_distance(full_text_vector, ^search_vector) < 1
)
|> Ash.Query.sort([
{
vector_cosine_distance(
full_text_vector,
^search_vector
),
:asc
}
])
{:error, error} ->
{:error, error}
end
end)
end
read :semantic_search do
argument :query, :string, allow_nil?: false
prepare before_action(fn query, context ->
case InterimIq.Embeddings.OpenAiEmbeddingModel.generate([query.arguments.query], []) do
{:ok, [search_vector]} ->
Ash.Query.filter(
query,
vector_cosine_distance(full_text_vector, ^search_vector) < 1
)
|> Ash.Query.sort([
{
vector_cosine_distance(
full_text_vector,
^search_vector
),
:asc
}
])
{:error, error} ->
{:error, error}
end
end)
end