From 01f74da01efb87a0a3692ffa0144f67e50d51a98 Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Thu, 29 Feb 2024 18:11:50 -0800 Subject: [PATCH 01/30] Sample ROCm docker-compose Un-tested until I can source an AMD gpu --- docker-compose.yml-rocm | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 docker-compose.yml-rocm diff --git a/docker-compose.yml-rocm b/docker-compose.yml-rocm new file mode 100644 index 0000000..299b4d8 --- /dev/null +++ b/docker-compose.yml-rocm @@ -0,0 +1,12 @@ +version: '3' +services: + local-rag: + container_name: local-rag + image: jonfairbanks/local-rag + restart: unless-stopped + environment: + - TZ=America/Los_Angeles + ports: + - '8501:8501/tcp' + devices: + - /dev/dri:/dev/dri From b58a6f303ea59543152ad259ed2db5ce9bd5712e Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Thu, 29 Feb 2024 18:13:18 -0800 Subject: [PATCH 02/30] Setup HuggingFaceEmbedding() --- utils/llama_index.py | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/utils/llama_index.py b/utils/llama_index.py index b37cf29..d1b034e 100644 --- a/utils/llama_index.py +++ b/utils/llama_index.py @@ -4,6 +4,10 @@ import utils.logs as logs +from llama_index.embeddings.huggingface import HuggingFaceEmbedding +from llama_index.embeddings.text_embeddings_inference import ( + TextEmbeddingsInference, +) # This is not used but required by llama-index and must be imported FIRST os.environ["OPENAI_API_KEY"] = "sk-abc123" @@ -15,20 +19,44 @@ set_global_service_context, ) + +################################### +# +# Setup Embedding Model +# +################################### + +@st.cache_resource(show_spinner=False) +def setup_embedding_model( + model: str, + timeout: int = 60, + embed_batch_size: int = 10 +): + embed_model = HuggingFaceEmbedding( + model_name=model, + timeout=timeout, + embed_batch_size=embed_batch_size, + ) + return embed_model + + ################################### # # Create Service Context # ################################### +# TODO: Migrate to LlamaIndex.Settings: https://docs.llamaindex.ai/en/stable/module_guides/supporting_modules/service_context_migration.html @st.cache_resource(show_spinner=False) def create_service_context( _llm, # TODO: Determine type system_prompt: str = None, # TODO: What are the implications of no system prompt being passed? embed_model: str = "BAAI/bge-large-en-v1.5", + embed_timeout: int = 60, + embed_batch_size: int = 10, chunk_size: int = 1024, # Llama-Index default is 1024 - chunk_overlap: int = 20, # Llama-Index default is 1024 + chunk_overlap: int = 200, # Llama-Index default is 200 ): """ Create a service context with the specified language model and embedding model. @@ -45,6 +73,7 @@ def create_service_context( """ formatted_embed_model = f"local:{embed_model}" try: + embedding_model = setup_embedding_model(embed_model, embed_timeout, embed_batch_size) service_context = ServiceContext.from_defaults( llm=_llm, system_prompt=system_prompt, @@ -54,8 +83,10 @@ def create_service_context( ) logs.log.info(f"Service Context created successfully") st.session_state["service_context"] = service_context + # Note: this may be redundant since service_context is returned set_global_service_context(service_context) + return service_context except Exception as e: logs.log.error(f"Failed to create service_context: {e}") From 546550c934bcc58cdffe0b41b9678496a102ced5 Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Fri, 1 Mar 2024 14:12:49 -0800 Subject: [PATCH 03/30] Stop processing during error cases --- components/tabs/github_repo.py | 10 ++++++++++ components/tabs/local_files.py | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/components/tabs/github_repo.py b/components/tabs/github_repo.py index a3b9d0c..f54cf04 100644 --- a/components/tabs/github_repo.py +++ b/components/tabs/github_repo.py @@ -48,6 +48,8 @@ def github_repo(): except Exception as err: logs.log.error(f"Failed to setup LLM: {err}") error = err + st.exception(error) + st.stop() #################################### # Determine embedding model to use # @@ -80,6 +82,8 @@ def github_repo(): except Exception as err: logs.log.error(f"Setting up Service Context failed: {err}") error = err + st.exception(error) + st.stop() ####################################### # Load files from the data/ directory # @@ -93,6 +97,8 @@ def github_repo(): except Exception as err: logs.log.error(f"Document Load Error: {err}") error = err + st.exception(error) + st.stop() ########################################### # Create an index from ingested documents # @@ -107,6 +113,8 @@ def github_repo(): except Exception as err: logs.log.error(f"Index Creation Error: {err}") error = err + st.exception(error) + st.stop() ##################### # Remove data files # @@ -119,6 +127,8 @@ def github_repo(): except Exception as err: logs.log.error(f"Failed to delete data files: {err}") error = err + st.exception(error) + st.stop() ##################### # Show Final Status # diff --git a/components/tabs/local_files.py b/components/tabs/local_files.py index 4f33c12..403701c 100644 --- a/components/tabs/local_files.py +++ b/components/tabs/local_files.py @@ -115,6 +115,8 @@ def local_files(): except Exception as err: logs.log.error(f"Setting up Service Context failed: {err}") error = err + st.exception(error) + st.stop() ####################################### # Load files from the data/ directory # @@ -127,6 +129,8 @@ def local_files(): except Exception as err: logs.log.error(f"Document Load Error: {err}") error = err + st.exception(error) + st.stop() ########################################### # Create an index from ingested documents # @@ -140,6 +144,8 @@ def local_files(): except Exception as err: logs.log.error(f"Index Creation Error: {err}") error = err + st.exception(error) + st.stop() ##################### # Remove data files # @@ -152,6 +158,8 @@ def local_files(): except Exception as err: logs.log.error(f"Failed to delete data files: {err}") error = err + st.exception(error) + st.stop() ##################### # Show Final Status # From b95d4fbf5f0c1678dafc528c21a51559dff4e6c4 Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Fri, 1 Mar 2024 22:36:10 -0800 Subject: [PATCH 04/30] Select llama2:7b as default on load --- components/page_state.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/components/page_state.py b/components/page_state.py index 61ca562..e6211b9 100644 --- a/components/page_state.py +++ b/components/page_state.py @@ -30,7 +30,10 @@ def set_initial_state(): if "selected_model" not in st.session_state: try: - st.session_state["selected_model"] = st.session_state["ollama_models"][0] + if("llama2:7b" in st.session_state["ollama_models"]): + st.session_state["selected_model"] = "llama2:7b" # Default to llama2:7b on initial load + else: + st.session_state["selected_model"] = st.session_state["ollama_models"][0] except Exception: st.session_state["selected_model"] = None pass From a8b8bbc05bc39e27ad805b950b688ba927b651ab Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Fri, 1 Mar 2024 22:37:20 -0800 Subject: [PATCH 05/30] Update chat mode options --- components/tabs/settings.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/components/tabs/settings.py b/components/tabs/settings.py index d30a653..da80d58 100644 --- a/components/tabs/settings.py +++ b/components/tabs/settings.py @@ -45,13 +45,14 @@ def settings(): st.selectbox( "Chat Mode", ( - "best", - "condense_question", - "context", - "condense_plus_context", - "react", + "compact", + "refine", + "tree_summarize", + "simple_summarize", + "accumulate", + "compact_accumulate", ), - help="Sets the [Llama-Index Chat Mode](https://docs.llamaindex.ai/en/stable/module_guides/deploying/chat_engines/usage_pattern.html#available-chat-modes) used when creating the Query Engine.", + help="Sets the [Llama Index Query Engine chat mode](https://github.com/run-llama/llama_index/blob/main/docs/module_guides/deploying/query_engine/response_modes.md) used when creating the Query Engine. Default: `compact`.", key="chat_mode", disabled=True, ) From a1f42f02004e6c54bfaf69850e74ece29ab54d14 Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Fri, 1 Mar 2024 22:37:43 -0800 Subject: [PATCH 06/30] Remove un-necessary caching --- utils/ollama.py | 1 - 1 file changed, 1 deletion(-) diff --git a/utils/ollama.py b/utils/ollama.py index 87ba156..2d6eb11 100644 --- a/utils/ollama.py +++ b/utils/ollama.py @@ -39,7 +39,6 @@ def create_client(host: str): ################################### -@st.cache_data(show_spinner=False) def get_models(): """ Retrieves a list of available language models from the Ollama server. From 7c0680072dbe4d0c90666fddea643655c1f020dd Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Fri, 1 Mar 2024 22:39:30 -0800 Subject: [PATCH 07/30] Ignore .DS_Store --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e5bf6d6..7be08cd 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ data/* *.log .cache/* -.nv/* \ No newline at end of file +.nv/* +.DS_Store From 517dde5de14fe231e3c6d5871c28de41a0e0f29e Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Fri, 1 Mar 2024 22:43:35 -0800 Subject: [PATCH 08/30] Remove outdated docstrings --- Pipfile.lock | 211 +++++++++++++++++++++++++++---------------- utils/llama_index.py | 50 +--------- 2 files changed, 138 insertions(+), 123 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index be327ba..e2909ce 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "6e793ac196dc4abbd5bb71d830765b7d4a31389269407ba781a6f492ac661303" + "sha256": "aebb2633904386a58fe3905ffd1a4f765846c5b46756244d9866bd54e4a0ecf6" }, "pipfile-spec": 6, "requires": { @@ -227,11 +227,11 @@ }, "build": { "hashes": [ - "sha256:538aab1b64f9828977f84bc63ae570b060a8ed1be419e7870b8b4fc5e6ea553b", - "sha256:589bf99a67df7c9cf07ec0ac0e5e2ea5d4b37ac63301c4986d1acb126aa83f8f" + "sha256:8ed0851ee76e6e38adce47e4bee3b51c771d86c64cf578d0c2245567ee200e73", + "sha256:8eea65bb45b1aac2e734ba2cc8dad3a6d97d97901a395bd0ed3e7b46953d2a31" ], "markers": "python_version >= '3.7'", - "version": "==1.0.3" + "version": "==1.1.1" }, "cachetools": { "hashes": [ @@ -793,11 +793,11 @@ "inference" ], "hashes": [ - "sha256:16955c2b60bcff32a0778f84b9e9ae8f61d7f003da6aa1fbb7bc897a0c37b28c", - "sha256:839f2fc69fc51797b76dcffa7edbf7fb1150176f74cb1dc2d87ca00e5e0b5611" + "sha256:26a15b604e4fc7bad37c467b76456543ec849386cbca9cd7e1e135f53e500423", + "sha256:b183144336fdf2810a8c109822e0bb6ef1fd61c65da6fb60e8c3f658b7144016" ], "markers": "python_full_version >= '3.8.0'", - "version": "==0.21.2" + "version": "==0.21.3" }, "humanfriendly": { "hashes": [ @@ -897,36 +897,36 @@ }, "llama-index": { "hashes": [ - "sha256:31883c563b1a8d296910c2d5fa054ebc60539064d5dcac25114e4bb9749883e5", - "sha256:bfc25753ea0c3c59918b4f5925cb470a478b3b0da083a45c48f1992ab16a695f" + "sha256:b2572d407c9b1070dca2ee9a3f518ab40c7aca9e9212c008cc024c9e0bb2f60d", + "sha256:db1ea0da807b20b819849b1bff2aaf5d49073e1ea36801ff40242a62fb4676eb" ], "index": "pypi", - "markers": "python_version < '4.0' and python_full_version >= '3.8.1'", - "version": "==0.10.14" + "markers": "python_full_version >= '3.8.1' and python_version < '4.0'", + "version": "==0.10.15" }, "llama-index-agent-openai": { "hashes": [ "sha256:1ab06fe853d9d391ba724dcb0009b249ae88ca4de4b5842226373b0c55ee435a", "sha256:42099326d526af140493c5f744ef70bef0aed8a941b6c9aea4b3eff9c63f0ba6" ], - "markers": "python_version < '4.0' and python_full_version >= '3.8.1'", + "markers": "python_full_version >= '3.8.1' and python_version < '4.0'", "version": "==0.1.5" }, "llama-index-cli": { "hashes": [ - "sha256:403c1b0be437d5fa3ca677dbc61dcebbf095ad4daf565fcc0f9db28e94be5df1", - "sha256:bf94e6c61ab75240dbe59b867b9b3e4788b0f66b2cb1c2efb18320735a0bf612" + "sha256:48a81fc33d4005dbe91b77ebe840ac69e0102e7e2a59770308f94fae1b792544", + "sha256:55a77e3c370eb760c42cb74a0df6f650e41ec17928b72b07ff8b927cb94b15b4" ], - "markers": "python_version < '4.0' and python_full_version >= '3.8.1'", - "version": "==0.1.6" + "markers": "python_full_version >= '3.8.1' and python_version < '4.0'", + "version": "==0.1.7" }, "llama-index-core": { "hashes": [ - "sha256:52e99ae101a32b2894477e49a0c4bc93de721a71d598fea61e4d9e8e68a35633", - "sha256:db6c66948c51751545a73bb3acecfe401649e05296d8865d71d22bcb5a1e55e7" + "sha256:37618f227583e643aee2efd3c7e2914541184136410af2fcf618b855f75b432c", + "sha256:a1482c9af67b5b254215267c02fce08ac6bb52a19a0859797552950b023fb98d" ], - "markers": "python_version < '4.0' and python_full_version >= '3.8.1'", - "version": "==0.10.14" + "markers": "python_full_version >= '3.8.1' and python_version < '4.0'", + "version": "==0.10.15" }, "llama-index-embeddings-huggingface": { "hashes": [ @@ -934,7 +934,7 @@ "sha256:9c80539f3cbbd7191c219e2cda154b1a7151aa912196bc537c16f40e18e4187c" ], "index": "pypi", - "markers": "python_version < '4.0' and python_full_version >= '3.8.1'", + "markers": "python_full_version >= '3.8.1' and python_version < '4.0'", "version": "==0.1.4" }, "llama-index-embeddings-openai": { @@ -942,7 +942,7 @@ "sha256:f12f0ef6f92211efe1a022a97bb68fc8731c93bd20df3b0567dba69c610033db", "sha256:f8b2dded0718e9f57c08ce352d186941e6acf7de414c64219210b66f7a6d6d2d" ], - "markers": "python_version < '4.0' and python_full_version >= '3.8.1'", + "markers": "python_full_version >= '3.8.1' and python_version < '4.0'", "version": "==0.1.6" }, "llama-index-indices-managed-llama-cloud": { @@ -950,7 +950,7 @@ "sha256:5db725cb7db675019dc65e38153890802e2ae89838c127c19d3184efc46ea28b", "sha256:9fe2823855f00bf8b091be008ce953b9a9c5d4b2d976b54ab0d37877c83457f5" ], - "markers": "python_version < '4.0' and python_full_version >= '3.8.1'", + "markers": "python_full_version >= '3.8.1' and python_version < '4.0'", "version": "==0.1.3" }, "llama-index-legacy": { @@ -958,7 +958,7 @@ "sha256:714ada95beac179b4acefa4d2deff74bb7b2f22b0f699ac247d4cb67738d16d4", "sha256:82ddc4691edbf49533d65582c249ba22c03fe96fbd3e92f7758dccef28e43834" ], - "markers": "python_version < '4.0' and python_full_version >= '3.8.1'", + "markers": "python_full_version >= '3.8.1' and python_version < '4.0'", "version": "==0.9.48" }, "llama-index-llms-ollama": { @@ -967,23 +967,23 @@ "sha256:967d816e13a6e064f8454b2faf7b70c749a52230258cac67b6025e20db6e988c" ], "index": "pypi", - "markers": "python_version < '4.0' and python_full_version >= '3.8.1'", + "markers": "python_full_version >= '3.8.1' and python_version < '4.0'", "version": "==0.1.2" }, "llama-index-llms-openai": { "hashes": [ - "sha256:15530dfa3893b15c5576ebc71e01b77acbf47abd689219436fdf7b6ca567a9fd", - "sha256:4260ad31c3444e97ec8a8d061cb6dbf1074262b82341a2b69d2b27e8a23efe62" + "sha256:162a7f1064b389d0db6f731bcedaca80e87ceca8aa919d7425ca32107e756243", + "sha256:5ddb405c0a5847a7c2098a70ced270555f036c2793412a8992456bd32f83ff0f" ], - "markers": "python_version < '4.0' and python_full_version >= '3.8.1'", - "version": "==0.1.6" + "markers": "python_full_version >= '3.8.1' and python_version < '4.0'", + "version": "==0.1.7" }, "llama-index-multi-modal-llms-openai": { "hashes": [ "sha256:03b887d110551d5d5b99b9fd110824e6311f2e31f4d5e67dafd2ee66da32818d", "sha256:6a5d6584c33a9d1b06cf5c874c63af2603fc93b660bde481a8c547e876c6e2c3" ], - "markers": "python_version < '4.0' and python_full_version >= '3.8.1'", + "markers": "python_full_version >= '3.8.1' and python_version < '4.0'", "version": "==0.1.4" }, "llama-index-program-openai": { @@ -991,7 +991,7 @@ "sha256:573e99a2dd16ad3caf382c8ab28d1ac10eb2571bc9481d84a6d89806ad6aa5d4", "sha256:cfa8f00f3743d2fc70043e80f7c3925d23b1413a0cc7a72863ad60497a18307d" ], - "markers": "python_version < '4.0' and python_full_version >= '3.8.1'", + "markers": "python_full_version >= '3.8.1' and python_version < '4.0'", "version": "==0.1.4" }, "llama-index-question-gen-openai": { @@ -999,7 +999,7 @@ "sha256:1f83b49e8b2e665030d1ec8c54687d6985d9fa8426147b64e46628a9e489b302", "sha256:4486198117a45457d2e036ae60b93af58052893cc7d78fa9b6f47dd47b81e2e1" ], - "markers": "python_version < '4.0' and python_full_version >= '3.8.1'", + "markers": "python_full_version >= '3.8.1' and python_version < '4.0'", "version": "==0.1.3" }, "llama-index-readers-file": { @@ -1007,7 +1007,7 @@ "sha256:d9fc0ca84926d04bd757c57fe87841cd9dbc2606aab5f2ce927deec14aaa1a74", "sha256:f583bd90353a0c0985213af02c97aa2f2f22e702d4311fe719de91382c9ad8dd" ], - "markers": "python_version < '4.0' and python_full_version >= '3.8.1'", + "markers": "python_full_version >= '3.8.1' and python_version < '4.0'", "version": "==0.1.6" }, "llama-index-readers-llama-parse": { @@ -1015,7 +1015,7 @@ "sha256:e0ee0c393e10fc80eac644788338bbd2032050c8b8a474f3d0b5ebd08e9867fe", "sha256:f52a06a2765a2ffe6c138cf1703ab1de6249ff069ba62d80b9147e849bbcbc27" ], - "markers": "python_version < '4.0' and python_full_version >= '3.8.1'", + "markers": "python_full_version >= '3.8.1' and python_version < '4.0'", "version": "==0.1.3" }, "llama-index-vector-stores-chroma": { @@ -1023,7 +1023,7 @@ "sha256:40692f8bcc4b44d4a28b6ed578bad71fbc33ce5d95220c29b00e5ba7ab00d8a0", "sha256:5e6ed1bc0b0e4c54a030b7ec95cc19015af4a8a22d3c37deb66f76b017d54b14" ], - "markers": "python_version < '4.0' and python_full_version >= '3.8.1'", + "markers": "python_full_version >= '3.8.1' and python_version < '4.0'", "version": "==0.1.5" }, "llama-parse": { @@ -1031,7 +1031,7 @@ "sha256:736a80e4fc5970b9cbef1048171908021ebd26be43f07b806889f0d1bb3875fe", "sha256:8e6e7a0986ad30cb82c5c67a29b7e2c3892620dd2a422afc909654a9d0f1c82c" ], - "markers": "python_version < '4.0' and python_full_version >= '3.8.1'", + "markers": "python_full_version >= '3.8.1' and python_version < '4.0'", "version": "==0.3.5" }, "llamaindex-py-client": { @@ -1042,6 +1042,33 @@ "markers": "python_version >= '3.8' and python_version < '4.0'", "version": "==0.1.13" }, + "llvmlite": { + "hashes": [ + "sha256:05cb7e9b6ce69165ce4d1b994fbdedca0c62492e537b0cc86141b6e2c78d5888", + "sha256:08fa9ab02b0d0179c688a4216b8939138266519aaa0aa94f1195a8542faedb56", + "sha256:3366938e1bf63d26c34fbfb4c8e8d2ded57d11e0567d5bb243d89aab1eb56098", + "sha256:43d65cc4e206c2e902c1004dd5418417c4efa6c1d04df05c6c5675a27e8ca90e", + "sha256:70f44ccc3c6220bd23e0ba698a63ec2a7d3205da0d848804807f37fc243e3f77", + "sha256:763f8d8717a9073b9e0246998de89929071d15b47f254c10eef2310b9aac033d", + "sha256:7e0c4c11c8c2aa9b0701f91b799cb9134a6a6de51444eff5a9087fc7c1384275", + "sha256:81e674c2fe85576e6c4474e8c7e7aba7901ac0196e864fe7985492b737dbab65", + "sha256:8d90edf400b4ceb3a0e776b6c6e4656d05c7187c439587e06f86afceb66d2be5", + "sha256:a78ab89f1924fc11482209f6799a7a3fc74ddc80425a7a3e0e8174af0e9e2301", + "sha256:ae511caed28beaf1252dbaf5f40e663f533b79ceb408c874c01754cafabb9cbf", + "sha256:b2fce7d355068494d1e42202c7aff25d50c462584233013eb4470c33b995e3ee", + "sha256:bb3975787f13eb97629052edb5017f6c170eebc1c14a0433e8089e5db43bcce6", + "sha256:bdd3888544538a94d7ec99e7c62a0cdd8833609c85f0c23fcb6c5c591aec60ad", + "sha256:c35da49666a21185d21b551fc3caf46a935d54d66969d32d72af109b5e7d2b6f", + "sha256:c5bece0cdf77f22379f19b1959ccd7aee518afa4afbd3656c6365865f84903f9", + "sha256:d0936c2067a67fb8816c908d5457d63eba3e2b17e515c5fe00e5ee2bace06040", + "sha256:d47494552559e00d81bfb836cf1c4d5a5062e54102cc5767d5aa1e77ccd2505c", + "sha256:d7599b65c7af7abbc978dbf345712c60fd596aa5670496561cc10e8a71cebfb2", + "sha256:ebe66a86dc44634b59a3bc860c7b20d26d9aaffcd30364ebe8ba79161a9121f4", + "sha256:f92b09243c0cc3f457da8b983f67bd8e1295d0f5b3746c7a1861d7a99403854a" + ], + "markers": "python_version >= '3.9'", + "version": "==0.42.0" + }, "markdown-it-py": { "hashes": [ "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", @@ -1392,6 +1419,34 @@ "markers": "python_version >= '3.7'", "version": "==3.8.1" }, + "numba": { + "hashes": [ + "sha256:0307ee91b24500bb7e64d8a109848baf3a3905df48ce142b8ac60aaa406a0400", + "sha256:1192d6b2906bf3ff72b1d97458724d98860ab86a91abdd4cfd9328432b661e31", + "sha256:12b9b064a3e4ad00e2371fc5212ef0396c80f41caec9b5ec391c8b04b6eaf2a8", + "sha256:32bd0a41525ec0b1b853da244808f4e5333867df3c43c30c33f89cf20b9c2b63", + "sha256:4981659220b61a03c1e557654027d271f56f3087448967a55c79a0e5f926de62", + "sha256:5516a469514bfae52a9d7989db4940653a5cbfac106f44cb9c50133b7ad6224b", + "sha256:6feb1504bb432280f900deaf4b1dadcee68812209500ed3f81c375cbceab24dc", + "sha256:70d26ba589f764be45ea8c272caa467dbe882b9676f6749fe6f42678091f5f21", + "sha256:753dc601a159861808cc3207bad5c17724d3b69552fd22768fddbf302a817a4c", + "sha256:8cbef55b73741b5eea2dbaf1b0590b14977ca95a13a07d200b794f8f6833a01c", + "sha256:8d061d800473fb8fef76a455221f4ad649a53f5e0f96e3f6c8b8553ee6fa98fa", + "sha256:90efb436d3413809fcd15298c6d395cb7d98184350472588356ccf19db9e37c8", + "sha256:944faad25ee23ea9dda582bfb0189fb9f4fc232359a80ab2a028b94c14ce2b1d", + "sha256:9e20736bf62e61f8353fb71b0d3a1efba636c7a303d511600fc57648b55823ed", + "sha256:c086a434e7d3891ce5dfd3d1e7ee8102ac1e733962098578b507864120559ceb", + "sha256:cd3dac45e25d927dcb65d44fb3a973994f5add2b15add13337844afe669dd1ba", + "sha256:ce62bc0e6dd5264e7ff7f34f41786889fa81a6b860662f824aa7532537a7bee0", + "sha256:d540f69a8245fb714419c2209e9af6104e568eb97623adc8943642e61f5d6d8e", + "sha256:e125f7d69968118c28ec0eed9fbedd75440e64214b8d2eac033c22c04db48492", + "sha256:e86e6786aec31d2002122199486e10bbc0dc40f78d76364cded375912b13614c", + "sha256:fe4d7562d1eed754a7511ed7ba962067f198f86909741c5c6e18c4f1819b1f47" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==0.59.0" + }, "numpy": { "hashes": [ "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", @@ -2135,40 +2190,40 @@ }, "pymupdf": { "hashes": [ - "sha256:03bd1985b0234c3d2b8e26bb3e9ab1d2641dbada1e199b838a6bf884f35224c8", - "sha256:067c88b4e6609cb7e74d98d0b0a35c11eb8e29f4fc51dc7ed1dd448b81d347c7", - "sha256:0f6923a44fbeaeefaabb2fa10955dcef3624e8826db661201951f3b3409fed32", - "sha256:111d795a3e840aec2ad66beebd90a5327994ec85ed56fd68312f5463062dbbfa", - "sha256:2237ce9897771f4af686cc0c81517ffb020fc1a011b95ccf5ccf05383492bd6d", - "sha256:23d735db51722a889bb50636d161d2747f08fa0b82cc2e4a7eb8e228b25d1c4e", - "sha256:2479473b533936593428ce78499a1e9901570110ac602f03f1f3174efa0fa6a8", - "sha256:251c9c321a2112716068d5ae11deedd1911d0387cbdd0ef19adb216a3adf882c", - "sha256:514b272bfcd897f9ae29384da04167dcdea3b13ce0f2b9099b645314355d037d", - "sha256:514bcb679926b33413637b0bd73b223c90fb0d19352caf3395d0f23b1d47e8af", - "sha256:638fcb1f7551eb5ab582e412e204e8ded94acbbc37bc7f1e891a5dfc428881ee", - "sha256:6be2b20fbff40602f673fc8e60fde3e5911397f8ca9ed6aa2d15be94b12cc2c4", - "sha256:88bfed1bd13ec84869489fc7b97381016cb8b99956073f4c3e8ac8c840bbb15a", - "sha256:8eeb2e97347586ec293fddaf61e8dfc58d6b2763406e8f7a6e45b560bf9b15a3", - "sha256:98a78582c8a0c61b372e2bcd63dc61efc873e40b7d1f0b896a195e1a9ef9ffa7", - "sha256:a247a4be1e43a6127ee305eae9f65767ee7519a2aa0cb1a2aa6acfd4e7fe7a9b", - "sha256:a694f160d1701285cf3152951430740878d168511cd9ea0a3adcfaf3cac00322", - "sha256:ac97691c0e0e23607626d394bd660a46ea33f64921dc9288cf24daee207f9fe3", - "sha256:b062be400bbaff6e8b17c0a8da9481e01ec935f97967e0870e9aacd7ba60a52a", - "sha256:b12e608761e1586a65f6e96a34417a91f814dbab29f2929b41d825ab32fab6ef", - "sha256:b2cb058c8229f9697deebe0574f7d95e4b9a5e295ceafd554346bbd464141e89", - "sha256:b3ade5b349c38ddffb24f8c266fbcd7161f488c43960ff0f03f977d40d4df967", - "sha256:bba342321e1b5574631894d7d34ec046605d953a23553b7d2f9c0e4d3c27254b", - "sha256:c0a16cda5dc9b59d494ae23bdd9c4a3db53d04f2b6390265f5c0fe6269777975", - "sha256:c1bb6fa9e00c846e6829dec2bee8326754adaef5c80626b99233c01923f0342c", - "sha256:c29518701d6360beb01c25cf69a77b6426db90a9e7cd11179b3bd783c7fb4cb1", - "sha256:cbc1407dcf01b2e3e547b2d7643b97cc44c0950d2bb4b12c74322664c5cb37d7", - "sha256:d7792810634036a745ea3eb3c4ccf2b6adab55ca9644e3352747d2b5aa5327f9", - "sha256:dca46799c152051697c5e88d66c17ba6d0244668d0c4dd8a2ba2d8d3cb745988", - "sha256:eb414e92f08107f43576a1fedea28aa837220b15ad58c8e32015435fe96cc03e", - "sha256:ef345a5b050d0869ef404845075edd5f4bd7fd99e235f4d32ce85f423779a120" + "sha256:05e672ed3e82caca7ef02a88ace30130b1dd392a1190f03b2b58ffe7aa331400", + "sha256:0bbb0cf6593e53524f3fc26fb5e6ead17c02c64791caec7c4afe61b677dedf80", + "sha256:2dfc9e010669ae92fade6fb72aaea49ebe3b8dcd7ee4dcbbe50115abcaa4d3fe", + "sha256:2eb701247d8e685a24e45899d1175f01a3ce5fc792a4431c91fbb68633b29298", + "sha256:3f876533aa7f9a94bcd9a0225ce72571b7808260903fec1d95c120bc842fb52d", + "sha256:42ad2b819b90ce1947e11b90ec5085889df0a2e3aa0207bc97ecacfc6157cabc", + "sha256:52df831d46beb9ff494f5fba3e5d069af6d81f49abf6b6e799ee01f4f8fa6799", + "sha256:5ef4360f20015673c20cf59b7e19afc97168795188c584254ed3778cde43ce77", + "sha256:645a05321aecc8c45739f71f0eb574ce33138d19189582ffa5241fea3a8e2549", + "sha256:6577e2f473625e2d0df5f5a3bf1e4519e94ae749733cc9937994d1b256687bfa", + "sha256:734ee380b3abd038602be79114194a3cb74ac102b7c943bcb333104575922c50", + "sha256:73fce034f2afea886a59ead2d0caedf27e2b2a8558b5da16d0286882e0b1eb82", + "sha256:879e7f5ad35709d8760ab6103c3d5dac8ab8043a856ab3653fd324af7358ee87", + "sha256:92b3c4dd4d0491d495f333be2d41f4e1c155a409bc9d04b5ff29655dccbf4655", + "sha256:97b40bb22e3056874634617a90e0ed24a5172cf71791b9e25d1d91c6743bc567", + "sha256:99607649f89a02bba7d8ebe96e2410664316adc95e9337f7dfeff6a154f93049", + "sha256:9f7f4ef99dd8ac97fb0b852efa3dcbee515798078b6c79a6a13c7b1e7c5d41a4", + "sha256:a217689ede18cc6991b4e6a78afee8a440b3075d53b9dec4ba5ef7487d4547e9", + "sha256:a904261b317b761b0aa2bd2c1f6cd25d25aa4258be67a90c02a878efc5dca649", + "sha256:b22f8d854f8196ad5b20308c1cebad3d5189ed9f0988acbafa043947ea7e6c55", + "sha256:b3de8618b7cb5b36db611083840b3bcf09b11a893e2d8262f4e042102c7e65de", + "sha256:ba9a54552c7afb9ec85432c765e2fa9a81413acfaa7d70db7c9b528297749e5b", + "sha256:bb42d4b8407b4de7cb58c28f01449f16f32a6daed88afb41108f1aeb3552bdd4", + "sha256:c40d044411615e6f0baa7d3d933b3032cf97e168c7fa77d1be8a46008c109aee", + "sha256:cc0f794e3466bc96b5bf79d42fbc1551428751e3fef38ebc10ac70396b676144", + "sha256:d7cd88842b2e7f4c71eef4d87c98c35646b80b60e6375392d7ce40e519261f59", + "sha256:deee96c2fd415ded7b5070d8d5b2c60679aee6ed0e28ac0d2cb998060d835c2c", + "sha256:e2804a64bb57da414781e312fb0561f6be67658ad57ed4a73dce008b23fc70a6", + "sha256:f25aafd3e7fb9d7761a22acf2b67d704f04cc36d4dc33a3773f0eb3f4ec3606f", + "sha256:fab8833559bc47ab26ce736f915b8fc1dd37c108049b90396f7cd5e1004d7593", + "sha256:fbe1a3255b2cd0d769b2da2c4efdd0c0f30d4961a1aac02c0f75cf951b337aa4" ], "markers": "python_version >= '3.8'", - "version": "==1.23.25" + "version": "==1.23.26" }, "pymupdfb": { "hashes": [ @@ -2206,11 +2261,11 @@ }, "python-dateutil": { "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.2" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "version": "==2.9.0.post0" }, "python-dotenv": { "hashes": [ @@ -2755,7 +2810,7 @@ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.16.0" }, "smmap": { @@ -3044,7 +3099,7 @@ "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", "version": "==0.10.2" }, "tomli": { @@ -3129,11 +3184,11 @@ }, "transformers": { "hashes": [ - "sha256:86dc84ccbe36123647e84cbd50fc31618c109a41e6be92514b064ab55bf1304c", - "sha256:a7a9265fb060183e9d975cbbadc4d531b10281589c43f6d07563f86322728973" + "sha256:c4029cb9f01b3dd335e52f364c52d2b37c65b4c78e02e6a08b1919c5c928573e", + "sha256:c5fc7ad682b8a50a48b2a4c05d4ea2de5567adb1bdd00053619dbe5960857dd5" ], "markers": "python_full_version >= '3.8.0'", - "version": "==4.38.1" + "version": "==4.38.2" }, "triton": { "hashes": [ @@ -3144,7 +3199,7 @@ "sha256:da58a152bddb62cafa9a857dd2bc1f886dbf9f9c90a2b5da82157cd2b34392b0", "sha256:e8fe46d3ab94a8103e291bd44c741cc294b91d1d81c1a2888254cbf7ff846dab" ], - "markers": "python_version < '3.12' and platform_system == 'Linux' and platform_machine == 'x86_64'", + "markers": "platform_system == 'Linux' and platform_machine == 'x86_64' and python_version < '3.12'", "version": "==2.2.0" }, "typer": { diff --git a/utils/llama_index.py b/utils/llama_index.py index d1b034e..74439ac 100644 --- a/utils/llama_index.py +++ b/utils/llama_index.py @@ -4,10 +4,8 @@ import utils.logs as logs -from llama_index.embeddings.huggingface import HuggingFaceEmbedding -from llama_index.embeddings.text_embeddings_inference import ( - TextEmbeddingsInference, -) +from numba import cuda +from llama_index.embeddings.huggingface import ( HuggingFaceEmbedding ) # This is not used but required by llama-index and must be imported FIRST os.environ["OPENAI_API_KEY"] = "sk-abc123" @@ -32,11 +30,14 @@ def setup_embedding_model( timeout: int = 60, embed_batch_size: int = 10 ): + device = 'cpu' if not cuda.is_available() else 'cuda' embed_model = HuggingFaceEmbedding( model_name=model, timeout=timeout, embed_batch_size=embed_batch_size, + device=device ) + logs.log.info(f"Embedding model created successfully") return embed_model @@ -58,19 +59,6 @@ def create_service_context( chunk_size: int = 1024, # Llama-Index default is 1024 chunk_overlap: int = 200, # Llama-Index default is 200 ): - """ - Create a service context with the specified language model and embedding model. - - Parameters: - - llm (TODO: Determine type): The Llama-Index LLM instance to use for generation. - - system_prompt (str, optional): System prompt to use when creating the LLM. - - embed_model (str, optional): The embedding model to use for similarity search. Default is `BAAI/bge-large-en-v1.5`. - - chunk_size (int, optional): The maximum number of tokens to consider at once. Default is 1024. - - chunk_overlap (int, optional): The amount of shared content between two consecutive chunks of data. Smaller = more precise. Default is 20. - - Returns: - - A `ServiceContext` object with the specified settings. - """ formatted_embed_model = f"local:{embed_model}" try: embedding_model = setup_embedding_model(embed_model, embed_timeout, embed_batch_size) @@ -102,16 +90,6 @@ def create_service_context( @st.cache_resource(show_spinner=False) def load_documents(data_dir: str): - """ - Creates a data index from documents stored in a directory. - - Parameters: - - data_dir: Directory to load files from for embedding - - Returns: - - TODO: FIX -- VectorStoreIndex: An index containing vector representations of documents in the specified directory. - - None: If an exception occurs during the creation of the data index. - """ try: files = SimpleDirectoryReader(input_dir=data_dir, recursive=True) documents = files.load_data(files) @@ -136,24 +114,6 @@ def load_documents(data_dir: str): @st.cache_resource(show_spinner=False) def create_query_engine(_documents, _service_context): - """ - Create a query engine from a set of documents. - - This function creates a vector database index using the given documents and - service context, and then returns a query engine that can be used to perform - natural language queries on the index. - - Parameters: - - documents (VectorStoreIndex): A list of Document objects containing the - raw text data to be indexed. - - service_context (ServiceContext): A ServiceContext object providing any - necessary configuration or authentication information for the underlying - index implementation. - - Returns: - - query_engine (QueryEngine): A QueryEngine instance that can be used to - perform natural language queries on the indexed documents. - """ try: index = VectorStoreIndex.from_documents( documents=_documents, service_context=_service_context, show_progress=True From 9912b080db41d9e473a322951d0d48db32640a0f Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Fri, 1 Mar 2024 22:44:05 -0800 Subject: [PATCH 09/30] Remove un-necessary cache --- utils/llama_index.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/utils/llama_index.py b/utils/llama_index.py index 74439ac..a1f8f98 100644 --- a/utils/llama_index.py +++ b/utils/llama_index.py @@ -49,7 +49,6 @@ def setup_embedding_model( # TODO: Migrate to LlamaIndex.Settings: https://docs.llamaindex.ai/en/stable/module_guides/supporting_modules/service_context_migration.html -@st.cache_resource(show_spinner=False) def create_service_context( _llm, # TODO: Determine type system_prompt: str = None, # TODO: What are the implications of no system prompt being passed? @@ -88,7 +87,6 @@ def create_service_context( ################################### -@st.cache_resource(show_spinner=False) def load_documents(data_dir: str): try: files = SimpleDirectoryReader(input_dir=data_dir, recursive=True) From 77912fe1d9aa682de9c6e028b2831019c7608e99 Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Fri, 1 Mar 2024 22:45:10 -0800 Subject: [PATCH 10/30] Use GPU for embeddings if present --- Pipfile | 1 + utils/llama_index.py | 7 ++----- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Pipfile b/Pipfile index fe83c57..3f0cf39 100644 --- a/Pipfile +++ b/Pipfile @@ -12,6 +12,7 @@ llama-index-embeddings-huggingface = "*" pycryptodome = "*" nbconvert = "*" pyexiftool = "*" +numba = "*" [dev-packages] diff --git a/utils/llama_index.py b/utils/llama_index.py index a1f8f98..03ff03b 100644 --- a/utils/llama_index.py +++ b/utils/llama_index.py @@ -26,15 +26,12 @@ @st.cache_resource(show_spinner=False) def setup_embedding_model( - model: str, - timeout: int = 60, - embed_batch_size: int = 10 + model: str, ): device = 'cpu' if not cuda.is_available() else 'cuda' embed_model = HuggingFaceEmbedding( model_name=model, - timeout=timeout, - embed_batch_size=embed_batch_size, + # embed_batch_size=25, // TODO: Turning this on creates chaos, but has the potential to improve performance device=device ) logs.log.info(f"Embedding model created successfully") From 2835fa40b9d1255125740ada1fffdbbecee0770f Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Fri, 1 Mar 2024 22:46:39 -0800 Subject: [PATCH 11/30] Clean up --- utils/llama_index.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/utils/llama_index.py b/utils/llama_index.py index 03ff03b..0150f9e 100644 --- a/utils/llama_index.py +++ b/utils/llama_index.py @@ -50,14 +50,12 @@ def create_service_context( _llm, # TODO: Determine type system_prompt: str = None, # TODO: What are the implications of no system prompt being passed? embed_model: str = "BAAI/bge-large-en-v1.5", - embed_timeout: int = 60, - embed_batch_size: int = 10, chunk_size: int = 1024, # Llama-Index default is 1024 chunk_overlap: int = 200, # Llama-Index default is 200 ): formatted_embed_model = f"local:{embed_model}" try: - embedding_model = setup_embedding_model(embed_model, embed_timeout, embed_batch_size) + embedding_model = setup_embedding_model(embed_model) service_context = ServiceContext.from_defaults( llm=_llm, system_prompt=system_prompt, @@ -92,7 +90,6 @@ def load_documents(data_dir: str): return documents except Exception as err: logs.log.error(f"Error creating data index: {err}") - return None finally: for file in os.scandir(data_dir): if file.is_file() and not file.name.startswith(".gitkeep"): # TODO: Confirm syntax here From da281cc97187450a7b5ba8fc211501ebbc6b7c50 Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Fri, 1 Mar 2024 22:47:14 -0800 Subject: [PATCH 12/30] Clean-up from un-used caching --- utils/llama_index.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/llama_index.py b/utils/llama_index.py index 0150f9e..1bad294 100644 --- a/utils/llama_index.py +++ b/utils/llama_index.py @@ -47,7 +47,7 @@ def setup_embedding_model( # TODO: Migrate to LlamaIndex.Settings: https://docs.llamaindex.ai/en/stable/module_guides/supporting_modules/service_context_migration.html def create_service_context( - _llm, # TODO: Determine type + llm, # TODO: Determine type system_prompt: str = None, # TODO: What are the implications of no system prompt being passed? embed_model: str = "BAAI/bge-large-en-v1.5", chunk_size: int = 1024, # Llama-Index default is 1024 @@ -57,7 +57,7 @@ def create_service_context( try: embedding_model = setup_embedding_model(embed_model) service_context = ServiceContext.from_defaults( - llm=_llm, + llm=llm, system_prompt=system_prompt, embed_model=formatted_embed_model, chunk_size=int(chunk_size), From 2a9170d9c348202428f816f89304b7d48d114271 Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Fri, 1 Mar 2024 22:47:55 -0800 Subject: [PATCH 13/30] Single file type definition --- components/tabs/local_files.py | 38 +++++++++++++--------------------- 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/components/tabs/local_files.py b/components/tabs/local_files.py index 403701c..43ffbb4 100644 --- a/components/tabs/local_files.py +++ b/components/tabs/local_files.py @@ -8,6 +8,18 @@ import utils.llama_index as llama_index import utils.logs as logs +supported_files = ( + "csv", + "docx", + "epub", + "ipynb", + "json", + "md", + "pdf", + "ppt", + "pptx", + "txt", +) def local_files(): # Force users to confirm Settings before uploading files @@ -15,18 +27,7 @@ def local_files(): uploaded_files = st.file_uploader( "Select Files", accept_multiple_files=True, - type=( - "csv", - "docx", - "epub", - "ipynb", - "json", - "md", - "pdf", - "ppt", - "pptx", - "txt", - ), + type=supported_files, ) else: st.warning("Please configure Ollama settings before proceeding!", icon="⚠️") @@ -35,18 +36,7 @@ def local_files(): uploaded_files = st.file_uploader( "Select Files", accept_multiple_files=True, - type=( - "csv", - "docx", - "epub", - "ipynb", - "json", - "md", - "pdf", - "ppt", - "pptx", - "txt" - ), + type=supported_files, disabled=True, ) From bdb2f268fc97a527bef9fb4558d7ae2d3bf4309c Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Sat, 2 Mar 2024 00:03:34 -0800 Subject: [PATCH 14/30] Refactor RAG pipeline --- components/tabs/local_files.py | 114 +--------------------------- utils/rag_pipeline.py | 133 +++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+), 110 deletions(-) create mode 100644 utils/rag_pipeline.py diff --git a/components/tabs/local_files.py b/components/tabs/local_files.py index 43ffbb4..d9a50c9 100644 --- a/components/tabs/local_files.py +++ b/components/tabs/local_files.py @@ -7,6 +7,7 @@ import utils.ollama as ollama import utils.llama_index as llama_index import utils.logs as logs +import utils.rag_pipeline as rag supported_files = ( "csv", @@ -44,117 +45,10 @@ def local_files(): st.session_state["file_list"] = uploaded_files with st.spinner("Processing..."): - error = None - - ###################### - # Save Files to Disk # - ###################### - - for uploaded_file in uploaded_files: - with st.spinner(f"Processing {uploaded_file.name}..."): - save_dir = os.getcwd() + "/data" - func.save_uploaded_file(uploaded_file, save_dir) - - st.caption("✔️ Files Uploaded") - - ###################################### - # Create Llama-Index service-context # - # to use local LLMs and embeddings # - ###################################### - - try: - llm = ollama.create_ollama_llm( - st.session_state["selected_model"], - st.session_state["ollama_endpoint"], - ) - st.session_state["llm"] = llm - st.caption("✔️ LLM Initialized") - - # resp = llm.complete("Hello!") - # print(resp) - - # Determine embedding model to use - - embedding_model = st.session_state["embedding_model"] - hf_embedding_model = None - - if embedding_model == None: - # logs.log.info("No embedding model set; using defaults...") - hf_embedding_model = "BAAI/bge-large-en-v1.5" - - if embedding_model == "Default (bge-large-en-v1.5)": - # logs.log.info("Using default embedding model...") - hf_embedding_model = "BAAI/bge-large-en-v1.5" - - if embedding_model == "Large (Salesforce/SFR-Embedding-Mistral)": - # logs.log.info("Using the Salesforce embedding model; RIP yer VRAM...") - hf_embedding_model = "Salesforce/SFR-Embedding-Mistral" - - if embedding_model == "Other": - # logs.log.info("Using a user-provided embedding model...") - hf_embedding_model = st.session_state["other_embedding_model"] - - llama_index.create_service_context( - st.session_state["llm"], - st.session_state["system_prompt"], - hf_embedding_model, - st.session_state["chunk_size"], - # st.session_state["chunk_overlap"], - ) - st.caption("✔️ Context Created") - except Exception as err: - logs.log.error(f"Setting up Service Context failed: {err}") - error = err - st.exception(error) - st.stop() - - ####################################### - # Load files from the data/ directory # - ####################################### - - try: - documents = llama_index.load_documents(save_dir) - st.session_state["documents"] = documents - st.caption("✔️ Processed File Data") - except Exception as err: - logs.log.error(f"Document Load Error: {err}") - error = err - st.exception(error) - st.stop() - - ########################################### - # Create an index from ingested documents # - ########################################### - - try: - llama_index.create_query_engine( - st.session_state["documents"], st.session_state["service_context"] - ) - st.caption("✔️ Created File Index") - except Exception as err: - logs.log.error(f"Index Creation Error: {err}") - error = err - st.exception(error) - st.stop() - - ##################### - # Remove data files # - ##################### - - try: - save_dir = os.getcwd() + "/data" - shutil.rmtree(save_dir) - st.caption("✔️ Removed Temp Files") - except Exception as err: - logs.log.error(f"Failed to delete data files: {err}") - error = err - st.exception(error) - st.stop() - - ##################### - # Show Final Status # - ##################### + # Initiate the RAG pipeline, providing documents to be saved on disk if necessary + error = rag.rag_pipeline(uploaded_files) + # Display errors (if any) or proceed if error is not None: st.exception(error) else: diff --git a/utils/rag_pipeline.py b/utils/rag_pipeline.py new file mode 100644 index 0000000..fd6f5ce --- /dev/null +++ b/utils/rag_pipeline.py @@ -0,0 +1,133 @@ +import os +import sys +import shutil +import inspect + +import streamlit as st + +import utils.helpers as func +import utils.ollama as ollama +import utils.llama_index as llama_index +import utils.logs as logs + +def rag_pipeline(uploaded_files: list = None): + error = None + + ################################# + # (OPTIONAL) Save Files to Disk # + ################################# + + if uploaded_files is not None: + for uploaded_file in uploaded_files: + with st.spinner(f"Processing {uploaded_file.name}..."): + save_dir = os.getcwd() + "/data" + func.save_uploaded_file(uploaded_file, save_dir) + + st.caption("✔️ Files Uploaded") + + + ###################################### + # Create Llama-Index service-context # + # to use local LLMs and embeddings # + ###################################### + + try: + llm = ollama.create_ollama_llm( + st.session_state["selected_model"], + st.session_state["ollama_endpoint"], + ) + st.session_state["llm"] = llm + st.caption("✔️ LLM Initialized") + + # resp = llm.complete("Hello!") + # print(resp) + except Exception as err: + logs.log.error(f"Failed to setup LLM: {str(err)}") + error = err + st.exception(error) + st.stop() + + #################################### + # Determine embedding model to use # + #################################### + + embedding_model = st.session_state["embedding_model"] + hf_embedding_model = None + + if embedding_model == None: + hf_embedding_model = "BAAI/bge-large-en-v1.5" + + if embedding_model == "Default (bge-large-en-v1.5)": + hf_embedding_model = "BAAI/bge-large-en-v1.5" + + if embedding_model == "Large (Salesforce/SFR-Embedding-Mistral)": + hf_embedding_model = "Salesforce/SFR-Embedding-Mistral" + + if embedding_model == "Other": + hf_embedding_model = st.session_state["other_embedding_model"] + + try: + llama_index.create_service_context( + st.session_state["llm"], + st.session_state["system_prompt"], + hf_embedding_model, + st.session_state["chunk_size"], + # st.session_state["chunk_overlap"], + ) + st.caption("✔️ Context Created") + except Exception as err: + logs.log.error(f"Setting up Service Context failed: {str(err)}") + error = err + st.exception(error) + st.stop() + + ####################################### + # Load files from the data/ directory # + ####################################### + + # if documents already exists in state + if len(st.session_state["documents"]) > 0: + logs.log.info("Documents are already available; skipping document loading") + st.caption("✔️ Processed File Data") + else: + try: + save_dir = os.getcwd() + "/data" + documents = llama_index.load_documents(save_dir) + st.session_state["documents"] = documents + st.caption("✔️ Processed File Data") + except Exception as err: + logs.log.error(f"Document Load Error: {str(err)}") + error = err + st.exception(error) + st.stop() + + ########################################### + # Create an index from ingested documents # + ########################################### + + try: + llama_index.create_query_engine( + st.session_state["documents"], + st.session_state["service_context"], + ) + st.caption("✔️ Created File Index") + except Exception as err: + logs.log.error(f"Index Creation Error: {str(err)}") + error = err + st.exception(error) + st.stop() + + ##################### + # Remove data files # + ##################### + + try: + save_dir = os.getcwd() + "/data" + shutil.rmtree(save_dir) + st.caption("✔️ Removed Temp Files") + except Exception as err: + logs.log.error(f"Failed to delete data files, you may want to clean-up manually: {str(err)}") + error = err + pass + + return error \ No newline at end of file From 94d13a5975ba0411654d694f9d1654e303189363 Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Sat, 2 Mar 2024 01:54:30 -0800 Subject: [PATCH 15/30] Remove Deploy button from header --- components/page_config.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/components/page_config.py b/components/page_config.py index 812b5dc..489436d 100644 --- a/components/page_config.py +++ b/components/page_config.py @@ -10,6 +10,16 @@ def set_page_config(): menu_items={ 'Get Help': 'https://github.com/jonfairbanks/local-rag/discussions', 'Report a bug': "https://github.com/jonfairbanks/local-rag/issues", - 'About': None } ) + + # Remove the Streamlit `Deploy` button from the Header + st.markdown( + r""" + + """, unsafe_allow_html=True + ) From 0674acfbe145643821ab992240682482eed25b2a Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Sat, 2 Mar 2024 01:55:09 -0800 Subject: [PATCH 16/30] Use llama2 on first load --- components/page_state.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/page_state.py b/components/page_state.py index e6211b9..c1b2908 100644 --- a/components/page_state.py +++ b/components/page_state.py @@ -33,7 +33,7 @@ def set_initial_state(): if("llama2:7b" in st.session_state["ollama_models"]): st.session_state["selected_model"] = "llama2:7b" # Default to llama2:7b on initial load else: - st.session_state["selected_model"] = st.session_state["ollama_models"][0] + st.session_state["selected_model"] = st.session_state["ollama_models"][0] # If llama2:7b is not present, select the first model available except Exception: st.session_state["selected_model"] = None pass From 64219bf8a26670c653cf551197b7d26fe7b785bb Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Sat, 2 Mar 2024 01:55:18 -0800 Subject: [PATCH 17/30] Fix default chat mode --- components/page_state.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/page_state.py b/components/page_state.py index c1b2908..ec684dc 100644 --- a/components/page_state.py +++ b/components/page_state.py @@ -73,7 +73,7 @@ def set_initial_state(): st.session_state["service_context"] = None if "chat_mode" not in st.session_state: - st.session_state["chat_mode"] = "best" + st.session_state["chat_mode"] = "compact" ##################### # Advanced Settings # From 67adca56299d946189c8ed5cb2ebaecaa893d1f1 Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Sat, 2 Mar 2024 01:56:01 -0800 Subject: [PATCH 18/30] Only clean-up files for upload use-case --- utils/rag_pipeline.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/utils/rag_pipeline.py b/utils/rag_pipeline.py index fd6f5ce..1d109e2 100644 --- a/utils/rag_pipeline.py +++ b/utils/rag_pipeline.py @@ -94,7 +94,7 @@ def rag_pipeline(uploaded_files: list = None): save_dir = os.getcwd() + "/data" documents = llama_index.load_documents(save_dir) st.session_state["documents"] = documents - st.caption("✔️ Processed File Data") + st.caption("✔️ Data Processed") except Exception as err: logs.log.error(f"Document Load Error: {str(err)}") error = err @@ -121,13 +121,13 @@ def rag_pipeline(uploaded_files: list = None): # Remove data files # ##################### - try: - save_dir = os.getcwd() + "/data" - shutil.rmtree(save_dir) - st.caption("✔️ Removed Temp Files") - except Exception as err: - logs.log.error(f"Failed to delete data files, you may want to clean-up manually: {str(err)}") - error = err - pass + if len(st.session_state['file_list']) > 0: + try: + save_dir = os.getcwd() + "/data" + shutil.rmtree(save_dir) + st.caption("✔️ Removed Temp Files") + except Exception as err: + logs.log.warning(f"Unable to delete data files, you may want to clean-up manually: {str(err)}") + pass - return error \ No newline at end of file + return error # If no errors occurred, None is returned \ No newline at end of file From 131c6e7d37872907d4aa709ff36601bcca66d71d Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Sat, 2 Mar 2024 01:56:45 -0800 Subject: [PATCH 19/30] File Upload --> Sources --- components/sidebar.py | 4 ++-- components/tabs/{file_upload.py => sources.py} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename components/tabs/{file_upload.py => sources.py} (96%) diff --git a/components/sidebar.py b/components/sidebar.py index 10cd52d..e569940 100644 --- a/components/sidebar.py +++ b/components/sidebar.py @@ -1,7 +1,7 @@ import streamlit as st from components.tabs.about import about -from components.tabs.file_upload import file_upload +from components.tabs.sources import sources from components.tabs.settings import settings @@ -10,7 +10,7 @@ def sidebar(): tab1, tab2, tab3 = st.sidebar.tabs(["My Files", "Settings", "About"]) with tab1: - file_upload() + sources() with tab2: settings() diff --git a/components/tabs/file_upload.py b/components/tabs/sources.py similarity index 96% rename from components/tabs/file_upload.py rename to components/tabs/sources.py index 8c66330..cd505eb 100644 --- a/components/tabs/file_upload.py +++ b/components/tabs/sources.py @@ -5,7 +5,7 @@ from components.tabs.website import website -def file_upload(): +def sources(): st.title("Directly import your files") st.caption("Convert your files to embeddings for utilization during chat") st.write("") From 541ed1288361b9a42600d40066cd9cf82ea9ebc6 Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Sat, 2 Mar 2024 01:58:22 -0800 Subject: [PATCH 20/30] Website RAG --- components/page_state.py | 9 ++++--- components/tabs/website.py | 51 +++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/components/page_state.py b/components/page_state.py index ec684dc..850b4da 100644 --- a/components/page_state.py +++ b/components/page_state.py @@ -46,9 +46,9 @@ def set_initial_state(): } ] - ###################### - # Files & Documents # - ###################### + ################################ + # Files, Documents & Websites # + ################################ if "file_list" not in st.session_state: st.session_state["file_list"] = [] @@ -56,6 +56,9 @@ def set_initial_state(): if "github_repo" not in st.session_state: st.session_state["github_repo"] = None + if "websites" not in st.session_state: + st.session_state["websites"] = [] + ############### # Llama-Index # ############### diff --git a/components/tabs/website.py b/components/tabs/website.py index b93dcc7..ff3afdf 100644 --- a/components/tabs/website.py +++ b/components/tabs/website.py @@ -1,5 +1,10 @@ import streamlit as st +import utils.rag_pipeline as rag + +from llama_index.readers.web import SimpleWebPageReader +from urllib.parse import urlparse + def website(): # if st.session_state["selected_model"] is not None: @@ -32,4 +37,48 @@ def website(): # st.write(css_example, unsafe_allow_html=True) - st.write(":grey[Coming Soon™]") + def ensure_https(url): + parsed = urlparse(url) + + if not bool(parsed.scheme): + return f"https://{url}" + + return url + + st.write("Enter a Website") + col1, col2 = st.columns([1,.2]) + with col1: + new_website = st.text_input("Enter a Website", label_visibility="collapsed") + with col2: + add_button = st.button(u"➕") + + # If the add button is clicked, append the new website to our list + if add_button and new_website != '': + st.session_state['websites'].append(ensure_https(new_website)) + st.session_state['websites'] = sorted(set(st.session_state['websites'])) + + if st.session_state['websites'] != []: + st.markdown(f"

Website(s)

", unsafe_allow_html=True) + for site in st.session_state['websites']: + st.caption(f"- {site}") + st.write("") + + process_button = st.button("Process") + + if process_button: + documents = SimpleWebPageReader(html_to_text=True).load_data( + st.session_state['websites'] + ) + + if len(documents) > 0: + st.session_state["documents"] = documents + + with st.spinner("Processing..."): + # Initiate the RAG pipeline, providing documents to be saved on disk if necessary + error = rag.rag_pipeline() + + # Display errors (if any) or proceed + if error is not None: + st.exception(error) + else: + st.write("Site processing completed. Let's chat! 😎") From 18d3022268fbff40aba3bf1b5749d9e33fcfcb58 Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Sat, 2 Mar 2024 01:58:36 -0800 Subject: [PATCH 21/30] Align Button Labels --- components/tabs/github_repo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/tabs/github_repo.py b/components/tabs/github_repo.py index f54cf04..d2a94a6 100644 --- a/components/tabs/github_repo.py +++ b/components/tabs/github_repo.py @@ -21,7 +21,7 @@ def github_repo(): repo_processed = None repo_processed = st.button( - "Process Repo", + "Process", on_click=func.clone_github_repo, args=(st.session_state["github_repo"],), ) # TODO: Should this be with st.button? From c8630e80149df6278f2ff6ef276e338574b665eb Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Sat, 2 Mar 2024 02:11:38 -0800 Subject: [PATCH 22/30] Fix cache type --- utils/llama_index.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/llama_index.py b/utils/llama_index.py index 1bad294..77cdac4 100644 --- a/utils/llama_index.py +++ b/utils/llama_index.py @@ -104,7 +104,7 @@ def load_documents(data_dir: str): ################################### -@st.cache_resource(show_spinner=False) +@st.cache_data(show_spinner=False) def create_query_engine(_documents, _service_context): try: index = VectorStoreIndex.from_documents( From 1a080767cab4a5827884dcca54e96e62620e07ce Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Sat, 2 Mar 2024 02:11:46 -0800 Subject: [PATCH 23/30] Fix return value --- utils/llama_index.py | 1 - 1 file changed, 1 deletion(-) diff --git a/utils/llama_index.py b/utils/llama_index.py index 77cdac4..7771af2 100644 --- a/utils/llama_index.py +++ b/utils/llama_index.py @@ -126,4 +126,3 @@ def create_query_engine(_documents, _service_context): return query_engine except Exception as e: logs.log.error(f"Error when creating Query Engine: {e}") - return From ddab1da216b6f17e8bb2b035652dd7bd3141c122 Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Sat, 2 Mar 2024 02:12:06 -0800 Subject: [PATCH 24/30] Log once process completes --- utils/llama_index.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/llama_index.py b/utils/llama_index.py index 7771af2..f02aaca 100644 --- a/utils/llama_index.py +++ b/utils/llama_index.py @@ -119,10 +119,10 @@ def create_query_engine(_documents, _service_context): streaming=True, ) - logs.log.info("Query Engine created successfully") - st.session_state["query_engine"] = query_engine + logs.log.info("Query Engine created successfully") + return query_engine except Exception as e: logs.log.error(f"Error when creating Query Engine: {e}") From 3a225106300bad37a75aca6cfbb3dcb2e27fbbb9 Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Sat, 2 Mar 2024 02:17:04 -0800 Subject: [PATCH 25/30] Update Titles & Branding --- components/header.py | 2 +- components/sidebar.py | 2 +- components/tabs/sources.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/components/header.py b/components/header.py index f678b72..d810707 100644 --- a/components/header.py +++ b/components/header.py @@ -4,5 +4,5 @@ def set_page_header(): st.header("📚 Offline, Open-Source RAG", anchor=False) st.caption( - "Ingest files for retrieval augmented generation (RAG) with open-source Large Language Models (LLMs), all without 3rd parties or sensitive data leaving your network." + "Ingest your data for retrieval augmented generation (RAG) with open-source Large Language Models (LLMs), all without 3rd parties or sensitive information leaving your network." ) diff --git a/components/sidebar.py b/components/sidebar.py index e569940..e1b5039 100644 --- a/components/sidebar.py +++ b/components/sidebar.py @@ -7,7 +7,7 @@ def sidebar(): with st.sidebar: - tab1, tab2, tab3 = st.sidebar.tabs(["My Files", "Settings", "About"]) + tab1, tab2, tab3 = st.sidebar.tabs(["Data Sources", "Settings", "About"]) with tab1: sources() diff --git a/components/tabs/sources.py b/components/tabs/sources.py index cd505eb..277bb9a 100644 --- a/components/tabs/sources.py +++ b/components/tabs/sources.py @@ -6,8 +6,8 @@ def sources(): - st.title("Directly import your files") - st.caption("Convert your files to embeddings for utilization during chat") + st.title("Directly import your data") + st.caption("Convert your data into embeddings for utilization during chat") st.write("") with st.expander("💻   **Local Files**", expanded=False): From 3844637ce2756dfbb3b5c4e3de4049a4e5e42a1e Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Sat, 2 Mar 2024 02:17:46 -0800 Subject: [PATCH 26/30] Unique keys for Process buttons --- components/tabs/github_repo.py | 3 ++- components/tabs/website.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/components/tabs/github_repo.py b/components/tabs/github_repo.py index d2a94a6..a54606b 100644 --- a/components/tabs/github_repo.py +++ b/components/tabs/github_repo.py @@ -24,7 +24,8 @@ def github_repo(): "Process", on_click=func.clone_github_repo, args=(st.session_state["github_repo"],), - ) # TODO: Should this be with st.button? + key="process_github", + ) with st.spinner("Processing..."): if repo_processed is True: diff --git a/components/tabs/website.py b/components/tabs/website.py index ff3afdf..7967a49 100644 --- a/components/tabs/website.py +++ b/components/tabs/website.py @@ -63,7 +63,7 @@ def ensure_https(url): st.caption(f"- {site}") st.write("") - process_button = st.button("Process") + process_button = st.button("Process", key="process_website") if process_button: documents = SimpleWebPageReader(html_to_text=True).load_data( From ecc19968bc5e3ad38e3b5d48234a2703cc6ccda4 Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Sat, 2 Mar 2024 02:18:15 -0800 Subject: [PATCH 27/30] Relocate function --- components/tabs/website.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/components/tabs/website.py b/components/tabs/website.py index 7967a49..562686b 100644 --- a/components/tabs/website.py +++ b/components/tabs/website.py @@ -5,6 +5,13 @@ from llama_index.readers.web import SimpleWebPageReader from urllib.parse import urlparse +def ensure_https(url): + parsed = urlparse(url) + + if not bool(parsed.scheme): + return f"https://{url}" + + return url def website(): # if st.session_state["selected_model"] is not None: @@ -37,13 +44,7 @@ def website(): # st.write(css_example, unsafe_allow_html=True) - def ensure_https(url): - parsed = urlparse(url) - - if not bool(parsed.scheme): - return f"https://{url}" - - return url + st.write("Enter a Website") col1, col2 = st.columns([1,.2]) From 2bb0271cb060c6ae64ecc60f63f2134816966e49 Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Sat, 2 Mar 2024 02:18:39 -0800 Subject: [PATCH 28/30] Handle Null case --- utils/rag_pipeline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/rag_pipeline.py b/utils/rag_pipeline.py index 1d109e2..747ce7e 100644 --- a/utils/rag_pipeline.py +++ b/utils/rag_pipeline.py @@ -86,7 +86,7 @@ def rag_pipeline(uploaded_files: list = None): ####################################### # if documents already exists in state - if len(st.session_state["documents"]) > 0: + if st.session_state["documents"] is not None and len(st.session_state["documents"]) > 0: logs.log.info("Documents are already available; skipping document loading") st.caption("✔️ Processed File Data") else: From 8bed40c75a7af5272c5ca08d37ef22cfa045a6fc Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Sat, 2 Mar 2024 02:20:50 -0800 Subject: [PATCH 29/30] Dynamically create Index --- utils/llama_index.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/utils/llama_index.py b/utils/llama_index.py index f02aaca..0ad78e2 100644 --- a/utils/llama_index.py +++ b/utils/llama_index.py @@ -97,6 +97,23 @@ def load_documents(data_dir: str): logs.log.info(f"Document loading complete; removing local file(s)") +################################### +# +# Create Document Index +# +################################### + +@st.cache_data(show_spinner=False) +def create_index(_documents, _service_context): + index = VectorStoreIndex.from_documents( + documents=_documents, service_context=_service_context, show_progress=True + ) + + logs.log.info("Index created from loaded documents successfully") + + return index + + ################################### # # Create Query Engine @@ -107,11 +124,7 @@ def load_documents(data_dir: str): @st.cache_data(show_spinner=False) def create_query_engine(_documents, _service_context): try: - index = VectorStoreIndex.from_documents( - documents=_documents, service_context=_service_context, show_progress=True - ) - - logs.log.info("Index created from loaded documents successfully") + index = create_index(_documents, _service_context) query_engine = index.as_query_engine( similarity_top_k=st.session_state["top_k"], From 32b7ca0491670990626164164642384ba9732e73 Mon Sep 17 00:00:00 2001 From: Jon Fairbanks Date: Sat, 2 Mar 2024 02:21:13 -0800 Subject: [PATCH 30/30] Set additional options on Query Engine --- utils/llama_index.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utils/llama_index.py b/utils/llama_index.py index 0ad78e2..51a8dd4 100644 --- a/utils/llama_index.py +++ b/utils/llama_index.py @@ -128,8 +128,10 @@ def create_query_engine(_documents, _service_context): query_engine = index.as_query_engine( similarity_top_k=st.session_state["top_k"], + response_mode=st.session_state["chat_mode"], service_context=_service_context, streaming=True, + # verbose=True, # Broken? ) st.session_state["query_engine"] = query_engine