AI アプリケーション
データと、その見つけ方を
ひとつのストアに
RAG やエージェントの記憶は、たいてい 3 つのシステムを意味します。キャッシュ、ベクトルデータベース、検索インデックス——同じ事実が 3 つにあり、互いにずれていきます。kevy は、ベクトル KNN、BM25 全文検索、変更フィードをエンジンに持っています。すでに書いたキーの上で、そのまま動きます。
なぜ向いているのか
RAG のスタックで高くつくのは、検索ではありません。真実の 3 つのコピーを、歩調を合わせて保つことです。文書を書いたら、それを埋め込み、索引に入れ、キャッシュを無効化することを、忘れずにやらなければなりません。そのどれもが、忘れうる場所です。
kevy では、インデックスはパイプラインではなく宣言です。どのキーの、どのフィールドかをエンジンに伝えれば、書き込みの側がインデックスを最新に保ちます。あとから実行するものはなく、遅れていくものもありません。
kevy がやらないのは、埋め込みを作ることです。エンジンにモデルはなく、今後も持ちません。推論はストレージエンジンの仕事ではありませんし、そうしてしまえば、ベクトルの形式が私たちのリリース周期に縛られます。ベクトルはあなたが持ち込み、kevy がそれを保存し、索引を張り、検索します。
手順——ベクトル検索
# declare it once. the engine backfills, and answers
# INDEXBUILDING while it does.
IDX.CREATE idx:sem ON PREFIX doc: FIELD vec TYPE vector KIND ann DIM 768 DISTANCE cosine M 16 EF 200
# write a document the way you already write documents
HSET doc:4410 title "Ada on pipelining" vec "<768 f32, little-endian>"
# nearest ten. no separate system, no sync step.
IDX.QUERY idx:sem KNN "<query vector>" LIMIT 10
-> 1) doc:4410
2) doc:9982手順——全文検索、そして両者の併用
IDX.CREATE idx:ft ON PREFIX doc: FIELD title TYPE str KIND text
IDX.QUERY idx:ft MATCH "pipelining"
-> 1) 1) "doc:1"
2) "0.2877" # the BM25 score
# hybrid: fuse the text ranking and the vector ranking (RRF)
IDX.QUERY HYBRID idx:ft MATCH "pipelining" idx:sem KNN "<vector>" LIMIT 20 RRFK 60
# a change feed: tail every write from another process.
# needs [feed] enabled = true in kevy.toml
FEED.SHARDS -> (integer) 16
FEED.TAIL 0 -> 1) (integer) 1 # generation
2) (integer) 1 # offset
FEED.READ 0 1 0 COUNT 2 -> the writes themselves, replayable
これを読んでいるのがエージェントなら
llms-full.txt は、1 回の取得で済みます。全コマンドと、その本当のコストと Redis との本当の差異、そして 24 本のガイド全文が入っています。エンジン自身のコマンド表から生成しているので、サーバーの実際の挙動とずれることはありません。