| from llama_index.core import VectorStoreIndex | |
| from llama_index.core import SimpleDirectoryReader | |
| from llama_index.core import SummaryIndex | |
| from llama_index.core.tools import QueryEngineTool, ToolMetadata | |
| from llama_index.core.agent import ReActAgent | |
| from llama_index.llms.ollama import Ollama | |
| from langchain_community.embeddings.ollama import OllamaEmbeddings | |
| from llama_index.core import load_index_from_storage, StorageContext | |
| from llama_index.core.node_parser import SentenceSplitter | |
| import os | |
| from llama_index.core import Settings | |
| Settings.llm = Ollama(model="llama3") | |
| Settings.embed_model = OllamaEmbeddings(model="llama3") | |
| docs = ["./alice.pdf", "./ReAct.pdf"] | |
| topic_docs = {} | |
| for doc in docs: | |
| doc_name = doc.split(".")[1].split("/")[-1] | |
| topic_docs[doc_name] = SimpleDirectoryReader(input_files=[doc]).load_data() | |
| node_paser = SentenceSplitter() | |
| agents = {} | |
| query_engines = {} | |
| all_nodes = [] | |
| for id, document in topic_docs.items(): | |
| nodes = node_paser.get_nodes_from_documents(document) | |
| all_nodes.extend(nodes) | |
| if not os.path.exists(f"./{id}"): | |
| vector_index = VectorStoreIndex(nodes=nodes, show_progress=True) | |
| vector_index.storage_context.persist(persist_dir=f"./{id}") | |
| else: | |
| vector_index = load_index_from_storage(StorageContext.from_defaults(persist_dir=f"./{id}")) | |
| summary_index = SummaryIndex(nodes=nodes, show_progress=True) | |
| summary_index.storage_context.persist(persist_dir=f"./summary-{id}") | |
| vector_query_engine = vector_index.as_query_engine() | |
| summary_query_engine = summary_index.as_query_engine() | |
| query_engine_tools = [ | |
| QueryEngineTool( | |
| query_engine=vector_query_engine, | |
| metadata=ToolMetadata( | |
| name="vector_tool", | |
| description=f"Useful for specific aspects of {id}" | |
| ), | |
| ), | |
| QueryEngineTool( | |
| query_engine=summary_query_engine, | |
| metadata=ToolMetadata( | |
| name="summary_tool", | |
| description=f"Useful for any request that require a holistic summary about {id}" | |
| ) | |
| ) | |
| ] | |
| agent = ReActAgent.from_tools( | |
| query_engine_tools, | |
| llm=Settings.llm, | |
| verbose=True, | |
| ) | |
| agents[id] = agent | |
| query_engines[id] = vector_index.as_query_engine(similarity_top_k=2) | |
| all_tools = [] | |
| for key, docu in topic_docs.items(): | |
| print(f"Processing {key}") | |
| print("-------------------------------------") | |
| summary = ( | |
| f"This content contains info about {key}" | |
| f"Use this tool if want to answer any question about {key}." | |
| ) | |
| doc_tool = QueryEngineTool( | |
| query_engine=agents[key], | |
| metadata=ToolMetadata( | |
| name=f"tool_{key}", | |
| description=summary | |
| ), | |
| ) | |
| all_tools.append(doc_tool) | |
| from llama_index.core.objects import ObjectIndex | |
| obj_index = ObjectIndex.from_objects( | |
| all_tools, | |
| index_cls=VectorStoreIndex, | |
| ) | |
| top_agent = ReActAgent.from_tools( | |
| tool_retriever=obj_index.as_retriever(similarity_top_k=1), | |
| verbose=True | |
| ) | |
| base_index = VectorStoreIndex(all_nodes) | |
| base_query_engine = base_index.as_query_engine(similarity_top_k=4) | |
| response = top_agent.query("Why did Alice run after the rabbit?") |