Spaces:
Sleeping
Sleeping
| import os | |
| from openai import OpenAI | |
| import logging | |
| from typing import List, Dict, Any | |
| import json | |
| import time | |
| from pydantic import BaseModel | |
| import time | |
| from qdrant_client import QdrantClient, models | |
| from qdrant_client import QdrantClient | |
| from qdrant_client.models import Filter, FieldCondition, MatchValue, Range, MatchAny | |
| qdrant_client = QdrantClient( | |
| url="https://00e40cf4-6976-43c1-aa08-be895735804b.europe-west3-0.gcp.cloud.qdrant.io:6333", | |
| api_key="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2Nlc3MiOiJtIn0.lfvuJEBzsmB7vez0nhv7HBbUlW77eUAT8raSazqYXHA", | |
| ) | |
| qdrant_client.set_model("sentence-transformers/all-MiniLM-L6-v2") | |
| qdrant_client.set_sparse_model("prithivida/Splade_PP_en_v1") | |
| def recommend_talent_tool(search_query: str, verticals=None, min_age=None, max_age=None, gender=None, | |
| min_followers=None, max_followers=None, | |
| min_overall_engagement=None, max_overall_engagement=None): | |
| conditions = [] | |
| if verticals: | |
| if isinstance(verticals, str): | |
| verticals = [verticals] | |
| conditions.append( | |
| FieldCondition( | |
| key="verticals", | |
| match=MatchAny(any=verticals) | |
| ) | |
| ) | |
| if min_age is not None or max_age is not None: | |
| range_params = {} | |
| if min_age is not None: | |
| range_params["gte"] = int(min_age) # Ensure it's an integer | |
| if max_age is not None: | |
| range_params["lte"] = int(max_age) | |
| conditions.append( | |
| FieldCondition( | |
| key="age", | |
| range=Range(**range_params) | |
| ) | |
| ) | |
| if gender: | |
| conditions.append( | |
| FieldCondition( | |
| key="gender", | |
| match=MatchValue(value=gender) | |
| ) | |
| ) | |
| if min_followers is not None or max_followers is not None: | |
| range_params = {} | |
| if min_followers is not None: | |
| range_params["gte"] = int(min_followers) # Convert to int | |
| if max_followers is not None: | |
| range_params["lte"] = int(max_followers) | |
| conditions.append( | |
| FieldCondition( | |
| key="follower_count", | |
| range=Range(**range_params) | |
| ) | |
| ) | |
| if min_overall_engagement is not None or max_overall_engagement is not None: | |
| range_params = {} | |
| if min_overall_engagement is not None: | |
| range_params["gte"] = float(min_overall_engagement) # Convert to float | |
| if max_overall_engagement is not None: | |
| range_params["lte"] = float(max_overall_engagement) | |
| conditions.append( | |
| FieldCondition( | |
| key="overall_engagement", | |
| range=Range(**range_params) | |
| ) | |
| ) | |
| query_filter = Filter(must=conditions) if conditions else None | |
| search_result = qdrant_client.query( | |
| collection_name="social_media_profiles", | |
| query_text=search_query, | |
| query_filter=query_filter, | |
| limit=10 | |
| ) | |
| # Extract metadata and scores | |
| results = [] | |
| max_followers = max((hit.metadata.get("follower_count", 1) for hit in search_result), default=1) | |
| max_engagement = max((hit.metadata.get("overall_engagement", 1) for hit in search_result), default=1) | |
| W1, W2, W3 = 0.5, 2.5, 0.25 | |
| for hit in search_result: | |
| metadata = hit.metadata | |
| vector_similarity = hit.score # Qdrant should return a similarity score | |
| follower_count = metadata.get("follower_count", 0) | |
| overall_engagement = metadata.get("overall_engagement", 0) | |
| # Normalize follower count and engagement score | |
| normalized_followers = follower_count / max_followers if max_followers > 0 else 0 | |
| normalized_engagement = overall_engagement / max_engagement if max_engagement > 0 else 0 | |
| # Calculate the matching score | |
| matching_score = ( | |
| W1 * vector_similarity + | |
| W2 * normalized_followers + | |
| W3 * normalized_engagement | |
| ) | |
| results.append({"metadata": metadata, "matching_score": matching_score}) | |
| # Sort by matching score in descending order | |
| sorted_results = sorted(results, key=lambda x: x["matching_score"], reverse=True) | |
| return [item["metadata"] for item in sorted_results] | |