From 7be729cb22a8bbdc967969243ab33f59dedd4951 Mon Sep 17 00:00:00 2001 From: Julian lechner Date: Thu, 17 Sep 2026 15:52:43 +0200 Subject: [PATCH] feat(qwen): enforce 1024-dimensional embeddings --- scripts/test-retrieval-server.py | 10 +++++++--- shared/retrieval/server.py | 6 ++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/scripts/test-retrieval-server.py b/scripts/test-retrieval-server.py index 2990e98..dc37cff 100644 --- a/scripts/test-retrieval-server.py +++ b/scripts/test-retrieval-server.py @@ -16,6 +16,10 @@ MODULE = importlib.util.module_from_spec(SPEC) SPEC.loader.exec_module(MODULE) +def embedding(): + return array('f', [1.0] + [0.0] * (MODULE.EMBEDDING_DIMENSIONS - 1)) + + class RetrievalServerTests(unittest.TestCase): @unittest.skipUnless(os.environ.get('QWEN_TEST_MODEL_CACHE'), 'Set QWEN_TEST_MODEL_CACHE to run the real-model check.') def test_real_models(self): @@ -52,7 +56,7 @@ class RetrievalServerTests(unittest.TestCase): def encode(values, **kwargs): self.assertEqual(kwargs.get('prompt_name'), 'query' if values == ['query'] else None) encoded.extend(values) - return [array('f', [1.0]) for _ in values] + return [embedding() for _ in values] for index in indexes: index.encoder = lambda: SimpleNamespace(encode=encode) @@ -88,7 +92,7 @@ class RetrievalServerTests(unittest.TestCase): root = Path(temporary) (root / 'a.md').write_text('before', encoding='utf-8') index = MODULE.Index(root, root / 'data') - index.encoder = lambda: SimpleNamespace(encode=lambda values, **kwargs: [array('f', [1.0]) for _ in values]) + index.encoder = lambda: SimpleNamespace(encode=lambda values, **kwargs: [embedding() for _ in values]) try: index.rebuild() (root / 'a.md').write_text('after', encoding='utf-8') @@ -97,7 +101,7 @@ class RetrievalServerTests(unittest.TestCase): def encode(values, **kwargs): if values == ['fail']: raise RuntimeError('encoder failed') - return [array('f', [1.0]) for _ in values] + return [embedding() for _ in values] index.encoder = lambda: SimpleNamespace(encode=encode) with self.assertRaisesRegex(RuntimeError, 'encoder failed'): diff --git a/shared/retrieval/server.py b/shared/retrieval/server.py index 34cf30d..e90af91 100644 --- a/shared/retrieval/server.py +++ b/shared/retrieval/server.py @@ -15,6 +15,7 @@ import threading MODEL = "Qwen/Qwen3-Embedding-0.6B" RERANKER_MODEL = "Qwen/Qwen3-Reranker-0.6B" +EMBEDDING_DIMENSIONS = 1024 RETRIEVAL_INSTRUCTION = "Given a codebase question, retrieve relevant code and documentation that answer the question." TEXT_EXTENSIONS = {".c", ".cpp", ".cs", ".go", ".java", ".js", ".json", ".md", ".py", ".ps1", ".rs", ".sh", ".toml", ".ts", ".tsx", ".txt", ".yaml", ".yml"} @@ -31,7 +32,7 @@ class Index: self.root = root.resolve() self.data = data.resolve() self.data.mkdir(parents=True, exist_ok=True) - identity = os.path.normcase(str(self.root)) + "\n" + MODEL + identity = os.path.normcase(str(self.root)) + "\n" + MODEL + "\n" + str(EMBEDDING_DIMENSIONS) database = hashlib.sha256(identity.encode()).hexdigest() + ".sqlite3" self.db = sqlite3.connect(self.data / database, check_same_thread=False, timeout=30) self.db.execute("create table if not exists chunks (path text, text text, vector blob)") @@ -62,7 +63,8 @@ class Index: def encoder(self): if self.model is None: from sentence_transformers import SentenceTransformer - self.model = SentenceTransformer(MODEL, prompts={"query": f"Instruct: {RETRIEVAL_INSTRUCTION}\nQuery: "}) + self.model = SentenceTransformer(MODEL, truncate_dim=EMBEDDING_DIMENSIONS, + prompts={"query": f"Instruct: {RETRIEVAL_INSTRUCTION}\nQuery: "}) return self.model def reranker(self):