Added new demo
This commit is contained in:
parent
3635c93854
commit
77dcf86fb1
3 changed files with 149 additions and 0 deletions
43
autonomous_rag/README.md
Normal file
43
autonomous_rag/README.md
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
### 🤖 AutoRAG: Autonomous RAG with GPT-4o and Vector Database
|
||||
This Streamlit application implements an Autonomous Retrieval-Augmented Generation (RAG) system using OpenAI's GPT-4o model and PgVector database. It allows users to upload PDF documents, add them to a knowledge base, and query the AI assistant with context from both the knowledge base and web searches.
|
||||
Features
|
||||
|
||||
### Freatures
|
||||
- Chat interface for interacting with the AI assistant
|
||||
- PDF document upload and processing
|
||||
- Knowledge base integration using PostgreSQL and Pgvector
|
||||
- Web search capability using DuckDuckGo
|
||||
- Persistent storage of assistant data and conversations
|
||||
|
||||
### How to get Started?
|
||||
|
||||
1. Clone the GitHub repository
|
||||
```bash
|
||||
git clone https://github.com/Shubhamsaboo/awesome-llm-apps.git
|
||||
```
|
||||
|
||||
2. Install the required dependencies:
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
3. Ensure PgVector Database is running:
|
||||
The app expects PgVector to be running on [localhost:6333](http://localhost:5532/). Adjust the configuration in the code if your setup is different.
|
||||
|
||||
```bash
|
||||
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
|
||||
```
|
||||
|
||||
4. Run the Streamlit App
|
||||
```bash
|
||||
streamlit run autorag.py
|
||||
```
|
||||
97
autonomous_rag/autorag.py
Normal file
97
autonomous_rag/autorag.py
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
import streamlit as st
|
||||
import nest_asyncio
|
||||
from io import BytesIO
|
||||
from phi.assistant import Assistant
|
||||
from phi.document.reader.pdf import PDFReader
|
||||
from phi.llm.openai import OpenAIChat
|
||||
from phi.knowledge import AssistantKnowledge
|
||||
from phi.tools.duckduckgo import DuckDuckGo
|
||||
from phi.embedder.openai import OpenAIEmbedder
|
||||
from phi.vectordb.pgvector import PgVector2
|
||||
from phi.storage.assistant.postgres import PgAssistantStorage
|
||||
|
||||
# Apply nest_asyncio to allow nested event loops, required for running async functions in Streamlit
|
||||
nest_asyncio.apply()
|
||||
|
||||
# Database connection string for PostgreSQL
|
||||
DB_URL = "postgresql+psycopg://ai:ai@localhost:5532/ai"
|
||||
|
||||
# Function to set up the Assistant, utilizing caching for resource efficiency
|
||||
@st.cache_resource
|
||||
def setup_assistant(api_key: str) -> Assistant:
|
||||
llm = OpenAIChat(model="gpt-4o-mini", api_key=api_key)
|
||||
# Set up the Assistant with storage, knowledge base, and tools
|
||||
return Assistant(
|
||||
name="auto_rag_assistant", # Name of the Assistant
|
||||
llm=llm, # Language model to be used
|
||||
storage=PgAssistantStorage(table_name="auto_rag_storage", db_url=DB_URL),
|
||||
knowledge_base=AssistantKnowledge(
|
||||
vector_db=PgVector2(
|
||||
db_url=DB_URL,
|
||||
collection="auto_rag_docs",
|
||||
embedder=OpenAIEmbedder(model="text-embedding-ada-002", dimensions=1536, api_key=api_key),
|
||||
),
|
||||
num_documents=3,
|
||||
),
|
||||
tools=[DuckDuckGo()], # Additional tool for web search via DuckDuckGo
|
||||
instructions=[
|
||||
"Search your knowledge base first.",
|
||||
"If not found, search the internet.",
|
||||
"Provide clear and concise answers.",
|
||||
],
|
||||
show_tool_calls=True,
|
||||
search_knowledge=True,
|
||||
read_chat_history=True,
|
||||
markdown=True,
|
||||
debug_mode=True,
|
||||
)
|
||||
|
||||
# Function to add a PDF document to the knowledge base
|
||||
def add_document(assistant: Assistant, file: BytesIO):
|
||||
reader = PDFReader()
|
||||
docs = reader.read(file)
|
||||
if docs:
|
||||
assistant.knowledge_base.load_documents(docs, upsert=True)
|
||||
st.success("Document added to the knowledge base.")
|
||||
else:
|
||||
st.error("Failed to read the document.")
|
||||
|
||||
# Function to query the Assistant and return a response
|
||||
def query_assistant(assistant: Assistant, question: str) -> str:
|
||||
return "".join([delta for delta in assistant.run(question)])
|
||||
|
||||
# Main function to handle Streamlit app layout and interactions
|
||||
def main():
|
||||
st.set_page_config(page_title="AutoRAG", layout="wide")
|
||||
st.title("🤖 Auto-RAG: Autonomous RAG with GPT-4o")
|
||||
|
||||
api_key = st.sidebar.text_input("Enter your OpenAI API Key 🔑", type="password")
|
||||
|
||||
if not api_key:
|
||||
st.sidebar.warning("Enter your OpenAI API Key to proceed.")
|
||||
st.stop()
|
||||
|
||||
assistant = setup_assistant(api_key)
|
||||
|
||||
uploaded_file = st.sidebar.file_uploader("📄 Upload PDF", type=["pdf"])
|
||||
|
||||
if uploaded_file and st.sidebar.button("🛠️ Add to Knowledge Base"):
|
||||
add_document(assistant, BytesIO(uploaded_file.read()))
|
||||
|
||||
question = st.text_input("💬 Ask Your Question:")
|
||||
|
||||
# When the user submits a question, query the assistant for an answer
|
||||
if st.button("🔍 Get Answer"):
|
||||
# Ensure the question is not empty
|
||||
if question.strip():
|
||||
with st.spinner("🤔 Thinking..."):
|
||||
# Query the assistant and display the response
|
||||
answer = query_assistant(assistant, question)
|
||||
st.write("📝 **Response:**", answer)
|
||||
else:
|
||||
# Show an error if the question input is empty
|
||||
st.error("Please enter a question.")
|
||||
|
||||
# Entry point of the application
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
9
autonomous_rag/requirements.txt
Normal file
9
autonomous_rag/requirements.txt
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
streamlit
|
||||
phidata
|
||||
openai
|
||||
psycopg-binary
|
||||
pgvector
|
||||
requests
|
||||
sqlalchemy
|
||||
pypdf
|
||||
duckduckgo-search
|
||||
Loading…
Reference in a new issue