Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
product_recommendation_chatbot
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Bhargava Rellu
product_recommendation_chatbot
Commits
c8fb1ed0
Commit
c8fb1ed0
authored
Apr 18, 2025
by
BRellu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactor
parent
e3465f0d
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
90 additions
and
36 deletions
+90
-36
.env
.env
+5
-5
poetry.lock
poetry.lock
+12
-1
pyproject.toml
pyproject.toml
+1
-0
routes.py
src/reviewsense/api/routes.py
+4
-5
main.py
src/reviewsense/main.py
+1
-1
BotService.py
src/reviewsense/services/BotService.py
+47
-12
retrieval.py
src/reviewsense/services/retrieval.py
+20
-12
No files found.
.env
View file @
c8fb1ed0
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
poetry.lock
View file @
c8fb1ed0
...
@@ -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
"
pyproject.toml
View file @
c8fb1ed0
...
@@ -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]
...
...
src/reviewsense/api/routes.py
View file @
c8fb1ed0
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
]])
...
...
src/reviewsense/main.py
View file @
c8fb1ed0
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
:
...
...
src/reviewsense/services/BotService.py
View file @
c8fb1ed0
...
@@ -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/services/retrieval.py
View file @
c8fb1ed0
# 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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment