embedding.py 4.8 KB

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