feat(multimodal): 实现本地模型管线与请求用量配置
This commit is contained in:
@@ -17,7 +17,7 @@ from app.contracts import Note, NoteBlock, NoteSummary
|
||||
from app.database.db import connect, transaction
|
||||
from app.errors import ApiError
|
||||
from app.knowledge.parser import ParsedNote, parse_note
|
||||
from app.retrieval.embedding import HashEmbeddingProvider
|
||||
from app.local_models.runtime import LocalEmbedding
|
||||
from app.retrieval import routed_vectors
|
||||
from app.retrieval.vectorstore import SqliteVecStore, VectorRecord
|
||||
from app.services.coordination import serialized_vault_mutation
|
||||
@@ -28,8 +28,8 @@ from app.services.vault_paths import (
|
||||
safe_note_filename,
|
||||
)
|
||||
|
||||
# 轻量实现实例(无状态,可直接复用);接入真实模型后替换为对应 Provider
|
||||
embedding = HashEmbeddingProvider()
|
||||
# 真实模型接口不在 API 进程加载权重;测试可显式替换该实例。
|
||||
embedding = LocalEmbedding()
|
||||
vector_store = SqliteVecStore()
|
||||
|
||||
|
||||
@@ -80,6 +80,10 @@ PreparedIndex = tuple[list[list[float]], routed_vectors.RemoteEmbeddings | None]
|
||||
async def prepare_note_index(parsed: ParsedNote) -> PreparedIndex:
|
||||
"""Compute vectors before opening a write transaction (including API I/O)."""
|
||||
texts = [block.content for block in parsed.blocks]
|
||||
if isinstance(embedding, LocalEmbedding):
|
||||
# One routed invocation: API first, validated local fallback. No hash vectors.
|
||||
remote = await routed_vectors.embed_remote(texts, accept_local=True)
|
||||
return [], remote
|
||||
vectors = await embedding.embed_documents(texts)
|
||||
remote = await routed_vectors.embed_remote(texts)
|
||||
return vectors, remote
|
||||
@@ -127,7 +131,8 @@ async def index_note(
|
||||
await vector_store.upsert(records, conn=conn)
|
||||
routed_vectors.store_remote(conn, [block.block_id for block in parsed.blocks], remote)
|
||||
repository.set_index_meta(
|
||||
{"embedding_model": embedding.model_id, "embedding_dim": str(embedding.dim)},
|
||||
{"embedding_model": remote.space_id if remote and isinstance(embedding, LocalEmbedding) else embedding.model_id,
|
||||
"embedding_dim": str(remote.dimensions if remote and isinstance(embedding, LocalEmbedding) else embedding.dim)},
|
||||
conn=conn,
|
||||
)
|
||||
finally:
|
||||
|
||||
Reference in New Issue
Block a user