Spaces:
Sleeping
Sleeping
from langchain.docstore.document import Document | |
from langchain.text_splitter import RecursiveCharacterTextSplitter | |
from smolagents import Tool | |
from langchain_community.retrievers import BM25Retriever | |
from smolagents import CodeAgent, HfApiModel | |
class PartyPlanningRetrieverTool(Tool): | |
name = "party_planning_retriever" | |
description = "Uses semantic search to retrieve relevant party planning ideas for Alfred’s superhero-themed party at Wayne Manor." | |
inputs = { | |
"query": { | |
"type": "string", | |
"description": "The query to perform. This should be a query related to party planning or superhero themes.", | |
} | |
} | |
output_type = "string" | |
def __init__(self, docs, **kwargs): | |
super().__init__(**kwargs) | |
self.retriever = BM25Retriever.from_documents( | |
docs, k=5 # Retrieve the top 5 documents | |
) | |
def forward(self, query: str) -> str: | |
assert isinstance(query, str), "Your search query must be a string" | |
docs = self.retriever.invoke( | |
query, | |
) | |
return "\nRetrieved ideas:\n" + "".join( | |
[ | |
f"\n\n===== Idea {str(i)} =====\n" + doc.page_content | |
for i, doc in enumerate(docs) | |
] | |
) | |
# Simulate a knowledge base about party planning | |
party_ideas = [ | |
{"text": "A superhero-themed masquerade ball with luxury decor, including gold accents and velvet curtains.", "source": "Party Ideas 1"}, | |
{"text": "Hire a professional DJ who can play themed music for superheroes like Batman and Wonder Woman.", "source": "Entertainment Ideas"}, | |
{"text": "For catering, serve dishes named after superheroes, like 'The Hulk's Green Smoothie' and 'Iron Man's Power Steak.'", "source": "Catering Ideas"}, | |
{"text": "Decorate with iconic superhero logos and projections of Gotham and other superhero cities around the venue.", "source": "Decoration Ideas"}, | |
{"text": "Interactive experiences with VR where guests can engage in superhero simulations or compete in themed games.", "source": "Entertainment Ideas"} | |
] | |
source_docs = [ | |
Document(page_content=doc["text"], metadata={"source": doc["source"]}) | |
for doc in party_ideas | |
] | |
# Split the documents into smaller chunks for more efficient search | |
text_splitter = RecursiveCharacterTextSplitter( | |
chunk_size=500, | |
chunk_overlap=50, | |
add_start_index=True, | |
strip_whitespace=True, | |
separators=["\n\n", "\n", ".", " ", ""], | |
) | |
docs_processed = text_splitter.split_documents(source_docs) | |
# Create the retriever tool | |
party_planning_retriever = PartyPlanningRetrieverTool(docs_processed) | |
# Initialize the agent | |
agent = CodeAgent(tools=[party_planning_retriever], model=HfApiModel()) | |
# Example usage | |
response = agent.run( | |
"Find ideas for a luxury superhero-themed party, including entertainment, catering, and decoration options." | |
) | |
print(response) | |