From 3b913aa47baa8a0c74c733f2d2bed113da1c2b04 Mon Sep 17 00:00:00 2001 From: Jerry Liu <jerryjliu98@gmail.com> Date: Mon, 12 Dec 2022 22:47:24 -0800 Subject: [PATCH] Add documentation (#96) Co-authored-by: Jerry Liu <jerry@robustintelligence.com> --- README.md | 62 ++++++--------- docs/Makefile | 20 +++++ docs/_static/composability/diagram.png | Bin 0 -> 31056 bytes docs/_static/composability/diagram_b0.png | Bin 0 -> 14133 bytes docs/_static/composability/diagram_b1.png | Bin 0 -> 30486 bytes docs/_static/composability/diagram_q1.png | Bin 0 -> 40713 bytes docs/_static/composability/diagram_q2.png | Bin 0 -> 55410 bytes docs/conf.py | 50 ++++++++++++ docs/getting_started/installation.md | 20 +++++ docs/getting_started/overview.rst | 4 + docs/getting_started/starter_example.md | 69 ++++++++++++++++ docs/how_to/composability.md | 53 +++++++++++++ docs/how_to/cost_analysis.md | 39 +++++++++ docs/how_to/custom_llms.md | 43 ++++++++++ docs/how_to/custom_prompts.md | 54 +++++++++++++ docs/how_to/data_connectors.md | 13 +++ docs/how_to/embeddings.md | 27 +++++++ docs/how_to/insert.md | 5 ++ docs/how_to/overview.rst | 4 + docs/index.rst | 75 ++++++++++++++++++ docs/make.bat | 35 ++++++++ docs/reference/example_notebooks.rst | 8 ++ docs/reference/indices.rst | 15 ++++ docs/reference/indices/list.rst | 9 +++ docs/reference/indices/list_query.rst | 7 ++ docs/reference/indices/table.rst | 8 ++ docs/reference/indices/table_query.rst | 7 ++ docs/reference/indices/tree.rst | 8 ++ docs/reference/indices/tree_query.rst | 7 ++ docs/reference/llm_predictor.rst | 10 +++ docs/reference/overview.rst | 4 + docs/reference/prompts.rst | 70 ++++++++++++++++ docs/reference/query.rst | 14 ++++ docs/reference/readers.rst | 6 ++ docs/requirements.txt | 3 + gpt_index/__init__.py | 13 +-- gpt_index/indices/__init__.py | 17 +++- gpt_index/indices/base.py | 36 ++++++++- gpt_index/indices/keyword_table/__init__.py | 13 ++- gpt_index/indices/keyword_table/base.py | 23 +++++- gpt_index/indices/keyword_table/rake_base.py | 6 +- .../indices/keyword_table/simple_base.py | 6 +- gpt_index/indices/list/__init__.py | 8 +- gpt_index/indices/list/base.py | 25 +++++- .../indices/query/keyword_table/__init__.py | 14 +++- .../indices/query/keyword_table/query.py | 43 +++++++++- gpt_index/indices/query/list/__init__.py | 7 +- .../indices/query/list/embedding_query.py | 15 +++- gpt_index/indices/query/list/query.py | 29 ++++++- gpt_index/indices/query/tree/__init__.py | 12 ++- .../indices/query/tree/embedding_query.py | 20 +++++ gpt_index/indices/query/tree/leaf_query.py | 18 +++++ .../indices/query/tree/retrieve_query.py | 8 ++ gpt_index/indices/tree/__init__.py | 9 ++- gpt_index/indices/tree/base.py | 18 ++++- gpt_index/langchain_helpers/chain_wrapper.py | 24 +++++- gpt_index/prompts/__init__.py | 6 +- gpt_index/readers/__init__.py | 26 +++++- gpt_index/readers/file.py | 13 ++- gpt_index/readers/mongo.py | 16 +++- gpt_index/readers/notion.py | 13 ++- gpt_index/readers/slack.py | 14 +++- gpt_index/readers/wikipedia.py | 7 +- tests/indices/list/__init__.py | 8 +- 64 files changed, 1141 insertions(+), 75 deletions(-) create mode 100644 docs/Makefile create mode 100644 docs/_static/composability/diagram.png create mode 100644 docs/_static/composability/diagram_b0.png create mode 100644 docs/_static/composability/diagram_b1.png create mode 100644 docs/_static/composability/diagram_q1.png create mode 100644 docs/_static/composability/diagram_q2.png create mode 100644 docs/conf.py create mode 100644 docs/getting_started/installation.md create mode 100644 docs/getting_started/overview.rst create mode 100644 docs/getting_started/starter_example.md create mode 100644 docs/how_to/composability.md create mode 100644 docs/how_to/cost_analysis.md create mode 100644 docs/how_to/custom_llms.md create mode 100644 docs/how_to/custom_prompts.md create mode 100644 docs/how_to/data_connectors.md create mode 100644 docs/how_to/embeddings.md create mode 100644 docs/how_to/insert.md create mode 100644 docs/how_to/overview.rst create mode 100644 docs/index.rst create mode 100644 docs/make.bat create mode 100644 docs/reference/example_notebooks.rst create mode 100644 docs/reference/indices.rst create mode 100644 docs/reference/indices/list.rst create mode 100644 docs/reference/indices/list_query.rst create mode 100644 docs/reference/indices/table.rst create mode 100644 docs/reference/indices/table_query.rst create mode 100644 docs/reference/indices/tree.rst create mode 100644 docs/reference/indices/tree_query.rst create mode 100644 docs/reference/llm_predictor.rst create mode 100644 docs/reference/overview.rst create mode 100644 docs/reference/prompts.rst create mode 100644 docs/reference/query.rst create mode 100644 docs/reference/readers.rst create mode 100644 docs/requirements.txt diff --git a/README.md b/README.md index b00595a634..657f7fcf24 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,38 @@ # 🗂️ ️GPT Index -GPT Index is a project consisting of a set of *data structures* that are created using GPT-3 and can be traversed using GPT-3 in order to answer queries. +GPT Index is a project consisting of a set of *data structures* that are created using LLMs and can be traversed using LLMs in order to answer queries. + +PyPi: https://pypi.org/project/gpt-index/. + +Documentation: https://gpt-index.readthedocs.io/en/latest/. ## 🚀 Overview #### Context -- GPT-3 is a phenomenonal piece of technology for knowledge generation and reasoning. -- A big limitation of GPT-3 is context size (e.g. Davinci's limit is 4096 tokens. Large, but not infinite). -- The ability to feed "knowledge" to GPT-3 is restricted to this limited prompt size and model weights. -- **Thought**: What if GPT-3 can have access to potentially a much larger database of knowledge without retraining/finetuning? +- LLMs are a phenomenonal piece of technology for knowledge generation and reasoning. +- A big limitation of LLMs is context size (e.g. OpenAI's `davinci` model for GPT-3 has a [limit](https://openai.com/api/pricing/) of 4096 tokens. Large, but not infinite). +- The ability to feed "knowledge" to LLMs is restricted to this limited prompt size and model weights. +- **Thought**: What if LLMs can have access to potentially a much larger database of knowledge without retraining/finetuning? #### Proposed Solution -That's where the **GPT Index** data structures come in. Instead of relying on world knowledge encoded in the model weights, a GPT Index data structure does the following: -- Uses a pre-trained GPT-3 model primarily for *reasoning*/*summarization* instead of prior knowledge. -- Takes as input a large corpus of text data and build a structured index over it (using GPT-3 or heuristics). -- Allow users to _query_ the index in order to synthesize an answer to the question - this requires both _traversal_ of the index as well as a synthesis of the answer. +That's where the **GPT Index** comes in. GPT Index is a simple, flexible interface between your external data and LLMs. It resolves the following pain points: + +- Provides simple data structures to resolve prompt size limitations. +- Offers data connectors to your external data sources. +- Offers you a comprehensive toolset trading off cost and performance. + +At the core of GPT Index is a **data structure**. Instead of relying on world knowledge encoded in the model weights, a GPT Index data structure does the following: + +- Uses a pre-trained LLM primarily for *reasoning*/*summarization* instead of prior knowledge. +- Takes as input a large corpus of text data and build a structured index over it (using an LLM or heuristics). +- Allow users to *query* the index in order to synthesize an answer to the question - this requires both *traversal* of the index as well as a synthesis of the answer. + +## 📄 Documentation + +Full documentation can be found here: https://gpt-index.readthedocs.io/en/latest/. + +Please check it out for the most up-to-date tutorials, how-to guides, references, and other resources! -The high-level design exercise of this project is to test the capability of GPT-3 as a general-purpose processor to organize and retrieve data. From our current understanding, related works have used GPT-3 to reason with external db sources (see below); this work links reasoning with knowledge building. ## 💻 Example Usage @@ -53,32 +69,6 @@ The main third-party package requirements are `transformers`, `openai`, and `lan All requirements should be contained within the `setup.py` file. To run the package locally without building the wheel, simply do `pip install -r requirements.txt`. -## Index Data Structures - -- [`Tree Index`](gpt_index/indices/tree/README.md): Tree data structures - - **Creation**: with GPT hierarchical summarization over sub-documents - - **Query**: with GPT recursive querying over multiple choice problems -- [`Keyword Table Index`](gpt_index/indices/keyword_table/README.md): a keyword-based table - - **Creation**: with GPT keyword extraction over each sub-document - - **Query**: with GPT keyword extraction over question, match to sub-documents. *Create and refine* an answer over candidate sub-documents. -- [`List Index`](gpt_index/indices/list/README.md): a simple list-based data structure - - **Creation**: by splitting documents into a list of text chunks - - **Query**: use GPT with a create and refine prompt iterately over the list of sub-documents - - -## Data Connectors - -We currently offer connectors into the following data sources. External data sources are retrieved through their APIs + corresponding authentication token. -- Notion (`NotionPageReader`) -- Google Drive (`GoogleDocsReader`) -- Slack (`SlackReader`) -- MongoDB (local) (`SimpleMongoReader`) -- Wikipedia (`WikipediaReader`) -- local file directory (`SimpleDirectoryReader`) - -Example notebooks of how to use data connectors are found in the [Data Connector Example Notebooks](examples/data_connectors). - - ## 🔬 Related Work [WIP] [Measuring and Narrowing the Compositionality Gap in Language Models, by Press et al.](https://arxiv.org/abs/2210.03350) diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000000..d4bb2cbb9e --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/_static/composability/diagram.png b/docs/_static/composability/diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..9734b399757d0e7d5aae85768423cd59b51873b0 GIT binary patch literal 31056 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 HN@xNAyo}a= literal 0 HcmV?d00001 diff --git a/docs/_static/composability/diagram_b0.png b/docs/_static/composability/diagram_b0.png new file mode 100644 index 0000000000000000000000000000000000000000..0e080daaac368b2f8497d5815637cc9f0d4a85f7 GIT binary patch literal 14133 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 literal 0 HcmV?d00001 diff --git a/docs/_static/composability/diagram_b1.png b/docs/_static/composability/diagram_b1.png new file mode 100644 index 0000000000000000000000000000000000000000..31a6d3055ff6259c6bf46c4cd8b23f1fa9f32ecc GIT binary patch literal 30486 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 literal 0 HcmV?d00001 diff --git a/docs/_static/composability/diagram_q1.png b/docs/_static/composability/diagram_q1.png new file mode 100644 index 0000000000000000000000000000000000000000..feb6cbb723f8c537a029e36f2863288ecf9616ee GIT binary patch literal 40713 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 aD+<O#5?eJEbZb8Y)oz}yelF{r5}E)LU>+R+ literal 0 HcmV?d00001 diff --git a/docs/_static/composability/diagram_q2.png b/docs/_static/composability/diagram_q2.png new file mode 100644 index 0000000000000000000000000000000000000000..f89af4216df9e549bb5a6105709667c2bd9151de GIT binary patch literal 55410 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�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ð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 R^WF-O>7K5BF6*2UngAKqzjgos literal 0 HcmV?d00001 diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000000..e82983c975 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,50 @@ +"""Configuration for sphinx.""" +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys + +import sphinx_rtd_theme # noqa: F401 + +sys.path.insert(0, os.path.abspath("../")) + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + + +project = "GPT Index" +copyright = "2022, Jerry Liu" +author = "Jerry Liu" + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [ + "sphinx.ext.autodoc", + "sphinx.ext.coverage", + "sphinx.ext.autodoc.typehints", + "sphinx.ext.autosummary", + "sphinx.ext.napoleon", + "sphinx_rtd_theme", + "sphinx.ext.mathjax", + "myst_parser", +] + +templates_path = ["_templates"] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] + + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = "sphinx_rtd_theme" +html_static_path = ["_static"] diff --git a/docs/getting_started/installation.md b/docs/getting_started/installation.md new file mode 100644 index 0000000000..676e9d36b9 --- /dev/null +++ b/docs/getting_started/installation.md @@ -0,0 +1,20 @@ +# Installation and Setup + +### Installation from Pip + +You can simply do: +``` +pip install gpt-index +``` + +### Installation from Source +Git clone this repository: `git clone git@github.com:jerryjliu/gpt_index.git`. Then do: + +- `pip install -e .` if you want to do an editable install (you can modify source files) of just the package itself. +- `pip install -r requirements.txt` if you want to install optional dependencies + dependencies used for development (e.g. unit testing). + + +### Environment Setup + +By default, we use the OpenAI GPT-3 `text-davinci-002` model. In order to use this, you must have an OPENAI_API_KEY setup. +You can register an API key by logging into [OpenAI's page and creating a new API token](https://beta.openai.com/account/api-keys) diff --git a/docs/getting_started/overview.rst b/docs/getting_started/overview.rst new file mode 100644 index 0000000000..25a789dafe --- /dev/null +++ b/docs/getting_started/overview.rst @@ -0,0 +1,4 @@ +Overview +===================================== + +This section shows you how to quickly get up and running with GPT Index. diff --git a/docs/getting_started/starter_example.md b/docs/getting_started/starter_example.md new file mode 100644 index 0000000000..d75a8532a7 --- /dev/null +++ b/docs/getting_started/starter_example.md @@ -0,0 +1,69 @@ +# Starter Tutorial + +Here is a starter example for using GPT Index. Make sure you've followed the [installation](installation.md) steps first. + + +### Download +GPT Index examples can be found in the `examples` folder of the GPT Index repository. +We first want to download this `examples` folder. An easy way to do this is to just clone the repo: + +```bash +$ git clone git@github.com:jerryjliu/gpt_index.git +``` + +Next, navigate to your newly-cloned repository, and verify the contents: + +```bash +$ cd gpt_index +$ ls +LICENSE data_requirements.txt tests/ +MANIFEST.in examples/ pyproject.toml +Makefile experimental/ requirements.txt +README.md gpt_index/ setup.py +``` + + +We now want to navigate to the following folder: +```bash +$ cd examples/paul_graham_essay +``` + +This contains GPT Index examples around Paul Graham's essay, ["What I Worked On"](http://paulgraham.com/worked.html). A comprehensive set of examples are already provided in `TestEssay.ipynb`. For the purposes of this tutorial, we can focus on a simple example of getting GPT Index up and running. + + +### Build and Query Index +Create a new `.py` file with the following: + +```python +from gpt_index import GPTTreeIndex, SimpleDirectoryReader +from IPython.display import Markdown, display + +documents = SimpleDirectoryReader('data').load_data() +index = GPTTreeIndex(documents) +``` + +This builds an index over the documents in the `data` folder (which in this case just consists of the essay text). We then run the following +```python +response = index.query("What did the author do growing up?") +print(response) +``` + +You should get back a response similar to the following: `The author wrote short stories and tried to program on an IBM 1401.` + +### Saving and Loading + +To save to disk and load from disk, do + +```python +# save to disk +index.save_to_disk('index.json') +# load from disk +index = GPTTreeIndex.load_from_disk('index.json') +``` + + +### Next Steps + +That's it! For more information on GPT Index features, please check out the numerous "How-To Guides" to the left. +Additionally, if you would like to play around with Example Notebooks, check out [this link](/reference/example_notebooks.rst). + diff --git a/docs/how_to/composability.md b/docs/how_to/composability.md new file mode 100644 index 0000000000..6b46516f32 --- /dev/null +++ b/docs/how_to/composability.md @@ -0,0 +1,53 @@ +# Composability + + +GPT Index offers **composability** of your indices, meaning that you can build indices on top of other indices. This allows you to more effectively index your entire document tree in order to feed custom knowledge to GPT. + +Composability allows you to to define lower-level indices for each document, and higher-order indices over a collection of documents. To see how this works, imagine defining 1) a tree index for the text within each document, and 2) a list index over each tree index (one document) within your collection. + +To see how this works, imagine you have 3 documents: `doc1`, `doc2`, and `doc3`. + +```python +doc1 = SimpleDirectoryReader('data1').load_data() +doc2 = SimpleDirectoryReader('data2').load_data() +doc3 = SimpleDirectoryReader('data3').load_data() +``` + + + +Now let's define a tree index for each document. In Python, we have: + +```python +index1 = GPTTreeIndex(doc1) +index2 = GPTTreeIndex(doc2) +index2 = GPTTreeIndex(doc2) +``` + + + +We can then create a list index on these 3 tree indices: + +```python +list_index = GPTListIndex([index1, index2, index3]) +``` + + + +During a query, we would start with the top-level list index. Each node in the list corresponds to an underlying tree index. + +```python +response = list_index.query("Where did the author grow up?") +``` + + + +So within a node, instead of fetching the text, we would recursively query the stored tree index to retrieve our answer. + + + +NOTE: You can stack indices as many times as you want, depending on the hierarchies of your knowledge base! + + +We can take a look at a code example below as well. We first build two tree indices, one over the Wikipedia NYC page, and the other over Paul Graham's essay. We then define a keyword extractor index over the two tree indices. + +[Here is an example notebook](https://github.com/jerryjliu/gpt_index/blob/main/examples/composable_indices/ComposableIndices.ipynb). diff --git a/docs/how_to/cost_analysis.md b/docs/how_to/cost_analysis.md new file mode 100644 index 0000000000..891060b243 --- /dev/null +++ b/docs/how_to/cost_analysis.md @@ -0,0 +1,39 @@ +# Cost Analysis + +Each call to an LLM will cost some amount of money - for instance, OpenAI's Davinci costs $0.02 / 1k tokens. The cost of building an index and querying depends on +1. the type of LLM used +2. the type of data structure used +3. parameters used during building +4. parameters used during querying + +The cost of building and querying each index is a TODO in the reference documentation. In the meantime, here is a high-level overview of the cost structure of the indices. + +### Index Building + + +#### Indices with no LLM calls +The following indices don't require LLM calls at all during building (0 cost): +- `GPTListIndex` +- `GPTSimpleKeywordTableIndex` - uses a regex keyword extractor to extract keywords from each document +- `GPTRAKEKeywordTableIndex` - uses a RAKE keyword extractor to extract keywords from each document + +#### Indices with LLM calls +The following indices do require LLM calls during build time: +- `GPTTreeIndex` - use LLM to hierarchically summarize the text to build the tree +- `GPTKeywordTableIndex` - use LLM to extract keywords from each document + + +### Query Time + +There will always be >= 1 LLM call during query time, in order to synthesize the final answer. +Some indices contain cost tradeoffs between index building and querying. `GPTListIndex`, for instance, +is free to build, but running a query over a list index (without filtering or embedding lookups), will +call the LLM {math}`N` times. + +Here are some notes regarding each of the indices: +- `GPTListIndex`: by default requires {math}`N` LLM calls, where N is the number of nodes. + - However, can do `index.query(..., keyword="<keyword>")` to filter out nodes that don't contain the keyword +- `GPTTreeIndex`: by default requires {math}`\log (N)` LLM calls, where N is the number of leaf nodes. + - Setting `child_branch_factor=2` will be more expensive than the default `child_branch_factor=1` (polynomial vs logarithmic), because we traverse 2 children instead of just 1 for each parent node. +- `GPTKeywordTableIndex`: by default requires an LLM call to extract query keywords. + - Can do `index.query(..., mode="simple")` or `index.query(..., mode="rake")` to also use regex/RAKE keyword extractors on your query text. \ No newline at end of file diff --git a/docs/how_to/custom_llms.md b/docs/how_to/custom_llms.md new file mode 100644 index 0000000000..99581ef4bd --- /dev/null +++ b/docs/how_to/custom_llms.md @@ -0,0 +1,43 @@ +# Defining LLMs + +The goal of GPT Index is to provide a toolkit of data structures that can organize external information in a manner that +is easily compatible with the prompt limitations of an LLM. Therefore LLMs are always used to construct the final +answer. +Depending on the [type of index](/reference/indices.rst) being used, +LLMs may also be used during index construction, insertion, and query traversal. + +GPT Index uses Langchain's [LLM](https://langchain.readthedocs.io/en/latest/modules/llms.html) +and [LLMChain](https://langchain.readthedocs.io/en/latest/modules/chains.html) module to define +the underlying abstraction. We introduce a wrapper class, +[`LLMPredictor`](/reference/llm_predictor.rst), for integration into GPT Index. + +By default, we use OpenAI's `text-davinci-002` model. But you may choose to customize +the underlying LLM being used. + + +## Example + +An example snippet of customizing the LLM being used is shown below. +In this example, we use `text-davinci-003` instead of `text-davinci-002`. Note that +you may plug in any LLM shown on Langchain's +[LLM](https://langchain.readthedocs.io/en/latest/modules/llms.html) page. + + +```python + +from gpt_index import GPTKeywordTableIndex, SimpleDirectoryReader, LLMPredictor +from langchain import OpenAI + +# define LLM +llm_predictor = LLMPredictor(llm=OpenAI(temperature=0, model_name="text-davinci-002")) + +# load index from disk +index = GPTKeywordTableIndex.load_from_disk('index_table.json', llm_predictor=llm_predictor) + +# get response from query +response = index.query("What did the author do after his time at Y Combinator?") + +``` + +In this snipet, the index has already been created and saved to disk. We load +the existing index, and swap in a new `LLMPredictor` that is used during query time. \ No newline at end of file diff --git a/docs/how_to/custom_prompts.md b/docs/how_to/custom_prompts.md new file mode 100644 index 0000000000..f1cf36c14e --- /dev/null +++ b/docs/how_to/custom_prompts.md @@ -0,0 +1,54 @@ +# Defining Prompts + +Prompting is the fundamental input that gives LLMs their expressive power. GPT Index uses prompts to build the index, do insertion, +perform traversal during querying, and to synthesize the final answer. + +GPT Index uses a finite set of *prompt types*, described [here](/reference/prompts.rst). +All index classes, along with their associated queries, utilize a subset of these prompts. The user may provide their own prompt. +If the user does not provide their own prompt, default prompts are used. + +An API reference of all index classes and query classes are found below. The definition of each index class and query +contains optional prompts that the user may pass in. +- [Indices](/reference/indices.rst) +- [Queries](/reference/query.rst) + + +### Example + +An example can be found in [this notebook](https://github.com/jerryjliu/gpt_index/blob/main/examples/paul_graham_essay/TestEssay.ipynb). + +The corresponding snippet is below. We show how to define a custom Summarization Prompt that not only +contains a `text` field, but also `query_str` field during construction of `GPTTreeIndex`, so that +the answer to the query can be simply synthesized from the root nodes. + +```python + +from gpt_index import Prompt, GPTTreeIndex, SimpleDirectoryReader + +# load documents +documents = SimpleDirectoryReader('data').load_data() +# define custom prompt +query_str = "What did the author do growing up?" +summary_prompt_tmpl = ( + "Context information is below. \n" + "---------------------\n" + "{text}" + "\n---------------------\n" + "Given the context information and not prior knowledge, " + "answer the question: {query_str}\n" +) + +summary_prompt = Prompt( + input_variables=["query_str", "text"], + template=DEFAULT_TEXT_QA_PROMPT_TMPL +) +# Build GPTTreeIndex: pass in custom prompt, also pass in query_str +index_with_query = GPTTreeIndex(documents, summary_template=summary_prompt, query_str=query_str) + +``` + +Once the index is built, we can retrieve our answer: +```python +# directly retrieve response from root nodes instead of traversing tree +response = index_with_query.query(query_str, mode="retrieve") +``` diff --git a/docs/how_to/data_connectors.md b/docs/how_to/data_connectors.md new file mode 100644 index 0000000000..d9b39b3ba9 --- /dev/null +++ b/docs/how_to/data_connectors.md @@ -0,0 +1,13 @@ +# Data Connectors + +We currently offer connectors into the following data sources. External data sources are retrieved through their APIs + corresponding authentication token. +The API reference documentation can be found [here](/reference/readers.rst). + +- [Notion](https://developers.notion.com/) (`NotionPageReader`) +- [Google Docs](https://developers.google.com/docs/api) (`GoogleDocsReader`) +- [Slack](https://api.slack.com/) (`SlackReader`) +- MongoDB (`SimpleMongoReader`) +- Wikipedia (`WikipediaReader`) +- local file directory (`SimpleDirectoryReader`) + +We offer [example notebooks of connecting to different data sources](https://github.com/jerryjliu/gpt_index/tree/main/examples/data_connectors). Please check them out! \ No newline at end of file diff --git a/docs/how_to/embeddings.md b/docs/how_to/embeddings.md new file mode 100644 index 0000000000..cc713330d6 --- /dev/null +++ b/docs/how_to/embeddings.md @@ -0,0 +1,27 @@ +# Embedding support + +GPT Index provides embedding support to our tree and list indices. In addition to each node storing text, each node can optionally store an embedding. +During query-time, we can use embeddings to do max-similarity retrieval of nodes before calling the LLM to synthesize an answer. +Since similarity lookup using embeddings (e.g. using cosine similarity) does not require a LLM call, embeddings serve as a cheaper lookup mechanism instead +of using LLMs to traverse nodes. + +NOTE: we currently support OpenAI embeddings. External embeddings are coming soon! + +**How are Embeddings Generated?** + +Embeddings are lazily generated and then cached at query time (if mode="embedding" is specified during `index.query`), and not during index construction. +This design choice prevents the need to generate embeddings for all text chunks during index construction. + +**Embedding Lookups** +For the list index: +- We iterate through every node in the list, and identify the top k nodes through embedding similarity. We use these nodes to synthesize an answer. +- See the [List Query API](/reference/indices/list_query.rst) for more details. + +For the tree index: +- We start with the root nodes, and traverse down the tree by picking the child node through embedding similarity. +- See the [Tree Query API](/reference/indices/tree_query.rst) for more details. + +**Example Notebook** + +An example notebook is given [here](https://github.com/jerryjliu/gpt_index/blob/main/examples/test_wiki/TestNYC_Embeddings.ipynb). + diff --git a/docs/how_to/insert.md b/docs/how_to/insert.md new file mode 100644 index 0000000000..3b28eb8f7a --- /dev/null +++ b/docs/how_to/insert.md @@ -0,0 +1,5 @@ +# Insert Capabilities + +Every GPT Index data structure allows insertion. + +An example notebook showcasing our insert capabilities is given [here](https://github.com/jerryjliu/gpt_index/blob/main/examples/paul_graham_essay/InsertDemo.ipynb). \ No newline at end of file diff --git a/docs/how_to/overview.rst b/docs/how_to/overview.rst new file mode 100644 index 0000000000..1c6cc0c6d1 --- /dev/null +++ b/docs/how_to/overview.rst @@ -0,0 +1,4 @@ +Overview +===================================== + +The how-to section contains guides on some of the core features of GPT Index: diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000000..081304af61 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,75 @@ +.. GPT Index documentation master file, created by + sphinx-quickstart on Sun Dec 11 14:30:34 2022. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to GPT Index! +===================================== + +GPT Index is a project consisting of a set of data structures that are created using LLMs and can be traversed using LLMs in order to answer queries. + +The Github project page is here: https://github.com/jerryjliu/gpt_index. + +The pypi package is here: https://pypi.org/project/gpt-index/. + + +🚀 Overview +----------- + +Context +^^^^^^^ +- LLMs are a phenomenonal piece of technology for knowledge generation and reasoning. +- A big limitation of LLMs is context size (e.g. Davinci's limit is 4096 tokens. Large, but not infinite). +- The ability to feed "knowledge" to LLMs is restricted to this limited prompt size and model weights. +- **Thought**: What if LLMs can have access to potentially a much larger database of knowledge without retraining/finetuning? + +Proposed Solution +^^^^^^^^^^^^^^^^^ +That's where the **GPT Index** comes in. GPT Index is a simple, flexible interface between your external data and LLMs. It resolves the following pain points: + +- Provides simple data structures to resolve prompt size limitations. +- Offers data connectors to your external data sources. +- Offers you a comprehensive toolset trading off cost and performance. + +At the core of GPT Index is a **data structure**. Instead of relying on world knowledge encoded in the model weights, a GPT Index data structure does the following: + +- Uses a pre-trained LLM primarily for *reasoning*/*summarization* instead of prior knowledge. +- Takes as input a large corpus of text data and build a structured index over it (using an LLM or heuristics). +- Allow users to *query* the index in order to synthesize an answer to the question - this requires both *traversal* of the index as well as a synthesis of the answer. + + +.. toctree:: + :maxdepth: 1 + :caption: Getting Started + + getting_started/overview.rst + getting_started/installation.md + getting_started/starter_example.md + + +.. toctree:: + :maxdepth: 1 + :caption: How To + + how_to/overview.rst + how_to/data_connectors.md + how_to/composability.md + how_to/insert.md + how_to/cost_analysis.md + how_to/embeddings.md + how_to/custom_prompts.md + how_to/custom_llms.md + + +.. toctree:: + :maxdepth: 1 + :caption: Reference + + reference/overview.rst + reference/indices.rst + reference/query.rst + reference/readers.rst + reference/prompts.rst + reference/example_notebooks.rst + reference/llm_predictor.rst + diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000000..32bb24529f --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/reference/example_notebooks.rst b/docs/reference/example_notebooks.rst new file mode 100644 index 0000000000..df5e3e58bc --- /dev/null +++ b/docs/reference/example_notebooks.rst @@ -0,0 +1,8 @@ +.. _Ref-Example-Notebooks: + +Example Notebooks +================= + +We offer a wide variety of example notebooks. They are referenced throughout the documentation. + +Example notebooks are found `here <https://github.com/jerryjliu/gpt_index/tree/main/examples>`_. \ No newline at end of file diff --git a/docs/reference/indices.rst b/docs/reference/indices.rst new file mode 100644 index 0000000000..89a8b7fcd3 --- /dev/null +++ b/docs/reference/indices.rst @@ -0,0 +1,15 @@ +.. _Ref-Indices: + +Indices +======= + +This doc shows both the overarching class used to represent an index. These +classes allow for index creation, insertion, and also querying. + +.. toctree:: + :maxdepth: 1 + :caption: Index Data Structures + + indices/list.rst + indices/table.rst + indices/tree.rst diff --git a/docs/reference/indices/list.rst b/docs/reference/indices/list.rst new file mode 100644 index 0000000000..65c0ea734f --- /dev/null +++ b/docs/reference/indices/list.rst @@ -0,0 +1,9 @@ +List Index +========== + +Building the List Index + +.. automodule:: gpt_index.indices.list + :members: + :inherited-members: + :exclude-members: delete, docstore, index_struct, index_struct_cls \ No newline at end of file diff --git a/docs/reference/indices/list_query.rst b/docs/reference/indices/list_query.rst new file mode 100644 index 0000000000..fa65e44982 --- /dev/null +++ b/docs/reference/indices/list_query.rst @@ -0,0 +1,7 @@ +Querying a List Index +===================== + +.. automodule:: gpt_index.indices.query.list + :members: + :inherited-members: + :exclude-members: index_struct, query, set_llm_predictor, set_prompt_helper \ No newline at end of file diff --git a/docs/reference/indices/table.rst b/docs/reference/indices/table.rst new file mode 100644 index 0000000000..bdda65a5dd --- /dev/null +++ b/docs/reference/indices/table.rst @@ -0,0 +1,8 @@ +Table Index +=========== + +Building the Keyword Table Index + +.. automodule:: gpt_index.indices.keyword_table + :members: + :inherited-members: \ No newline at end of file diff --git a/docs/reference/indices/table_query.rst b/docs/reference/indices/table_query.rst new file mode 100644 index 0000000000..abcb62a701 --- /dev/null +++ b/docs/reference/indices/table_query.rst @@ -0,0 +1,7 @@ +Querying a Keyword Table Index +============================== + +.. automodule:: gpt_index.indices.query.keyword_table + :members: + :inherited-members: + :exclude-members: index_struct, query, set_llm_predictor, set_prompt_helper \ No newline at end of file diff --git a/docs/reference/indices/tree.rst b/docs/reference/indices/tree.rst new file mode 100644 index 0000000000..5e582f92a6 --- /dev/null +++ b/docs/reference/indices/tree.rst @@ -0,0 +1,8 @@ +Tree Index +========== + +Building the Tree Index + +.. automodule:: gpt_index.indices.tree + :members: + :inherited-members: \ No newline at end of file diff --git a/docs/reference/indices/tree_query.rst b/docs/reference/indices/tree_query.rst new file mode 100644 index 0000000000..46f5e67f52 --- /dev/null +++ b/docs/reference/indices/tree_query.rst @@ -0,0 +1,7 @@ +Querying a Tree Index +===================== + +.. automodule:: gpt_index.indices.query.tree + :members: + :inherited-members: + :exclude-members: index_struct, query, set_llm_predictor, set_prompt_helper \ No newline at end of file diff --git a/docs/reference/llm_predictor.rst b/docs/reference/llm_predictor.rst new file mode 100644 index 0000000000..ffc096c78b --- /dev/null +++ b/docs/reference/llm_predictor.rst @@ -0,0 +1,10 @@ +.. _Ref-LLM-Predictor: + +LLMPredictor +================= + +Our LLMPredictor is a wrapper around Langchain's `LLMChain` that allows easy integration into GPT Index. + +.. automodule:: gpt_index.langchain_helpers.chain_wrapper + :members: + :inherited-members: diff --git a/docs/reference/overview.rst b/docs/reference/overview.rst new file mode 100644 index 0000000000..b5ef28e5bf --- /dev/null +++ b/docs/reference/overview.rst @@ -0,0 +1,4 @@ +Overview +===================================== + +The reference section contains comprehensive API documentation over all index data structures, and query modes. diff --git a/docs/reference/prompts.rst b/docs/reference/prompts.rst new file mode 100644 index 0000000000..eb8c0cfdac --- /dev/null +++ b/docs/reference/prompts.rst @@ -0,0 +1,70 @@ +.. _Prompt-Templates: + +Prompt Templates +================= + +These are the reference prompt templates. +We then document all prompts, with their required variables. + +We then show the base prompt class, +derived from `Langchain <https://langchain.readthedocs.io/en/latest/modules/prompt.html>`_. + + +**Summarization Prompt** + +- Prompt to summarize the provided `text`. +- input variables: `["text"]` + +**Tree Insert Prompt** + +- Prompt to insert a new chunk of text `new_chunk_text` into the tree index. More specifically, + this prompt has the LLM select the relevant candidate child node to continue tree traversal. +- input variables: `["num_chunks", "context_list", "new_chunk_text"]` + +**Question-Answer Prompt** + +- Prompt to answer a question `query_str` given a context `context_str`. +- input variables: `["context_str", "query_str"]` + +**Refinement Prompt** + +- Prompt to refine an existing answer `existing_answer` given a context `context_msg`, + and a query `query_str`. +- input variables: `["query_str", "existing_answer", "context_msg"]` + +**Keyword Extraction Prompt** + +- Prompt to extract keywords from a text `text` with a maximum of `max_keywords` keywords. +- input variables: `["text", "max_keywords"]` + +**Query Keyword Extraction Prompt** + +- Prompt to extract keywords from a query `query_str` with a maximum of `max_keywords` keywords. +- input variables: `["question", "max_keywords"]` + + +**Tree Select Query Prompt** + +- Prompt to select a candidate child node out of all child nodes provided in `context_list`, + given a query `query_str`. `num_chunks` is the number of child nodes in `context_list`. + +- input variables: `["num_chunks", "context_list", "query_str"]` + + +**Tree Select Query Prompt (Multiple)** + +- Prompt to select multiple candidate child nodes out of all child nodes provided in `context_list`, + given a query `query_str`. `branching_factor` refers to the number of child nodes to select, and + `num_chunks` is the number of child nodes in `context_list`. + +- input variables: `["num_chunks", "context_list", "query_str", "branching_factor"]` + + +**Base Prompt Class** + +.. automodule:: gpt_index.prompts + :members: + :inherited-members: + :exclude-members: Config, construct, copy, dict, from_examples, from_file, get_full_format_args, output_parser, save, template, template_format, update_forward_refs, validate_variable_names, json, template_is_valid + + diff --git a/docs/reference/query.rst b/docs/reference/query.rst new file mode 100644 index 0000000000..84525694f7 --- /dev/null +++ b/docs/reference/query.rst @@ -0,0 +1,14 @@ +.. _Ref-Query: + +Querying an Index +================= + +This doc specifically shows the classes that are used to query indices. + +.. toctree:: + :maxdepth: 1 + :caption: Query classes + + indices/list_query.rst + indices/table_query.rst + indices/tree_query.rst diff --git a/docs/reference/readers.rst b/docs/reference/readers.rst new file mode 100644 index 0000000000..8fc062f543 --- /dev/null +++ b/docs/reference/readers.rst @@ -0,0 +1,6 @@ +Data Connectors +=============== + +.. automodule:: gpt_index.readers + :members: + :inherited-members: \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000000..0d0e6022fa --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,3 @@ +sphinx +sphinx_rtd_theme +myst-parser \ No newline at end of file diff --git a/gpt_index/__init__.py b/gpt_index/__init__.py index 53553541bb..d024cd75d8 100644 --- a/gpt_index/__init__.py +++ b/gpt_index/__init__.py @@ -6,13 +6,14 @@ with open(Path(__file__).absolute().parents[0] / "VERSION") as _f: __version__ = _f.read().strip() -from gpt_index.indices.keyword_table.base import GPTKeywordTableIndex -from gpt_index.indices.keyword_table.rake_base import GPTRAKEKeywordTableIndex -from gpt_index.indices.keyword_table.simple_base import GPTSimpleKeywordTableIndex -from gpt_index.indices.list.base import GPTListIndex - # indices -from gpt_index.indices.tree.base import GPTTreeIndex +from gpt_index.indices.keyword_table import ( + GPTKeywordTableIndex, + GPTRAKEKeywordTableIndex, + GPTSimpleKeywordTableIndex, +) +from gpt_index.indices.list import GPTListIndex +from gpt_index.indices.tree import GPTTreeIndex # langchain helper from gpt_index.langchain_helpers.chain_wrapper import LLMPredictor diff --git a/gpt_index/indices/__init__.py b/gpt_index/indices/__init__.py index 0eee67e42b..10f6e05ee4 100644 --- a/gpt_index/indices/__init__.py +++ b/gpt_index/indices/__init__.py @@ -1 +1,16 @@ -"""Init file for indices.""" +"""GPT Index data structures.""" + +# indices +from gpt_index.indices.keyword_table.base import GPTKeywordTableIndex +from gpt_index.indices.keyword_table.rake_base import GPTRAKEKeywordTableIndex +from gpt_index.indices.keyword_table.simple_base import GPTSimpleKeywordTableIndex +from gpt_index.indices.list.base import GPTListIndex +from gpt_index.indices.tree.base import GPTTreeIndex + +__all__ = [ + "GPTKeywordTableIndex", + "GPTSimpleKeywordTableIndex", + "GPTRAKEKeywordTableIndex", + "GPTListIndex", + "GPTTreeIndex", +] diff --git a/gpt_index/indices/base.py b/gpt_index/indices/base.py index 43c7eab830..915fddbd12 100644 --- a/gpt_index/indices/base.py +++ b/gpt_index/indices/base.py @@ -152,7 +152,17 @@ class BaseGPTIndex(Generic[IS]): mode: str = DEFAULT_MODE, **query_kwargs: Any ) -> str: - """Answer a query.""" + """Answer a query. + + When `query` is called, we query the index with the given `mode` and + `query_kwargs`. The `mode` determines the type of query to run, and + `query_kwargs` are parameters that are specific to the query type. + + For a comprehensive documentation of available `mode` and `query_kwargs` to + query a given index, please visit :ref:`Ref-Query`. + + + """ # TODO: remove _mode_to_query and consolidate with query_runner if mode == "recursive": if "query_configs" not in query_kwargs: @@ -175,7 +185,20 @@ class BaseGPTIndex(Generic[IS]): @classmethod def load_from_disk(cls, save_path: str, **kwargs: Any) -> "BaseGPTIndex": - """Load from disk.""" + """Load index from disk. + + This method loads the index from a JSON file stored on disk. The index data + structure itself is preserved completely. If the index is defined over + subindices, those subindices will also be preserved (and subindices of + those subindices, etc.). + + Args: + save_path (str): The save_path of the file. + + Returns: + BaseGPTIndex: The loaded index. + + """ with open(save_path, "r") as f: result_dict = json.load(f) index_struct = cls.index_struct_cls.from_dict(result_dict["index_struct"]) @@ -183,7 +206,14 @@ class BaseGPTIndex(Generic[IS]): return cls(index_struct=index_struct, docstore=docstore, **kwargs) def save_to_disk(self, save_path: str) -> None: - """Safe to file.""" + """Save to file. + + This method stores the index into a JSON file stored on disk. + + Args: + save_path (str): The save_path of the file. + + """ out_dict: Dict[str, dict] = { "index_struct": self.index_struct.to_dict(), "docstore": self.docstore.to_dict(), diff --git a/gpt_index/indices/keyword_table/__init__.py b/gpt_index/indices/keyword_table/__init__.py index 1d4640565a..43a973b9b0 100644 --- a/gpt_index/indices/keyword_table/__init__.py +++ b/gpt_index/indices/keyword_table/__init__.py @@ -1 +1,12 @@ -"""Init file.""" +"""Keyword Table Index Data Structures.""" + +# indices +from gpt_index.indices.keyword_table.base import GPTKeywordTableIndex +from gpt_index.indices.keyword_table.rake_base import GPTRAKEKeywordTableIndex +from gpt_index.indices.keyword_table.simple_base import GPTSimpleKeywordTableIndex + +__all__ = [ + "GPTKeywordTableIndex", + "GPTSimpleKeywordTableIndex", + "GPTRAKEKeywordTableIndex", +] diff --git a/gpt_index/indices/keyword_table/base.py b/gpt_index/indices/keyword_table/base.py index 640f40217b..70f1556dc8 100644 --- a/gpt_index/indices/keyword_table/base.py +++ b/gpt_index/indices/keyword_table/base.py @@ -39,7 +39,26 @@ DQKET = DEFAULT_QUERY_KEYWORD_EXTRACT_TEMPLATE class BaseGPTKeywordTableIndex(BaseGPTIndex[KeywordTable]): - """Base GPT Index.""" + """GPT Keyword Table Index. + + This index extracts keywords from the text, and maps each + keyword to the node(s) that it corresponds to. In this sense it mimicks a + "hash table". During index construction, the keyword table is constructed + by extracting keywords from each node and creating an internal mapping. + + During query time, the keywords are extracted from the query text, and these + keywords are used to index into the keyword table. The retrieved nodes + are then used to answer the query. + + Args: + keyword_extract_template (Optional[Prompt]): A Keyword Extraction Prompt + (see :ref:`Prompt-Templates`). + max_keywords_per_query (int): The maximum number of keywords to extract + per query. + max_keywords_per_query (int): The maximum number of keywords to extract + per chunk. + + """ index_struct_cls = KeywordTable @@ -151,7 +170,7 @@ class BaseGPTKeywordTableIndex(BaseGPTIndex[KeywordTable]): class GPTKeywordTableIndex(BaseGPTKeywordTableIndex): """GPT Keyword Table Index. - Uses GPT to build keyword table. + This index uses a GPT model to extract keywords from the text. """ diff --git a/gpt_index/indices/keyword_table/rake_base.py b/gpt_index/indices/keyword_table/rake_base.py index b610e3a541..61b26ce6dc 100644 --- a/gpt_index/indices/keyword_table/rake_base.py +++ b/gpt_index/indices/keyword_table/rake_base.py @@ -11,7 +11,11 @@ from gpt_index.indices.keyword_table.utils import rake_extract_keywords class GPTRAKEKeywordTableIndex(BaseGPTKeywordTableIndex): - """GPT Index.""" + """GPT RAKE Keyword Table Index. + + This index uses a RAKE keyword extractor to extract keywords from the text. + + """ def _extract_keywords(self, text: str) -> Set[str]: """Extract keywords from text.""" diff --git a/gpt_index/indices/keyword_table/simple_base.py b/gpt_index/indices/keyword_table/simple_base.py index e8f506884b..4d542c38da 100644 --- a/gpt_index/indices/keyword_table/simple_base.py +++ b/gpt_index/indices/keyword_table/simple_base.py @@ -15,7 +15,11 @@ DQKET = DEFAULT_QUERY_KEYWORD_EXTRACT_TEMPLATE class GPTSimpleKeywordTableIndex(BaseGPTKeywordTableIndex): - """GPT Index.""" + """GPT Simple Keyword Table Index. + + This index uses a simple regex extractor to extract keywords from the text. + + """ def _extract_keywords(self, text: str) -> Set[str]: """Extract keywords from text.""" diff --git a/gpt_index/indices/list/__init__.py b/gpt_index/indices/list/__init__.py index 1d4640565a..b24c607f33 100644 --- a/gpt_index/indices/list/__init__.py +++ b/gpt_index/indices/list/__init__.py @@ -1 +1,7 @@ -"""Init file.""" +"""List-based data structures.""" + +from gpt_index.indices.list.base import GPTListIndex + +__all__ = [ + "GPTListIndex", +] diff --git a/gpt_index/indices/list/base.py b/gpt_index/indices/list/base.py index e93f8a827d..5eaeb598df 100644 --- a/gpt_index/indices/list/base.py +++ b/gpt_index/indices/list/base.py @@ -29,7 +29,21 @@ GENERATE_TEXT_QUERY = "What is a concise summary of this document?" class GPTListIndex(BaseGPTIndex[IndexList]): - """GPT List Index.""" + """GPT List Index. + + The list index is a simple data structure where nodes are stored in + a sequence. During index construction, the document texts are + chunked up, converted to nodes, and stored in a list. + + During query time, the list index iterates through the nodes + with some optional filter parameters, and synthesizes an + answer from all the nodes. + + Args: + text_qa_template (Optional[Prompt]): A Question-Answer Prompt + (see :ref:`Prompt-Templates`). + + """ index_struct_cls = IndexList @@ -69,7 +83,14 @@ class GPTListIndex(BaseGPTIndex[IndexList]): def build_index_from_documents( self, documents: Sequence[BaseDocument] ) -> IndexList: - """Build the index from documents.""" + """Build the index from documents. + + Args: + documents (List[BaseDocument]): A list of documents. + + Returns: + IndexList: The created list index. + """ text_splitter = self._prompt_helper.get_text_splitter_given_prompt( self.text_qa_template, 1 ) diff --git a/gpt_index/indices/query/keyword_table/__init__.py b/gpt_index/indices/query/keyword_table/__init__.py index 1d4640565a..9b0b308e6e 100644 --- a/gpt_index/indices/query/keyword_table/__init__.py +++ b/gpt_index/indices/query/keyword_table/__init__.py @@ -1 +1,13 @@ -"""Init file.""" +"""Query classes for keyword table indices.""" + +from gpt_index.indices.query.keyword_table.query import ( + GPTKeywordTableGPTQuery, + GPTKeywordTableRAKEQuery, + GPTKeywordTableSimpleQuery, +) + +__all__ = [ + "GPTKeywordTableGPTQuery", + "GPTKeywordTableRAKEQuery", + "GPTKeywordTableSimpleQuery", +] diff --git a/gpt_index/indices/query/keyword_table/query.py b/gpt_index/indices/query/keyword_table/query.py index 98b3a5235d..52b00270bc 100644 --- a/gpt_index/indices/query/keyword_table/query.py +++ b/gpt_index/indices/query/keyword_table/query.py @@ -23,7 +23,23 @@ DQKET = DEFAULT_QUERY_KEYWORD_EXTRACT_TEMPLATE class BaseGPTKeywordTableQuery(BaseGPTIndexQuery[KeywordTable]): - """Base GPT Keyword Table Index Query.""" + """Base GPT Keyword Table Index Query. + + Arguments are shared among subclasses. + + Args: + keyword_extract_template (Optional[Prompt]): A Keyword Extraction Prompt + (see :ref:`Prompt-Templates`). + query_keyword_extract_template (Optional[Prompt]): A Query Keyword Extraction + Prompt (see :ref:`Prompt-Templates`). + refine_template (Optional[Prompt]): A Refinement Prompt + (see :ref:`Prompt-Templates`). + text_qa_template (Optional[Prompt]): A Question Answering Prompt + (see :ref:`Prompt-Templates`). + max_keywords_per_query (int): Maximum number of keywords to extract from query. + num_chunks_per_query (int): Maximum number of text chunks to query. + + """ def __init__( self, @@ -89,7 +105,14 @@ class BaseGPTKeywordTableQuery(BaseGPTIndexQuery[KeywordTable]): class GPTKeywordTableGPTQuery(BaseGPTKeywordTableQuery): """GPT Keyword Table Index Query. - Extracts keywords using GPT. + Extracts keywords using GPT. Set when `mode="default"` in `query` method of + `GPTKeywordTableIndex`. + + .. code-block:: python + + response = index.query("<query_str>", mode="default") + + See BaseGPTKeywordTableQuery for arguments. """ @@ -107,7 +130,14 @@ class GPTKeywordTableGPTQuery(BaseGPTKeywordTableQuery): class GPTKeywordTableSimpleQuery(BaseGPTKeywordTableQuery): """GPT Keyword Table Index Simple Query. - Extracts keywords using Simple keyword extractor. + Extracts keywords using simple regex-based keyword extractor. + Set when `mode="simple"` in `query` method of `GPTKeywordTableIndex`. + + .. code-block:: python + + response = index.query("<query_str>", mode="simple") + + See BaseGPTKeywordTableQuery for arguments. """ @@ -122,6 +152,13 @@ class GPTKeywordTableRAKEQuery(BaseGPTKeywordTableQuery): """GPT Keyword Table Index RAKE Query. Extracts keywords using RAKE keyword extractor. + Set when `mode="rake"` in `query` method of `GPTKeywordTableIndex`. + + .. code-block:: python + + response = index.query("<query_str>", mode="rake") + + See BaseGPTKeywordTableQuery for arguments. """ diff --git a/gpt_index/indices/query/list/__init__.py b/gpt_index/indices/query/list/__init__.py index 1d4640565a..795cc1c5df 100644 --- a/gpt_index/indices/query/list/__init__.py +++ b/gpt_index/indices/query/list/__init__.py @@ -1 +1,6 @@ -"""Init file.""" +"""Query classes for list indices.""" + +from gpt_index.indices.query.list.embedding_query import GPTListIndexEmbeddingQuery +from gpt_index.indices.query.list.query import GPTListIndexQuery + +__all__ = ["GPTListIndexEmbeddingQuery", "GPTListIndexQuery"] diff --git a/gpt_index/indices/query/list/embedding_query.py b/gpt_index/indices/query/list/embedding_query.py index fd2fe99e19..4accc86209 100644 --- a/gpt_index/indices/query/list/embedding_query.py +++ b/gpt_index/indices/query/list/embedding_query.py @@ -8,7 +8,20 @@ from gpt_index.prompts.base import Prompt class GPTListIndexEmbeddingQuery(BaseGPTListIndexQuery): - """GPTListIndex query.""" + """GPTListIndex query. + + An embedding-based for GPTListIndex, which traverses + each node in sequence and retrieves top-k nodes by + embedding similarity to the query. + Set when `mode="embedding"` in `query` method of `GPTListIndex`. + + .. code-block:: python + + response = index.query("<query_str>", mode="embedding") + + See BaseGPTListIndexQuery for arguments. + + """ def __init__( self, diff --git a/gpt_index/indices/query/list/query.py b/gpt_index/indices/query/list/query.py index b51746b02d..bf0b18f417 100644 --- a/gpt_index/indices/query/list/query.py +++ b/gpt_index/indices/query/list/query.py @@ -12,7 +12,19 @@ from gpt_index.prompts.default_prompts import ( class BaseGPTListIndexQuery(BaseGPTIndexQuery[IndexList]): - """GPTListIndex query.""" + """GPTListIndex query. + + Arguments are shared among subclasses. + + Args: + text_qa_template (Optional[Prompt]): A Question Answering Prompt + (see :ref:`Prompt-Templates`). + refine_template (Optional[Prompt]): A Refinement Prompt + (see :ref:`Prompt-Templates`). + keyword (Optional[str]): If specified, keyword to filter nodes. + Simulates Ctrl+F lookup in a document. + + """ def __init__( self, @@ -62,7 +74,20 @@ class BaseGPTListIndexQuery(BaseGPTIndexQuery[IndexList]): class GPTListIndexQuery(BaseGPTListIndexQuery): - """GPTListIndex query.""" + """GPTListIndex query. + + The default query mode for GPTListIndex, which traverses + each node in sequence and synthesizes a response across all nodes + (with an optional keyword filter). + Set when `mode="default"` in `query` method of `GPTListIndex`. + + .. code-block:: python + + response = index.query("<query_str>", mode="default") + + See BaseGPTListIndexQuery for arguments. + + """ def _get_nodes_for_response( self, query_str: str, verbose: bool = False diff --git a/gpt_index/indices/query/tree/__init__.py b/gpt_index/indices/query/tree/__init__.py index 1d4640565a..f269b72b00 100644 --- a/gpt_index/indices/query/tree/__init__.py +++ b/gpt_index/indices/query/tree/__init__.py @@ -1 +1,11 @@ -"""Init file.""" +"""Query classes for tree indices.""" + +from gpt_index.indices.query.tree.embedding_query import GPTTreeIndexEmbeddingQuery +from gpt_index.indices.query.tree.leaf_query import GPTTreeIndexLeafQuery +from gpt_index.indices.query.tree.retrieve_query import GPTTreeIndexRetQuery + +__all__ = [ + "GPTTreeIndexLeafQuery", + "GPTTreeIndexRetQuery", + "GPTTreeIndexEmbeddingQuery", +] diff --git a/gpt_index/indices/query/tree/embedding_query.py b/gpt_index/indices/query/tree/embedding_query.py index 7d474e0447..ba78dcbe32 100644 --- a/gpt_index/indices/query/tree/embedding_query.py +++ b/gpt_index/indices/query/tree/embedding_query.py @@ -16,6 +16,26 @@ class GPTTreeIndexEmbeddingQuery(GPTTreeIndexLeafQuery): This class traverses the index graph using the embedding similarity between the query and the node text. + .. code-block:: python + + response = index.query("<query_str>", mode="embedding") + + Args: + query_template (Optional[Prompt]): Tree Select Query Prompt + (see :ref:`Prompt-Templates`). + query_template_multiple (Optional[Prompt]): Tree Select Query Prompt (Multiple) + (see :ref:`Prompt-Templates`). + text_qa_template (Optional[Prompt]): Question-Answer Prompt + (see :ref:`Prompt-Templates`). + refine_template (Optional[Prompt]): Refinement Prompt + (see :ref:`Prompt-Templates`). + child_branch_factor (int): Number of child nodes to consider at each level. + If child_branch_factor is 1, then the query will only choose one child node + to traverse for any given parent node. + If child_branch_factor is 2, then the query will choose two child nodes. + embed_model (Optional[OpenAIEmbedding]): Embedding model to use for + embedding similarity. + """ def __init__( diff --git a/gpt_index/indices/query/tree/leaf_query.py b/gpt_index/indices/query/tree/leaf_query.py index b76d388981..80531d38a0 100644 --- a/gpt_index/indices/query/tree/leaf_query.py +++ b/gpt_index/indices/query/tree/leaf_query.py @@ -20,6 +20,24 @@ class GPTTreeIndexLeafQuery(BaseGPTIndexQuery[IndexGraph]): This class traverses the index graph and searches for a leaf node that can best answer the query. + .. code-block:: python + + response = index.query("<query_str>", mode="default") + + Args: + query_template (Optional[Prompt]): Tree Select Query Prompt + (see :ref:`Prompt-Templates`). + query_template_multiple (Optional[Prompt]): Tree Select Query Prompt (Multiple) + (see :ref:`Prompt-Templates`). + text_qa_template (Optional[Prompt]): Question-Answer Prompt + (see :ref:`Prompt-Templates`). + refine_template (Optional[Prompt]): Refinement Prompt + (see :ref:`Prompt-Templates`). + child_branch_factor (int): Number of child nodes to consider at each level. + If child_branch_factor is 1, then the query will only choose one child node + to traverse for any given parent node. + If child_branch_factor is 2, then the query will choose two child nodes. + """ def __init__( diff --git a/gpt_index/indices/query/tree/retrieve_query.py b/gpt_index/indices/query/tree/retrieve_query.py index f7f9cad538..bc22bebf51 100644 --- a/gpt_index/indices/query/tree/retrieve_query.py +++ b/gpt_index/indices/query/tree/retrieve_query.py @@ -19,6 +19,14 @@ class GPTTreeIndexRetQuery(BaseGPTIndexQuery[IndexGraph]): the answer (because it was constructed with a query_str), so it does not attempt to parse information down the graph in order to synthesize an answer. + .. code-block:: python + + response = index.query("<query_str>", mode="retrieve") + + Args: + text_qa_template (Optional[Prompt]): Question-Answer Prompt + (see :ref:`Prompt-Templates`). + """ def __init__( diff --git a/gpt_index/indices/tree/__init__.py b/gpt_index/indices/tree/__init__.py index 1d4640565a..c13b792b07 100644 --- a/gpt_index/indices/tree/__init__.py +++ b/gpt_index/indices/tree/__init__.py @@ -1 +1,8 @@ -"""Init file.""" +"""Tree-structured Index Data Structures.""" + +# indices +from gpt_index.indices.tree.base import GPTTreeIndex + +__all__ = [ + "GPTTreeIndex", +] diff --git a/gpt_index/indices/tree/base.py b/gpt_index/indices/tree/base.py index 18b7c99bf4..a946c4e831 100644 --- a/gpt_index/indices/tree/base.py +++ b/gpt_index/indices/tree/base.py @@ -119,7 +119,23 @@ class GPTTreeIndexBuilder: class GPTTreeIndex(BaseGPTIndex[IndexGraph]): - """GPT Index.""" + """GPT Tree Index. + + The tree index is a tree-structured index, where each node is a summary of + the children nodes. During index construction, the tree is constructed + in a bottoms-up fashion until we end up with a set of root_nodes. + + There are a few different options during query time (see :ref:`Ref-Query`). + The main option is to traverse down the tree from the root nodes. + A secondary answer is to directly synthesize the answer from the root nodes. + + Args: + summary_template (Optional[Prompt]): A Summarization Prompt + (see :ref:`Prompt-Templates`). + insert_prompt (Optional[Prompt]): An Tree Insertion Prompt + (see :ref:`Prompt-Templates`). + + """ index_struct_cls = IndexGraph diff --git a/gpt_index/langchain_helpers/chain_wrapper.py b/gpt_index/langchain_helpers/chain_wrapper.py index 23a7c99570..390dff4c63 100644 --- a/gpt_index/langchain_helpers/chain_wrapper.py +++ b/gpt_index/langchain_helpers/chain_wrapper.py @@ -9,14 +9,34 @@ from gpt_index.prompts.base import Prompt class LLMPredictor: - """LLM predictor class.""" + """LLM predictor class. + + Wrapper around an LLMChain from Langchain. + + Args: + llm (Optional[LLM]): LLM from Langchain to use for predictions. + Defaults to OpenAI's text-davinci-002 model. + Please see + `Langchain's LLM Page + <https://langchain.readthedocs.io/en/latest/modules/llms.html>`_ + for more details. + + """ def __init__(self, llm: Optional[LLM] = None) -> None: """Initialize params.""" self._llm = llm or OpenAI(temperature=0, model_name="text-davinci-002") def predict(self, prompt: Prompt, **prompt_args: Any) -> Tuple[str, str]: - """Predict the answer to a query.""" + """Predict the answer to a query. + + Args: + prompt (Prompt): Prompt to use for prediction. + + Returns: + Tuple[str, str]: Tuple of the predicted answer and the formatted prompt. + + """ llm_chain = LLMChain(prompt=prompt, llm=self._llm) formatted_prompt = prompt.format(**prompt_args) diff --git a/gpt_index/prompts/__init__.py b/gpt_index/prompts/__init__.py index 1d4640565a..70a9a06c14 100644 --- a/gpt_index/prompts/__init__.py +++ b/gpt_index/prompts/__init__.py @@ -1 +1,5 @@ -"""Init file.""" +"""Prompt class.""" + +from gpt_index.prompts.base import Prompt + +__all__ = ["Prompt"] diff --git a/gpt_index/readers/__init__.py b/gpt_index/readers/__init__.py index 04de8b7ec7..0fd7ca35c0 100644 --- a/gpt_index/readers/__init__.py +++ b/gpt_index/readers/__init__.py @@ -1 +1,25 @@ -"""Init file for readers.""" +"""Data Connectors for GPT Index. + +This module contains the data connectors for GPT Index. Each connector inherits +from a `BaseReader` class, connects to a data source, and loads BaseDocument objects +from that data source. + +""" + +# readers +from gpt_index.readers.file import SimpleDirectoryReader +from gpt_index.readers.google.gdocs import GoogleDocsReader +from gpt_index.readers.mongo import SimpleMongoReader +from gpt_index.readers.notion import NotionPageReader +from gpt_index.readers.slack import SlackReader +from gpt_index.readers.wikipedia import WikipediaReader + +__all__ = [ + "WikipediaReader", + "SimpleDirectoryReader", + "SimpleMongoReader", + "NotionPageReader", + "GoogleDocsReader", + "SlackReader", + "LLMPredictor", +] diff --git a/gpt_index/readers/file.py b/gpt_index/readers/file.py index ea20cd2ea0..f9ca48c17e 100644 --- a/gpt_index/readers/file.py +++ b/gpt_index/readers/file.py @@ -12,6 +12,9 @@ class SimpleDirectoryReader(BaseReader): Can read files into separate documents, or concatenates files into one document text. + input_dir (str): Path to the directory. + exclude_hidden (bool): Whether to exclude hidden files (dotfiles). + """ def __init__(self, input_dir: str, exclude_hidden: bool = True) -> None: @@ -26,7 +29,15 @@ class SimpleDirectoryReader(BaseReader): self.input_files = input_files def load_data(self, **load_kwargs: Any) -> List[Document]: - """Load data from the input directory.""" + """Load data from the input directory. + + Args: + concatenate (bool): whether to concatenate all files into one document. + + Returns: + List[Document]: A list of documents. + + """ concatenate = load_kwargs.get("concatenate", True) data = "" data_list = [] diff --git a/gpt_index/readers/mongo.py b/gpt_index/readers/mongo.py index 16a5b24c20..7404223e88 100644 --- a/gpt_index/readers/mongo.py +++ b/gpt_index/readers/mongo.py @@ -11,6 +11,11 @@ class SimpleMongoReader(BaseReader): Concatenates each Mongo doc into Document used by GPT Index. + Args: + host (str): Mongo host. + port (int): Mongo port. + max_docs (int): Maximum number of documents to load. + """ def __init__(self, host: str, port: int, max_docs: int = 1000) -> None: @@ -43,7 +48,16 @@ class SimpleMongoReader(BaseReader): return documents def load_data(self, **load_kwargs: Any) -> List[Document]: - """Load data from the input directory.""" + """Load data from the input directory. + + Args: + db_name (str): name of the database. + collection_name (str): name of the collection. + + Returns: + List[Document]: A list of documents. + + """ if "db_name" not in load_kwargs: raise ValueError("`db_name` not found in load_kwargs.") else: diff --git a/gpt_index/readers/notion.py b/gpt_index/readers/notion.py index 8fc9855059..1bec6a4fd8 100644 --- a/gpt_index/readers/notion.py +++ b/gpt_index/readers/notion.py @@ -18,6 +18,9 @@ class NotionPageReader(BaseReader): Reads a set of Notion pages. + Args: + integration_token (str): Notion integration token. + """ def __init__(self, integration_token: Optional[str] = None) -> None: @@ -115,7 +118,15 @@ class NotionPageReader(BaseReader): return page_ids def load_data(self, **load_kwargs: Any) -> List[Document]: - """Load data from the input directory.""" + """Load data from the input directory. + + Args: + page_ids (List[str]): List of page ids to load. + + Returns: + List[Document]: List of documents. + + """ if "page_ids" not in load_kwargs: raise ValueError('Must specify a "page_ids" in `load_kwargs`.') docs = [] diff --git a/gpt_index/readers/slack.py b/gpt_index/readers/slack.py index 73cae8651d..3fd22a4978 100644 --- a/gpt_index/readers/slack.py +++ b/gpt_index/readers/slack.py @@ -14,6 +14,10 @@ class SlackReader(BaseReader): Reads conversations from channels. + Args: + slack_token (Optional[str]): Slack token. If not provided, we + assume the environment variable `SLACK_BOT_TOKEN` is set. + """ def __init__(self, slack_token: Optional[str] = None) -> None: @@ -100,7 +104,15 @@ class SlackReader(BaseReader): return "\n\n".join(result_messages) def load_data(self, **load_kwargs: Any) -> List[Document]: - """Load data from the input directory.""" + """Load data from the input directory. + + Args: + channel_ids (List[str]): List of channel ids to read. + + Returns: + List[Document]: List of documents. + + """ channel_ids = load_kwargs.pop("channel_ids", None) if channel_ids is None: raise ValueError('Must specify a "channel_id" in `load_kwargs`.') diff --git a/gpt_index/readers/wikipedia.py b/gpt_index/readers/wikipedia.py index fd361aa1db..2db0fb0cd4 100644 --- a/gpt_index/readers/wikipedia.py +++ b/gpt_index/readers/wikipedia.py @@ -22,7 +22,12 @@ class WikipediaReader(BaseReader): ) def load_data(self, **load_kwargs: Any) -> List[Document]: - """Load data from the input directory.""" + """Load data from the input directory. + + Args: + pages (List[str]): List of pages to read. + + """ import wikipedia pages: List[str] = load_kwargs.pop("pages", None) diff --git a/tests/indices/list/__init__.py b/tests/indices/list/__init__.py index 1d4640565a..b24c607f33 100644 --- a/tests/indices/list/__init__.py +++ b/tests/indices/list/__init__.py @@ -1 +1,7 @@ -"""Init file.""" +"""List-based data structures.""" + +from gpt_index.indices.list.base import GPTListIndex + +__all__ = [ + "GPTListIndex", +] -- GitLab