agents/EmbedderAgent.py (32 lines of code) (raw):
from abc import ABC
from .core import Agent
from vertexai.language_models import TextEmbeddingModel
class EmbedderAgent(Agent, ABC):
"""
An agent specialized in generating text embeddings using Large Language Models (LLMs).
This agent supports two modes for generating embeddings:
1. "vertex": Directly interacts with the Vertex AI TextEmbeddingModel.
2. "lang-vertex": Uses LangChain's VertexAIEmbeddings for a streamlined interface.
Attributes:
agentType (str): Indicates the type of agent, fixed as "EmbedderAgent".
mode (str): The embedding generation mode ("vertex" or "lang-vertex").
model: The underlying embedding model (Vertex AI TextEmbeddingModel or LangChain's VertexAIEmbeddings).
Methods:
create(question) -> list:
Generates text embeddings for the given question(s).
Args:
question (str or list): The text input for which embeddings are to be generated. Can be a single string or a list of strings.
Returns:
list: A list of embedding vectors. Each embedding vector is represented as a list of floating-point numbers.
Raises:
ValueError: If the input `question` is not a string or list, or if the specified `mode` is invalid.
"""
agentType: str = "EmbedderAgent"
def __init__(self, mode, embeddings_model='text-embedding-004'):
if mode == 'vertex':
self.mode = mode
self.model = TextEmbeddingModel.from_pretrained(embeddings_model)
elif mode == 'lang-vertex':
self.mode = mode
from langchain.embeddings import VertexAIEmbeddings
self.model = VertexAIEmbeddings()
else: raise ValueError('EmbedderAgent mode must be either vertex or lang-vertex')
def create(self, question):
"""Text embedding with a Large Language Model."""
if self.mode == 'vertex':
if isinstance(question, str):
embeddings = self.model.get_embeddings([question])
for embedding in embeddings:
vector = embedding.values
return vector
elif isinstance(question, list):
vector = list()
for q in question:
embeddings = self.model.get_embeddings([q])
for embedding in embeddings:
vector.append(embedding.values)
return vector
else: raise ValueError('Input must be either str or list')
elif self.mode == 'lang-vertex':
vector = self.embeddings_service.embed_documents(question)
return vector