feat(rag): 新增 Embedder 抽象与离线 FakeEmbedder
This commit is contained in:
@@ -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()
|
||||
Reference in New Issue
Block a user