mirror of
https://github.com/asg017/sqlite-vec.git
synced 2026-04-25 08:46:49 +02:00
58 lines
1.4 KiB
MySQL
58 lines
1.4 KiB
MySQL
|
|
.load ../../dist/vec0
|
||
|
|
.load ./rembed0
|
||
|
|
insert into rembed_clients(name, options)
|
||
|
|
values ('snowflake-arctic-embed-m-v1.5', 'llamafile');
|
||
|
|
|
||
|
|
.bail on
|
||
|
|
.mode box
|
||
|
|
.header on
|
||
|
|
.timer on
|
||
|
|
|
||
|
|
.param set :query 'death row'
|
||
|
|
.param set :weight_fts 1.0
|
||
|
|
.param set :weight_vec 1.0
|
||
|
|
.param set :rrf_k 60
|
||
|
|
.param set :query_embedding "vec_normalize(vec_slice(rembed('snowflake-arctic-embed-m-v1.5', :query), 0, 256))"
|
||
|
|
.param set :k 10
|
||
|
|
|
||
|
|
select 'Hybrid w/ RRF' as "";
|
||
|
|
|
||
|
|
with vec_matches as (
|
||
|
|
select
|
||
|
|
article_id,
|
||
|
|
row_number() over (order by distance) as rank_number,
|
||
|
|
distance
|
||
|
|
from vec_headlines
|
||
|
|
where
|
||
|
|
headline_embedding match :query_embedding
|
||
|
|
and k = :k
|
||
|
|
order by distance
|
||
|
|
),
|
||
|
|
fts_matches as (
|
||
|
|
select
|
||
|
|
rowid,
|
||
|
|
--highlight(fts_headlines, 0, '<b>', '</b>') as headline_highlighted,
|
||
|
|
row_number() over (order by rank) as rank_number,
|
||
|
|
rank as score
|
||
|
|
from fts_headlines
|
||
|
|
where headline match :query
|
||
|
|
limit :k
|
||
|
|
),
|
||
|
|
final as (
|
||
|
|
select
|
||
|
|
articles.id,
|
||
|
|
articles.headline,
|
||
|
|
vec_matches.distance as vector_distance,
|
||
|
|
fts_matches.score as fts_score,
|
||
|
|
coalesce(1.0 / (:rrf_k + fts_matches.rowid), 0.0) * :weight_fts +
|
||
|
|
coalesce(1.0 / (:rrf_k + vec_matches.article_id), 0.0) * :weight_vec
|
||
|
|
as combined_score
|
||
|
|
|
||
|
|
from fts_matches
|
||
|
|
full outer join vec_matches on vec_matches.article_id = fts_matches.rowid
|
||
|
|
join articles on articles.rowid = coalesce(fts_matches.rowid, vec_matches.article_id)
|
||
|
|
order by combined_score desc
|
||
|
|
)
|
||
|
|
select * from final;
|
||
|
|
|