Skip to content

Commit af729d7

Browse files
author
Daniele Briggi
committed
fix(context): contex creation
1 parent 877d139 commit af729d7

File tree

5 files changed

+34
-16
lines changed

5 files changed

+34
-16
lines changed

src/sqlite_rag/database.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ def _create_schema(conn: sqlite3.Connection, settings: Settings):
9191

9292
cursor.execute(
9393
f"""
94-
SELECT vector_init('chunks', 'embedding', 'type={settings.vector_type},dimension={settings.embedding_dim},{settings.other_vector_config}');
94+
SELECT vector_init('chunks', 'embedding', 'type={settings.vector_type},dimension={settings.embedding_dim},{settings.other_vector_options}');
9595
"""
9696
)
9797

src/sqlite_rag/engine.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import json
12
import re
23
import sqlite3
34
from pathlib import Path
@@ -38,7 +39,7 @@ def load_model(self):
3839

3940
self._conn.execute(
4041
"SELECT llm_model_load(?, ?);",
41-
(self._settings.model_path_or_name, self._settings.model_config),
42+
(self._settings.model_path_or_name, self._settings.model_options),
4243
)
4344

4445
def process(self, document: Document) -> Document:
@@ -53,8 +54,6 @@ def generate_embedding(self, chunks: list[Chunk]) -> list[Chunk]:
5354
for chunk in chunks:
5455
cursor = self._conn.cursor()
5556

56-
self.create_new_context()
57-
5857
try:
5958
cursor.execute(
6059
"SELECT llm_embed_generate(?) AS embedding", (chunk.content,)
@@ -94,7 +93,9 @@ def create_new_context(self) -> None:
9493
""""""
9594
cursor = self._conn.cursor()
9695

97-
cursor.execute("SELECT llm_context_create(?);", (self._settings.model_config,))
96+
cursor.execute(
97+
"SELECT llm_context_create(?);", (self._settings.model_context_options,)
98+
)
9899

99100
def free_context(self) -> None:
100101
""""""
@@ -117,8 +118,9 @@ def search(self, query: str, limit: int = 10) -> list[DocumentResult]:
117118
)
118119

119120
cursor = self._conn.cursor()
121+
# TODO: understand how to sort results depending on the distance metric
122+
# Eg, for cosine distance, higher is better (closer to 1)
120123
cursor.execute(
121-
# TODO: use vector_convert_XXX to convert the query to the correct type
122124
f"""
123125
-- sqlite-vector KNN vector search results
124126
WITH vec_matches AS (
@@ -159,6 +161,7 @@ def search(self, query: str, limit: int = 10) -> list[DocumentResult]:
159161
documents.id,
160162
documents.uri,
161163
documents.content as document_content,
164+
documents.metadata,
162165
chunks.content AS snippet,
163166
vec_rank,
164167
fts_rank,
@@ -170,7 +173,7 @@ def search(self, query: str, limit: int = 10) -> list[DocumentResult]:
170173
JOIN documents ON documents.id = chunks.document_id
171174
ORDER BY combined_rank DESC
172175
;
173-
""",
176+
""", # nosec B608
174177
{
175178
"query": query,
176179
"query_embedding": query_embedding,
@@ -188,6 +191,7 @@ def search(self, query: str, limit: int = 10) -> list[DocumentResult]:
188191
id=row["id"],
189192
uri=row["uri"],
190193
content=row["document_content"],
194+
metadata=json.loads(row["metadata"]) if row["metadata"] else {},
191195
),
192196
snippet=row["snippet"],
193197
vec_rank=row["vec_rank"],

src/sqlite_rag/settings.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,21 @@ class Settings:
1414
model_path_or_name: str = (
1515
"./models/Qwen/Qwen3-Embedding-0.6B-GGUF/Qwen3-Embedding-0.6B-f16.gguf"
1616
)
17-
model_config: str = "n_ctx=128,pooling_type=last,normalize_embedding=1"
17+
# See: https://github.com/sqliteai/sqlite-ai/blob/main/API.md#llm_model_loadpath-text-options-text
18+
model_options: str = ""
19+
# See: https://github.com/sqliteai/sqlite-ai/blob/main/API.md#llm_context_createoptions-text
20+
model_context_options: str = (
21+
"generate_embedding=1,normalize_embedding=1,pooling_type=mean"
22+
)
1823

1924
vector_type: str = "FLOAT16"
2025
embedding_dim: int = 1024
21-
other_vector_config: str = "distance=cosine" # e.g. distance=metric,other=value,...
26+
other_vector_options: str = (
27+
"distance=cosine" # e.g. distance=metric,other=value,...
28+
)
2229

2330
chunk_size: int = 128
24-
# Token overlap between chunks
31+
# Tokens overlap between chunks
2532
chunk_overlap: int = 20
2633

2734
#

src/sqlite_rag/sqliterag.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ def add(
111111

112112
processed += 1
113113

114+
self._engine.free_context()
115+
114116
return processed
115117

116118
def add_text(
@@ -120,6 +122,7 @@ def add_text(
120122
self._ensure_initialized()
121123

122124
document = Document(content=text, uri=uri, metadata=metadata)
125+
123126
self._engine.create_new_context()
124127
document = self._engine.process(document)
125128

@@ -128,6 +131,8 @@ def add_text(
128131
if self._settings.quantize_scan:
129132
self._engine.quantize()
130133

134+
self._engine.free_context()
135+
131136
def list_documents(self) -> list[Document]:
132137
"""List all documents in the database"""
133138
self._ensure_initialized()
@@ -206,6 +211,8 @@ def rebuild(self, remove_missing: bool = False) -> dict:
206211
if self._settings.quantize_scan:
207212
self._engine.quantize()
208213

214+
self._engine.free_context()
215+
209216
return {
210217
"total": total_docs,
211218
"reprocessed": reprocessed,

tests/test_settings.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ def test_store_settings(self, db_conn):
99
settings_manager = SettingsManager(db_conn[0])
1010
settings = Settings(
1111
model_path_or_name="test_model",
12-
model_config="test_config",
12+
model_options="test_config",
1313
embedding_dim=768,
1414
vector_type="test_store",
1515
chunk_overlap=100,
@@ -23,7 +23,7 @@ def test_store_settings(self, db_conn):
2323

2424
assert stored_settings is not None
2525
assert stored_settings.model_path_or_name == "test_model"
26-
assert stored_settings.model_config == "test_config"
26+
assert stored_settings.model_options == "test_config"
2727
assert stored_settings.embedding_dim == 768
2828
assert stored_settings.vector_type == "test_store"
2929
assert stored_settings.chunk_overlap == 100
@@ -34,7 +34,7 @@ def test_store_settings_when_exist(self, db_conn):
3434
settings_manager = SettingsManager(db_conn[0])
3535
settings = Settings(
3636
model_path_or_name="test_model",
37-
model_config="test_config",
37+
model_options="test_config",
3838
embedding_dim=768,
3939
vector_type="test_store",
4040
chunk_overlap=100,
@@ -47,7 +47,7 @@ def test_store_settings_when_exist(self, db_conn):
4747
# Store again with different values
4848
new_settings = Settings(
4949
model_path_or_name="new_model",
50-
model_config="new_config",
50+
model_options="new_config",
5151
embedding_dim=512,
5252
vector_type="new_store",
5353
chunk_overlap=50,
@@ -60,7 +60,7 @@ def test_store_settings_when_exist(self, db_conn):
6060

6161
assert stored_settings is not None
6262
assert stored_settings.model_path_or_name == "new_model"
63-
assert stored_settings.model_config == "new_config"
63+
assert stored_settings.model_options == "new_config"
6464
assert stored_settings.embedding_dim == 512
6565
assert stored_settings.vector_type == "new_store"
6666
assert stored_settings.chunk_overlap == 50
@@ -82,7 +82,7 @@ def test_load_settings_with_defaults(self, db_conn):
8282

8383
assert loaded_settings is not None
8484
assert loaded_settings.model_path_or_name == settings.model_path_or_name
85-
assert loaded_settings.model_config == settings.model_config
85+
assert loaded_settings.model_options == settings.model_options
8686
assert loaded_settings.embedding_dim == settings.embedding_dim
8787
assert loaded_settings.vector_type == settings.vector_type
8888
assert loaded_settings.chunk_overlap == settings.chunk_overlap

0 commit comments

Comments
 (0)