feat(rag): 新增 Embedder 抽象与离线 FakeEmbedder

This commit is contained in:
lhl
2026-08-29 22:27:24 +08:00
parent 80daadcd31
commit 9bc7828e63
3 changed files with 81 additions and 0 deletions
View File
+51
View File
@@ -0,0 +1,51 @@
from __future__ import annotations
from typing import List, Protocol
class Embedder(Protocol):
def embed(self, texts: List[str]) -> List[List[float]]: ...
_DIM = 64
def _tokenize(text: str) -> List[str]:
toks = []
cur = ""
for ch in text.lower():
if ch.isalnum():
cur += ch
else:
if cur:
toks.append(cur)
cur = ""
if cur:
toks.append(cur)
out = []
for t in toks:
idx = 0
for i, c in enumerate(t):
if i > 0 and c.isupper():
out.append(t[idx:i])
idx = i
out.append(t[idx:])
return [x for x in out if x]
class FakeEmbedder:
def embed(self, texts: List[str]) -> List[List[float]]:
vecs = []
for t in texts:
v = [0.0] * _DIM
for tok in _tokenize(t):
h = __import__("hashlib").md5(tok.encode("utf-8")).digest()
idx = h[0] % _DIM
v[idx] += 1.0
norm = __import__("math").sqrt(sum(x * x for x in v)) or 1.0
vecs.append([x / norm for x in v])
return vecs
def get_embedder(engine) -> Embedder:
return FakeEmbedder()