Spaces:
Build error
Build error
| """ | |
| Module: answer_augmentation | |
| Description: Uses an LLM to enhance real estate listing descriptions for better personalization. | |
| """ | |
| import json | |
| import os | |
| from langchain_openai import ChatOpenAI | |
| from langchain_core.prompts import PromptTemplate | |
| class LlmAugmentation: | |
| """Handles LLM-based augmentation of real estate listings.""" | |
| def __init__(self): | |
| """ | |
| Initializes the LLM model using LangChain. | |
| """ | |
| # Load API credentials securely (avoid hardcoding API keys) | |
| os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY") | |
| # os.environ["OPENAI_API_BASE"] = "https://openai.vocareum.com/v1" | |
| if not os.environ["OPENAI_API_KEY"]: | |
| raise ValueError("❌ OpenAI API key is missing. Set VOCAREUM_OPENAI_API_KEY in environment variables.") | |
| self.llm = ChatOpenAI( | |
| model_name="gpt-3.5-turbo", | |
| temperature=0.9 | |
| ) | |
| # Define the LLM prompt template | |
| self.llm_prompt = PromptTemplate.from_template( | |
| """ | |
| Your role is to enhance real estate listing descriptions. | |
| You will receive {n_answers} real estate listings retrieved using similarity search. | |
| Each listing matches the buyer’s preferences in terms of location, property features, amenities, and neighborhood. | |
| Your task: | |
| - **Enhance the property descriptions**: Subtly emphasize features of the property to make it appealing to possible buyers. | |
| - **Maintain factual integrity**: Do not add fictional information. Keep the facts unchanged while improving appeal. | |
| - **Do NOT** use bullet points or numered lists. Separate the listings by a new blank line. | |
| - **Recommended lenght**: Use between 80 to 120 words. | |
| Here are the listings: | |
| {listings} | |
| Now, rewrite the descriptions to highlight the aspects most relevant to the buyer. | |
| """ | |
| ) | |
| def generate_augmented_descriptions(self, listings): | |
| """ | |
| Uses the LLM to augment property descriptions for better personalization. | |
| Args: | |
| listings (list): A list of retrieved real estate listings (dictionaries). | |
| Returns: | |
| list: A list of augmented listing descriptions. | |
| """ | |
| try: | |
| if not listings: | |
| raise ValueError("Listings data is empty. Cannot generate augmented descriptions.") | |
| # Format listings into readable JSON | |
| listings_text = json.dumps(listings, indent=2) | |
| # Generate augmented descriptions using LangChain's LLM | |
| response = self.llm.invoke( | |
| self.llm_prompt.format(n_answers=len(listings), listings=listings_text) | |
| ) | |
| # Ensure response is valid | |
| if not response or not hasattr(response, "content"): | |
| raise ValueError("Received invalid response from LLM.") | |
| return response.content.strip() | |
| except Exception as e: | |
| print(f"❌ Error generating augmented descriptions: {e}") | |
| return [] | |