embedding.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import os
  2. from openai import OpenAI
  3. from dotenv import load_dotenv
  4. from typing import List
  5. from logger.logging import setup_logging
  6. load_dotenv()
  7. logger = setup_logging()
  8. class EmbeddingTool:
  9. def __init__(self):
  10. """
  11. 初始化embedding工具
  12. """
  13. self.client = OpenAI(
  14. api_key=os.getenv("OPENAI_API_KEY"),
  15. base_url=os.getenv("OPENAI_BASE_URL")
  16. )
  17. self.model = os.getenv("ENBEDDING_MODEL")
  18. self.dimensions = int(os.getenv("MILVUS_VECTOR_DIM"))
  19. self.encoding_format = "float"
  20. if not self.client or not self.model or not self.dimensions or not self.encoding_format:
  21. logger.error("Embedding工具初始化失败")
  22. raise ValueError("Embedding工具初始化失败")
  23. def get_embedding(self, text: str) -> List[float]:
  24. """
  25. 获取单个文本的embedding向量
  26. Args:
  27. text (str): 输入文本
  28. Returns:
  29. List[float]: 向量列表
  30. """
  31. try:
  32. response = self.client.embeddings.create(
  33. model=self.model,
  34. input=[text],
  35. dimensions=self.dimensions,
  36. encoding_format=self.encoding_format
  37. )
  38. if not response.data:
  39. logger.error("获取embedding失败")
  40. return []
  41. embedding = response.data[0].embedding
  42. if not embedding:
  43. logger.error("获取embedding失败")
  44. return []
  45. if len(embedding) != self.dimensions:
  46. logger.error("获取embedding失败")
  47. return []
  48. return embedding
  49. except Exception as e:
  50. print(f"获取embedding失败: {e}")
  51. return []
  52. def get_embeddings_batch(self, texts: List[str]) -> List[List[float]]:
  53. """
  54. 批量获取多个文本的embedding向量
  55. Args:
  56. texts (List[str]): 文本列表
  57. Returns:
  58. List[List[float]]: 向量列表的列表
  59. """
  60. try:
  61. response = self.client.embeddings.create(
  62. model=self.model,
  63. input=texts,
  64. dimensions=self.dimensions,
  65. encoding_format=self.encoding_format
  66. )
  67. if not response.data:
  68. logger.error("批量获取embedding失败")
  69. return []
  70. embeddings = [data.embedding for data in response.data]
  71. if len(embeddings) != len(texts):
  72. logger.error("批量获取embedding失败")
  73. return []
  74. for embedding in embeddings:
  75. if len(embedding) != self.dimensions:
  76. logger.error("批量获取embedding失败")
  77. return []
  78. return embeddings
  79. except Exception as e:
  80. print(f"批量获取embedding失败: {e}")
  81. return []
  82. def get_model_info(self) -> dict:
  83. """
  84. 获取模型信息
  85. Returns:
  86. dict: 模型信息
  87. """
  88. return {
  89. "model": self.model,
  90. "dimensions": self.dimensions,
  91. "encoding_format": self.encoding_format,
  92. "base_url": self.client.base_url
  93. }
  94. # 使用示例和测试
  95. if __name__ == "__main__":
  96. print("=== Embedding工具测试 ===")
  97. # 创建embedding工具实例
  98. embedding_tool = EmbeddingTool()
  99. # 显示模型信息
  100. print("模型信息:", embedding_tool.get_model_info())
  101. # 单个文本embedding测试
  102. print("\n=== 单个文本embedding测试 ===")
  103. test_text = "这是一个测试文档的内容,用于生成向量表示。"
  104. embedding = embedding_tool.get_embedding(test_text)
  105. if embedding:
  106. print(f"文本: {test_text}")
  107. print(f"向量维度: {len(embedding)}")
  108. print(f"向量前5个值: {embedding[:5]}")
  109. # 批量文本embedding测试
  110. print("\n=== 批量文本embedding测试 ===")
  111. test_texts = [
  112. "风急天高猿啸哀",
  113. "渚清沙白鸟飞回",
  114. "无边落木萧萧下",
  115. "不尽长江滚滚来"
  116. ]
  117. embeddings = embedding_tool.get_embeddings_batch(test_texts)
  118. if embeddings:
  119. print(f"处理了 {len(embeddings)} 个文本")
  120. for i, (text, emb) in enumerate(zip(test_texts, embeddings)):
  121. print(f"文本{i+1}: {text}")
  122. print(f"向量维度: {len(emb)}, 前3个值: {emb[:5]}")
  123. print("\n=== 测试完成 ===")