refactoring

This commit is contained in:
Adam Wilson
2025-06-25 14:54:12 -06:00
parent 9b8b6b7105
commit a530e78399
15 changed files with 100 additions and 55 deletions
@@ -4,10 +4,10 @@ from src.text_generation.adapters.embedding_model import EmbeddingModel
from src.text_generation.adapters.text_generation_foundation_model import TextGenerationFoundationModel
from src.text_generation.entrypoints.http_api_controller import HttpApiController
from src.text_generation.entrypoints.server import RestApiServer
from src.text_generation.services.language_models.text_generation_response_service import TextGenerationResponseService
from src.text_generation.services.language_models.retrieval_augmented_generation_response_service import RetrievalAugmentedGenerationResponseService
from src.text_generation.services.similarity_scoring.generated_text_guardrail_service import GeneratedTextGuardrailService
from src.text_generation.services.logging.file_logging_service import FileLoggingService
from src.text_generation.services.nlp.text_generation_response_service import TextGenerationResponseService
from src.text_generation.services.nlp.retrieval_augmented_generation_response_service import RetrievalAugmentedGenerationResponseService
from src.text_generation.services.guardrails.generated_text_guardrail_service import GeneratedTextGuardrailService
class DependencyInjectionContainer(containers.DeclarativeContainer):
@@ -1,10 +1,10 @@
import json
import traceback
from src.text_generation.services.language_models.text_generation_response_service import TextGenerationResponseService
from src.text_generation.services.language_models.retrieval_augmented_generation_response_service import RetrievalAugmentedGenerationResponseService
from src.text_generation.services.nlp.text_generation_response_service import TextGenerationResponseService
from src.text_generation.services.nlp.retrieval_augmented_generation_response_service import RetrievalAugmentedGenerationResponseService
from src.text_generation.services.logging.file_logging_service import FileLoggingService
from src.text_generation.services.similarity_scoring.generated_text_guardrail_service import GeneratedTextGuardrailService
from src.text_generation.services.guardrails.generated_text_guardrail_service import GeneratedTextGuardrailService
class HttpApiController:
@@ -1,35 +1,17 @@
import numpy
from sklearn.metrics.pairwise import cosine_similarity
from src.text_generation.ports.abstract_embedding_model import AbstractEmbeddingModel
from src.text_generation.services.guardrails.abstract_generated_text_guardrail_service import AbstractGeneratedTextGuardrailService
from src.text_generation.services.nlp.abstract_semantic_similarity_service import AbstractSemanticSimilarityService
class GeneratedTextGuardrailService(AbstractGeneratedTextGuardrailService):
def __init__(
self,
embedding_model: AbstractEmbeddingModel,
self,
semantic_similarity_service: AbstractSemanticSimilarityService,
comparison_texts: list[str]):
super().__init__()
self.embeddings = embedding_model.embeddings
self.comparison_texts = comparison_texts
self.semantic_similarity_service = semantic_similarity_service
self.semantic_similarity_service.use_comparison_texts(comparison_texts)
self.cosine_similarity_risk_threshold: float = 0.5
def analyze(self, model_generated_text: str) -> float:
# Get embeddings
query_embedding = self.embeddings.embed_query(model_generated_text)
doc_embeddings = self.embeddings.embed_documents(self.comparison_texts)
# Calculate similarity scores
query_embedding = numpy.array(query_embedding).reshape(1, -1)
doc_embeddings = numpy.array(doc_embeddings)
similarity_scores = cosine_similarity(query_embedding, doc_embeddings)[0]
scores = list()
# Results will be floating point values between -1 and 1
for i, score in enumerate(similarity_scores):
print(f"======== Text {i+1}: {score:.4f} | Score type: {type(score)}")
scores.append(score)
return max(scores)
score: float = self.semantic_similarity_service.analyze(text=model_generated_text)
return score >= self.cosine_similarity_risk_threshold
@@ -0,0 +1,7 @@
import abc
class AbstractSemanticSimilarityGuidelinesService(abc.ABC):
@abc.abstractmethod
def analyze(self, prompt_input_text: str) -> float:
raise NotImplementedError
@@ -6,14 +6,13 @@ from src.text_generation.common.constants import Constants
from src.text_generation.services.guidelines.abstract_rag_guidelines_service import AbstractRetrievalAugmentedGenerationGuidelinesService
from src.text_generation.ports.abstract_embedding_model import AbstractEmbeddingModel
class RetrievalAugmentedGenerationGuidelinesService(
AbstractRetrievalAugmentedGenerationGuidelinesService
):
AbstractRetrievalAugmentedGenerationGuidelinesService):
def __init__(
self,
embedding_model: AbstractEmbeddingModel
):
embedding_model: AbstractEmbeddingModel):
self.constants = Constants()
self.embedding_model = embedding_model
@@ -35,6 +34,7 @@ class RetrievalAugmentedGenerationGuidelinesService(
)
split_docs = text_splitter.split_documents(data)
# TODO: log?
i = 1
for doc in split_docs:
print(f'{i}: {doc.page_content}\n\n')
@@ -0,0 +1,7 @@
import abc
class SemanticSimilarityGuidelinesService(abc.ABC):
@abc.abstractmethod
def analyze(self, prompt_input_text: str) -> float:
raise NotImplementedError
@@ -0,0 +1,11 @@
import abc
class AbstractSemanticSimilarityService(abc.ABC):
@abc.abstractmethod
def analyze(self, text: str) -> float:
raise NotImplementedError
@abc.abstractmethod
def use_comparison_texts(self, comparison_texts: list[str]):
raise NotImplementedError
@@ -1,4 +1,4 @@
from src.text_generation.services.language_models.abstract_language_model_response_service import AbstractLanguageModelResponseService
from src.text_generation.services.nlp.abstract_language_model_response_service import AbstractLanguageModelResponseService
class FakeLanguageModelResponseService(AbstractLanguageModelResponseService):
@@ -3,7 +3,7 @@ from langchain.prompts import PromptTemplate
from src.text_generation.ports.abstract_embedding_model import AbstractEmbeddingModel
from src.text_generation.ports.abstract_foundation_model import AbstractFoundationModel
from src.text_generation.services.language_models.abstract_language_model_response_service import AbstractLanguageModelResponseService
from src.text_generation.services.nlp.abstract_language_model_response_service import AbstractLanguageModelResponseService
from src.text_generation.services.guidelines.abstract_rag_guidelines_service import AbstractRetrievalAugmentedGenerationGuidelinesService
from src.text_generation.services.utilities.abstract_response_processing_service import AbstractResponseProcessingService
@@ -0,0 +1,34 @@
from numpy import float64, array
from sklearn.metrics.pairwise import cosine_similarity
from src.text_generation.common.constants import Constants
from src.text_generation.services.nlp.abstract_semantic_similarity_service import AbstractSemanticSimilarityService
from src.text_generation.ports.abstract_embedding_model import AbstractEmbeddingModel
class SemanticSimilarityService(AbstractSemanticSimilarityService):
def __init__(
self,
embedding_model: AbstractEmbeddingModel):
super().__init__()
self.embeddings = embedding_model.embeddings
self.constants = Constants()
def use_comparison_texts(self, comparison_texts: list[str]):
self.comparison_texts = comparison_texts
def analyze(self, text: str) -> float:
query_embedding = self.embeddings.embed_query(text)
doc_embeddings = self.embeddings.embed_documents(self.comparison_texts)
query_embedding = array(query_embedding).reshape(1, -1)
doc_embeddings = array(doc_embeddings)
similarity_scores: list[float64] = cosine_similarity(query_embedding, doc_embeddings)[0]
scores = list()
# perfect alignment (similarity) results in a score of 1;
# opposite is -1
for _, score in enumerate(similarity_scores):
scores.append(score)
return max(scores)
@@ -2,7 +2,7 @@ from langchain.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from src.text_generation.services.language_models.abstract_language_model_response_service import AbstractLanguageModelResponseService
from src.text_generation.services.nlp.abstract_language_model_response_service import AbstractLanguageModelResponseService
from src.text_generation.ports.abstract_foundation_model import AbstractFoundationModel