embedder.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. """
  2. BGE-M3 Embedding 生成器
  3. 将文本 chunk 向量化写入 Milvus
  4. """
  5. import logging
  6. from typing import Optional
  7. from dataclasses import dataclass
  8. from app.core.config import get_settings
  9. settings = get_settings()
  10. logger = logging.getLogger(__name__)
  11. class Embedder:
  12. def __init__(self, model_name: Optional[str] = None, device: Optional[str] = None):
  13. self.model_name = model_name or settings.embedding_model
  14. self.device = device or settings.embedding_device
  15. self.model = None
  16. self._loaded = False
  17. def load_model(self):
  18. """Phase 2 实现:加载 BGE-M3 模型"""
  19. if self._loaded:
  20. return
  21. logger.info(f"Loading embedding model: {self.model_name}")
  22. self._loaded = True
  23. def encode(self, texts: list[str], batch_size: int = 32) -> list[list[float]]:
  24. """
  25. 批量文本向量化。
  26. BGE-M3 支持文本前加 instruction 前缀:
  27. 查询: "Represent this sentence for searching relevant passages: "
  28. 文档: ""
  29. Phase 2 实现。
  30. """
  31. return [[0.0] * settings.embedding_dim] * len(texts)
  32. def encode_queries(self, queries: list[str]) -> list[list[float]]:
  33. """查询向量化(带 instruction 前缀)"""
  34. prefixed = [
  35. f"Represent this sentence for searching relevant passages: {q}"
  36. for q in queries
  37. ]
  38. return self.encode(prefixed)
  39. def encode_documents(self, documents: list[str]) -> list[list[float]]:
  40. """文档向量化"""
  41. return self.encode(documents)
  42. def embed_and_store(
  43. self,
  44. chunks: list[str],
  45. metadata_list: list[dict],
  46. collection_name: Optional[str] = None,
  47. ):
  48. """
  49. 向量化并写入 Milvus。
  50. Phase 2 实现。
  51. """
  52. vectors = self.encode_documents(chunks)
  53. logger.info(f"Generated {len(vectors)} embeddings for {len(chunks)} chunks")
  54. return len(vectors)