embedding_service.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. """
  2. 向量化工具
  3. 使用豆包的 doubao-embedding-vision-251215 模型生成向量嵌入
  4. """
  5. from typing import List
  6. from openai import OpenAI
  7. from ..core.ark_client import get_client
  8. class EmbeddingService:
  9. def __init__(self):
  10. self.embedding_model = "doubao-embedding-vision-251215"
  11. def generate_embeddings(self, texts: List[str], app_name: str) -> List[List[float]]:
  12. """
  13. 批量生成文本的向量嵌入
  14. :param texts: 文本列表
  15. :param app_name: 租户的appName(用于获取对应的API客户端)
  16. :return: 向量列表
  17. """
  18. if not texts:
  19. return []
  20. try:
  21. client = get_client(app_name)
  22. # 调用豆包的 Embeddings API
  23. response = client.embeddings.create(
  24. model=self.embedding_model,
  25. input=texts
  26. )
  27. # 提取向量
  28. embeddings = [item.embedding for item in response.data]
  29. return embeddings
  30. except Exception as e:
  31. print(f"向量化失败: {str(e)}")
  32. return []
  33. def generate_single_embedding(self, text: str, app_name: str) -> List[float]:
  34. """
  35. 生成单个文本的向量嵌入
  36. :param text: 文本内容
  37. :param app_name: 租户的appName
  38. :return: 向量
  39. """
  40. embeddings = self.generate_embeddings([text], app_name)
  41. return embeddings[0] if embeddings else []
  42. # 全局单例
  43. _embedding_service = None
  44. def get_embedding_service() -> EmbeddingService:
  45. """获取向量化服务单例"""
  46. global _embedding_service
  47. if _embedding_service is None:
  48. _embedding_service = EmbeddingService()
  49. return _embedding_service