Problem: LLMs have limited context and cannot take actions.
Solution: Add memory, knowledge and tools.
- Memory: Enables LLMs to have long-term conversations by storing chat history in a database.
- Knowledge: Provides LLMs with business context by storing information in a vector database.
- Tools: Enable LLMs to take actions like pulling data from an API, sending emails or querying a database.
Memory & knowledge make LLMs smarter while tools make them autonomous.
- Step 1: Create an
Assistant - Step 2: Add Tools (functions), Knowledge (vectordb) and Storage (database)
- Step 3: Serve using Streamlit, FastApi or Django to build your AI application
pip install -U phidataCreate a file assistant.py
fromphi.assistantimportAssistantfromphi.tools.duckduckgoimportDuckDuckGoassistant=Assistant(tools=[DuckDuckGo()], show_tool_calls=True)
assistant.print_response("Whats happening in France?", markdown=True)Install libraries
pip install openai duckduckgo-searchExport your OPENAI_API_KEY
export OPENAI_API_KEY=sk-xxxxRun the Assistant and let it search the web using DuckDuckGo
python assistant.py- Read the basics to learn more about phidata.
- Read about Assistants and how to customize them.
- Checkout the cookbook for in-depth examples and code.
Checkout the following AI Applications built using phidata:
- PDF AI that summarizes and answers questions from PDFs.
- ArXiv AI that answers questions about ArXiv papers using the ArXiv API.
- HackerNews AI summarize stories, users and shares what's new on HackerNews.
Show details
The PythonAssistant can achieve tasks by writing and running python code.
- Create a file
python_assistant.py
fromphi.assistant.pythonimportPythonAssistantfromphi.file.local.csvimportCsvFilepython_assistant=PythonAssistant(
files=[
CsvFile(
path="https://phidata-public.s3.amazonaws.com/demo_data/IMDB-Movie-Data.csv",
description="Contains information about movies from IMDB.",
)
],
pip_install=True,
show_tool_calls=True,
)
python_assistant.print_response("What is the average rating of movies?", markdown=True)- Install pandas and run the
python_assistant.py
pip install pandas
python python_assistant.pyShow details
The DuckDbAssistant can perform data analysis using SQL.
- Create a file
data_assistant.py
importjsonfromphi.assistant.duckdbimportDuckDbAssistantduckdb_assistant=DuckDbAssistant(
semantic_model=json.dumps({
"tables": [
{
"name": "movies",
"description": "Contains information about movies from IMDB.",
"path": "https://phidata-public.s3.amazonaws.com/demo_data/IMDB-Movie-Data.csv",
}
]
}),
)
duckdb_assistant.print_response("What is the average rating of movies? Show me the SQL.", markdown=True)- Install duckdb and run the
data_assistant.pyfile
pip install duckdb
python data_assistant.pyShow details
One of our favorite LLM features is generating structured data (i.e. a pydantic model) from text. Use this feature to extract features, generate movie scripts, produce fake data etc.
Let's create an Movie Assistant to write a MovieScript for us.
- Create a file
movie_assistant.py
fromtypingimportListfrompydanticimportBaseModel, Fieldfromrich.prettyimportpprintfromphi.assistantimportAssistantclassMovieScript(BaseModel):
setting: str=Field(..., description="Provide a nice setting for a blockbuster movie.")
ending: str=Field(..., description="Ending of the movie. If not available, provide a happy ending.")
genre: str=Field(..., description="Genre of the movie. If not available, select action, thriller or romantic comedy.")
name: str=Field(..., description="Give a name to this movie")
characters: List[str] =Field(..., description="Name of characters for this movie.")
storyline: str=Field(..., description="3 sentence storyline for the movie. Make it exciting!")
movie_assistant=Assistant(
description="You help write movie scripts.",
output_model=MovieScript,
)
pprint(movie_assistant.run("New York"))- Run the
movie_assistant.pyfile
python movie_assistant.py- The output is an object of the
MovieScriptclass, here's how it looks:
MovieScript(
│ setting='A bustling and vibrant New York City',
│ ending='The protagonist saves the city and reconciles with their estranged family.',
│ genre='action',
│ name='City Pulse',
│ characters=['Alex Mercer', 'Nina Castillo', 'Detective Mike Johnson'],
│ storyline='In the heart of New York City, a former cop turned vigilante, Alex Mercer, teams up with a street-smart activist, Nina Castillo, to take down a corrupt political figure who threatens to destroy the city. As they navigate through the intricate web of power and deception, they uncover shocking truths that push them to the brink of their abilities. With time running out, they must race against the clock to save New York and confront their own demons.'
)Show details
Lets create a PDF Assistant that can answer questions from a PDF. We'll use PgVector for knowledge and storage.
Knowledge Base: information that the Assistant can search to improve its responses (uses a vector db).
Storage: provides long term memory for Assistants (uses a database).
- Run PgVector
Install docker desktop and run PgVector on port 5532 using:
docker run -d \
-e POSTGRES_DB=ai \
-e POSTGRES_USER=ai \
-e POSTGRES_PASSWORD=ai \
-e PGDATA=/var/lib/postgresql/data/pgdata \
-v pgvolume:/var/lib/postgresql/data \
-p 5532:5432 \
--name pgvector \
phidata/pgvector:16- Create PDF Assistant
- Create a file
pdf_assistant.py
importtyperfromrich.promptimportPromptfromtypingimportOptional, Listfromphi.assistantimportAssistantfromphi.storage.assistant.postgresimportPgAssistantStoragefromphi.knowledge.pdfimportPDFUrlKnowledgeBasefromphi.vectordb.pgvectorimportPgVector2db_url="postgresql+psycopg://ai:ai@localhost:5532/ai"knowledge_base=PDFUrlKnowledgeBase(
urls=["https://phi-public.s3.amazonaws.com/recipes/ThaiRecipes.pdf"],
vector_db=PgVector2(collection="recipes", db_url=db_url),
)
# Comment out after first runknowledge_base.load()
storage=PgAssistantStorage(table_name="pdf_assistant", db_url=db_url)
defpdf_assistant(new: bool=False, user: str="user"):
run_id: Optional[str] =Noneifnotnew:
existing_run_ids: List[str] =storage.get_all_run_ids(user)
iflen(existing_run_ids) >0:
run_id=existing_run_ids[0]
assistant=Assistant(
run_id=run_id,
user_id=user,
knowledge_base=knowledge_base,
storage=storage,
# Show tool calls in the responseshow_tool_calls=True,
# Enable the assistant to search the knowledge basesearch_knowledge=True,
# Enable the assistant to read the chat historyread_chat_history=True,
)
ifrun_idisNone:
run_id=assistant.run_idprint(f"Started Run: {run_id}\n")
else:
print(f"Continuing Run: {run_id}\n")
# Runs the assistant as a cli appassistant.cli_app(markdown=True)
if__name__=="__main__":
typer.run(pdf_assistant)- Install libraries
pip install -U pgvector pypdf "psycopg[binary]" sqlalchemy- Run PDF Assistant
python pdf_assistant.py- Ask a question:
How do I make pad thai?
See how the Assistant searches the knowledge base and returns a response.
Message
byeto exit, start the assistant again usingpython pdf_assistant.pyand ask:
What was my last message?
See how the assistant now maintains storage across sessions.
- Run the
pdf_assistant.pyfile with the--newflag to start a new run.
python pdf_assistant.py --newCheckout the cookbook for more examples.
We've helped many companies build AI products, the general workflow is:
- Build an Assistant with proprietary data to perform tasks specific to your product.
- Connect your product to the Assistant via an API.
- Monitor and Improve your AI product.
We also provide dedicated support and development, book a call to get started.
We're an open-source project and welcome contributions, please read the contributing guide for more information.
- If you have a feature request, please open an issue or make a pull request.
- If you have ideas on how we can improve, please create a discussion.
Our roadmap is available here. If you have a feature request, please open an issue/discussion.
