Commit 81afdc4b authored by Bhargava Rellu's avatar Bhargava Rellu

Merge branch 'RS-101' into 'master'

[RS-101] - Integrate Astradb into Ecom Review Sense

See merge request !2
parents c068bacc 54ef043f
ASTRA_DB_API_ENDPOINT="https://0c52512b-0c65-4e70-ac47-71edf5244a82-us-east-2.apps.astra.datastax.com"
ASTRA_DB_APPLICATION_TOKEN="AstraCS:EvXpFFafufegdQJvhqlYxmxt:ef86b5996013b12140b69254bd554d7e8e10eb5a7137859b9c432f92a5a3b65c"
ASTRA_DB_NAMESPACE="default_keyspace"
HF_TOKEN="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"
GROQ_API_KEY="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"
GROQ_API_KEY="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"
GROQ_MODEL_NAME="llama-3.3-70b-versatile"
MONGODB_URL=mongodb+srv://genai:nisum@123@productrater.hpbsn.mongodb.net/?retryWrites=true&w=majority&appName=productRater
MONGODB_PASSWORD=nisum@123
MONGODB_USERNAME=genai
MONGODB_CLUSTER=productrater.hpbsn.mongodb.net
MONGODB_APPNAME=productRater
# Default settings
EMBEDDING_MODEL="sentence-transformers/all-mpnet-base-v2"
HUGGING_FACE_INTERFACE_API="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"
HUGGING_FACE_MODEL="BAAI/bge-base-en-v1.5"
ASTRA_DB_API_END_POINT="https://9706ee0b-b3e8-4ee2-bb26-45e8a0db1586-us-east-2.apps.astra.datastax.com"
ASTRA_DB_TOKEN="AstraCS:OEbpcggZbUjOvRiesULZkTnf:9d215d8d32c2ffb09081212208e474f81a0bcdde45e7b683cd67f4a1a936a8bf"
ASTRA_DB_NAME_SPACE="default_keyspace"
from functools import lru_cache
from langchain_groq import ChatGroq
import os
from dotenv import load_dotenv
load_dotenv()
groq_model_name = os.getenv("GROQ_MODEL_NAME")
@lru_cache(maxsize=1) # Cache only one instance (singleton behavior)
def get_llm(groq_token: str):
......@@ -15,7 +19,7 @@ def get_llm(groq_token: str):
ChatGroq: A singleton instance of the ChatGroq LLM.
"""
return ChatGroq(
model_name="llama-3.3-70b-versatile",
model_name=groq_model_name,
temperature=1,
groq_api_key=groq_token # Pass the Groq token here
)
......@@ -6,7 +6,20 @@ from pymongo import MongoClient
from src.reviewsense_ecom.model.FeatureSentiment import FeatureSentiment
from src.reviewsense_ecom.model.Product import Product
from src.reviewsense_ecom.model.ProductReview import ProductReview
from src.reviewsense_ecom.service.review_adder import ReviewAdder
import os
from dotenv import load_dotenv
load_dotenv()
mongo_db = os.getenv("MONGODB_URL")
# Load environment variables
load_dotenv()
# Read individual parts from .env
username = os.getenv("MONGODB_USERNAME")
password = urllib.parse.quote_plus(os.getenv("MONGODB_PASSWORD")) # escape special characters
cluster = os.getenv("MONGODB_CLUSTER")
appname = os.getenv("MONGODB_APPNAME")
# def get_db_connection(collection_name: str): #LOCAL DB
# client = MongoClient("mongodb://localhost:27017/") # Update with your MongoDB connection
......@@ -15,10 +28,8 @@ from src.reviewsense_ecom.model.ProductReview import ProductReview
def get_db_connection(collection_name: str): # get_db_cloud_connection
password = "nisum@123"
escaped_password = urllib.parse.quote_plus(password)
client = MongoClient(
f"mongodb+srv://genai:{escaped_password}@productrater.hpbsn.mongodb.net/?retryWrites=true&w=majority&appName=productRater") # Update with your MongoDB connection
mongo_uri = f"mongodb+srv://{username}:{password}@{cluster}/?retryWrites=true&w=majority&appName={appname}"
client = MongoClient(mongo_uri)
db = client["productRater"] # Change to your database name
return db[collection_name]
......@@ -134,7 +145,14 @@ def add_review_features(input_data, reviews_by_feature):
inserted_result = collection.insert_one(new_review.__dict__)
if inserted_result.inserted_id:
print(f"Review successfully added with ID: {inserted_result.inserted_id}")
print(f"Review successfully added Into MongoDB with ID: {inserted_result.inserted_id}")
# ✅ Add review to vector DB
try:
review_adder = ReviewAdder()
vector_id = review_adder.add_review_vector(input_data.product_id, input_data.new_review)
print(f"Review also added to Vector DB with ID: {vector_id} ")
except Exception as e:
print(f"Failed to add review to vector DB: {e}")
# Return the newly inserted review object
return new_review.__dict__
......
# src/reviewsense/core/database.py
from functools import lru_cache
from dotenv import load_dotenv
import os
from langchain_astradb import AstraDBVectorStore
from langchain_community.embeddings import HuggingFaceInferenceAPIEmbeddings
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_astradb import AstraDBVectorStore
load_dotenv()
huggingface_inference_api = os.getenv("HUGGING_FACE_INTERFACE_API")
huggingface_model= os.getenv("HUGGING_FACE_MODEL")
astra_db_api_end_point=os.getenv("ASTRA_DB_API_END_POINT")
astra_db_token=os.getenv("ASTRA_DB_TOKEN")
astra_db_name_space=os.getenv("ASTRA_DB_NAME_SPACE")
@lru_cache(maxsize=1)
def get_vector_store(
collection_name: str = "feature_reviews",
embedding_model: str = "sentence-transformers/all-mpnet-base-v2"
collection_name: str = "customer_reviews",
embedding_model: str = "sentence-transformers/all-mpnet-base-v2"
):
"""
Create a singleton vector store instance
......@@ -22,13 +31,13 @@ def get_vector_store(
"""
# Initialize embeddings
embeddings = HuggingFaceEmbeddings(model_name=embedding_model)
embeddings = HuggingFaceInferenceAPIEmbeddings(api_key=huggingface_inference_api, model_name=huggingface_model)
# Create and return vector store
return AstraDBVectorStore(
collection_name=collection_name,
embedding=embeddings,
api_endpoint="https://19b6fcda-3fe8-4585-a5f5-6a464a382426-westus3.apps.astra.datastax.com",
token="AstraCS:UaZmElcIDkRHzUmktguKwrnd:197d3e825510580f5f97cc749b00a94b685d54a5f1d4a755b75440fe2c29329b",
namespace="default_keyspace",
)
api_endpoint=astra_db_api_end_point,
token=astra_db_token,
namespace=astra_db_name_space,
)
\ No newline at end of file
from typing import List, Dict
import os
from dotenv import load_dotenv
from langchain.prompts import ChatPromptTemplate
from langchain_core.output_parsers import JsonOutputParser
......@@ -9,7 +10,7 @@ from src.reviewsense_ecom.llm.llm import get_llm
# Load environment variables from .env file
load_dotenv()
groq_api_key = os.getenv("GROQ_API_KEY")
class FeatureReview(BaseModel):
feature: str
......@@ -24,7 +25,7 @@ class FeatureReviews(BaseModel):
class FeatureExtractor:
def __init__(self):
self.llm = get_llm("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")
self.llm = get_llm(groq_api_key)
self.parser = self._create_reviews_parser()
self.prompt = self._create_extraction_prompt()
......
# services/review_adder.py
from langchain_community.docstore.document import Document
from src.reviewsense_ecom.retriever.retrieval import get_vector_store
class ReviewAdder:
"""Class for adding reviews to the vector store"""
def __init__(self):
self.vector_store = get_vector_store()
def add_review_vector(self, product_id: str, review: str) -> str:
review_document = Document(page_content=review, metadata={"title": product_id})
return self.vector_store.add_documents([review_document])[0]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment