Commit c8fb1ed0 authored by BRellu's avatar BRellu

refactor

parent e3465f0d
ASTRA_DB_API_ENDPOINT="https://9706ee0b-b3e8-4ee2-bb26-45e8a0db1586-us-east-2.apps.astra.datastax.com"
ASTRA_DB_API_ENDPOINT="https://0c52512b-0c65-4e70-ac47-71edf5244a82-us-east-2.apps.astra.datastax.com" ASTRA_DB_APPLICATION_TOKEN="AstraCS:OEbpcggZbUjOvRiesULZkTnf:9d215d8d32c2ffb09081212208e474f81a0bcdde45e7b683cd67f4a1a936a8bf"
ASTRA_DB_APPLICATION_TOKEN="AstraCS:EvXpFFafufegdQJvhqlYxmxt:ef86b5996013b12140b69254bd554d7e8e10eb5a7137859b9c432f92a5a3b65c"
ASTRA_DB_NAMESPACE="default_keyspace" ASTRA_DB_NAMESPACE="default_keyspace"
HF_TOKEN="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" HF_TOKEN="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"
GROQ_API_KEY="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" GROQ_API_KEY="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"
HUGGING_FACE_MODEL="BAAI/bge-base-en-v1.5"
\ No newline at end of file
...@@ -2494,6 +2494,17 @@ files = [ ...@@ -2494,6 +2494,17 @@ files = [
[package.dependencies] [package.dependencies]
requests = ">=2.0.1,<3.0.0" requests = ">=2.0.1,<3.0.0"
[[package]]
name = "review"
version = "1510"
description = "upload script for Rietveld code review tool"
optional = false
python-versions = "*"
groups = ["main"]
files = [
{file = "review-1510.zip", hash = "sha256:0b49c9c80dfaf051b399d9147a76f0900edab95ee3816d2a4c1a3c3a6ad130f9"},
]
[[package]] [[package]]
name = "safetensors" name = "safetensors"
version = "0.5.2" version = "0.5.2"
...@@ -3287,4 +3298,4 @@ propcache = ">=0.2.0" ...@@ -3287,4 +3298,4 @@ propcache = ">=0.2.0"
[metadata] [metadata]
lock-version = "2.1" lock-version = "2.1"
python-versions = "^3.9" python-versions = "^3.9"
content-hash = "a980d3a86400e70c44fece09364c23407b1a898daad559746447df6ff7773437" content-hash = "b7e83229a21b0e3036ab39dbca747be37a094792b9352cd6f141348e36666d42"
...@@ -17,6 +17,7 @@ transformers = "^4.30.0" ...@@ -17,6 +17,7 @@ transformers = "^4.30.0"
numpy = "^1.24.0" numpy = "^1.24.0"
pydantic = "^2.10.6" pydantic = "^2.10.6"
langchain_groq = "^0.1.10" langchain_groq = "^0.1.10"
review = "^1510"
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
......
from fastapi import APIRouter, HTTPException from fastapi import APIRouter, HTTPException
from typing import Dict, Optional from typing import Dict, Optional
from reviewsense.api.schemas.UserMessage import UserMessage
from reviewsense.api.schemas.product_review_input import ProductReviewInput
from reviewsense.services.BotService import BotService
from reviewsense.services.ReviewService import ReviewService
from src.reviewsense.api.schemas.UserMessage import UserMessage
from src.reviewsense.services.BotService import BotService
router = APIRouter() router = APIRouter()
review_service = ReviewService()
@router.post("/calculate_ratings/", response_model=Dict[str, Optional[float]]) @router.post("/calculate_ratings/", response_model=Dict[str, Optional[float]])
......
from fastapi import FastAPI from fastapi import FastAPI
from reviewsense.api.routes import router from reviewsense.api.routes import router
from reviewsense.core.config import get_settings
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
def create_app() -> FastAPI: def create_app() -> FastAPI:
......
...@@ -5,11 +5,9 @@ from langchain_astradb import AstraDBVectorStore ...@@ -5,11 +5,9 @@ from langchain_astradb import AstraDBVectorStore
from logging import getLogger from logging import getLogger
from functools import lru_cache from functools import lru_cache
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import ChatPromptTemplate
from reviewsense.core.llm import get_llm, generate_response from src.reviewsense.core.llm import generate_response, get_llm
from reviewsense.services.retrieval import get_vector_store from src.reviewsense.services.retrieval import get_vector_store
logger = getLogger(__name__) logger = getLogger(__name__)
...@@ -79,16 +77,17 @@ class BotService: ...@@ -79,16 +77,17 @@ class BotService:
ProductContext if found, None otherwise ProductContext if found, None otherwise
""" """
try: try:
as_retriever = self.vector_store.as_retriever(search_type="similarity_score_threshold", # as_retriever = self.vector_store.as_retriever(search_type="similarity_score_threshold",
search_kwargs={"k": 1, "score_threshold": 0.8}, ) # search_kwargs={"k": 1, "score_threshold": 0.8}, )
results = as_retriever.invoke(search_query) documents = self.vector_store.similarity_search_with_score(query="good camera", k=100)
# results = as_retriever.invoke(search_query)
# if not results:
# logger.info("No results found for query")
# return None
if not results:
logger.info("No results found for query")
return None
document = results[0] product_name = documents[0][0].metadata.get('title')
product_name = document.metadata.get('product_name')
if not product_name: if not product_name:
logger.warning("Product name missing in document metadata") logger.warning("Product name missing in document metadata")
...@@ -132,3 +131,39 @@ class BotService: ...@@ -132,3 +131,39 @@ class BotService:
except BotServiceError as e: except BotServiceError as e:
logger.error(f"Error handling user query: {e}") logger.error(f"Error handling user query: {e}")
return "I apologize, but I encountered an error processing your request." return "I apologize, but I encountered an error processing your request."
def get_product_reviews(
self,
product_id: str,
query: str,
k: int = 1
) -> str:
"""
Retrieve and combine product reviews from the vector store.
Args:
product_id: Product identifier
query: Search query
k: Number of results to retrieve
Returns:
Combined review string
"""
try:
results = self.vector_store.similarity_search_with_score_id(
query=query,
k=5,
filter={"title": product_id}
)
all_reviews = []
for doc, _, _ in results:
reviews = ReviewProcessor.process_reviews(doc.page_content)
all_reviews.extend(reviews)
return ' '.join(all_reviews)
except Exception as e:
logger.error(f"Error retrieving product reviews: {e}")
raise VectorStoreError(f"Failed to retrieve reviews: {e}")
# src/reviewsense/core/database.py # src/reviewsense/core/database.py
from functools import lru_cache from functools import lru_cache
from dotenv import load_dotenv
import os
from langchain_community.embeddings import HuggingFaceInferenceAPIEmbeddings from langchain_community.embeddings import HuggingFaceInferenceAPIEmbeddings
from langchain_huggingface import HuggingFaceEmbeddings from langchain_huggingface import HuggingFaceEmbeddings
from langchain_astradb import AstraDBVectorStore from langchain_astradb import AstraDBVectorStore
from reviewsense.core.config import get_settings
load_dotenv()
huggingface_inference_api = os.getenv("HF_TOKEN")
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) @lru_cache(maxsize=1)
def get_vector_store( def get_vector_store(
collection_name: str = "One", collection_name: str = "customer_reviews",
embedding_model: str = "sentence-transformers/all-mpnet-base-v2" embedding_model: str = "sentence-transformers/all-mpnet-base-v2"
): ):
""" """
Create a singleton vector store instance Create a singleton vector store instance
Args: Args:
collection_name (str): Database collection name collection_name (str): Database collection name
embedding_model (str): Embedding model to use embedding_model (str): Embedding model to use
Returns: Returns:
AstraDBVectorStore: Configured vector store instance AstraDBVectorStore: Configured vector store instance
""" """
settings = get_settings()
# Initialize embeddings # Initialize embeddings
embeddings = HuggingFaceInferenceAPIEmbeddings(api_key="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", model_name="BAAI/bge-base-en-v1.5") embeddings = HuggingFaceInferenceAPIEmbeddings(api_key=huggingface_inference_api, model_name=huggingface_model)
# Create and return vector store # Create and return vector store
return AstraDBVectorStore( return AstraDBVectorStore(
collection_name=collection_name, collection_name=collection_name,
embedding=embeddings, embedding=embeddings,
api_endpoint="https://9706ee0b-b3e8-4ee2-bb26-45e8a0db1586-us-east-2.apps.astra.datastax.com", api_endpoint=astra_db_api_end_point,
token="AstraCS:OEbpcggZbUjOvRiesULZkTnf:9d215d8d32c2ffb09081212208e474f81a0bcdde45e7b683cd67f4a1a936a8bf", token=astra_db_token,
namespace="default_keyspace", namespace=astra_db_name_space,
) )
\ No newline at end of file
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