Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions bootstraprag/templates/llamaindex/rag_with_react/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# driver code
from react_agent_with_query_engine import ReActWithQueryEngine

react_with_engine = ReActWithQueryEngine(input_dir='<YOUR_DATA_FOLDER>')

# Start a loop to continually get input from the user
while True:
# Get a query from the user
user_query = input("Enter your query [type 'bye' to 'exit']: ")

# Check if the user wants to terminate the loop
if user_query.lower() == "bye" or user_query.lower() == "exit":
break

response = react_with_engine.query(user_query=user_query)
print(response)
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
from llama_index.core import (
SimpleDirectoryReader,
VectorStoreIndex,
StorageContext,
load_index_from_storage,
Settings
)
from llama_index.core.tools import QueryEngineTool, ToolMetadata
from llama_index.embeddings.ollama import OllamaEmbedding
from llama_index.vector_stores.qdrant import QdrantVectorStore
from llama_index.core.agent import ReActAgent
from llama_index.llms.ollama import Ollama
from llama_index.core.base.response.schema import Response, StreamingResponse, AsyncStreamingResponse, PydanticResponse
from dotenv import load_dotenv, find_dotenv
from typing import Union
import qdrant_client
import logging
import os

_ = load_dotenv(find_dotenv())

logging.basicConfig(level=int(os.environ['INFO']))
logger = logging.getLogger(__name__)


class ReActWithQueryEngine:

RESPONSE_TYPE = Union[
Response, StreamingResponse, AsyncStreamingResponse, PydanticResponse
]

def __init__(self, input_dir: str, similarity_top_k: int = 3):
self.index_loaded = False
self.similarity_top_k = similarity_top_k
self.input_dir = input_dir
self._index = None
self._engine = None
self.agent: ReActAgent = None
self.query_engine_tools = []

# use your prefered vector embeddings model
logger.info("initializing the OllamaEmbedding")
embed_model = OllamaEmbedding(model_name=os.environ['OLLMA_EMBED_MODEL'],
base_url=os.environ['OLLAMA_BASE_URL'])
# openai embeddings, embedding_model_name="text-embedding-3-large"
# embed_model = OpenAIEmbedding(embed_batch_size=10, model=embedding_model_name)

# use your prefered llm
llm = Ollama(model=os.environ['OLLMA_LLM_MODEL'], base_url=os.environ['OLLAMA_BASE_URL'], request_timeout=600)
# llm = OpenAI(model="gpt-4o")

logger.info("initializing the global settings")
Settings.embed_model = embed_model
Settings.llm = llm

# Create a local Qdrant vector store
logger.info("initializing the vector store related objects")
client = qdrant_client.QdrantClient(url=os.environ['DB_URL'], api_key=os.environ['DB_API_KEY'])
self.vector_store = QdrantVectorStore(client=client, collection_name=os.environ['COLLECTION_NAME'])
self._load_data_and_create_engine()

def _load_data_and_create_engine(self):
try:
self._index = VectorStoreIndex.from_vector_store(vector_store=self.vector_store)
self.index_loaded = True
except Exception as e:
self.index_loaded = False

if not self.index_loaded:
# load data
_docs = SimpleDirectoryReader(input_dir=self.input_dir).load_data()

# build and persist index
self._index = VectorStoreIndex.from_documents(documents=_docs)

self._engine = self._index.as_query_engine(similarity_top_k=self.similarity_top_k)
self._create_query_engine_tools()

def _create_query_engine_tools(self):
# can have more than one as per the requirement
self.query_engine_tools.append(
QueryEngineTool(
query_engine=self._engine,
metadata=ToolMetadata(
name="test_tool_engine", # change this accordingly
description=(
"Provides information about user query based on the information that you have. "
"Use a detailed plain text question as input to the tool."
),
),
)
)
self._create_react_agent()

def _create_react_agent(self):
# [Optional] Add Context
# context = """\
# You are a stock market sorcerer who is an expert on the companies Lyft and Uber.\
# You will answer questions about Uber and Lyft as in the persona of a sorcerer \
# and veteran stock market investor.
# """
self.agent = ReActAgent.from_tools(
self.query_engine_tools,
llm=Settings.llm,
verbose=True,
# context=context
)

def query(self, user_query: str) -> RESPONSE_TYPE:
return self.agent.query(str_or_query_bundle=user_query)
9 changes: 8 additions & 1 deletion bootstraprag/templates/llamaindex/rag_with_react/readme.md
Original file line number Diff line number Diff line change
@@ -1 +1,8 @@
## Under development, coming soon !
## Instructions to run the code

- Navigate to the root of the project and run the below command
- `pip install -r requirements.txt`
- In the data folder place your data preferably any ".pdf"
- change the data directory in `main.py`
#### Note: ensure your qdrant and ollama (if LLM models are pointing to local) are running
- run `python main.py`
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
qdrant-client==1.10.1
python-dotenv==1.0.1
llama-index==0.10.58
llama-index-llms-openai==0.1.27
llama-index-llms-ollama==0.2.0
llama-index-embeddings-openai==0.1.11
llama-index-embeddings-ollama==0.1.2
llama-index-vector-stores-qdrant==0.2.14
qdrant-client==1.10.1