| 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?") |