| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- """
- BGE-M3 Embedding 生成器
- 将文本 chunk 向量化写入 Milvus
- """
- import logging
- from typing import Optional
- from dataclasses import dataclass
- from app.core.config import get_settings
- settings = get_settings()
- logger = logging.getLogger(__name__)
- class Embedder:
- def __init__(self, model_name: Optional[str] = None, device: Optional[str] = None):
- self.model_name = model_name or settings.embedding_model
- self.device = device or settings.embedding_device
- self.model = None
- self._loaded = False
- def load_model(self):
- """Phase 2 实现:加载 BGE-M3 模型"""
- if self._loaded:
- return
- logger.info(f"Loading embedding model: {self.model_name}")
- self._loaded = True
- def encode(self, texts: list[str], batch_size: int = 32) -> list[list[float]]:
- """
- 批量文本向量化。
- BGE-M3 支持文本前加 instruction 前缀:
- 查询: "Represent this sentence for searching relevant passages: "
- 文档: ""
- Phase 2 实现。
- """
- return [[0.0] * settings.embedding_dim] * len(texts)
- def encode_queries(self, queries: list[str]) -> list[list[float]]:
- """查询向量化(带 instruction 前缀)"""
- prefixed = [
- f"Represent this sentence for searching relevant passages: {q}"
- for q in queries
- ]
- return self.encode(prefixed)
- def encode_documents(self, documents: list[str]) -> list[list[float]]:
- """文档向量化"""
- return self.encode(documents)
- def embed_and_store(
- self,
- chunks: list[str],
- metadata_list: list[dict],
- collection_name: Optional[str] = None,
- ):
- """
- 向量化并写入 Milvus。
- Phase 2 实现。
- """
- vectors = self.encode_documents(chunks)
- logger.info(f"Generated {len(vectors)} embeddings for {len(chunks)} chunks")
- return len(vectors)
|