RAG やエージェントの記憶は、たいてい 3 つのシステムを意味します。キャッシュ、ベクトルデータベース、検索インデックス——同じ事実が 3 つにあり、互いにずれていきます。kevy は、ベクトル KNN、BM25 全文検索、変更フィードをエンジンに持っています。すでに書いたキーの上で、そのまま動きます。
RAG のスタックで高くつくのは、検索ではありません。真実の 3 つのコピーを、歩調を合わせて保つことです。文書を書いたら、それを埋め込み、索引に入れ、キャッシュを無効化することを、忘れずにやらなければなりません。そのどれもが、忘れうる場所です。
kevy では、インデックスはパイプラインではなく宣言です。どのキーの、どのフィールドかをエンジンに伝えれば、書き込みパスがインデックスを最新に保ちます。あとから実行するものはなく、遅れていくものもありません。
kevy がやらないのは、埋め込みを作ることです。エンジンにモデルはなく、今後も持ちません。推論はストレージエンジンの仕事ではありませんし、そうしてしまえば、ベクトルの形式が私たちのリリース周期に縛られます。ベクトルはあなたが持ち込み、kevy がそれを保存し、索引を張り、検索します。
すでに書いているキーのフィールドに対する KNN。一度宣言すれば、あとは書き込みパスが最新に保ちます。同期するものはありません。
IDX.CREATE idx:sem ON PREFIX doc: FIELD vec TYPE vector KIND ann DIM 768 DISTANCE cosine M 16 EF 200
-> OKエンジンが既存のキーを埋め戻します。その間の問い合わせには INDEXBUILDING を返します。
HSET doc:4410 title "Ada on pipelining" vec "<768 f32, little-endian>"IDX.QUERY idx:sem KNN "<query vector>" LIMIT 10
-> 1) doc:4410
2) doc:9982コストと制約 インデックスは HNSW で、近似です。再現率は保証ではなく、調整のためのパラメータ(EF)です。最初の構築は、合致するキーに対して O(N) です——行き当たるのではなく、計画してください。そして埋め込みモデルはありません。ベクトルは、あなたが持ち込みます。調整のつまみはベクトルのガイドにあります。
同じキーに対する BM25。そしてテキストのランキングとベクトルのランキングを、1 つのコマンドで融合するハイブリッドクエリ。
IDX.CREATE idx:ft ON PREFIX doc: FIELD title TYPE str KIND text
-> OKIDX.QUERY idx:ft MATCH "pipelining"
-> 1) 1) "doc:1"
2) "0.2877" # the BM25 scoreIDX.QUERY HYBRID idx:ft MATCH "pipelining" idx:sem KNN "<vector>" LIMIT 20 RRFK 60コストと制約 インデックスの代金は、合致するキーへの書き込みのたびに支払います——読み取り主体の検索には正しい取引で、毎秒何千回も書き直すキーには間違った取引です。トークン化(CJK を含みます)と、BM25 がどこで止まるのかは、テキストのガイドにあります。
別のプロセスから、すべての書き込みを追いかけます——スケジュールではなく変更のたびに埋め込み、止めたところから再開します。
# kevy.toml
[feed]
enabled = trueFEED.SHARDS -> (integer) 16
FEED.TAIL 0 -> 1) (integer) 1 # generation
2) (integer) 1 # offsetFEED.READ 0 1 0 COUNT 2 -> the writes themselves, replayableコストと制約 フィードはシャード単位です。FEED.SHARDS が、あなたの持つカーソルの数を教え、コンシューマはシャードごとにオフセットを 1 つ追跡します。既定ではオフになっており、[feed] をオンにすることが、書き込みパスの帳簿づけの代金です。再起動をまたぐ再開は、変更フィードのガイドが扱っています。
llms-full.txt は、1 回の取得で済みます。全コマンドと、その本当のコストと Redis との本当の差異、そしてすべてのガイドの全文が入っています。エンジン自身のコマンド表から生成しているので、サーバーの実際の挙動とずれることはありません。