mirror of
https://github.com/lightbroker/llmsecops-research.git
synced 2026-09-26 19:41:59 +02:00
refactoring
This commit is contained in:
@@ -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
|
||||
+7
@@ -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
-1
@@ -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):
|
||||
+1
-1
@@ -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)
|
||||
+1
-1
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user