From e4a8ec281ab1580395570a8c277639e2e9d4a54e Mon Sep 17 00:00:00 2001 From: Prashant Dixit <54981696+PrashantDixit0@users.noreply.github.com> Date: Sun, 21 Apr 2024 10:15:21 +0530 Subject: [PATCH] Locally RAG from Scratch (#171) * assests and app name * update README * demo gifs * talk with github codespaces * talk with github codespaces * gitignore * linted * added version * link fix * added local llm tag * crag * link fix * lint * llm tags * non-clickable badge * non-clickable badge * fix * tutorial llm tags * added instructions and fix * colab fix * fix * formatted * hybrid search and rag colab * colab format * python test * node test * python test * blog link update * rag mlx * myntra search engine app * link fix * CrewAI Example * lint * node test * node test * node test * added readme * support for Gemini Pro * fix * chunking techniques * lint * Locally RAG from Scratch * lint * llama3 added * link finx --- README.md | 3 +- assets/RAG-locally.png | Bin 0 -> 64711 bytes .../Langchain-LlamaIndex-Chunking/README.md | 2 +- tutorials/Local-RAG-from-Scratch/README.md | 14 +++ tutorials/Local-RAG-from-Scratch/lease.txt | 76 ++++++++++++ tutorials/Local-RAG-from-Scratch/rag.py | 111 ++++++++++++++++++ .../Local-RAG-from-Scratch/requirments.txt | 4 + 7 files changed, 208 insertions(+), 2 deletions(-) create mode 100644 assets/RAG-locally.png create mode 100644 tutorials/Local-RAG-from-Scratch/README.md create mode 100644 tutorials/Local-RAG-from-Scratch/lease.txt create mode 100644 tutorials/Local-RAG-from-Scratch/rag.py create mode 100644 tutorials/Local-RAG-from-Scratch/requirments.txt diff --git a/README.md b/README.md index 9ec5d28d..d102f852 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,8 @@ Looking to get started with LLMs, vectorDBs, and the world of Generative AI? The | --------- | -------------------------- | ----------- | | | | | | [Build RAG from Scratch](./tutorials/RAG-from-Scratch) | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/lancedb/vectordb-recipes/blob/main/tutorials/RAG-from-Scratch/RAG_from_Scratch.ipynb) [![LLM](https://img.shields.io/badge/openai-api-white)](#) | | -| [Langchain LlamaIndex Chunking](./tutorials/RAG-from-Scratch) | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/lancedb/vectordb-recipes/blob/main/tutorials/RAG-from-Scratch/RAG_from_Scratch.ipynb)| [![Ghost](https://img.shields.io/badge/ghost-000?style=for-the-badge&logo=ghost&logoColor=%23F7DF1E)](https://blog.lancedb.com/product-quantization-compress-high-dimensional-vectors-dfcba98fab47) | +| [Local RAG from Scratch with Llama3](./tutorials/Local-RAG-from-Scratch) | [![Python](https://img.shields.io/badge/python-3670A0?style=for-the-badge&logo=python&logoColor=ffdd54)](./tutorials/Local-RAG-from-Scratch/rag.py) [![local LLM](https://img.shields.io/badge/local-llm-green)](#) | | +| [Langchain LlamaIndex Chunking](./tutorials/Langchain-LlamaIndex-Chunking) | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/lancedb/vectordb-recipes/blob/main/tutorials/Langchain-LlamaIndex-Chunking/Langchain_Llamaindex_chunking.ipynb)| [![Ghost](https://img.shields.io/badge/ghost-000?style=for-the-badge&logo=ghost&logoColor=%23F7DF1E)](https://blog.lancedb.com/chunking-techniques-with-langchain-and-llamaindex/) | | [Product Quantization: Compress High Dimensional Vectors](https://blog.lancedb.com/product-quantization-compress-high-dimensional-vectors-dfcba98fab47) | | [![Ghost](https://img.shields.io/badge/ghost-000?style=for-the-badge&logo=ghost&logoColor=%23F7DF1E)](https://blog.lancedb.com/product-quantization-compress-high-dimensional-vectors-dfcba98fab47) | | [Corrective RAG with Langgraph](./tutorials/Corrective-RAG-with_Langgraph/) | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/lancedb/vectordb-recipes/blob/main/tutorials/Corrective-RAG-with_Langgraph/CRAG_with_Langgraph.ipynb) [![LLM](https://img.shields.io/badge/openai-api-white)](#) | [![Ghost](https://img.shields.io/badge/ghost-000?style=for-the-badge&logo=ghost&logoColor=%23F7DF1E)](https://blog.lancedb.com/implementing-corrective-rag-in-the-easiest-way-2/)| | [LLMs, RAG, & the missing storage layer for AI](https://blog.lancedb.com/llms-rag-the-missing-storage-layer-for-ai-28ded35fa984) | | [![Ghost](https://img.shields.io/badge/ghost-000?style=for-the-badge&logo=ghost&logoColor=%23F7DF1E)](https://blog.lancedb.com/llms-rag-the-missing-storage-layer-for-ai-28ded35fa984/) | diff --git a/assets/RAG-locally.png b/assets/RAG-locally.png new file mode 100644 index 0000000000000000000000000000000000000000..468a42e722591734287e5e65f727fbfa79855f3f GIT binary patch literal 64711 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 literal 0 HcmV?d00001 diff --git a/tutorials/Langchain-LlamaIndex-Chunking/README.md b/tutorials/Langchain-LlamaIndex-Chunking/README.md index 3de1b089..42549094 100644 --- a/tutorials/Langchain-LlamaIndex-Chunking/README.md +++ b/tutorials/Langchain-LlamaIndex-Chunking/README.md @@ -4,4 +4,4 @@ We have comprehensively covered all the chunking techniques available in Langchain and LlamaIndex. -[Read More in Blog](https://blog.lancedb.com/chunking-techiniques-with-langchain-and-llamaindex/) \ No newline at end of file +[Read More in Blog](https://blog.lancedb.com/chunking-techniques-with-langchain-and-llamaindex/) \ No newline at end of file diff --git a/tutorials/Local-RAG-from-Scratch/README.md b/tutorials/Local-RAG-from-Scratch/README.md new file mode 100644 index 00000000..6ca9d41a --- /dev/null +++ b/tutorials/Local-RAG-from-Scratch/README.md @@ -0,0 +1,14 @@ +## Locally RAG from Scratch with Llama3 + +This example demonstrates RAG built from scratch without using any supporting framework like Langchain and LlamaIndex. + +![alt text](<../../assets/RAG-locally.png>) + +This easy to build RAG locally can be done in following steps: + +1. Reading Document and Recursive Text Splitting +2. Setup LanceDB table with schema and LanceDB Embedding API +3. Insert Chunks in LanceDB table +4. Query your question(This step will do semantic search and use Llama3 llm for resulting output) + +**NOTE:** You can change document and query in document both in `rag.py`, Try to run with your custom document with your custom query questions. \ No newline at end of file diff --git a/tutorials/Local-RAG-from-Scratch/lease.txt b/tutorials/Local-RAG-from-Scratch/lease.txt new file mode 100644 index 00000000..3c61558e --- /dev/null +++ b/tutorials/Local-RAG-from-Scratch/lease.txt @@ -0,0 +1,76 @@ +EX-10 2 elmonteleaseforfiling.htm MATERIAL CONTRACT +COMMERCIAL LEASE AGREEMENT + + + +THIS LEASE AGREEMENT is made and entered into on December 1, 2013, by and between Temple CB, LLC, whose address is 4350 Temple City Boulevard, El Monte, California 91731 (hereinafter referred to as "Landlord"), and Okra Energy, Inc., whose address is 4350 Temple City Boulevard, El Monte, California 91731 (hereinafter referred to as "Tenant"). + + + +ARTICLE I - GRANT OF LEASE + + + +Landlord, in consideration of the rents to be paid and the covenants and agreements to be performed and observed by the Tenant, does hereby lease to the Tenant and the Tenant does hereby lease and take from the Landlord the property described in Exhibit "A" attached hereto and by reference made a part hereof (the "Leased Premises"), together with, as part of the parcel, all improvements located thereon. + + + +ARTICLE II - LEASE TERM + + + +Section l. Term of Lease. The term of this Lease shall begin on the Commencement Date, as defined in Section 2 of this Article II, and shall terminate on May 31, 2020 ("the Termination Date"); provided, however, that at the option of Tenant, Tenant may renew this Lease for five additional successive one- year terms at a Monthly Rent of $100,000 per month, provided that notice of such renewal is given in writing no less than 120 days prior to the Termination Date or the expiration of any one-year renewal term. Tenant may at any time cancel this Lease and terminate all of its obligations hereunder by the payment of $300,000, plus all other amounts then due under this Lease. + + + +Section 2. Commencement Date. The "Commencement Date" shall mean December 1, 2013. + + + +ARTICLE III - EXTENSIONS + + + +The parties hereto may elect to extend this Agreement upon such terms and conditions as may be agreed upon in writing and signed by the parties at the time of any such extension. + + + +ARTICLE IV - DETERMINATION OF RENT + + + +Section 1. Monthly Rent: The Tenant agrees to pay the Landlord and the Landlord agrees to accept, during the term hereof, at such place as the Landlord shall from time to time direct by notice to the Tenant, monthly rent of $40,000. + + +Section 2. Late Fee. A late fee in the amount of 5% of the Monthly Rent shall be assessed if payment is not postmarked or received by Landlord on or before the tenth day of each month. + + + +ARTICLE V - SECURITY DEPOSIT + + + +The Tenant has deposited with the Landlord the sum of Twenty Thousand Dollars ($20,000.00) as security for the full and faithful performance by the Tenant of all the terms of this lease required to be performed by the Tenant. Such sum shall be returned to the Tenant after the expiration of this lease, provided the Tenant has fully and faithfully carried out all of its terms. In the event of a bona fide sale of the property of which the leased premises are a part, the Landlord shall have the right to transfer the security to the purchaser to be held under the terms of this lease, and the Landlord shall be released from all liability for the return of such security to the Tenant. + + + +ARTICLE VI - TAXES + + + +Section l. Personal Property Taxes. The Tenant shall be liable for all taxes levied against any leasehold interest of the Tenant or personal property and trade fixtures owned or placed by the Tenant in the Leased Premises. + + + +Section 2. Real Estate Taxes. During the continuance of this lease Landlord shall deliver to Tenant a copy of any real estate taxes and assessments against the Leased Property. From and after the Commencement Date, the Tenant shall pay to Landlord not later than twenty-one (21) days after the day on which the same may become initially due, all real estate taxes and assessments applicable to the Leased Premises, together with any interest and penalties lawfully imposed thereon as a result of Tenant's late payment thereof, which shall be levied upon the Leased Premises during the term of this Lease. + + + +Section 3. Contest of Taxes. The Tenant, at its own cost and expense, may, if it shall in good faith so desire, contest by appropriate proceedings the amount of any personal or real property tax. The Tenant may, if it shall so desire, endeavor at any time or times, by appropriate proceedings, to obtain a reduction in the assessed valuation of the Leased Premises for tax purposes. In any such event, if the Landlord agrees, at the request of the Tenant, to join with the Tenant at Tenant's expense in said proceedings and the Landlord agrees to sign and deliver such papers and instruments as may be necessary to prosecute such proceedings, the Tenant shall have the right to contest the amount of any such tax and the Tenant shall have the right to withhold payment of any such tax, if the statute under which the Tenant is contesting such tax so permits. + + + +Section 4. Payment of Ordinary Assessments. The Tenant shall pay all assessments, ordinary and extraordinary, attributable to or against the Leased Premises not later than twenty-one (21) days after the day on which the same became initially due. The Tenant may take the benefit of any law allowing assessments to be paid in installments and in such event the Tenant shall only be liable for such installments of assessments due during the term hereof. + + + diff --git a/tutorials/Local-RAG-from-Scratch/rag.py b/tutorials/Local-RAG-from-Scratch/rag.py new file mode 100644 index 00000000..c55df8e9 --- /dev/null +++ b/tutorials/Local-RAG-from-Scratch/rag.py @@ -0,0 +1,111 @@ +import nltk +import pandas as pd + +nltk.download("punkt") +import re +import ollama + +# lancedb imports for embedding api +import lancedb +from lancedb.embeddings import get_registry +from lancedb.pydantic import LanceModel, Vector + + +# Recursive Text Splitter +def recursive_text_splitter(text, max_chunk_length=1000, overlap=100): + """ + Helper function for chunking text recursively + """ + # Initialize result + result = [] + + current_chunk_count = 0 + separator = ["\n", " "] + _splits = re.split(f"({separator})", text) + splits = [_splits[i] + _splits[i + 1] for i in range(1, len(_splits), 2)] + + for i in range(len(splits)): + if current_chunk_count != 0: + chunk = "".join( + splits[ + current_chunk_count + - overlap : current_chunk_count + + max_chunk_length + ] + ) + else: + chunk = "".join(splits[0:max_chunk_length]) + + if len(chunk) > 0: + result.append("".join(chunk)) + current_chunk_count += max_chunk_length + + return result + + +# define schema for table with embedding api + +model = get_registry().get("colbert").create(name="colbert-ir/colbertv2.0") + + +class TextModel(LanceModel): + text: str = model.SourceField() + vector: Vector(model.ndims()) = model.VectorField() + + +# add in vector db +def lanceDBConnection(df): + """ + LanceDB insertion + """ + db = lancedb.connect("/tmp/lancedb") + table = db.create_table( + "scratch", + schema=TextModel, + mode="overwrite", + ) + table.add(df) + return table + + +# Read Document +with open("lease.txt", "r") as file: + text_data = file.read() + +# Split the text using the recursive character text splitter +chunks = recursive_text_splitter(text_data, max_chunk_length=100, overlap=10) +df = pd.DataFrame({"text": chunks}) +table = lanceDBConnection(df) + +# Query Question +k = 5 +question = "When this lease document was created?" + +# Semantic Search +result = table.search(question).limit(5).to_list() +context = [r["text"] for r in result] + +# Context Prompt +base_prompt = """You are an AI assistant. Your task is to understand the user question, and provide an answer using the provided contexts. Every answer you generate should have citations in this pattern "Answer [position].", for example: "Earth is round [1][2].," if it's relevant. +Your answers are correct, high-quality, and written by an domain expert. If the provided context does not contain the answer, simply state, "The provided context does not have the answer." + +User question: {} + +Contexts: +{} +""" + +# llm +prompt = f"{base_prompt.format(question, context)}" + +response = ollama.chat( + model="llama3", + messages=[ + { + "role": "system", + "content": prompt, + }, + ], +) + +print(response["message"]["content"]) diff --git a/tutorials/Local-RAG-from-Scratch/requirments.txt b/tutorials/Local-RAG-from-Scratch/requirments.txt new file mode 100644 index 00000000..eaf8317a --- /dev/null +++ b/tutorials/Local-RAG-from-Scratch/requirments.txt @@ -0,0 +1,4 @@ +ollama +nltk +pandas +lancedb \ No newline at end of file