From c34de2197110aa0127f325e01cc42056935f7b4a Mon Sep 17 00:00:00 2001 From: timothyafolami Date: Mon, 5 Aug 2024 22:14:19 +0100 Subject: [PATCH] Pdf Ingestion pipeline completed --- Projct Structure.txt | 16 ++ data_ingestion/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 199 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 2192 bytes data_ingestion/pdf_ingest.py | 42 ++++ data_ingestion/utils.py | 42 ++++ doc-experiment.ipynb | 236 +++++++++++------- loggings/__init__.py | 0 loggings/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 193 bytes .../logging_config.cpython-311.pyc | Bin 0 -> 853 bytes loggings/app.log | 28 +++ loggings/logging_config.py | 19 ++ search.py | 25 ++ .../index.faiss | Bin .../index.pkl | Bin 945205 -> 945207 bytes 15 files changed, 318 insertions(+), 90 deletions(-) create mode 100644 Projct Structure.txt create mode 100644 data_ingestion/__init__.py create mode 100644 data_ingestion/__pycache__/__init__.cpython-311.pyc create mode 100644 data_ingestion/__pycache__/utils.cpython-311.pyc create mode 100644 data_ingestion/pdf_ingest.py create mode 100644 data_ingestion/utils.py create mode 100644 loggings/__init__.py create mode 100644 loggings/__pycache__/__init__.cpython-311.pyc create mode 100644 loggings/__pycache__/logging_config.cpython-311.pyc create mode 100644 loggings/app.log create mode 100644 loggings/logging_config.py create mode 100644 search.py rename vec-db/index/{faiss_index_rand => faiss_index_pdf}/index.faiss (100%) rename vec-db/index/{faiss_index_rand => faiss_index_pdf}/index.pkl (94%) diff --git a/Projct Structure.txt b/Projct Structure.txt new file mode 100644 index 00000000..8a3af613 --- /dev/null +++ b/Projct Structure.txt @@ -0,0 +1,16 @@ +---- 1. Load User Document + ----> Starting with word document. Like Pdf, txt and docx file. + ----> Data Ingestion is meant to take in the user data. Load the embedding model, then create a vector database from it. + ----> Considerations: + 1. Pdfs have pages already, hence text splitter won't be used. We want to be able to make reference to the pages the searched document can be found. + 2. The apporach for other data types can be different. we can have text splitter fot txt files and if possible add pages to the chunks made for easy reference. + 3. + + Data Ingestion Module: + This module will handle the data ingestion process. + uitls.py --> keep the reusable functions + pdf_ingest.py --> This module will handle pdfs + + + Loggings Module: + This module will keep logs of what's going on here. \ No newline at end of file diff --git a/data_ingestion/__init__.py b/data_ingestion/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/data_ingestion/__pycache__/__init__.cpython-311.pyc b/data_ingestion/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09e0fb0ec7c3d3543f6c4ea5ee2a6dffd79ccaca GIT binary patch literal 199 zcmZ3^%ge<81Pvw|(?IlN5CH>>P{wCAAY(d13PUi1CZpd2X#0(Sz0Dv+zqW}N^ literal 0 HcmV?d00001 diff --git a/data_ingestion/__pycache__/utils.cpython-311.pyc b/data_ingestion/__pycache__/utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d392cb33ff8b76ee43c000bf4aacc95475481149 GIT binary patch literal 2192 zcmZ`(&2JM&6rcU@+TLVS5&{K6XdsEmwhE>|MTHOu3aB86s7O^QGF@$U#?F%cFf;4W zL~ChYFvTlN3g?Z)WGs%zN{D zzxRI9G!;Sn`|K~JA2SI3#eX_Yd^>sbEleIEjIiJ!SC|t7J{KL)mF6UvOZU*6EFvPW z!M^p*X*8E1nUa9zd%~Q8`>+CImSk|IB;qX0bGRSpVa#Lo2GX_H{M>UP+4E(!T(-UP zCDS73%jBXvPcVjmrVB~t(z(kwZdhFlFae*D1mBx8AizhV2A*Nb7HVJ_XJ8Zq0aR~W zh(aM0UnpyEW}Tl)TTKcj@F6?1GI;*nxyyz5GMQ$s={VEGOB76&Y>OnaRmEm9?D-Tl z_6jjb*R@$)N>ta!#4$Y6B}spKzIex^WtM2fvp{FGe<`=B%ap@T`?%-_k*K}fm<$VJ z&^ErYP8GjqgtB5_yY8}a+^kmog>vzNf5&rt6SLwq(=!)6ySxyLU8nvnVg;;-nPJ+t zhsk$EYzC$Q;1L$szE`XUw!@B8mXl$Ay7vGh^_PACb`|*8Sr8Fw4o*Z@n#21am*Sn1 z(beXzPoB-j!^fg)uLkwz$mGkb@%5W6NgNvZ2Z8vPi|9&ALH)a9dDk1b0$Cjf@gM%G zG*U-l@(68?%B^mMczo92)Oz=1O$>Y?g0OEzTEjil+kZ0%~xM3E`z(C@?P|@Tvs%1jy0=ikKDWM!Hy?l8BfISsg zfcG^y%&c~^2F!FD?C<)5B_7;%+s?QLM?(qAJ$=s#*vyo8h0M$(XhTpFxnctJ+?p;Y zgUohq$E0?!Y%pR{Ya!|9dc*R)08%tj%u0oLILWyrFgeTgY$D?MBy+n;=yD<~(h;~R zksz$VSvUz?<&4e3Dx@!O?G#qp*V9iyF%BPF0s$n=_x+h4{Ubm6n5=$P&mV5&4@VQt zoEnWc)&6L*sSUP}DCwz)tfrEGC^dGB#o9!>*Odvr+IQc%>pVRE!|7F}vGZ_UnQACg zaoU@C?R)dVhYc{mRxieRJr?zp=rg)NcY_Ns9O8qT9B_b?)`Dq!@Osy+dH~9iUTLSC z8OhkYHnq!AT9sH@=+biBW-YH$X=YMR%JliqQR+d8%SP@r6!5A;&d|?5&r1yZ8AMAG z1fhw(h`078Iu>v3tz1^v-9lY4j0O(H+QGUu-q6M)wUt9hJ_q!Kq3uEyh5dYOvry6a V^vlWZJJZu@R`{5kd8bI<^B 1\u001b[0m search_result, \u001b[38;5;28mall\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[43msearch\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdb\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mWhat is LDA\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m 2\u001b[0m \u001b[38;5;28mprint\u001b[39m( search_result )\n", - "Cell \u001b[1;32mIn[15], line 2\u001b[0m, in \u001b[0;36msearch\u001b[1;34m(db, query, k)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21msearch\u001b[39m(db, query, k\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m4\u001b[39m):\n\u001b[1;32m----> 2\u001b[0m docs \u001b[38;5;241m=\u001b[39m \u001b[43mdb\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msimilarity_search\u001b[49m\u001b[43m(\u001b[49m\u001b[43mquery\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mk\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 3\u001b[0m \u001b[38;5;28mall\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 4\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m doc \u001b[38;5;129;01min\u001b[39;00m docs:\n", - "File \u001b[1;32mc:\\Users\\timmy_3aupohg\\anaconda3\\envs\\smog_env\\Lib\\site-packages\\langchain_community\\vectorstores\\faiss.py:530\u001b[0m, in \u001b[0;36mFAISS.similarity_search\u001b[1;34m(self, query, k, filter, fetch_k, **kwargs)\u001b[0m\n\u001b[0;32m 510\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21msimilarity_search\u001b[39m(\n\u001b[0;32m 511\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[0;32m 512\u001b[0m query: \u001b[38;5;28mstr\u001b[39m,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 516\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[0;32m 517\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m List[Document]:\n\u001b[0;32m 518\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Return docs most similar to query.\u001b[39;00m\n\u001b[0;32m 519\u001b[0m \n\u001b[0;32m 520\u001b[0m \u001b[38;5;124;03m Args:\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 528\u001b[0m \u001b[38;5;124;03m List of Documents most similar to the query.\u001b[39;00m\n\u001b[0;32m 529\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 530\u001b[0m docs_and_scores \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msimilarity_search_with_score\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 531\u001b[0m \u001b[43m \u001b[49m\u001b[43mquery\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mk\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mfilter\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mfilter\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfetch_k\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfetch_k\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\n\u001b[0;32m 532\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 533\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m [doc \u001b[38;5;28;01mfor\u001b[39;00m doc, _ \u001b[38;5;129;01min\u001b[39;00m docs_and_scores]\n", - "File \u001b[1;32mc:\\Users\\timmy_3aupohg\\anaconda3\\envs\\smog_env\\Lib\\site-packages\\langchain_community\\vectorstores\\faiss.py:402\u001b[0m, in \u001b[0;36mFAISS.similarity_search_with_score\u001b[1;34m(self, query, k, filter, fetch_k, **kwargs)\u001b[0m\n\u001b[0;32m 378\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21msimilarity_search_with_score\u001b[39m(\n\u001b[0;32m 379\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[0;32m 380\u001b[0m query: \u001b[38;5;28mstr\u001b[39m,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 384\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[0;32m 385\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m List[Tuple[Document, \u001b[38;5;28mfloat\u001b[39m]]:\n\u001b[0;32m 386\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Return docs most similar to query.\u001b[39;00m\n\u001b[0;32m 387\u001b[0m \n\u001b[0;32m 388\u001b[0m \u001b[38;5;124;03m Args:\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 400\u001b[0m \u001b[38;5;124;03m L2 distance in float. Lower score represents more similarity.\u001b[39;00m\n\u001b[0;32m 401\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 402\u001b[0m embedding \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_embed_query\u001b[49m\u001b[43m(\u001b[49m\u001b[43mquery\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 403\u001b[0m docs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msimilarity_search_with_score_by_vector(\n\u001b[0;32m 404\u001b[0m embedding,\n\u001b[0;32m 405\u001b[0m k,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 408\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs,\n\u001b[0;32m 409\u001b[0m )\n\u001b[0;32m 410\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m docs\n", - "File \u001b[1;32mc:\\Users\\timmy_3aupohg\\anaconda3\\envs\\smog_env\\Lib\\site-packages\\langchain_community\\vectorstores\\faiss.py:156\u001b[0m, in \u001b[0;36mFAISS._embed_query\u001b[1;34m(self, text)\u001b[0m\n\u001b[0;32m 154\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39membedding_function\u001b[38;5;241m.\u001b[39membed_query(text)\n\u001b[0;32m 155\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 156\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43membedding_function\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtext\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;31mTypeError\u001b[0m: 'FAISS' object is not callable" + "name": "stdout", + "output_type": "stream", + "text": [ + "206 4-5. Using the driving support systems\n", + "COROLLA_UWARNING\n", + "■Before using LDA system\n", + "●Do not rely solely upon the LDA \n", + "system. The LDA system does \n", + "not automatically drive the vehi-cle or reduce the amount of \n", + "attention that must be paid to \n", + "the area in front of the vehicle. The driver must always assume \n", + "full responsibilit y for driving \n", + "safely by paying careful atten-\n", + "tion to the surrounding condi-tions and operating the steering \n", + "wheel to correct the path of the \n", + "vehicle. Also, the driver must take adequate breaks when \n", + "fatigued, such as from driving \n", + "for a long period of time.\n", + "●Failure to perform appropriate \n", + "driving operations and pay care-\n", + "ful attention may lead to an \n", + "accident, resulting in death or serious injury.\n", + "●When not using the LDA sys-\n", + "tem, use the LDA switch to turn \n", + "the system off.\n", + "■Situations unsuitable for LDA system\n", + "In the following situations, use the LDA switch to turn the system off. \n", + "Failure to do so may lead to an \n", + "accident, resulting in death or serious injury.\n", + "●Vehicle is driven on a road sur-\n", + "face which is slippery due to \n", + "rainy weather, fallen snow, freezing, etc.\n", + "●Vehicle is driven on a snow-cov-\n", + "ered road.\n", + "●White (yellow) lin es are difficult \n", + "to see due to rain, snow, fog, \n", + "dust, etc.\n", + "●A spare tire, tire chains, etc. are \n", + "equipped.●When the tires have been excessively worn, or when the \n", + "tire inflation p ressure is low.\n", + "●When tires of a size other than specified are installed.\n", + "●Vehicle is driven in traffic lanes \n", + "other than that highways and \n", + "freeways.\n", + "●During emergency towing.\n", + "■Preventing LDA system mal-functions and operations per-\n", + "formed by mistake\n", + "●Do not modify the headlights or place stickers, etc. on the sur-\n", + "face of the lights.\n", + "●Do not modify the suspension etc. If the suspension etc. needs \n", + "to be replaced, contact your \n", + "Toyota dealer.\n", + "●Do not install or place anything on the hoo d or grille. Also, do \n", + "not install a gr ille guard (bull \n", + "bars, kangaroo bar, etc.).\n", + "●If your windshield needs repairs, contact your Toyota \n", + "dealer.\n", + "■Conditions in which functions \n", + "may not operate properly\n", + "In the following situations, the \n", + "functions may not operate prop-erly and the vehicle may depart \n", + "from its lane. Drive safely by \n", + "always paying careful attention to your surroundings and operate \n", + "the steering whee l to correct the \n", + "path of the vehicle without relying \n", + "solely on the functions.\n", + "●Vehicle is being driven around a sharp curve.\n", + "https://www.MyCarManual.com\n" ] } ], "source": [ - "search_result, all = search(db, \"What is LDA\")\n", + "search_result, all, pages = search(db, \"What is LDA\")\n", "print( search_result )" ] }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[205, 208, 204, 212]" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pages" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/loggings/__init__.py b/loggings/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/loggings/__pycache__/__init__.cpython-311.pyc b/loggings/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..916d547fff74a5695797d9fd0adf0549d858908c GIT binary patch literal 193 zcmZ3^%ge<81hdRGrh(|kAOZ#$p^VRLK*n^26oz01O-8?!3`I;p{%4TnuaIP`n9$S#`4wvNj2FkW*o75%&B0A-_u7-@9|Kx011DDQ}F23ZuPt_ ztV2ou9TQfmV!4K4ItJMr=UD}HI%Nj-N^|pwG=0;?B~n~0&dpo+Ew&sq#5N`b8LV1L z(R5Oz@`mf#$frsRIl6^CQW~R~L1)TGlzEYgE}>Ef`7J8r9h3NkDmL20y6Lg3w)R}B zuGF5@*rST3#dJX}m-Z+H_2#QbmK_0`1~FZR?*s8*tMYI-tCr-i9Mz}(;1MTr}OT;ao1n7!V; R-^0 literal 0 HcmV?d00001 diff --git a/loggings/app.log b/loggings/app.log new file mode 100644 index 00000000..762510e3 --- /dev/null +++ b/loggings/app.log @@ -0,0 +1,28 @@ +2024-08-05 22:09:11,365 - INFO - Loading and creating vector store for ./data/corolla-2020-toyota-owners-manual.pdf +2024-08-05 22:09:11,365 - INFO - Loading document from ./data/corolla-2020-toyota-owners-manual.pdf +2024-08-05 22:09:11,365 - INFO - Checking if the document is a pdf +2024-08-05 22:09:11,365 - INFO - Document is a pdf +2024-08-05 22:09:11,365 - INFO - Loading and splitting the document +2024-08-05 22:09:56,949 - INFO - Document loaded and split into 588 pages +2024-08-05 22:09:56,949 - INFO - Creating vector store +2024-08-05 22:10:06,736 - INFO - Loading faiss with AVX2 support. +2024-08-05 22:10:06,774 - INFO - Successfully loaded faiss with AVX2 support. +2024-08-05 22:10:06,800 - INFO - Vector store created +2024-08-05 22:10:06,802 - INFO - Saving the vector store +2024-08-05 22:11:24,966 - INFO - Loading and creating vector store for ./data/corolla-2020-toyota-owners-manual.pdf +2024-08-05 22:11:24,966 - INFO - Loading document from ./data/corolla-2020-toyota-owners-manual.pdf +2024-08-05 22:11:24,966 - INFO - Checking if the document is a pdf +2024-08-05 22:11:24,966 - INFO - Document is a pdf +2024-08-05 22:11:24,966 - INFO - Loading and splitting the document +2024-08-05 22:12:09,202 - INFO - Document loaded and split into 588 pages +2024-08-05 22:12:09,202 - INFO - Creating vector store +2024-08-05 22:12:19,066 - INFO - Loading faiss with AVX2 support. +2024-08-05 22:12:19,089 - INFO - Successfully loaded faiss with AVX2 support. +2024-08-05 22:12:19,123 - INFO - Vector store created +2024-08-05 22:12:19,123 - INFO - Saving the vector store +2024-08-05 22:12:19,131 - INFO - Vector store saved +2024-08-05 22:12:55,111 - INFO - Loading faiss with AVX2 support. +2024-08-05 22:12:55,144 - INFO - Successfully loaded faiss with AVX2 support. +2024-08-05 22:12:55,205 - INFO - Receiving the search query +2024-08-05 22:13:04,060 - INFO - Searching for what is LDA? +2024-08-05 22:13:04,241 - INFO - Search completed diff --git a/loggings/logging_config.py b/loggings/logging_config.py new file mode 100644 index 00000000..b8535061 --- /dev/null +++ b/loggings/logging_config.py @@ -0,0 +1,19 @@ +import logging +import logging.handlers +import os + +# Create loggings directory if it doesn't exist +if not os.path.exists('loggings'): + os.makedirs('loggings') + +# Define the logging configuration +LOG_FILE = 'loggings/app.log' + +logging.basicConfig(level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s', + handlers=[ + logging.FileHandler(LOG_FILE), + logging.StreamHandler() + ]) + +logger = logging.getLogger(__name__) diff --git a/search.py b/search.py new file mode 100644 index 00000000..258ee37f --- /dev/null +++ b/search.py @@ -0,0 +1,25 @@ +from data_ingestion.utils import search, load_embedded_data +import sys, os + +# Add the root directory to sys.path +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from loggings.logging_config import logger + + + +# loading the embedded data +embed_db = load_embedded_data() + + + +if __name__ == "__main__": + logger.info("Receiving the search query") + query = input("Enter the search query: ") + logger.info(f"Searching for {query}") + page_content, all, pages = search(embed_db, query) + logger.info("Search completed") + logger.info(f"Page content: {page_content}") + print(f"Page content: {page_content}") + print(f"Pages: {pages}") + print(f"All: {all}") + print("Search completed") \ No newline at end of file diff --git a/vec-db/index/faiss_index_rand/index.faiss b/vec-db/index/faiss_index_pdf/index.faiss similarity index 100% rename from vec-db/index/faiss_index_rand/index.faiss rename to vec-db/index/faiss_index_pdf/index.faiss diff --git a/vec-db/index/faiss_index_rand/index.pkl b/vec-db/index/faiss_index_pdf/index.pkl similarity index 94% rename from vec-db/index/faiss_index_rand/index.pkl rename to vec-db/index/faiss_index_pdf/index.pkl index 046f332aae6b3a6b8f70cd92b133491d862611b3..3492cbc0660f8b3d1b02c3a88edc7168024a2ac9 100644 GIT binary patch delta 34481 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 K?~{K1>i-vpn|_Y~ delta 34396 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 Wy!9TZ9ba8Db$NOEy-xetEB}AzgYnw{