from .embeddings import get_embeddings, get_query_embedding, rerank_results from .vector_store import VectorDB import groq from .config import Config # Initialize Groq client groq_client = groq.Groq(api_key=Config.GROQ_API_KEY) # Vector database instance vector_db = VectorDB() def process_articles_for_vector_db(articles): """Process articles and add to vector database""" if not articles: return # Extract text content for embedding texts = [] for article in articles: text = f"{article['title']} {article['content']}" texts.append(text) # Generate embeddings embeddings = get_embeddings(texts) if embeddings: vector_db.add_vectors(embeddings, articles) def recommend_similar(article_id, top_n=3): """Recommend similar articles based on article ID""" article = vector_db.get_article_by_id(article_id) if not article: return [] # Get embedding for the article article_text = f"{article['title']} {article['content']}" query_embedding = get_query_embedding(article_text) if not query_embedding: return [] # Search for similar articles similar_articles = vector_db.search(query_embedding, k=top_n + 1) # Filter out the original article recommendations = [art for art in similar_articles if art.get('slug') != article_id] return recommendations[:top_n] def analyze_article_with_groq(article_text): """Analyze article using Groq LLM""" try: response = groq_client.chat.completions.create( model=Config.GROQ_MODEL, messages=[ { "role": "system", "content": "You are an AI news analyst. Provide insights, key points, and sentiment analysis for the given article." }, { "role": "user", "content": f"Analyze this news article: {article_text}" } ], max_tokens=500, temperature=0.3 ) return response.choices[0].message.content except Exception as e: print(f"Error analyzing article with Groq: {str(e)}") return "Analysis unavailable" def get_personalized_recommendations(user_interests, top_n=5): """Get personalized recommendations based on user interests""" query_embedding = get_query_embedding(user_interests) if not query_embedding: return [] recommendations = vector_db.search(query_embedding, k=top_n) # Re-rank results for better relevance if recommendations: documents = [f"{art['title']} {art['content']}" for art in recommendations] reranked = rerank_results(user_interests, documents) if reranked: # Reorder recommendations based on reranking reordered = [] for result in reranked: if result.index < len(recommendations): reordered.append(recommendations[result.index]) return reordered return recommendations