From 08e9f2899d748ae95bd1324108d10d688e3592a7 Mon Sep 17 00:00:00 2001 From: Stefan Krawczyk Date: Mon, 4 Mar 2024 22:48:30 -0800 Subject: [PATCH] Adds RAG example on how to chunk Hamilton documentation (#721) This is the first part of a RAG pipeline - document ingestion. This uses langchain's text splitting functionality, you could easily replace this with your own logic. The DAG though is run and defined in Hamilton -- and the processing of each URL is done in parallel. You could easily farm this out to Ray or Dask, and even pyspark as well... See the README for more info. --- .../scraping_and_chunking/README.md | 147 ++++++++++++++++ .../scraping_and_chunking/doc_pipeline.py | 162 ++++++++++++++++++ .../scraping_and_chunking/pipeline.png | Bin 0 -> 99166 bytes .../scraping_and_chunking/requirements.txt | 6 + .../scraping_and_chunking/run.py | 37 ++++ .../scraping_and_chunking/run_dask.py | 42 +++++ .../scraping_and_chunking/run_ray.py | 41 +++++ .../spark/doc_pipeline.py | 12 +- .../spark/requirements.txt | 7 + .../spark/spark_pipeline.py | 15 +- 10 files changed, 459 insertions(+), 10 deletions(-) create mode 100644 examples/LLM_Workflows/scraping_and_chunking/README.md create mode 100644 examples/LLM_Workflows/scraping_and_chunking/doc_pipeline.py create mode 100644 examples/LLM_Workflows/scraping_and_chunking/pipeline.png create mode 100644 examples/LLM_Workflows/scraping_and_chunking/requirements.txt create mode 100644 examples/LLM_Workflows/scraping_and_chunking/run.py create mode 100644 examples/LLM_Workflows/scraping_and_chunking/run_dask.py create mode 100644 examples/LLM_Workflows/scraping_and_chunking/run_ray.py create mode 100644 examples/LLM_Workflows/scraping_and_chunking/spark/requirements.txt diff --git a/examples/LLM_Workflows/scraping_and_chunking/README.md b/examples/LLM_Workflows/scraping_and_chunking/README.md new file mode 100644 index 000000000..87de23be2 --- /dev/null +++ b/examples/LLM_Workflows/scraping_and_chunking/README.md @@ -0,0 +1,147 @@ +# Scraping and Chunking +Scraping and chunking are an important part of any RAG dataflow. Typically they're +the start of your "backend" operations to populate for example your vector database. + +## High Level Explanation +Here we show how to model this process with Hamilton, but also we show how to avoid +dealing with executors and control flow logic that can make your code hard to maintain, test, and reuse. +For the latter case, see the example code below. You would typically see this in a scraping and chunking workflow to +parallelize it. `some_func` below would be some large function, or wrapper around logic to process each +URL. The point to grok, is that you have to deal with this +control flow logic yourself to orchestrate your code -- which invariably tightly couples it and +makes it harder to test and reuse. +```python +def scrape(urls: list) -> list: + all_data = [] + with concurrent.futures.ThreadPoolExecutor(max_workers=MAX) as executor: + futures = [ + executor.submit( + some_func, url, func_args... + ) + for url in urls + ] + with tqdm(total=len(urls)) as pbar: + for _ in concurrent.futures.as_completed(futures): + pbar.update(1) + for future in futures: + data = future.result() + all_data += data + return all_data +``` +## +Instead, with Hamilton, you can write the processing logic INDEPENDENT of having to deal +with the for loop and control logic to submit to the executor. This is a big win, because +it means you can easily unit test your code, reuse it, and then scale it to run in parallel without +coupling to a specific execution system. + +To start, we can "unravel" `some_func` above into a DAG of operations (a simple linear chain here): +```python + +def article_regex() -> str: + """This assumes you're using the furo theme for sphinx""" + return r'
(.*?)
' + + +def article_text(url: str, article_regex: str) -> str: + """Pulls URL and takes out relevant HTML. + + :param url: the url to pull. + :param article_regex: the regext to use to get the contents out of. + :return: sub-portion of the HTML + """ + html = requests.get(url) + article = re.findall(article_regex, html.text, re.DOTALL) + if not article: + raise ValueError(f"No article found in {url}") + text = article[0].strip() + return text + +def processed_article(article_text: str) -> list: + """Processes the article text. + + :param article_text: the text to process. + :return: the processed text. + """ + # do some processing, even saving it, etc. + return article_text +``` +Next we can then "parallelize" & "collect" it over inputs, i.e. "map" over it with various values. To tell Hamilton to +do that we'd add the following functions to "sandwich" the code above: +```python +def url(urls_from_sitemap: list[str], max_urls: int = 1000) -> Parallelizable[str]: + """ + Takes in a list of URLs for parallel processing. + + Note: this could be in a separate module, but it's here for simplicity. + """ + for url in urls_from_sitemap[0:max_urls]: + yield url + +# The previous Hamilton code could live here, or if in another module, Hamilton +# would stitch the graph together correctly. + +def collect_processed_articles(processed_article: Collect[list]) -> list: + """Function to collect the results from parallel processing. + Note: all `processed_article` results are pulled into memory. So, if you have a lot of results, + you may want to write them to a datastore and pass pointers instead. + """ + return list(url_result) +``` +The magic is in the `Parallelizable` & `Collect` types. This tells Hamilton to run what is between them +in parallel as a single task. For more information see the +[parallel documentation](https://hamilton.dagworks.io/en/latest/concepts/parallel-task/) and +[examples](https://github.com/DAGWorks-Inc/hamilton/tree/main/examples/parallelism). + +## Let's explain the example + +Here is an image of the pipeline when run locally, or via ray or dask: +![pipeline](pipeline.png) + +The pipeline is a simple one that: +1. takes in a sitemap.xml file and creates a list of all the URLs in the file. Defaults to Hamilton's. +2. For each URL the process is then parallelized (green border). +3. each url is pulled and stripped to the relevant body of HTML. +4. the HTML is then chunked into smaller pieces -- returning langchain documents +5. what this doesn't do is create embeddings -- but that would be easy to extend. +6. then all the results are collected (red border) and returned. + +What this leaves us with is a general way to then plug in various executors to run the code in parallel. +This is what the `run.py`, `run_dask.py`, `run_ray.py`, and `spark/spark_pipeline.py` files do. They run the same code, but on different +execution systems. + +### File Structure +Here we explain the file structure of the example: + + - `doc_pipeline.py` - the main file that contains the Hamilton code that defines the document chunking pipeline. + - `run.py` - code that you would invoke to run `doc_pipeline` locally, or in a single python process. + - `run_dask.py` - code that you would invoke to run `doc_pipeline` on a Dask cluster / or dask locally. + - `run_ray.py` - code that you would invoke to run `doc_pipeline` on a Ray cluster / or ray locally. + - `spark/doc_pipeline.py` - the main file that contains the Hamilton code that defines the document chunking pipeline, +but adjusted for PySpark. + - `spark/spark_pipeline.py` - code that you would invoke to run `spark/doc_pipeline` on a Spark cluster / or spark locally. + - `spark/README.md` - more details on running the Spark example and why the code differs slightly. + +### Running the example +Make sure you have the right python dependencies installed for the execution system you want to use. +See `requirements.txt` (or `spark/requirements.txt`) for the dependencies you need to install. + +Then you can run the example with the following commands: +```bash +python run.py +python run_dask.py +python run_ray.py +python spark/spark_pipeline.py +``` +See `spark/README.md` for more details on running the Spark example and why the code differs slightly. + +## Extensions / what to do next +This example is a simple one, but it's easy to extend. For example, you could: + +* add a step to create embeddings from the chunked documents. +* you could also add a step to save the results to a database, or to a file system. +* you'd also likely tune the parallelism to ensure you don't DoS the resource you're hitting. + +## Hamilton over Langchain +Hamilton is a general purpose tool, and what we've described here applies broadly +to any code that you might write: data, machine learning, LLMs, web processing, etc. You can +even use it with parts of LangChain! diff --git a/examples/LLM_Workflows/scraping_and_chunking/doc_pipeline.py b/examples/LLM_Workflows/scraping_and_chunking/doc_pipeline.py new file mode 100644 index 000000000..f1d3af5f3 --- /dev/null +++ b/examples/LLM_Workflows/scraping_and_chunking/doc_pipeline.py @@ -0,0 +1,162 @@ +""" +Things this module does. + + 1. takes in a sitemap.xml file and creates a list of all the URLs in the file. + 2. takes in a list of URLs and pulls the HTML from each URL. + 3. it then strips the HTML to the relevant body of HTML. + html/body/div[class="page"]/div[class="main"]/div[class="content"]/div[class="article-container"]/article + 4. it then chunks the HTML into smaller pieces -- returning langchain documents + 5. what this doesn't do is create embeddings -- but that would be easy to extend. +""" + +import re + +import requests +from langchain import text_splitter +from langchain_core import documents + +from hamilton.htypes import Collect, Parallelizable + + +def sitemap_text(sitemap_url: str = "https://hamilton.dagworks.io/en/latest/sitemap.xml") -> str: + """Takes in a sitemap URL and returns the sitemap.xml file. + + :param sitemap_url: the URL of sitemap.xml file + :return: + """ + sitemap = requests.get(sitemap_url) + return sitemap.text + + +def urls_from_sitemap(sitemap_text: str) -> list[str]: + """Takes in a sitemap.xml file contents and creates a list of all the URLs in the file. + + :param sitemap_text: the contents of a sitemap.xml file + :return: list of URLs + """ + urls = re.findall(r"(.*?)", sitemap_text) + return urls + + +def url(urls_from_sitemap: list[str], max_urls: int = 1000) -> Parallelizable[str]: + """ + Takes in a list of URLs for parallel processing. + + Note: this could be in a separate module, but it's here for simplicity. + """ + for url in urls_from_sitemap[0:max_urls]: + yield url + + +# --- Start Parallel Code --- +# The following code is parallelized, once for each url. +# This code could be in a separate module, but it's here for simplicity. + + +def article_regex() -> str: + """This assumes you're using the furo theme for sphinx""" + return r'
(.*?)
' + + +def article_text(url: str, article_regex: str) -> str: + """Pulls URL and takes out relevant HTML. + + :param url: the url to pull. + :param article_regex: the regext to use to get the contents out of. + :return: sub-portion of the HTML + """ + html = requests.get(url) + article = re.findall(article_regex, html.text, re.DOTALL) + if not article: + raise ValueError(f"No article found in {url}") + text = article[0].strip() + return text + + +def html_chunker() -> text_splitter.HTMLHeaderTextSplitter: + """Return HTML chunker object. + + :return: + """ + headers_to_split_on = [ + ("h1", "Header 1"), + ("h2", "Header 2"), + ("h3", "Header 3"), + ] + return text_splitter.HTMLHeaderTextSplitter(headers_to_split_on=headers_to_split_on) + + +def text_chunker( + chunk_size: int = 256, chunk_overlap: int = 32 +) -> text_splitter.RecursiveCharacterTextSplitter: + """Returns the text chunker object. + + :param chunk_size: + :param chunk_overlap: + :return: + """ + return text_splitter.RecursiveCharacterTextSplitter( + chunk_size=chunk_size, chunk_overlap=chunk_overlap + ) + + +def chunked_text( + article_text: str, + html_chunker: text_splitter.HTMLHeaderTextSplitter, + text_chunker: text_splitter.RecursiveCharacterTextSplitter, +) -> list[documents.Document]: + """This function takes in HTML, chunks it, and then chunks it again. + + It then outputs a list of langchain "documents". Multiple documents for one HTML header section is possible. + + :param article_text: + :param html_chunker: + :param text_chunker: + :return: + """ + header_splits = html_chunker.split_text(article_text) + splits = text_chunker.split_documents(header_splits) + return splits + + +def url_result(url: str, article_text: str, chunked_text: list[documents.Document]) -> dict: + """Function to aggregate what we want to return from parallel processing. + + Note: this function is where you could cache the results to a datastore. + + :param url: + :param article_text: + :param chunked_text: + :return: + """ + return {"url": url, "article_text": article_text, "chunks": chunked_text} + + +# --- END Parallel Code --- + + +def collect_chunked_url_text(url_result: Collect[dict]) -> list: + """Function to collect the results from parallel processing. + Note: All results for `url_result` are pulled into memory here. + So, if you have a lot of results, you may want to write them to a datastore and pass pointers. + """ + return list(url_result) + + +if __name__ == "__main__": + # code here for quickly testing the build of the code here. + import doc_pipeline + + from hamilton import driver + from hamilton.execution import executors + + dr = ( + driver.Builder() + .with_modules(doc_pipeline) + .enable_dynamic_execution(allow_experimental_mode=True) + .with_config({}) + .with_local_executor(executors.SynchronousLocalTaskExecutor()) + .with_remote_executor(executors.MultiProcessingExecutor(max_tasks=5)) + .build() + ) + dr.display_all_functions("pipeline.png") diff --git a/examples/LLM_Workflows/scraping_and_chunking/pipeline.png b/examples/LLM_Workflows/scraping_and_chunking/pipeline.png new file mode 100644 index 0000000000000000000000000000000000000000..e56716533f2df427f3c855911f1403566ac4429a GIT binary patch literal 99166 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 literal 0 HcmV?d00001 diff --git a/examples/LLM_Workflows/scraping_and_chunking/requirements.txt b/examples/LLM_Workflows/scraping_and_chunking/requirements.txt new file mode 100644 index 000000000..2bbeba39e --- /dev/null +++ b/examples/LLM_Workflows/scraping_and_chunking/requirements.txt @@ -0,0 +1,6 @@ +langchain +langchain-core +sf-hamilton[visualization] +# optionally install Ray, or Dask, or both +# sf-hamilton[ray] +# sf-hamilton[dask] diff --git a/examples/LLM_Workflows/scraping_and_chunking/run.py b/examples/LLM_Workflows/scraping_and_chunking/run.py new file mode 100644 index 000000000..a9942deb4 --- /dev/null +++ b/examples/LLM_Workflows/scraping_and_chunking/run.py @@ -0,0 +1,37 @@ +""" +A basic script to run the pipeline defined in `doc_pipeline.py`. + +By default this runs parts of the pipeline in parallel using threads or processes. +To choose threads or processed uncomment the appropriate line in the `Builder` below. + +To scale processing here, see `run_ray.py`, `run_dask.py`, and `spark/spark_pipeline.py`. +""" + +import doc_pipeline + +from hamilton import driver +from hamilton.execution import executors + +if __name__ == "__main__": + + dr = ( + driver.Builder() + .with_modules(doc_pipeline) + .enable_dynamic_execution(allow_experimental_mode=True) + .with_config({}) + .with_local_executor(executors.SynchronousLocalTaskExecutor()) + # Choose a backend to process the parallel parts of the pipeline + .with_remote_executor(executors.MultiThreadingExecutor(max_tasks=5)) + # .with_remote_executor(executors.MultiProcessingExecutor(max_tasks=5)) + .build() + ) + dr.display_all_functions("pipeline.png") + result = dr.execute( + ["collect_chunked_url_text"], + inputs={"chunk_size": 256, "chunk_overlap": 32}, + ) + # do something with the result... + import pprint + + for chunk in result["collect_chunked_url_text"]: + pprint.pprint(chunk) diff --git a/examples/LLM_Workflows/scraping_and_chunking/run_dask.py b/examples/LLM_Workflows/scraping_and_chunking/run_dask.py new file mode 100644 index 000000000..e8fd2ecf6 --- /dev/null +++ b/examples/LLM_Workflows/scraping_and_chunking/run_dask.py @@ -0,0 +1,42 @@ +""" +Shows how to run document chunking using dask. +""" + +import logging + +import doc_pipeline +from dask import distributed + +from hamilton import driver, log_setup +from hamilton.plugins import h_dask + +log_setup.setup_logging(logging.INFO) + +if __name__ == "__main__": + cluster = distributed.LocalCluster() + client = distributed.Client(cluster) + remote_executor = h_dask.DaskExecutor(client=client) + + dr = ( + driver.Builder() + .with_modules(doc_pipeline) + .enable_dynamic_execution(allow_experimental_mode=True) + .with_config({}) + # Choose a backend to process the parallel parts of the pipeline + # .with_remote_executor(executors.MultiThreadingExecutor(max_tasks=5)) + # .with_remote_executor(executors.MultiProcessingExecutor(max_tasks=5)) + .with_remote_executor(h_dask.DaskExecutor(client=client)) + .build() + ) + dr.display_all_functions("pipeline.png") + result = dr.execute( + ["collect_chunked_url_text"], + inputs={"chunk_size": 256, "chunk_overlap": 32}, + ) + # do something with the result... + import pprint + + for chunk in result["collect_chunked_url_text"]: + pprint.pprint(chunk) + + client.shutdown() diff --git a/examples/LLM_Workflows/scraping_and_chunking/run_ray.py b/examples/LLM_Workflows/scraping_and_chunking/run_ray.py new file mode 100644 index 000000000..a85cfc33b --- /dev/null +++ b/examples/LLM_Workflows/scraping_and_chunking/run_ray.py @@ -0,0 +1,41 @@ +""" +Shows how to run document chunking using ray. +""" + +import logging + +import doc_pipeline +import ray + +from hamilton import driver, log_setup +from hamilton.plugins import h_ray + +if __name__ == "__main__": + log_setup.setup_logging(logging.INFO) + ray.init() + + dr = ( + driver.Builder() + .with_modules(doc_pipeline) + .enable_dynamic_execution(allow_experimental_mode=True) + .with_config({}) + # Choose a backend to process the parallel parts of the pipeline + # .with_remote_executor(executors.MultiThreadingExecutor(max_tasks=5)) + # .with_remote_executor(executors.MultiProcessingExecutor(max_tasks=5)) + .with_remote_executor( + h_ray.RayTaskExecutor() + ) # be sure to run ray.init() or pass in config. + .build() + ) + dr.display_all_functions("pipeline.png") + result = dr.execute( + ["collect_chunked_url_text"], + inputs={"chunk_size": 256, "chunk_overlap": 32}, + ) + # do something with the result... + import pprint + + for chunk in result["collect_chunked_url_text"]: + pprint.pprint(chunk) + + ray.shutdown() diff --git a/examples/LLM_Workflows/scraping_and_chunking/spark/doc_pipeline.py b/examples/LLM_Workflows/scraping_and_chunking/spark/doc_pipeline.py index 6b89dedfe..b02f8cfdc 100644 --- a/examples/LLM_Workflows/scraping_and_chunking/spark/doc_pipeline.py +++ b/examples/LLM_Workflows/scraping_and_chunking/spark/doc_pipeline.py @@ -1,11 +1,17 @@ +""" +This module is a modified version to enable it to be used in a spark job. + +Notably at the end we create a module level variable that contains a list of functions that are spark safe. +This is used by the `@h_spark.with_columns` decorator to tell it which functions define the subdag +and use the dataframe that the function declares a dependency upon. +""" + import json import re import requests from langchain import text_splitter -# from langchain_core import documents - def article_regex() -> str: """This assumes you're using the furo theme for sphinx""" @@ -77,6 +83,8 @@ def chunked_text( return [json.dumps(s.to_json()) for s in splits] +# this is a helper variable that we use to tell `@h_spark.with_columns` decorator which functions we want +# it to create the subdag with that will take in and operate over the dataframe depended on. spark_safe = [ article_regex, article_text, diff --git a/examples/LLM_Workflows/scraping_and_chunking/spark/requirements.txt b/examples/LLM_Workflows/scraping_and_chunking/spark/requirements.txt new file mode 100644 index 000000000..42898b943 --- /dev/null +++ b/examples/LLM_Workflows/scraping_and_chunking/spark/requirements.txt @@ -0,0 +1,7 @@ +langchain +langchain-core +pyspark +sf-hamilton[visualization] +# optionally install Ray, or Dask, or both +# sf-hamilton[ray] +# sf-hamilton[dask] diff --git a/examples/LLM_Workflows/scraping_and_chunking/spark/spark_pipeline.py b/examples/LLM_Workflows/scraping_and_chunking/spark/spark_pipeline.py index daa73dc9a..c78cc32ef 100644 --- a/examples/LLM_Workflows/scraping_and_chunking/spark/spark_pipeline.py +++ b/examples/LLM_Workflows/scraping_and_chunking/spark/spark_pipeline.py @@ -48,14 +48,9 @@ def urls_from_sitemap( return df -""" -with_columns makes some assumptions: -(a) that all functions in the with_columns subdag take in the dataframe -(b) that all intermediate functions in the subdag need to become columns in the dataframe -(c) it doesn't allow you to wire through inputs to the subdag -""" - - +# with_columns makes some assumptions: +# (a) that all functions in the with_columns subdag take in some part of the dataframe +# (b) that all intermediate functions in the with_columns subdag need to become columns in the dataframe @h_spark.with_columns( *doc_pipeline.spark_safe, select=["article_text", "chunked_text"], @@ -64,6 +59,10 @@ def urls_from_sitemap( def chunked_url_text(urls_from_sitemap: ps.DataFrame) -> ps.DataFrame: """Creates dataframe with chunked text from URLs appended as columns. + I.e. `urls_from_sitemap` declares the dependency, and then + `with_columns` runs and appends columns to it, and then the + internal part of this function is called. + :param urls_from_sitemap: :return: """