From 684cdbca00f1650ba8a5f80f41ffebcf3e7b535f Mon Sep 17 00:00:00 2001 From: Logan <logan.markewich@live.com> Date: Mon, 3 Apr 2023 21:38:03 -0600 Subject: [PATCH] Add Notebooks to Docs/Sphinx (#1039) --- .github/workflows/dev_docs.yml | 2 + .gitignore | 3 +- docs/Makefile | 1 + docs/build_notebooks.py | 27 + docs/conf.py | 8 +- docs/guides/notebooks.rst | 171 +- .../async/AsyncComposableIndicesSEC.nblink | 1 + .../async/AsyncGPTTreeIndexDemo.nblink | 1 + .../async/AsyncLLMPredictorDemo.nblink | 1 + .../notebooks/async/AsyncQueryDemo.nblink | 1 + .../notebooks/azure_demo/AzureOpenAI.nblink | 1 + .../notebooks/chatbot/Chatbot_SEC.nblink | 1 + .../ChatGPTRetrievalPluginIndexDemo.nblink | 1 + .../ChatGPTRetrievalPluginReaderDemo.nblink | 1 + .../ChatGPT_Retrieval_Plugin_Upload.nblink | 1 + .../ComposableIndices-Prior.nblink | 1 + .../ComposableIndices-Weaviate.nblink | 1 + .../ComposableIndices.nblink | 1 + .../composable_indices/QASummaryGraph.nblink | 1 + .../cost_analysis/TokenPredictor.nblink | 1 + .../data_connectors/ChromaDemo.nblink | 1 + .../data_connectors/DatabaseReaderDemo.nblink | 1 + .../data_connectors/DiscordDemo.nblink | 1 + .../data_connectors/FaissDemo.nblink | 1 + .../GithubRepositoryReaderDemo.nblink | 1 + .../data_connectors/GoogleDocsDemo.nblink | 1 + .../notebooks/data_connectors/MakeDemo.nblink | 1 + .../data_connectors/MboxReaderDemo.nblink | 1 + .../data_connectors/MongoDemo.nblink | 1 + .../data_connectors/NotionDemo.nblink | 1 + .../data_connectors/ObsidianReaderDemo.nblink | 1 + .../data_connectors/PineconeDemo.nblink | 1 + .../data_connectors/QdrantDemo.nblink | 1 + .../data_connectors/SlackDemo.nblink | 1 + .../data_connectors/TwitterDemo.nblink | 1 + .../data_connectors/WeaviateDemo.nblink | 1 + .../data_connectors/WebPageDemo.nblink | 1 + .../notebooks/docstore/DocstoreDemo.nblink | 1 + .../evaluation/GuardrailsDemo.nblink | 1 + .../LangchainOutputParserDemo.nblink | 1 + .../evaluation/TestNYC-Evaluation.nblink | 1 + .../guides/notebooks/gatsby/TestGatsby.nblink | 1 + .../knowledge_graph/KnowledgeGraphDemo.nblink | 1 + .../langchain_demo/LangchainDemo.nblink | 1 + .../notebooks/multimodal/Multimodal.nblink | 1 + .../NodePostprocessorDemo.nblink | 1 + .../notebooks/optimizer/OptimizerDemo.nblink | 1 + .../DavinciComparison.nblink | 1 + .../paul_graham_essay/GPT4Comparison.nblink | 1 + .../paul_graham_essay/InsertDemo.nblink | 1 + .../KeywordTableComparison.nblink | 1 + .../SentenceSplittingDemo.nblink | 1 + .../paul_graham_essay/TestEssay.nblink | 1 + .../playground/PlaygroundDemo.nblink | 1 + .../HyDEQueryTransformDemo.nblink | 1 + .../struct_indices/PandasIndexDemo.nblink | 1 + .../SQLIndexDemo-Context.nblink | 1 + .../SQLIndexDemo-ManyTables.nblink | 1 + .../struct_indices/SQLIndexDemo.nblink | 1 + .../test_wiki/TestNYC-Benchmark-GPT4.nblink | 1 + .../test_wiki/TestNYC-Tree-GPT4.nblink | 1 + .../guides/notebooks/test_wiki/TestNYC.nblink | 1 + .../test_wiki/TestNYC_Embeddings.nblink | 1 + .../notebooks/test_wiki/TestWikiReader.nblink | 1 + .../AsyncIndexCreationDemo.nblink | 1 + .../vector_indices/ChromaIndexDemo.nblink | 1 + .../vector_indices/FaissIndexDemo.nblink | 1 + .../vector_indices/OpensearchDemo.nblink | 1 + .../vector_indices/PineconeIndexDemo.nblink | 1 + .../vector_indices/QdrantIndexDemo.nblink | 1 + .../SimpleIndexDemo-ChatGPT.nblink | 1 + .../SimpleIndexDemo-multistep.nblink | 1 + .../SimpleIndexDemo-streaming.nblink | 1 + .../vector_indices/SimpleIndexDemo.nblink | 1 + .../vector_indices/WeaviateIndexDemo.nblink | 1 + docs/requirements.txt | 6 +- .../async/AsyncComposableIndicesSEC.ipynb | 10 +- examples/async/AsyncGPTTreeIndexDemo.ipynb | 270 +- examples/chatbot/Chatbot_SEC.ipynb | 10 +- .../ChatGPTRetrievalPluginIndexDemo.ipynb | 2 +- .../ChatGPT_Retrieval_Plugin_Upload.ipynb | 10 +- .../composable_indices/QASummaryGraph.ipynb | 10 +- examples/cost_analysis/TokenPredictor.ipynb | 706 ++-- .../data_connectors/DatabaseReaderDemo.ipynb | 409 +- .../GithubRepositoryReaderDemo.ipynb | 222 +- examples/data_connectors/MboxReaderDemo.ipynb | 208 +- .../data_connectors/ObsidianReaderDemo.ipynb | 275 +- examples/data_connectors/TwitterDemo.ipynb | 216 +- examples/data_connectors/WeaviateDemo.ipynb | 352 +- examples/evaluation/GuardrailsDemo.ipynb | 680 ++-- .../LangchainOutputParserDemo.ipynb | 662 ++-- examples/evaluation/TestNYC-Evaluation.ipynb | 10 +- examples/gatsby/TestGatsby.ipynb | 374 +- .../knowledge_graph/KnowledgeGraphDemo.ipynb | 10 +- examples/langchain_demo/LangchainDemo.ipynb | 2 +- examples/multimodal/Multimodal.ipynb | 1201 +++--- examples/optimizer/OptimizerDemo.ipynb | 398 +- .../paul_graham_essay/DavinciComparison.ipynb | 26 +- .../paul_graham_essay/GPT4Comparison.ipynb | 1294 +++---- examples/paul_graham_essay/InsertDemo.ipynb | 10 +- .../KeywordTableComparison.ipynb | 852 ++--- examples/paul_graham_essay/TestEssay.ipynb | 1322 +++---- examples/playground/PlaygroundDemo.ipynb | 830 ++-- .../HyDEQueryTransformDemo.ipynb | 2 +- examples/struct_indices/PandasIndexDemo.ipynb | 2 +- .../struct_indices/SQLIndexDemo-Context.ipynb | 636 +-- .../SQLIndexDemo-ManyTables.ipynb | 798 ++-- examples/struct_indices/SQLIndexDemo.ipynb | 4 +- .../test_wiki/TestNYC-Benchmark-GPT4.ipynb | 3404 +++++++++-------- examples/test_wiki/TestNYC-Tree-GPT4.ipynb | 10 +- examples/test_wiki/TestNYC.ipynb | 366 +- examples/test_wiki/TestNYC_Embeddings.ipynb | 882 ++--- examples/test_wiki/TestWikiReader.ipynb | 582 +-- .../AsyncIndexCreationDemo.ipynb | 426 +-- .../SimpleIndexDemo-ChatGPT.ipynb | 851 +++-- .../SimpleIndexDemo-multistep.ipynb | 4 +- .../SimpleIndexDemo-streaming.ipynb | 278 +- examples/vector_indices/SimpleIndexDemo.ipynb | 4 +- 118 files changed, 9684 insertions(+), 9223 deletions(-) create mode 100644 docs/build_notebooks.py create mode 100644 docs/guides/notebooks/async/AsyncComposableIndicesSEC.nblink create mode 100644 docs/guides/notebooks/async/AsyncGPTTreeIndexDemo.nblink create mode 100644 docs/guides/notebooks/async/AsyncLLMPredictorDemo.nblink create mode 100644 docs/guides/notebooks/async/AsyncQueryDemo.nblink create mode 100644 docs/guides/notebooks/azure_demo/AzureOpenAI.nblink create mode 100644 docs/guides/notebooks/chatbot/Chatbot_SEC.nblink create mode 100644 docs/guides/notebooks/chatgpt_plugin/ChatGPTRetrievalPluginIndexDemo.nblink create mode 100644 docs/guides/notebooks/chatgpt_plugin/ChatGPTRetrievalPluginReaderDemo.nblink create mode 100644 docs/guides/notebooks/chatgpt_plugin/ChatGPT_Retrieval_Plugin_Upload.nblink create mode 100644 docs/guides/notebooks/composable_indices/ComposableIndices-Prior.nblink create mode 100644 docs/guides/notebooks/composable_indices/ComposableIndices-Weaviate.nblink create mode 100644 docs/guides/notebooks/composable_indices/ComposableIndices.nblink create mode 100644 docs/guides/notebooks/composable_indices/QASummaryGraph.nblink create mode 100644 docs/guides/notebooks/cost_analysis/TokenPredictor.nblink create mode 100644 docs/guides/notebooks/data_connectors/ChromaDemo.nblink create mode 100644 docs/guides/notebooks/data_connectors/DatabaseReaderDemo.nblink create mode 100644 docs/guides/notebooks/data_connectors/DiscordDemo.nblink create mode 100644 docs/guides/notebooks/data_connectors/FaissDemo.nblink create mode 100644 docs/guides/notebooks/data_connectors/GithubRepositoryReaderDemo.nblink create mode 100644 docs/guides/notebooks/data_connectors/GoogleDocsDemo.nblink create mode 100644 docs/guides/notebooks/data_connectors/MakeDemo.nblink create mode 100644 docs/guides/notebooks/data_connectors/MboxReaderDemo.nblink create mode 100644 docs/guides/notebooks/data_connectors/MongoDemo.nblink create mode 100644 docs/guides/notebooks/data_connectors/NotionDemo.nblink create mode 100644 docs/guides/notebooks/data_connectors/ObsidianReaderDemo.nblink create mode 100644 docs/guides/notebooks/data_connectors/PineconeDemo.nblink create mode 100644 docs/guides/notebooks/data_connectors/QdrantDemo.nblink create mode 100644 docs/guides/notebooks/data_connectors/SlackDemo.nblink create mode 100644 docs/guides/notebooks/data_connectors/TwitterDemo.nblink create mode 100644 docs/guides/notebooks/data_connectors/WeaviateDemo.nblink create mode 100644 docs/guides/notebooks/data_connectors/WebPageDemo.nblink create mode 100644 docs/guides/notebooks/docstore/DocstoreDemo.nblink create mode 100644 docs/guides/notebooks/evaluation/GuardrailsDemo.nblink create mode 100644 docs/guides/notebooks/evaluation/LangchainOutputParserDemo.nblink create mode 100644 docs/guides/notebooks/evaluation/TestNYC-Evaluation.nblink create mode 100644 docs/guides/notebooks/gatsby/TestGatsby.nblink create mode 100644 docs/guides/notebooks/knowledge_graph/KnowledgeGraphDemo.nblink create mode 100644 docs/guides/notebooks/langchain_demo/LangchainDemo.nblink create mode 100644 docs/guides/notebooks/multimodal/Multimodal.nblink create mode 100644 docs/guides/notebooks/node_postprocessor/NodePostprocessorDemo.nblink create mode 100644 docs/guides/notebooks/optimizer/OptimizerDemo.nblink create mode 100644 docs/guides/notebooks/paul_graham_essay/DavinciComparison.nblink create mode 100644 docs/guides/notebooks/paul_graham_essay/GPT4Comparison.nblink create mode 100644 docs/guides/notebooks/paul_graham_essay/InsertDemo.nblink create mode 100644 docs/guides/notebooks/paul_graham_essay/KeywordTableComparison.nblink create mode 100644 docs/guides/notebooks/paul_graham_essay/SentenceSplittingDemo.nblink create mode 100644 docs/guides/notebooks/paul_graham_essay/TestEssay.nblink create mode 100644 docs/guides/notebooks/playground/PlaygroundDemo.nblink create mode 100644 docs/guides/notebooks/query_transformations/HyDEQueryTransformDemo.nblink create mode 100644 docs/guides/notebooks/struct_indices/PandasIndexDemo.nblink create mode 100644 docs/guides/notebooks/struct_indices/SQLIndexDemo-Context.nblink create mode 100644 docs/guides/notebooks/struct_indices/SQLIndexDemo-ManyTables.nblink create mode 100644 docs/guides/notebooks/struct_indices/SQLIndexDemo.nblink create mode 100644 docs/guides/notebooks/test_wiki/TestNYC-Benchmark-GPT4.nblink create mode 100644 docs/guides/notebooks/test_wiki/TestNYC-Tree-GPT4.nblink create mode 100644 docs/guides/notebooks/test_wiki/TestNYC.nblink create mode 100644 docs/guides/notebooks/test_wiki/TestNYC_Embeddings.nblink create mode 100644 docs/guides/notebooks/test_wiki/TestWikiReader.nblink create mode 100644 docs/guides/notebooks/vector_indices/AsyncIndexCreationDemo.nblink create mode 100644 docs/guides/notebooks/vector_indices/ChromaIndexDemo.nblink create mode 100644 docs/guides/notebooks/vector_indices/FaissIndexDemo.nblink create mode 100644 docs/guides/notebooks/vector_indices/OpensearchDemo.nblink create mode 100644 docs/guides/notebooks/vector_indices/PineconeIndexDemo.nblink create mode 100644 docs/guides/notebooks/vector_indices/QdrantIndexDemo.nblink create mode 100644 docs/guides/notebooks/vector_indices/SimpleIndexDemo-ChatGPT.nblink create mode 100644 docs/guides/notebooks/vector_indices/SimpleIndexDemo-multistep.nblink create mode 100644 docs/guides/notebooks/vector_indices/SimpleIndexDemo-streaming.nblink create mode 100644 docs/guides/notebooks/vector_indices/SimpleIndexDemo.nblink create mode 100644 docs/guides/notebooks/vector_indices/WeaviateIndexDemo.nblink diff --git a/.github/workflows/dev_docs.yml b/.github/workflows/dev_docs.yml index f0b2e907ff..e1cbb57ad8 100644 --- a/.github/workflows/dev_docs.yml +++ b/.github/workflows/dev_docs.yml @@ -10,9 +10,11 @@ jobs: steps: - uses: actions/checkout@v2 - uses: cpina/github-action-push-to-another-repository@main + - uses: awalsh128/cache-apt-pkgs-action@latest env: API_TOKEN_GITHUB: ${{ secrets.PAT}} with: + packages: pandoc source-directory: './docs' destination-github-username: 'avb-is-me' destination-repository-name: 'gpt_index' diff --git a/.gitignore b/.gitignore index 0900a937e6..c31c85352c 100644 --- a/.gitignore +++ b/.gitignore @@ -82,7 +82,6 @@ target/ # Jupyter Notebook .ipynb_checkpoints -notebooks/ # IPython profile_default/ @@ -138,4 +137,4 @@ dmypy.json # Jetbrains .idea -modules/ \ No newline at end of file +modules/ diff --git a/docs/Makefile b/docs/Makefile index d4bb2cbb9e..d7e778614b 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -17,4 +17,5 @@ help: # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile + python ./build_notebooks.py @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/build_notebooks.py b/docs/build_notebooks.py new file mode 100644 index 0000000000..ed7fb0ca33 --- /dev/null +++ b/docs/build_notebooks.py @@ -0,0 +1,27 @@ +import json +import os + +source_dir = "../examples/" +dest_dir = "./guides/notebooks/" +relative_path = "../../../../examples" + + +for example_dir in os.listdir(source_dir): + example_dir_path = os.path.join(source_dir, example_dir) + + for nb_name in os.listdir(example_dir_path): + if not nb_name.endswith(".ipynb"): + continue + + # make dest folder in docs + os.makedirs(os.path.join(dest_dir, example_dir), exist_ok=True) + + # build link text + relative_nb_path = os.path.join(relative_path, example_dir, nb_name) + nb_link_text = json.dumps({"path": relative_nb_path}) + + # write nbsphinx-link document + nbsphinx_name = nb_name.replace(".ipynb", ".nblink") + nbsphinx_path = os.path.join(dest_dir, example_dir, nbsphinx_name) + with open(nbsphinx_path, "w") as f: + f.write(nb_link_text) diff --git a/docs/conf.py b/docs/conf.py index 4d37d641e5..f989990cf0 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -37,6 +37,8 @@ extensions = [ "sphinx_rtd_theme", "sphinx.ext.mathjax", "myst_parser", + "nbsphinx", + "nbsphinx_link", ] myst_heading_anchors = 4 @@ -45,7 +47,7 @@ myst_heading_anchors = 4 suppress_warnings = ["myst.header"] templates_path = ["_templates"] -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "**.ipynb_checkpoints"] # -- Options for HTML output ------------------------------------------------- @@ -53,3 +55,7 @@ exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] html_theme = "sphinx_rtd_theme" html_static_path = ["_static"] + +# nbsphinx options +nbsphinx_execute = "never" +nbsphinx_allow_errors = True diff --git a/docs/guides/notebooks.rst b/docs/guides/notebooks.rst index 5fae146bab..5e6773fabc 100644 --- a/docs/guides/notebooks.rst +++ b/docs/guides/notebooks.rst @@ -3,4 +3,173 @@ 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 +All examples can be accessed using the menu links or can be found `directly in the repository`_. + +.. _directly in the repository: https://github.com/jerryjliu/llama_index/tree/main/examples + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Async + + ./notebooks/async/* + + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Azure + + notebooks/azure_demo/* + + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Chatbot + + notebooks/chatbot/* + + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: ChatGPT Plugin + + notebooks/chatgpt_plugin/* + + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Composable Indices + + notebooks/composable_indices/* + + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Cost Analysis + + notebooks/cost_analysis/* + + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Data Connectors + + notebooks/data_connectors/* + + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Docstore + + notebooks/docstore/* + + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Evaluation + + notebooks/evaluation/* + + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Gastby + + notebooks/gatsby/* + + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Knowledge Graph + + notebooks/knowledge_graph/* + + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Langchain Integration + + notebooks/langchain_demo/* + + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Multimodal + + notebooks/multimodal/* + + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Node Post-Processor + + notebooks/node_postprocessor/* + + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Optimizer + + notebooks/optimizer/* + + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Paul Graham Essay + + notebooks/paul_graham_essay/* + + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Playground + + notebooks/playground/* + + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Query Transformations + + notebooks/query_transformations/* + + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Structured Indices + + notebooks/struct_indices/* + + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Wikipedia + + notebooks/test_wiki/* + + +.. toctree:: + :glob: + :maxdepth: 1 + :caption: Vector Indices + + notebooks/vector_indices/* diff --git a/docs/guides/notebooks/async/AsyncComposableIndicesSEC.nblink b/docs/guides/notebooks/async/AsyncComposableIndicesSEC.nblink new file mode 100644 index 0000000000..27f243d52e --- /dev/null +++ b/docs/guides/notebooks/async/AsyncComposableIndicesSEC.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/async/AsyncComposableIndicesSEC.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/async/AsyncGPTTreeIndexDemo.nblink b/docs/guides/notebooks/async/AsyncGPTTreeIndexDemo.nblink new file mode 100644 index 0000000000..a553014c27 --- /dev/null +++ b/docs/guides/notebooks/async/AsyncGPTTreeIndexDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/async/AsyncGPTTreeIndexDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/async/AsyncLLMPredictorDemo.nblink b/docs/guides/notebooks/async/AsyncLLMPredictorDemo.nblink new file mode 100644 index 0000000000..a61033974b --- /dev/null +++ b/docs/guides/notebooks/async/AsyncLLMPredictorDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/async/AsyncLLMPredictorDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/async/AsyncQueryDemo.nblink b/docs/guides/notebooks/async/AsyncQueryDemo.nblink new file mode 100644 index 0000000000..e5a19ec1c4 --- /dev/null +++ b/docs/guides/notebooks/async/AsyncQueryDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/async/AsyncQueryDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/azure_demo/AzureOpenAI.nblink b/docs/guides/notebooks/azure_demo/AzureOpenAI.nblink new file mode 100644 index 0000000000..318e9bf7fe --- /dev/null +++ b/docs/guides/notebooks/azure_demo/AzureOpenAI.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/azure_demo/AzureOpenAI.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/chatbot/Chatbot_SEC.nblink b/docs/guides/notebooks/chatbot/Chatbot_SEC.nblink new file mode 100644 index 0000000000..5156a52750 --- /dev/null +++ b/docs/guides/notebooks/chatbot/Chatbot_SEC.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/chatbot/Chatbot_SEC.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/chatgpt_plugin/ChatGPTRetrievalPluginIndexDemo.nblink b/docs/guides/notebooks/chatgpt_plugin/ChatGPTRetrievalPluginIndexDemo.nblink new file mode 100644 index 0000000000..424014f345 --- /dev/null +++ b/docs/guides/notebooks/chatgpt_plugin/ChatGPTRetrievalPluginIndexDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/chatgpt_plugin/ChatGPTRetrievalPluginIndexDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/chatgpt_plugin/ChatGPTRetrievalPluginReaderDemo.nblink b/docs/guides/notebooks/chatgpt_plugin/ChatGPTRetrievalPluginReaderDemo.nblink new file mode 100644 index 0000000000..bcad633aa0 --- /dev/null +++ b/docs/guides/notebooks/chatgpt_plugin/ChatGPTRetrievalPluginReaderDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/chatgpt_plugin/ChatGPTRetrievalPluginReaderDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/chatgpt_plugin/ChatGPT_Retrieval_Plugin_Upload.nblink b/docs/guides/notebooks/chatgpt_plugin/ChatGPT_Retrieval_Plugin_Upload.nblink new file mode 100644 index 0000000000..526d471354 --- /dev/null +++ b/docs/guides/notebooks/chatgpt_plugin/ChatGPT_Retrieval_Plugin_Upload.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/chatgpt_plugin/ChatGPT_Retrieval_Plugin_Upload.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/composable_indices/ComposableIndices-Prior.nblink b/docs/guides/notebooks/composable_indices/ComposableIndices-Prior.nblink new file mode 100644 index 0000000000..c5dec604c4 --- /dev/null +++ b/docs/guides/notebooks/composable_indices/ComposableIndices-Prior.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/composable_indices/ComposableIndices-Prior.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/composable_indices/ComposableIndices-Weaviate.nblink b/docs/guides/notebooks/composable_indices/ComposableIndices-Weaviate.nblink new file mode 100644 index 0000000000..bccfa5cc2d --- /dev/null +++ b/docs/guides/notebooks/composable_indices/ComposableIndices-Weaviate.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/composable_indices/ComposableIndices-Weaviate.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/composable_indices/ComposableIndices.nblink b/docs/guides/notebooks/composable_indices/ComposableIndices.nblink new file mode 100644 index 0000000000..edab307b2b --- /dev/null +++ b/docs/guides/notebooks/composable_indices/ComposableIndices.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/composable_indices/ComposableIndices.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/composable_indices/QASummaryGraph.nblink b/docs/guides/notebooks/composable_indices/QASummaryGraph.nblink new file mode 100644 index 0000000000..1648510d8d --- /dev/null +++ b/docs/guides/notebooks/composable_indices/QASummaryGraph.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/composable_indices/QASummaryGraph.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/cost_analysis/TokenPredictor.nblink b/docs/guides/notebooks/cost_analysis/TokenPredictor.nblink new file mode 100644 index 0000000000..915e93b1da --- /dev/null +++ b/docs/guides/notebooks/cost_analysis/TokenPredictor.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/cost_analysis/TokenPredictor.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/data_connectors/ChromaDemo.nblink b/docs/guides/notebooks/data_connectors/ChromaDemo.nblink new file mode 100644 index 0000000000..6d11f643b1 --- /dev/null +++ b/docs/guides/notebooks/data_connectors/ChromaDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/data_connectors/ChromaDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/data_connectors/DatabaseReaderDemo.nblink b/docs/guides/notebooks/data_connectors/DatabaseReaderDemo.nblink new file mode 100644 index 0000000000..287ef60779 --- /dev/null +++ b/docs/guides/notebooks/data_connectors/DatabaseReaderDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/data_connectors/DatabaseReaderDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/data_connectors/DiscordDemo.nblink b/docs/guides/notebooks/data_connectors/DiscordDemo.nblink new file mode 100644 index 0000000000..1d4952cb11 --- /dev/null +++ b/docs/guides/notebooks/data_connectors/DiscordDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/data_connectors/DiscordDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/data_connectors/FaissDemo.nblink b/docs/guides/notebooks/data_connectors/FaissDemo.nblink new file mode 100644 index 0000000000..1151a573b4 --- /dev/null +++ b/docs/guides/notebooks/data_connectors/FaissDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/data_connectors/FaissDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/data_connectors/GithubRepositoryReaderDemo.nblink b/docs/guides/notebooks/data_connectors/GithubRepositoryReaderDemo.nblink new file mode 100644 index 0000000000..689936b1da --- /dev/null +++ b/docs/guides/notebooks/data_connectors/GithubRepositoryReaderDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/data_connectors/GithubRepositoryReaderDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/data_connectors/GoogleDocsDemo.nblink b/docs/guides/notebooks/data_connectors/GoogleDocsDemo.nblink new file mode 100644 index 0000000000..60f687b022 --- /dev/null +++ b/docs/guides/notebooks/data_connectors/GoogleDocsDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/data_connectors/GoogleDocsDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/data_connectors/MakeDemo.nblink b/docs/guides/notebooks/data_connectors/MakeDemo.nblink new file mode 100644 index 0000000000..edf9cd5a93 --- /dev/null +++ b/docs/guides/notebooks/data_connectors/MakeDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/data_connectors/MakeDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/data_connectors/MboxReaderDemo.nblink b/docs/guides/notebooks/data_connectors/MboxReaderDemo.nblink new file mode 100644 index 0000000000..beeb32654d --- /dev/null +++ b/docs/guides/notebooks/data_connectors/MboxReaderDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/data_connectors/MboxReaderDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/data_connectors/MongoDemo.nblink b/docs/guides/notebooks/data_connectors/MongoDemo.nblink new file mode 100644 index 0000000000..e627ac29f5 --- /dev/null +++ b/docs/guides/notebooks/data_connectors/MongoDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/data_connectors/MongoDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/data_connectors/NotionDemo.nblink b/docs/guides/notebooks/data_connectors/NotionDemo.nblink new file mode 100644 index 0000000000..401c1c4873 --- /dev/null +++ b/docs/guides/notebooks/data_connectors/NotionDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/data_connectors/NotionDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/data_connectors/ObsidianReaderDemo.nblink b/docs/guides/notebooks/data_connectors/ObsidianReaderDemo.nblink new file mode 100644 index 0000000000..6faffd22b6 --- /dev/null +++ b/docs/guides/notebooks/data_connectors/ObsidianReaderDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/data_connectors/ObsidianReaderDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/data_connectors/PineconeDemo.nblink b/docs/guides/notebooks/data_connectors/PineconeDemo.nblink new file mode 100644 index 0000000000..a5a213bb9a --- /dev/null +++ b/docs/guides/notebooks/data_connectors/PineconeDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/data_connectors/PineconeDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/data_connectors/QdrantDemo.nblink b/docs/guides/notebooks/data_connectors/QdrantDemo.nblink new file mode 100644 index 0000000000..900ea79354 --- /dev/null +++ b/docs/guides/notebooks/data_connectors/QdrantDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/data_connectors/QdrantDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/data_connectors/SlackDemo.nblink b/docs/guides/notebooks/data_connectors/SlackDemo.nblink new file mode 100644 index 0000000000..231dbf937f --- /dev/null +++ b/docs/guides/notebooks/data_connectors/SlackDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/data_connectors/SlackDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/data_connectors/TwitterDemo.nblink b/docs/guides/notebooks/data_connectors/TwitterDemo.nblink new file mode 100644 index 0000000000..0b208c3f90 --- /dev/null +++ b/docs/guides/notebooks/data_connectors/TwitterDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/data_connectors/TwitterDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/data_connectors/WeaviateDemo.nblink b/docs/guides/notebooks/data_connectors/WeaviateDemo.nblink new file mode 100644 index 0000000000..ab9e2427f6 --- /dev/null +++ b/docs/guides/notebooks/data_connectors/WeaviateDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/data_connectors/WeaviateDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/data_connectors/WebPageDemo.nblink b/docs/guides/notebooks/data_connectors/WebPageDemo.nblink new file mode 100644 index 0000000000..829d3854eb --- /dev/null +++ b/docs/guides/notebooks/data_connectors/WebPageDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/data_connectors/WebPageDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/docstore/DocstoreDemo.nblink b/docs/guides/notebooks/docstore/DocstoreDemo.nblink new file mode 100644 index 0000000000..3f379a2f68 --- /dev/null +++ b/docs/guides/notebooks/docstore/DocstoreDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/docstore/DocstoreDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/evaluation/GuardrailsDemo.nblink b/docs/guides/notebooks/evaluation/GuardrailsDemo.nblink new file mode 100644 index 0000000000..c67b10a4b4 --- /dev/null +++ b/docs/guides/notebooks/evaluation/GuardrailsDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/evaluation/GuardrailsDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/evaluation/LangchainOutputParserDemo.nblink b/docs/guides/notebooks/evaluation/LangchainOutputParserDemo.nblink new file mode 100644 index 0000000000..a7a4722097 --- /dev/null +++ b/docs/guides/notebooks/evaluation/LangchainOutputParserDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/evaluation/LangchainOutputParserDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/evaluation/TestNYC-Evaluation.nblink b/docs/guides/notebooks/evaluation/TestNYC-Evaluation.nblink new file mode 100644 index 0000000000..977b921aa1 --- /dev/null +++ b/docs/guides/notebooks/evaluation/TestNYC-Evaluation.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/evaluation/TestNYC-Evaluation.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/gatsby/TestGatsby.nblink b/docs/guides/notebooks/gatsby/TestGatsby.nblink new file mode 100644 index 0000000000..45dbaa9346 --- /dev/null +++ b/docs/guides/notebooks/gatsby/TestGatsby.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/gatsby/TestGatsby.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/knowledge_graph/KnowledgeGraphDemo.nblink b/docs/guides/notebooks/knowledge_graph/KnowledgeGraphDemo.nblink new file mode 100644 index 0000000000..44bcf85d64 --- /dev/null +++ b/docs/guides/notebooks/knowledge_graph/KnowledgeGraphDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/knowledge_graph/KnowledgeGraphDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/langchain_demo/LangchainDemo.nblink b/docs/guides/notebooks/langchain_demo/LangchainDemo.nblink new file mode 100644 index 0000000000..251948c9bf --- /dev/null +++ b/docs/guides/notebooks/langchain_demo/LangchainDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/langchain_demo/LangchainDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/multimodal/Multimodal.nblink b/docs/guides/notebooks/multimodal/Multimodal.nblink new file mode 100644 index 0000000000..db221882e8 --- /dev/null +++ b/docs/guides/notebooks/multimodal/Multimodal.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/multimodal/Multimodal.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/node_postprocessor/NodePostprocessorDemo.nblink b/docs/guides/notebooks/node_postprocessor/NodePostprocessorDemo.nblink new file mode 100644 index 0000000000..bb855d8169 --- /dev/null +++ b/docs/guides/notebooks/node_postprocessor/NodePostprocessorDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/node_postprocessor/NodePostprocessorDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/optimizer/OptimizerDemo.nblink b/docs/guides/notebooks/optimizer/OptimizerDemo.nblink new file mode 100644 index 0000000000..c9d893cf65 --- /dev/null +++ b/docs/guides/notebooks/optimizer/OptimizerDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/optimizer/OptimizerDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/paul_graham_essay/DavinciComparison.nblink b/docs/guides/notebooks/paul_graham_essay/DavinciComparison.nblink new file mode 100644 index 0000000000..6d585c00e7 --- /dev/null +++ b/docs/guides/notebooks/paul_graham_essay/DavinciComparison.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/paul_graham_essay/DavinciComparison.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/paul_graham_essay/GPT4Comparison.nblink b/docs/guides/notebooks/paul_graham_essay/GPT4Comparison.nblink new file mode 100644 index 0000000000..63768b3834 --- /dev/null +++ b/docs/guides/notebooks/paul_graham_essay/GPT4Comparison.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/paul_graham_essay/GPT4Comparison.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/paul_graham_essay/InsertDemo.nblink b/docs/guides/notebooks/paul_graham_essay/InsertDemo.nblink new file mode 100644 index 0000000000..94c7766261 --- /dev/null +++ b/docs/guides/notebooks/paul_graham_essay/InsertDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/paul_graham_essay/InsertDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/paul_graham_essay/KeywordTableComparison.nblink b/docs/guides/notebooks/paul_graham_essay/KeywordTableComparison.nblink new file mode 100644 index 0000000000..df536641f0 --- /dev/null +++ b/docs/guides/notebooks/paul_graham_essay/KeywordTableComparison.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/paul_graham_essay/KeywordTableComparison.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/paul_graham_essay/SentenceSplittingDemo.nblink b/docs/guides/notebooks/paul_graham_essay/SentenceSplittingDemo.nblink new file mode 100644 index 0000000000..ad1fb314c2 --- /dev/null +++ b/docs/guides/notebooks/paul_graham_essay/SentenceSplittingDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/paul_graham_essay/SentenceSplittingDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/paul_graham_essay/TestEssay.nblink b/docs/guides/notebooks/paul_graham_essay/TestEssay.nblink new file mode 100644 index 0000000000..e2988e067b --- /dev/null +++ b/docs/guides/notebooks/paul_graham_essay/TestEssay.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/paul_graham_essay/TestEssay.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/playground/PlaygroundDemo.nblink b/docs/guides/notebooks/playground/PlaygroundDemo.nblink new file mode 100644 index 0000000000..b19e6d309e --- /dev/null +++ b/docs/guides/notebooks/playground/PlaygroundDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/playground/PlaygroundDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/query_transformations/HyDEQueryTransformDemo.nblink b/docs/guides/notebooks/query_transformations/HyDEQueryTransformDemo.nblink new file mode 100644 index 0000000000..c7e84b9aa4 --- /dev/null +++ b/docs/guides/notebooks/query_transformations/HyDEQueryTransformDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/query_transformations/HyDEQueryTransformDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/struct_indices/PandasIndexDemo.nblink b/docs/guides/notebooks/struct_indices/PandasIndexDemo.nblink new file mode 100644 index 0000000000..d6ec3f659c --- /dev/null +++ b/docs/guides/notebooks/struct_indices/PandasIndexDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/struct_indices/PandasIndexDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/struct_indices/SQLIndexDemo-Context.nblink b/docs/guides/notebooks/struct_indices/SQLIndexDemo-Context.nblink new file mode 100644 index 0000000000..794811f2b9 --- /dev/null +++ b/docs/guides/notebooks/struct_indices/SQLIndexDemo-Context.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/struct_indices/SQLIndexDemo-Context.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/struct_indices/SQLIndexDemo-ManyTables.nblink b/docs/guides/notebooks/struct_indices/SQLIndexDemo-ManyTables.nblink new file mode 100644 index 0000000000..482a9d0f10 --- /dev/null +++ b/docs/guides/notebooks/struct_indices/SQLIndexDemo-ManyTables.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/struct_indices/SQLIndexDemo-ManyTables.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/struct_indices/SQLIndexDemo.nblink b/docs/guides/notebooks/struct_indices/SQLIndexDemo.nblink new file mode 100644 index 0000000000..e2651cecc7 --- /dev/null +++ b/docs/guides/notebooks/struct_indices/SQLIndexDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/struct_indices/SQLIndexDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/test_wiki/TestNYC-Benchmark-GPT4.nblink b/docs/guides/notebooks/test_wiki/TestNYC-Benchmark-GPT4.nblink new file mode 100644 index 0000000000..e5e3f3eb46 --- /dev/null +++ b/docs/guides/notebooks/test_wiki/TestNYC-Benchmark-GPT4.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/test_wiki/TestNYC-Benchmark-GPT4.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/test_wiki/TestNYC-Tree-GPT4.nblink b/docs/guides/notebooks/test_wiki/TestNYC-Tree-GPT4.nblink new file mode 100644 index 0000000000..bbad368cb3 --- /dev/null +++ b/docs/guides/notebooks/test_wiki/TestNYC-Tree-GPT4.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/test_wiki/TestNYC-Tree-GPT4.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/test_wiki/TestNYC.nblink b/docs/guides/notebooks/test_wiki/TestNYC.nblink new file mode 100644 index 0000000000..9af98cb135 --- /dev/null +++ b/docs/guides/notebooks/test_wiki/TestNYC.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/test_wiki/TestNYC.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/test_wiki/TestNYC_Embeddings.nblink b/docs/guides/notebooks/test_wiki/TestNYC_Embeddings.nblink new file mode 100644 index 0000000000..9a81277e90 --- /dev/null +++ b/docs/guides/notebooks/test_wiki/TestNYC_Embeddings.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/test_wiki/TestNYC_Embeddings.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/test_wiki/TestWikiReader.nblink b/docs/guides/notebooks/test_wiki/TestWikiReader.nblink new file mode 100644 index 0000000000..b263c6cf36 --- /dev/null +++ b/docs/guides/notebooks/test_wiki/TestWikiReader.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/test_wiki/TestWikiReader.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/vector_indices/AsyncIndexCreationDemo.nblink b/docs/guides/notebooks/vector_indices/AsyncIndexCreationDemo.nblink new file mode 100644 index 0000000000..3a68f8d664 --- /dev/null +++ b/docs/guides/notebooks/vector_indices/AsyncIndexCreationDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/vector_indices/AsyncIndexCreationDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/vector_indices/ChromaIndexDemo.nblink b/docs/guides/notebooks/vector_indices/ChromaIndexDemo.nblink new file mode 100644 index 0000000000..15ff10564b --- /dev/null +++ b/docs/guides/notebooks/vector_indices/ChromaIndexDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/vector_indices/ChromaIndexDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/vector_indices/FaissIndexDemo.nblink b/docs/guides/notebooks/vector_indices/FaissIndexDemo.nblink new file mode 100644 index 0000000000..4b3d64aa54 --- /dev/null +++ b/docs/guides/notebooks/vector_indices/FaissIndexDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/vector_indices/FaissIndexDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/vector_indices/OpensearchDemo.nblink b/docs/guides/notebooks/vector_indices/OpensearchDemo.nblink new file mode 100644 index 0000000000..088df7a9c4 --- /dev/null +++ b/docs/guides/notebooks/vector_indices/OpensearchDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/vector_indices/OpensearchDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/vector_indices/PineconeIndexDemo.nblink b/docs/guides/notebooks/vector_indices/PineconeIndexDemo.nblink new file mode 100644 index 0000000000..3a97fa698c --- /dev/null +++ b/docs/guides/notebooks/vector_indices/PineconeIndexDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/vector_indices/PineconeIndexDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/vector_indices/QdrantIndexDemo.nblink b/docs/guides/notebooks/vector_indices/QdrantIndexDemo.nblink new file mode 100644 index 0000000000..672467f404 --- /dev/null +++ b/docs/guides/notebooks/vector_indices/QdrantIndexDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/vector_indices/QdrantIndexDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/vector_indices/SimpleIndexDemo-ChatGPT.nblink b/docs/guides/notebooks/vector_indices/SimpleIndexDemo-ChatGPT.nblink new file mode 100644 index 0000000000..a8dfbb2753 --- /dev/null +++ b/docs/guides/notebooks/vector_indices/SimpleIndexDemo-ChatGPT.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/vector_indices/SimpleIndexDemo-ChatGPT.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/vector_indices/SimpleIndexDemo-multistep.nblink b/docs/guides/notebooks/vector_indices/SimpleIndexDemo-multistep.nblink new file mode 100644 index 0000000000..a854f9e016 --- /dev/null +++ b/docs/guides/notebooks/vector_indices/SimpleIndexDemo-multistep.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/vector_indices/SimpleIndexDemo-multistep.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/vector_indices/SimpleIndexDemo-streaming.nblink b/docs/guides/notebooks/vector_indices/SimpleIndexDemo-streaming.nblink new file mode 100644 index 0000000000..765f138608 --- /dev/null +++ b/docs/guides/notebooks/vector_indices/SimpleIndexDemo-streaming.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/vector_indices/SimpleIndexDemo-streaming.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/vector_indices/SimpleIndexDemo.nblink b/docs/guides/notebooks/vector_indices/SimpleIndexDemo.nblink new file mode 100644 index 0000000000..8940a12d2d --- /dev/null +++ b/docs/guides/notebooks/vector_indices/SimpleIndexDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/vector_indices/SimpleIndexDemo.ipynb"} \ No newline at end of file diff --git a/docs/guides/notebooks/vector_indices/WeaviateIndexDemo.nblink b/docs/guides/notebooks/vector_indices/WeaviateIndexDemo.nblink new file mode 100644 index 0000000000..dc2ac1abb3 --- /dev/null +++ b/docs/guides/notebooks/vector_indices/WeaviateIndexDemo.nblink @@ -0,0 +1 @@ +{"path": "../../../../examples/vector_indices/WeaviateIndexDemo.ipynb"} \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt index 36e59f2fc6..b98b8d7ef8 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -2,4 +2,8 @@ sphinx>=4.3.0 sphinx_rtd_theme>=0.5.1 docutils<0.17 -myst-parser \ No newline at end of file +myst-parser +nbsphinx +nbsphinx-link +pandoc +ipython diff --git a/examples/async/AsyncComposableIndicesSEC.ipynb b/examples/async/AsyncComposableIndicesSEC.ipynb index 94bd2be0eb..3a34b977a1 100644 --- a/examples/async/AsyncComposableIndicesSEC.ipynb +++ b/examples/async/AsyncComposableIndicesSEC.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "259b03ca", + "metadata": {}, + "source": [ + "# Async Composable Indices SEC Demo" + ] + }, { "cell_type": "code", "execution_count": 2, @@ -460,7 +468,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.0" }, "widgets": { "application/vnd.jupyter.widget-state+json": { diff --git a/examples/async/AsyncGPTTreeIndexDemo.ipynb b/examples/async/AsyncGPTTreeIndexDemo.ipynb index 2c15133bfc..1fd2db130b 100644 --- a/examples/async/AsyncGPTTreeIndexDemo.ipynb +++ b/examples/async/AsyncGPTTreeIndexDemo.ipynb @@ -1,136 +1,136 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "96b2b1e4", - "metadata": {}, - "source": [ - "# Async GPTTreeIndex Demo" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9331cfeb", - "metadata": {}, - "outputs": [], - "source": [ - "# NOTE: This is ONLY necessary in jupyter notebook.\n", - "# Details: Jupyter runs an event-loop behind the scenes. \n", - "# This results in nested event-loops when we start an event-loop to make async queries.\n", - "# This is normally not allowed, we use nest_asyncio to allow it for convenience. \n", - "import nest_asyncio\n", - "nest_asyncio.apply()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8a1d2821", - "metadata": {}, - "outputs": [], - "source": [ - "import time\n", - "from llama_index import GPTTreeIndex, SimpleDirectoryReader" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6948df36", - "metadata": {}, - "outputs": [], - "source": [ - "# load documents\n", - "documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()" - ] - }, - { - "cell_type": "markdown", - "id": "2d9115d1", - "metadata": {}, - "source": [ - "#### By default, GPTTreeIndex makes blocking LLM calls" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d9ef0fef", - "metadata": {}, - "outputs": [], - "source": [ - "start_time = time.perf_counter()\n", - "index = GPTTreeIndex.from_documents(documents)\n", - "elapsed_time = time.perf_counter() - start_time" - ] - }, - { - "cell_type": "markdown", - "id": "9392d573", - "metadata": {}, - "source": [ - "It takes ~47s to finish building GPTTreeIndex from 5 text chunks." - ] - }, - { - "cell_type": "markdown", - "id": "474f82d1", - "metadata": {}, - "source": [ - "#### Pass in `use_async=True` to enable asynchronous LLM calls" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "78a02987", - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "start_time = time.perf_counter()\n", - "index = GPTTreeIndex.from_documents(documents, use_async=True)\n", - "elapsed_time = time.perf_counter() - start_time" - ] - }, - { - "cell_type": "markdown", - "id": "23469128", - "metadata": {}, - "source": [ - "It takes ~12s to finish building the GPTTreeIndex from 5 text chunks." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "59c1c27e", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file + "cells": [ + { + "cell_type": "markdown", + "id": "96b2b1e4", + "metadata": {}, + "source": [ + "# Async GPTTreeIndex Demo" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9331cfeb", + "metadata": {}, + "outputs": [], + "source": [ + "# NOTE: This is ONLY necessary in jupyter notebook.\n", + "# Details: Jupyter runs an event-loop behind the scenes. \n", + "# This results in nested event-loops when we start an event-loop to make async queries.\n", + "# This is normally not allowed, we use nest_asyncio to allow it for convenience. \n", + "import nest_asyncio\n", + "nest_asyncio.apply()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8a1d2821", + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "from llama_index import GPTTreeIndex, SimpleDirectoryReader" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6948df36", + "metadata": {}, + "outputs": [], + "source": [ + "# load documents\n", + "documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()" + ] + }, + { + "cell_type": "markdown", + "id": "2d9115d1", + "metadata": {}, + "source": [ + "#### By default, GPTTreeIndex makes blocking LLM calls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d9ef0fef", + "metadata": {}, + "outputs": [], + "source": [ + "start_time = time.perf_counter()\n", + "index = GPTTreeIndex.from_documents(documents)\n", + "elapsed_time = time.perf_counter() - start_time" + ] + }, + { + "cell_type": "markdown", + "id": "9392d573", + "metadata": {}, + "source": [ + "It takes ~47s to finish building GPTTreeIndex from 5 text chunks." + ] + }, + { + "cell_type": "markdown", + "id": "474f82d1", + "metadata": {}, + "source": [ + "#### Pass in `use_async=True` to enable asynchronous LLM calls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "78a02987", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "start_time = time.perf_counter()\n", + "index = GPTTreeIndex.from_documents(documents, use_async=True)\n", + "elapsed_time = time.perf_counter() - start_time" + ] + }, + { + "cell_type": "markdown", + "id": "23469128", + "metadata": {}, + "source": [ + "It takes ~12s to finish building the GPTTreeIndex from 5 text chunks." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "59c1c27e", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/chatbot/Chatbot_SEC.ipynb b/examples/chatbot/Chatbot_SEC.ipynb index 140d0bdf4e..fdc5854c2c 100644 --- a/examples/chatbot/Chatbot_SEC.ipynb +++ b/examples/chatbot/Chatbot_SEC.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "c2c4b179", + "metadata": {}, + "source": [ + "# Chatbot SEC Tutorial" + ] + }, { "cell_type": "code", "execution_count": 9, @@ -828,7 +836,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.0" }, "widgets": { "application/vnd.jupyter.widget-state+json": { diff --git a/examples/chatgpt_plugin/ChatGPTRetrievalPluginIndexDemo.ipynb b/examples/chatgpt_plugin/ChatGPTRetrievalPluginIndexDemo.ipynb index 8931588b2e..49448c76d4 100644 --- a/examples/chatgpt_plugin/ChatGPTRetrievalPluginIndexDemo.ipynb +++ b/examples/chatgpt_plugin/ChatGPTRetrievalPluginIndexDemo.ipynb @@ -228,7 +228,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.0" } }, "nbformat": 4, diff --git a/examples/chatgpt_plugin/ChatGPT_Retrieval_Plugin_Upload.ipynb b/examples/chatgpt_plugin/ChatGPT_Retrieval_Plugin_Upload.ipynb index b2da4bb54d..35546b102f 100644 --- a/examples/chatgpt_plugin/ChatGPT_Retrieval_Plugin_Upload.ipynb +++ b/examples/chatgpt_plugin/ChatGPT_Retrieval_Plugin_Upload.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "470309bd", + "metadata": {}, + "source": [ + "# ChatGPT Retrieval Plugin Upload Demo" + ] + }, { "cell_type": "markdown", "id": "cfb64210-9c6b-47d7-81f4-67dbdab68e4c", @@ -259,7 +267,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.0" }, "vscode": { "interpreter": { diff --git a/examples/composable_indices/QASummaryGraph.ipynb b/examples/composable_indices/QASummaryGraph.ipynb index d9a093a3f3..3c2a5e7347 100644 --- a/examples/composable_indices/QASummaryGraph.ipynb +++ b/examples/composable_indices/QASummaryGraph.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "ef5c50f0", + "metadata": {}, + "source": [ + "# QA Summary Graph Example" + ] + }, { "cell_type": "code", "execution_count": 1, @@ -431,7 +439,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.0" } }, "nbformat": 4, diff --git a/examples/cost_analysis/TokenPredictor.ipynb b/examples/cost_analysis/TokenPredictor.ipynb index e0a6352c80..db64f1c3c9 100644 --- a/examples/cost_analysis/TokenPredictor.ipynb +++ b/examples/cost_analysis/TokenPredictor.ipynb @@ -1,355 +1,355 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "df19606e-d67e-44d2-bed0-4b804e6fc6c3", - "metadata": {}, - "source": [ - "# Using Token Predictors\n", - "\n", - "Using our token predictors, we can predict the token usage of an operation before actually performing it.\n", - "\n", - "We first show how to predict LLM token usage with the MockLLMPredictor class, see below.\n", - "We then show how to also predict embedding token usage." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f1a9eb90-335c-4214-8bb6-fd1edbe3ccbd", - "metadata": {}, - "outputs": [], - "source": [ - "# My OpenAI Key\n", - "import os\n", - "os.environ['OPENAI_API_KEY'] = \"INSERT OPENAI KEY\"" - ] - }, - { - "cell_type": "markdown", - "id": "8a707fa6-d79e-4343-92fd-d0fadb25c466", - "metadata": {}, - "source": [ - "## Using MockLLMPredictor" - ] - }, - { - "cell_type": "markdown", - "id": "be3f7baa-1c0a-430b-981b-83ddca9e71f2", - "metadata": { - "tags": [] - }, - "source": [ - "#### Predicting Usage of GPT Tree Index\n", - "\n", - "Here we predict usage of GPTTreeIndex during index construction and querying, without making any LLM calls.\n", - "\n", - "NOTE: Predicting query usage before tree is built is only possible with GPTTreeIndex due to the nature of tree traversal. Results will be more accurate if GPTTreeIndex is actually built beforehand." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "c0ef16d1-45ef-43ec-9aad-4e44e9bb8578", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import GPTTreeIndex, MockLLMPredictor, SimpleDirectoryReader, ServiceContext" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "b2ecdadc-1403-4bd4-a876-f80e4da911ef", - "metadata": {}, - "outputs": [], - "source": [ - "documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "11056808-fd7f-4bc6-9348-0605fb4ee668", - "metadata": {}, - "outputs": [], - "source": [ - "llm_predictor = MockLLMPredictor(max_tokens=256)\n", - "service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9ea4ba66-9a09-4478-b0a8-dee8645fa4e3", - "metadata": {}, - "outputs": [], - "source": [ - "index = GPTTreeIndex.from_documents(documents, service_context=service_context)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "345433c2-5553-4645-a513-0186b771a21f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "19495\n" - ] - } - ], - "source": [ - "print(llm_predictor.last_token_usage)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f43733ae-af35-46e6-99d9-8ba507acbb0d", - "metadata": {}, - "outputs": [], - "source": [ - "# default query\n", - "response = index.query(\"What did the author do growing up?\", service_context=service_context)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "4ba19751-da2d-46af-9f8f-4f42871e65a0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "5493\n" - ] - } - ], - "source": [ - "print(llm_predictor.last_token_usage)" - ] - }, - { - "cell_type": "markdown", - "id": "4324d85b-ae80-48ab-baf0-7dc160dfae46", - "metadata": {}, - "source": [ - "#### Predicting Usage of GPT Keyword Table Index Query\n", - "\n", - "Here we build a real keyword table index over the data, but then predict query usage." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "10447805-38db-41b9-a2c6-b0c95437b276", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import GPTKeywordTableIndex, MockLLMPredictor, SimpleDirectoryReader" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "8ca76e72-5f43-47c1-a9a4-c5c5db4f0f21", - "metadata": {}, - "outputs": [], - "source": [ - "documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()\n", - "index = GPTKeywordTableIndex.load_from_disk('../paul_graham_essay/index_table.json')" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "61f48870-65d2-4b23-b57e-79082ecb4ab2", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "start token ct: 0\n", - "> Starting query: What did the author do after his time at Y Combinator?\n", - "query keywords: ['author', 'did', 'y', 'combinator', 'after', 'his', 'the', 'what', 'time', 'at', 'do']\n", - "Extracted keywords: ['combinator']\n", - "> Querying with idx: 3483810247393006047: of 2016 we moved to England. We wanted our kids...\n", - "> Querying with idx: 7597483754542696814: people edit code on our server through the brow...\n", - "> Querying with idx: 7572417251450701751: invited about 20 of the 225 groups to interview...\n", - "end token ct: 11313\n", - "> [query] Total token usage: 11313 tokens\n", - "11313\n" - ] - } - ], - "source": [ - "llm_predictor = MockLLMPredictor(max_tokens=256)\n", - "service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)\n", - "response = index.query(\"What did the author do after his time at Y Combinator?\", service_context=service_context)\n", - "print(llm_predictor.last_token_usage)" - ] - }, - { - "cell_type": "markdown", - "id": "0fee4405-05e0-46c2-87bb-64ec63a4c6c1", - "metadata": {}, - "source": [ - "#### Predicting Usage of GPT List Index Query\n", - "\n", - "Here we build a real list index over the data, but then predict query usage." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "267f2213-67d1-4241-b73f-f1790661d06b", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import GPTListIndex, MockLLMPredictor, SimpleDirectoryReader" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "d553a8b1-7045-4756-9729-df84bd305279", - "metadata": {}, - "outputs": [], - "source": [ - "documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()\n", - "index = GPTListIndex.load_from_disk('../paul_graham_essay/index_list.json')" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "69c99c68-6a23-48ed-aa41-e7af50fef2f3", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "start token ct: 0\n", - "> Starting query: What did the author do after his time at Y Combinator?\n", - "end token ct: 23941\n", - "> [query] Total token usage: 23941 tokens\n" - ] - } - ], - "source": [ - "llm_predictor = MockLLMPredictor(max_tokens=256)\n", - "service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)\n", - "response = index.query(\"What did the author do after his time at Y Combinator?\", service_context=service_context)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "e8422c5c-af68-4138-a8dd-f6e8d7208c4c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "23941\n" - ] - } - ], - "source": [ - "print(llm_predictor.last_token_usage)" - ] - }, - { - "cell_type": "markdown", - "id": "1e19cf61-6d6a-4dfa-af78-1ce184f41c6c", - "metadata": {}, - "source": [ - "## Using MockEmbedding" - ] - }, - { - "cell_type": "markdown", - "id": "106d86bf-7725-40bc-84ba-4f273493d3f6", - "metadata": {}, - "source": [ - "#### Predicting Usage of GPT Simple Vector Index" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "9baf0fe7-2c11-4233-a930-4e593433ba84", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import GPTSimpleVectorIndex, MockLLMPredictor, MockEmbedding, SimpleDirectoryReader" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "97023361-fa47-4008-b8d7-e66d60c5b263", - "metadata": {}, - "outputs": [], - "source": [ - "documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()\n", - "index = GPTSimpleVectorIndex.load_from_disk('../paul_graham_essay/index_simple_vec.json')" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "63ebe021-2b9c-4024-95f8-56cd9e7e7c47", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> [query] Total LLM token usage: 4374 tokens\n", - "> [query] Total embedding token usage: 14 tokens\n" - ] - } - ], - "source": [ - "llm_predictor = MockLLMPredictor(max_tokens=256)\n", - "embed_model = MockEmbedding(embed_dim=1536)\n", - "service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor, embed_model=embed_model)\n", - "response = index.query(\n", - " \"What did the author do after his time at Y Combinator?\",\n", - " service_context=service_context,\n", - ")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "gpt_retrieve_venv", - "language": "python", - "name": "gpt_retrieve_venv" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.16" - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "cells": [ + { + "cell_type": "markdown", + "id": "df19606e-d67e-44d2-bed0-4b804e6fc6c3", + "metadata": {}, + "source": [ + "# Using Token Predictors\n", + "\n", + "Using our token predictors, we can predict the token usage of an operation before actually performing it.\n", + "\n", + "We first show how to predict LLM token usage with the MockLLMPredictor class, see below.\n", + "We then show how to also predict embedding token usage." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f1a9eb90-335c-4214-8bb6-fd1edbe3ccbd", + "metadata": {}, + "outputs": [], + "source": [ + "# My OpenAI Key\n", + "import os\n", + "os.environ['OPENAI_API_KEY'] = \"INSERT OPENAI KEY\"" + ] + }, + { + "cell_type": "markdown", + "id": "8a707fa6-d79e-4343-92fd-d0fadb25c466", + "metadata": {}, + "source": [ + "## Using MockLLMPredictor" + ] + }, + { + "cell_type": "markdown", + "id": "be3f7baa-1c0a-430b-981b-83ddca9e71f2", + "metadata": { + "tags": [] + }, + "source": [ + "#### Predicting Usage of GPT Tree Index\n", + "\n", + "Here we predict usage of GPTTreeIndex during index construction and querying, without making any LLM calls.\n", + "\n", + "NOTE: Predicting query usage before tree is built is only possible with GPTTreeIndex due to the nature of tree traversal. Results will be more accurate if GPTTreeIndex is actually built beforehand." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c0ef16d1-45ef-43ec-9aad-4e44e9bb8578", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import GPTTreeIndex, MockLLMPredictor, SimpleDirectoryReader, ServiceContext" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "b2ecdadc-1403-4bd4-a876-f80e4da911ef", + "metadata": {}, + "outputs": [], + "source": [ + "documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "11056808-fd7f-4bc6-9348-0605fb4ee668", + "metadata": {}, + "outputs": [], + "source": [ + "llm_predictor = MockLLMPredictor(max_tokens=256)\n", + "service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9ea4ba66-9a09-4478-b0a8-dee8645fa4e3", + "metadata": {}, + "outputs": [], + "source": [ + "index = GPTTreeIndex.from_documents(documents, service_context=service_context)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "345433c2-5553-4645-a513-0186b771a21f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "19495\n" + ] + } + ], + "source": [ + "print(llm_predictor.last_token_usage)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f43733ae-af35-46e6-99d9-8ba507acbb0d", + "metadata": {}, + "outputs": [], + "source": [ + "# default query\n", + "response = index.query(\"What did the author do growing up?\", service_context=service_context)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "4ba19751-da2d-46af-9f8f-4f42871e65a0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5493\n" + ] + } + ], + "source": [ + "print(llm_predictor.last_token_usage)" + ] + }, + { + "cell_type": "markdown", + "id": "4324d85b-ae80-48ab-baf0-7dc160dfae46", + "metadata": {}, + "source": [ + "#### Predicting Usage of GPT Keyword Table Index Query\n", + "\n", + "Here we build a real keyword table index over the data, but then predict query usage." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "10447805-38db-41b9-a2c6-b0c95437b276", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import GPTKeywordTableIndex, MockLLMPredictor, SimpleDirectoryReader" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "8ca76e72-5f43-47c1-a9a4-c5c5db4f0f21", + "metadata": {}, + "outputs": [], + "source": [ + "documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()\n", + "index = GPTKeywordTableIndex.load_from_disk('../paul_graham_essay/index_table.json')" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "61f48870-65d2-4b23-b57e-79082ecb4ab2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "start token ct: 0\n", + "> Starting query: What did the author do after his time at Y Combinator?\n", + "query keywords: ['author', 'did', 'y', 'combinator', 'after', 'his', 'the', 'what', 'time', 'at', 'do']\n", + "Extracted keywords: ['combinator']\n", + "> Querying with idx: 3483810247393006047: of 2016 we moved to England. We wanted our kids...\n", + "> Querying with idx: 7597483754542696814: people edit code on our server through the brow...\n", + "> Querying with idx: 7572417251450701751: invited about 20 of the 225 groups to interview...\n", + "end token ct: 11313\n", + "> [query] Total token usage: 11313 tokens\n", + "11313\n" + ] + } + ], + "source": [ + "llm_predictor = MockLLMPredictor(max_tokens=256)\n", + "service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)\n", + "response = index.query(\"What did the author do after his time at Y Combinator?\", service_context=service_context)\n", + "print(llm_predictor.last_token_usage)" + ] + }, + { + "cell_type": "markdown", + "id": "0fee4405-05e0-46c2-87bb-64ec63a4c6c1", + "metadata": {}, + "source": [ + "#### Predicting Usage of GPT List Index Query\n", + "\n", + "Here we build a real list index over the data, but then predict query usage." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "267f2213-67d1-4241-b73f-f1790661d06b", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import GPTListIndex, MockLLMPredictor, SimpleDirectoryReader" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "d553a8b1-7045-4756-9729-df84bd305279", + "metadata": {}, + "outputs": [], + "source": [ + "documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()\n", + "index = GPTListIndex.load_from_disk('../paul_graham_essay/index_list.json')" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "69c99c68-6a23-48ed-aa41-e7af50fef2f3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "start token ct: 0\n", + "> Starting query: What did the author do after his time at Y Combinator?\n", + "end token ct: 23941\n", + "> [query] Total token usage: 23941 tokens\n" + ] + } + ], + "source": [ + "llm_predictor = MockLLMPredictor(max_tokens=256)\n", + "service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)\n", + "response = index.query(\"What did the author do after his time at Y Combinator?\", service_context=service_context)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "e8422c5c-af68-4138-a8dd-f6e8d7208c4c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "23941\n" + ] + } + ], + "source": [ + "print(llm_predictor.last_token_usage)" + ] + }, + { + "cell_type": "markdown", + "id": "1e19cf61-6d6a-4dfa-af78-1ce184f41c6c", + "metadata": {}, + "source": [ + "## Using MockEmbedding" + ] + }, + { + "cell_type": "markdown", + "id": "106d86bf-7725-40bc-84ba-4f273493d3f6", + "metadata": {}, + "source": [ + "#### Predicting Usage of GPT Simple Vector Index" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "9baf0fe7-2c11-4233-a930-4e593433ba84", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import GPTSimpleVectorIndex, MockLLMPredictor, MockEmbedding, SimpleDirectoryReader" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "97023361-fa47-4008-b8d7-e66d60c5b263", + "metadata": {}, + "outputs": [], + "source": [ + "documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()\n", + "index = GPTSimpleVectorIndex.load_from_disk('../paul_graham_essay/index_simple_vec.json')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "63ebe021-2b9c-4024-95f8-56cd9e7e7c47", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> [query] Total LLM token usage: 4374 tokens\n", + "> [query] Total embedding token usage: 14 tokens\n" + ] + } + ], + "source": [ + "llm_predictor = MockLLMPredictor(max_tokens=256)\n", + "embed_model = MockEmbedding(embed_dim=1536)\n", + "service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor, embed_model=embed_model)\n", + "response = index.query(\n", + " \"What did the author do after his time at Y Combinator?\",\n", + " service_context=service_context,\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/examples/data_connectors/DatabaseReaderDemo.ipynb b/examples/data_connectors/DatabaseReaderDemo.ipynb index 5cb887f0f5..c1816801e6 100644 --- a/examples/data_connectors/DatabaseReaderDemo.ipynb +++ b/examples/data_connectors/DatabaseReaderDemo.ipynb @@ -1,202 +1,209 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "import sys\n", - "\n", - "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", - "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from __future__ import absolute_import\n", - "\n", - "# My OpenAI Key\n", - "import os\n", - "os.environ['OPENAI_API_KEY'] = \"\"\n", - "\n", - "from llama_index.readers.database import DatabaseReader\n", - "from llama_index import GPTSimpleVectorIndex" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Initialize DatabaseReader object with the following parameters:\n", - "\n", - "db = DatabaseReader(\n", - " scheme = \"postgresql\", # Database Scheme\n", - " host = \"localhost\", # Database Host\n", - " port = \"5432\", # Database Port\n", - " user = \"postgres\", # Database User\n", - " password = \"FakeExamplePassword\", # Database Password\n", - " dbname = \"postgres\", # Database Name\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "### DatabaseReader class ###\n", - "# db is an instance of DatabaseReader:\n", - "print(type(db))\n", - "# DatabaseReader available method:\n", - "print(type(db.load_data))\n", - "\n", - "### SQLDatabase class ###\n", - "# db.sql is an instance of SQLDatabase:\n", - "print(type(db.sql_database))\n", - "# SQLDatabase available methods:\n", - "print(type(db.sql_database.from_uri))\n", - "print(type(db.sql_database.get_single_table_info))\n", - "print(type(db.sql_database.get_table_columns))\n", - "print(type(db.sql_database.get_table_info))\n", - "print(type(db.sql_database.get_table_names))\n", - "print(type(db.sql_database.insert_into_table))\n", - "print(type(db.sql_database.run))\n", - "print(type(db.sql_database.run_sql))\n", - "# SQLDatabase available properties:\n", - "print(type(db.sql_database.dialect))\n", - "print(type(db.sql_database.engine))\n", - "print(type(db.sql_database.table_info))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "### Testing DatabaseReader\n", - "### from SQLDatabase, SQLAlchemy engine and Database URI:\n", - "\n", - "# From SQLDatabase instance:\n", - "print(type(db.sql_database))\n", - "db_from_sql_database = DatabaseReader(sql_database = db.sql_database)\n", - "print(type(db_from_sql_database))\n", - "\n", - "# From SQLAlchemy engine:\n", - "print(type(db.sql_database.engine))\n", - "db_from_engine = DatabaseReader(engine = db.sql_database.engine)\n", - "print(type(db_from_engine))\n", - "\n", - "# From Database URI:\n", - "print(type(db.uri))\n", - "db_from_uri = DatabaseReader(uri = db.uri)\n", - "print(type(db_from_uri))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# The below SQL Query example returns a list values of each row\n", - "# with concatenated text from the name and age columns\n", - "# from the users table where the age is greater than or equal to 18\n", - "\n", - "query = f\"\"\"\n", - " SELECT\n", - " CONCAT(name, ' is ', age, ' years old.') AS text\n", - " FROM public.users\n", - " WHERE age >= 18\n", - " \"\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Please refer to llama_index.langchain_helpers.sql_wrapper\n", - "# SQLDatabase.run_sql method\n", - "texts = db.sql_database.run_sql(command = query)\n", - "\n", - "# Display type(texts) and texts\n", - "# type(texts) must return <class 'list'>\n", - "print(type(texts))\n", - "\n", - "# Documents must return a list of Tuple objects\n", - "print(texts)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Please refer to llama_index.readers.database.DatabaseReader.load_data\n", - "# DatabaseReader.load_data method\n", - "documents = db.load_data(query = query)\n", - "\n", - "# Display type(documents) and documents\n", - "# type(documents) must return <class 'list'>\n", - "print(type(documents))\n", - "\n", - "# Documents must return a list of Document objects\n", - "print(documents)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "try:\n", - " # Try to load existing Index from disk\n", - " index = GPTSimpleVectorIndex.load_from_disk('index.json')\n", - "except:\n", - " index = GPTSimpleVectorIndex.from_documents(documents)\n", - "\n", - " # Save newly created Index to disk\n", - " index.save_to_disk('index.json')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.1" - }, - "vscode": { - "interpreter": { - "hash": "bd5508c2ffc7f17f7d31cf4086cc872f89e96996a08987e995649e5fbe85a3a4" - } - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} \ No newline at end of file + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Database Reader Demo" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "import sys\n", + "\n", + "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", + "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from __future__ import absolute_import\n", + "\n", + "# My OpenAI Key\n", + "import os\n", + "os.environ['OPENAI_API_KEY'] = \"\"\n", + "\n", + "from llama_index.readers.database import DatabaseReader\n", + "from llama_index import GPTSimpleVectorIndex" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize DatabaseReader object with the following parameters:\n", + "\n", + "db = DatabaseReader(\n", + " scheme = \"postgresql\", # Database Scheme\n", + " host = \"localhost\", # Database Host\n", + " port = \"5432\", # Database Port\n", + " user = \"postgres\", # Database User\n", + " password = \"FakeExamplePassword\", # Database Password\n", + " dbname = \"postgres\", # Database Name\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "### DatabaseReader class ###\n", + "# db is an instance of DatabaseReader:\n", + "print(type(db))\n", + "# DatabaseReader available method:\n", + "print(type(db.load_data))\n", + "\n", + "### SQLDatabase class ###\n", + "# db.sql is an instance of SQLDatabase:\n", + "print(type(db.sql_database))\n", + "# SQLDatabase available methods:\n", + "print(type(db.sql_database.from_uri))\n", + "print(type(db.sql_database.get_single_table_info))\n", + "print(type(db.sql_database.get_table_columns))\n", + "print(type(db.sql_database.get_table_info))\n", + "print(type(db.sql_database.get_table_names))\n", + "print(type(db.sql_database.insert_into_table))\n", + "print(type(db.sql_database.run))\n", + "print(type(db.sql_database.run_sql))\n", + "# SQLDatabase available properties:\n", + "print(type(db.sql_database.dialect))\n", + "print(type(db.sql_database.engine))\n", + "print(type(db.sql_database.table_info))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "### Testing DatabaseReader\n", + "### from SQLDatabase, SQLAlchemy engine and Database URI:\n", + "\n", + "# From SQLDatabase instance:\n", + "print(type(db.sql_database))\n", + "db_from_sql_database = DatabaseReader(sql_database = db.sql_database)\n", + "print(type(db_from_sql_database))\n", + "\n", + "# From SQLAlchemy engine:\n", + "print(type(db.sql_database.engine))\n", + "db_from_engine = DatabaseReader(engine = db.sql_database.engine)\n", + "print(type(db_from_engine))\n", + "\n", + "# From Database URI:\n", + "print(type(db.uri))\n", + "db_from_uri = DatabaseReader(uri = db.uri)\n", + "print(type(db_from_uri))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# The below SQL Query example returns a list values of each row\n", + "# with concatenated text from the name and age columns\n", + "# from the users table where the age is greater than or equal to 18\n", + "\n", + "query = f\"\"\"\n", + " SELECT\n", + " CONCAT(name, ' is ', age, ' years old.') AS text\n", + " FROM public.users\n", + " WHERE age >= 18\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Please refer to llama_index.langchain_helpers.sql_wrapper\n", + "# SQLDatabase.run_sql method\n", + "texts = db.sql_database.run_sql(command = query)\n", + "\n", + "# Display type(texts) and texts\n", + "# type(texts) must return <class 'list'>\n", + "print(type(texts))\n", + "\n", + "# Documents must return a list of Tuple objects\n", + "print(texts)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Please refer to llama_index.readers.database.DatabaseReader.load_data\n", + "# DatabaseReader.load_data method\n", + "documents = db.load_data(query = query)\n", + "\n", + "# Display type(documents) and documents\n", + "# type(documents) must return <class 'list'>\n", + "print(type(documents))\n", + "\n", + "# Documents must return a list of Document objects\n", + "print(documents)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " # Try to load existing Index from disk\n", + " index = GPTSimpleVectorIndex.load_from_disk('index.json')\n", + "except:\n", + " index = GPTSimpleVectorIndex.from_documents(documents)\n", + "\n", + " # Save newly created Index to disk\n", + " index.save_to_disk('index.json')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + }, + "vscode": { + "interpreter": { + "hash": "bd5508c2ffc7f17f7d31cf4086cc872f89e96996a08987e995649e5fbe85a3a4" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/data_connectors/GithubRepositoryReaderDemo.ipynb b/examples/data_connectors/GithubRepositoryReaderDemo.ipynb index 389becf839..0424499940 100644 --- a/examples/data_connectors/GithubRepositoryReaderDemo.ipynb +++ b/examples/data_connectors/GithubRepositoryReaderDemo.ipynb @@ -1,110 +1,116 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# This is due to the fact that we use asyncio.loop_until_complete in\n", - "# the DiscordReader. Since the Jupyter kernel itself runs on\n", - "# an event loop, we need to add some help with nesting\n", - "!pip install nest_asyncio httpx\n", - "import nest_asyncio\n", - "nest_asyncio.apply()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%env OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n", - "from llama_index import GPTSimpleVectorIndex, GithubRepositoryReader\n", - "from IPython.display import Markdown, display\n", - "import os" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%env GITHUB_TOKEN=github_pat_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n", - "github_token = os.environ.get(\"GITHUB_TOKEN\")\n", - "owner = \"jerryjliu\"\n", - "repo = \"llama_index\"\n", - "branch = \"main\"\n", - "\n", - "documents = GithubRepositoryReader(\n", - " github_token=github_token,\n", - " owner=owner,\n", - " repo=repo,\n", - " use_parser=False,\n", - " verbose=False,\n", - ").load_data(branch=branch)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "index = GPTSimpleVectorIndex.from_documents(documents)\n", - "index.save_to_disk(\"github_index.json\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# import time\n", - "# for document in documents:\n", - "# print(document.extra_info)\n", - "# time.sleep(.25) \n", - "response = index.query(\"What is the difference between GPTSimpleVectorIndex and GPTListIndex?\", verbose=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "gpt_index-github-reader", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.0" - }, - "orig_nbformat": 4, - "vscode": { - "interpreter": { - "hash": "5bc2ab08ee48b6366504a28e3231c27a37c154a347ee8ac6184b716eff7bdbcd" - } - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Github Repository Reader Demo" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# This is due to the fact that we use asyncio.loop_until_complete in\n", + "# the DiscordReader. Since the Jupyter kernel itself runs on\n", + "# an event loop, we need to add some help with nesting\n", + "!pip install nest_asyncio\n", + "import nest_asyncio\n", + "nest_asyncio.apply()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%env OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n", + "from llama_index import GPTSimpleVectorIndex, GithubRepositoryReader\n", + "from IPython.display import Markdown, display\n", + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%env GITHUB_TOKEN=github_pat_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n", + "github_token = os.environ.get(\"GITHUB_TOKEN\")\n", + "owner = \"jerryjliu\"\n", + "repo = \"gpt_index\"\n", + "branch = \"main\"\n", + "\n", + "documents = GithubRepositoryReader(\n", + " github_token=github_token,\n", + " owner=owner,\n", + " repo=repo,\n", + " use_parser=False,\n", + " verbose=False,\n", + ").load_data(branch=branch)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "index = GPTSimpleVectorIndex.from_documents(documents)\n", + "index.save_to_disk(\"github_index.json\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# import time\n", + "# for document in documents:\n", + "# print(document.extra_info)\n", + "# time.sleep(.25) \n", + "response = index.query(\"What is the difference between GPTSimpleVectorIndex and GPTListIndex?\", verbose=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + }, + "vscode": { + "interpreter": { + "hash": "5bc2ab08ee48b6366504a28e3231c27a37c154a347ee8ac6184b716eff7bdbcd" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 } diff --git a/examples/data_connectors/MboxReaderDemo.ipynb b/examples/data_connectors/MboxReaderDemo.ipynb index 5285057c08..33ebc68f54 100644 --- a/examples/data_connectors/MboxReaderDemo.ipynb +++ b/examples/data_connectors/MboxReaderDemo.ipynb @@ -1,102 +1,108 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%env OPENAI_API_KEY=sk-************" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import MboxReader, GPTSimpleVectorIndex" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "documents = MboxReader().load_data('mbox_data_dir', max_count=1000) # Returns list of documents " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "index = GPTSimpleVectorIndex.from_documents(documents) # Initialize index with documents" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> [query] Total LLM token usage: 100 tokens\n", - "> [query] Total embedding token usage: 10 tokens\n" - ] - } - ], - "source": [ - "res = index.query('When did i have that call with the London office?')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> There is a call scheduled with the London office at 12am GMT on the 10th of February." - ] - } - ], - "source": [ - "res.response" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.8 (main, Oct 13 2022, 09:48:40) [Clang 14.0.0 (clang-1400.0.29.102)]" - }, - "orig_nbformat": 4, - "vscode": { - "interpreter": { - "hash": "7dd9b00487715d9ffc85f7f860a0013e7a0542b27fc53d2b1d33405d7679eac1" - } - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} \ No newline at end of file + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Mbox Reader Demo" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%env OPENAI_API_KEY=sk-************" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import MboxReader, GPTSimpleVectorIndex" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "documents = MboxReader().load_data('mbox_data_dir', max_count=1000) # Returns list of documents " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "index = GPTSimpleVectorIndex.from_documents(documents) # Initialize index with documents" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> [query] Total LLM token usage: 100 tokens\n", + "> [query] Total embedding token usage: 10 tokens\n" + ] + } + ], + "source": [ + "res = index.query('When did i have that call with the London office?')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> There is a call scheduled with the London office at 12am GMT on the 10th of February." + ] + } + ], + "source": [ + "res.response" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + }, + "vscode": { + "interpreter": { + "hash": "7dd9b00487715d9ffc85f7f860a0013e7a0542b27fc53d2b1d33405d7679eac1" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/data_connectors/ObsidianReaderDemo.ipynb b/examples/data_connectors/ObsidianReaderDemo.ipynb index 951a918f75..449427eb41 100644 --- a/examples/data_connectors/ObsidianReaderDemo.ipynb +++ b/examples/data_connectors/ObsidianReaderDemo.ipynb @@ -1,135 +1,142 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%env OPENAI_API_KEY=sk-************" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "import sys\n", - "\n", - "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", - "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import ObsidianReader, GPTSimpleVectorIndex" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "documents = ObsidianReader('/Users/hursh/vault').load_data() # Returns list of documents " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "index = GPTSimpleVectorIndex.from_documents(documents) # Initialize index with documents" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# index.save_to_disk('index.json')\n", - "index = GPTSimpleVectorIndex.load_from_disk('index.json')" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> [query] Total LLM token usage: 920 tokens\n", - "> [query] Total embedding token usage: 7 tokens\n" - ] - } - ], - "source": [ - "# set Logging to DEBUG for more detailed outputs\n", - "res = index.query('What is the meaning of life?')" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'\\nThe meaning of life is subjective and can vary from person to person. It is ultimately up to each individual to decide what they believe is the purpose and value of life. Some may find meaning in their faith, while others may find it in their relationships, work, or hobbies. Ultimately, it is up to each individual to decide what brings them joy and fulfillment and to pursue that path.'" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res.response" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.1" - }, - "vscode": { - "interpreter": { - "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" - } - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} \ No newline at end of file + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Obsidian Reader Demo" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%env OPENAI_API_KEY=sk-************" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "import sys\n", + "\n", + "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", + "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import ObsidianReader, GPTSimpleVectorIndex" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "documents = ObsidianReader('/Users/hursh/vault').load_data() # Returns list of documents " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "index = GPTSimpleVectorIndex.from_documents(documents) # Initialize index with documents" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# index.save_to_disk('index.json')\n", + "index = GPTSimpleVectorIndex.load_from_disk('index.json')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> [query] Total LLM token usage: 920 tokens\n", + "> [query] Total embedding token usage: 7 tokens\n" + ] + } + ], + "source": [ + "# set Logging to DEBUG for more detailed outputs\n", + "res = index.query('What is the meaning of life?')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\nThe meaning of life is subjective and can vary from person to person. It is ultimately up to each individual to decide what they believe is the purpose and value of life. Some may find meaning in their faith, while others may find it in their relationships, work, or hobbies. Ultimately, it is up to each individual to decide what brings them joy and fulfillment and to pursue that path.'" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res.response" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + }, + "vscode": { + "interpreter": { + "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/data_connectors/TwitterDemo.ipynb b/examples/data_connectors/TwitterDemo.ipynb index 06a9d41384..2828e6ee3f 100644 --- a/examples/data_connectors/TwitterDemo.ipynb +++ b/examples/data_connectors/TwitterDemo.ipynb @@ -1,105 +1,113 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "367a6eae", - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "import sys\n", - "\n", - "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", - "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "21d03e9b-8a47-45b2-ab27-295b7397ecad", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import GPTSimpleVectorIndex, TwitterTweetReader\n", - "from IPython.display import Markdown, display\n", - "import os" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ef5d2334-9661-4648-a823-a335ea277826", - "metadata": {}, - "outputs": [], - "source": [ - "# create an app in https://developer.twitter.com/en/apps\n", - "BEARER_TOKEN = \"<bearer_token>\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1d6a1153-1383-4aaf-b39d-72c1fc9cc428", - "metadata": {}, - "outputs": [], - "source": [ - "# create reader, specify twitter handles\n", - "reader = TwitterTweetReader(BEARER_TOKEN)\n", - "documents = reader.load_data([\"@twitter_handle1\"])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ca319024-88e7-424f-b1d8-4daa06c6bc6a", - "metadata": {}, - "outputs": [], - "source": [ - "index = GPTSimpleVectorIndex.from_documents(documents)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "78680a17-9088-419e-97cf-ac3d5783a709", - "metadata": {}, - "outputs": [], - "source": [ - "# set Logging to DEBUG for more detailed outputs\n", - "response = index.query(\"<query_text>\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2f0f92a7-cdd9-478f-9765-0a122d6e8508", - "metadata": {}, - "outputs": [], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.1" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file + "cells": [ + { + "cell_type": "markdown", + "id": "f5f652cc", + "metadata": {}, + "source": [ + "# Twitter Reader Demo" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "367a6eae", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "import sys\n", + "\n", + "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", + "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21d03e9b-8a47-45b2-ab27-295b7397ecad", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import GPTSimpleVectorIndex, TwitterTweetReader\n", + "from IPython.display import Markdown, display\n", + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef5d2334-9661-4648-a823-a335ea277826", + "metadata": {}, + "outputs": [], + "source": [ + "# create an app in https://developer.twitter.com/en/apps\n", + "BEARER_TOKEN = \"<bearer_token>\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1d6a1153-1383-4aaf-b39d-72c1fc9cc428", + "metadata": {}, + "outputs": [], + "source": [ + "# create reader, specify twitter handles\n", + "reader = TwitterTweetReader(BEARER_TOKEN)\n", + "documents = reader.load_data([\"@twitter_handle1\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ca319024-88e7-424f-b1d8-4daa06c6bc6a", + "metadata": {}, + "outputs": [], + "source": [ + "index = GPTSimpleVectorIndex.from_documents(documents)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "78680a17-9088-419e-97cf-ac3d5783a709", + "metadata": {}, + "outputs": [], + "source": [ + "# set Logging to DEBUG for more detailed outputs\n", + "response = index.query(\"<query_text>\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2f0f92a7-cdd9-478f-9765-0a122d6e8508", + "metadata": {}, + "outputs": [], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/data_connectors/WeaviateDemo.ipynb b/examples/data_connectors/WeaviateDemo.ipynb index b36751549b..1c163471d6 100644 --- a/examples/data_connectors/WeaviateDemo.ipynb +++ b/examples/data_connectors/WeaviateDemo.ipynb @@ -1,177 +1,177 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "36e7bb96-0c27-47e9-a525-c11f40be3b86", - "metadata": {}, - "source": [ - "# Weaviate" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "38ca1434", - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "import sys\n", - "\n", - "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", - "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "d99bc57b-85df-46ac-8262-2409344af428", - "metadata": {}, - "outputs": [], - "source": [ - "import weaviate\n", - "from llama_index.readers.weaviate import WeaviateReader" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fec36c7a-3766-4167-890e-b93adb831a64", - "metadata": {}, - "outputs": [], - "source": [ - "# See https://weaviate.io/developers/weaviate/current/client-libraries/python.html\n", - "# for more details on authentication\n", - "resource_owner_config = weaviate.AuthClientPassword(\n", - " username = \"<username>\", \n", - " password = \"<password>\", \n", - ")\n", - "\n", - "# initialize reader\n", - "reader = WeaviateReader(\"https://<cluster-id>.semi.network/\", auth_client_secret=resource_owner_config)" - ] - }, - { - "cell_type": "markdown", - "id": "ce9f299c-4f0a-4bca-bc90-79848f02b381", - "metadata": {}, - "source": [ - "You have two options for the Weaviate reader: 1) directly specify the class_name and properties, or 2) input the raw graphql_query. Examples are shown below." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "b92d69a1-d39f-45cf-a136-cb9c2f2f5cdf", - "metadata": {}, - "outputs": [], - "source": [ - "# 1) load data using class_name and properties\n", - "# docs = reader.load_data(\n", - "# class_name=\"Author\", properties=[\"name\", \"description\"], separate_documents=True\n", - "# )\n", - "\n", - "documents = reader.load_data(\n", - " class_name=\"<class_name>\", \n", - " properties=[\"property1\", \"property2\", \"...\"], \n", - " separate_documents=True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "722b5d47-9897-4c54-9734-259ab0c1634c", - "metadata": {}, - "outputs": [], - "source": [ - "# 2) example GraphQL query\n", - "# query = \"\"\"\n", - "# {\n", - "# Get {\n", - "# Author {\n", - "# name\n", - "# description\n", - "# }\n", - "# }\n", - "# }\n", - "# \"\"\"\n", - "# docs = reader.load_data(graphql_query=query, separate_documents=True)\n", - "\n", - "query = \"\"\"\n", - "{\n", - " Get {\n", - " <class_name> {\n", - " <property1>\n", - " <property2>\n", - " ...\n", - " }\n", - " }\n", - "}\n", - "\"\"\"\n", - "\n", - "documents = reader.load_data(graphql_query=query, separate_documents=True)" - ] - }, - { - "cell_type": "markdown", - "id": "169b4273-eb20-4d06-9ffe-71320f4570f6", - "metadata": {}, - "source": [ - "### Create index" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "92599a0a-93ba-4c93-80f1-9acae0663c34", - "metadata": {}, - "outputs": [], - "source": [ - "index = GPTListIndex.from_documents(documents)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "52d93c3f-a08d-4637-98bc-0c3cc693c563", - "metadata": {}, - "outputs": [], - "source": [ - "# set Logging to DEBUG for more detailed outputs\n", - "response = index.query(\"<query_text>\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "771b42be-4108-43a0-a1b4-b259a7819936", - "metadata": {}, - "outputs": [], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.1" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file + "cells": [ + { + "cell_type": "markdown", + "id": "36e7bb96-0c27-47e9-a525-c11f40be3b86", + "metadata": {}, + "source": [ + "# Weaviate Demo" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38ca1434", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "import sys\n", + "\n", + "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", + "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "d99bc57b-85df-46ac-8262-2409344af428", + "metadata": {}, + "outputs": [], + "source": [ + "import weaviate\n", + "from llama_index.readers.weaviate import WeaviateReader" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fec36c7a-3766-4167-890e-b93adb831a64", + "metadata": {}, + "outputs": [], + "source": [ + "# See https://weaviate.io/developers/weaviate/current/client-libraries/python.html\n", + "# for more details on authentication\n", + "resource_owner_config = weaviate.AuthClientPassword(\n", + " username = \"<username>\", \n", + " password = \"<password>\", \n", + ")\n", + "\n", + "# initialize reader\n", + "reader = WeaviateReader(\"https://<cluster-id>.semi.network/\", auth_client_secret=resource_owner_config)" + ] + }, + { + "cell_type": "markdown", + "id": "ce9f299c-4f0a-4bca-bc90-79848f02b381", + "metadata": {}, + "source": [ + "You have two options for the Weaviate reader: 1) directly specify the class_name and properties, or 2) input the raw graphql_query. Examples are shown below." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "b92d69a1-d39f-45cf-a136-cb9c2f2f5cdf", + "metadata": {}, + "outputs": [], + "source": [ + "# 1) load data using class_name and properties\n", + "# docs = reader.load_data(\n", + "# class_name=\"Author\", properties=[\"name\", \"description\"], separate_documents=True\n", + "# )\n", + "\n", + "documents = reader.load_data(\n", + " class_name=\"<class_name>\", \n", + " properties=[\"property1\", \"property2\", \"...\"], \n", + " separate_documents=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "722b5d47-9897-4c54-9734-259ab0c1634c", + "metadata": {}, + "outputs": [], + "source": [ + "# 2) example GraphQL query\n", + "# query = \"\"\"\n", + "# {\n", + "# Get {\n", + "# Author {\n", + "# name\n", + "# description\n", + "# }\n", + "# }\n", + "# }\n", + "# \"\"\"\n", + "# docs = reader.load_data(graphql_query=query, separate_documents=True)\n", + "\n", + "query = \"\"\"\n", + "{\n", + " Get {\n", + " <class_name> {\n", + " <property1>\n", + " <property2>\n", + " ...\n", + " }\n", + " }\n", + "}\n", + "\"\"\"\n", + "\n", + "documents = reader.load_data(graphql_query=query, separate_documents=True)" + ] + }, + { + "cell_type": "markdown", + "id": "169b4273-eb20-4d06-9ffe-71320f4570f6", + "metadata": {}, + "source": [ + "### Create index" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "92599a0a-93ba-4c93-80f1-9acae0663c34", + "metadata": {}, + "outputs": [], + "source": [ + "index = GPTListIndex.from_documents(documents)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "52d93c3f-a08d-4637-98bc-0c3cc693c563", + "metadata": {}, + "outputs": [], + "source": [ + "# set Logging to DEBUG for more detailed outputs\n", + "response = index.query(\"<query_text>\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "771b42be-4108-43a0-a1b4-b259a7819936", + "metadata": {}, + "outputs": [], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/evaluation/GuardrailsDemo.ipynb b/examples/evaluation/GuardrailsDemo.ipynb index 78b177a61d..b99a045174 100644 --- a/examples/evaluation/GuardrailsDemo.ipynb +++ b/examples/evaluation/GuardrailsDemo.ipynb @@ -1,341 +1,341 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "9c48213d-6e6a-4c10-838a-2a7c710c3a05", - "metadata": {}, - "source": [ - "# Simple Index Demo" - ] - }, - { - "cell_type": "markdown", - "id": "50d3b817-b70e-4667-be4f-d3a0fe4bd119", - "metadata": {}, - "source": [ - "#### Load documents, build the GPTSimpleVectorIndex" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "690a6918-7c75-4f95-9ccc-d2c4a1fe00d7", - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "import sys\n", - "\n", - "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", - "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))\n", - "\n", - "from gpt_index import GPTSimpleVectorIndex, SimpleDirectoryReader\n", - "from IPython.display import Markdown, display" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "03d1691e-544b-454f-825b-5ee12f7faa8a", - "metadata": {}, - "outputs": [], - "source": [ - "# load documents\n", - "documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "ad144ee7-96da-4dd6-be00-fd6cf0c78e58", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "INFO:gpt_index.token_counter.token_counter:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", - "> [build_index_from_documents] Total LLM token usage: 0 tokens\n", - "INFO:gpt_index.token_counter.token_counter:> [build_index_from_documents] Total embedding token usage: 18579 tokens\n", - "> [build_index_from_documents] Total embedding token usage: 18579 tokens\n" - ] - } - ], - "source": [ - "index = GPTSimpleVectorIndex.from_documents(documents, chunk_size_limit=512)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "2bbccf1d-ac39-427c-b3a3-f8e9d1d12348", - "metadata": {}, - "outputs": [], - "source": [ - "# save index to disk\n", - "index.save_to_disk('index_simple.json')" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "197ca78e-1310-474d-91e3-877c3636b901", - "metadata": {}, - "outputs": [], - "source": [ - "# load index from disk\n", - "index = GPTSimpleVectorIndex.load_from_disk('index_simple.json')" - ] - }, - { - "cell_type": "markdown", - "id": "8b7d7c61-b5d7-4b8f-b90b-3ebee1103f27", - "metadata": {}, - "source": [ - "#### Define Query + Guardrails Spec" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "6fb88295-0840-4e2d-b79b-def0b0a63a7f", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "from gpt_index.output_parsers import GuardrailsOutputParser\n", - "from gpt_index.llm_predictor import StructuredLLMPredictor" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "057139d2-09e8-4b8d-83a1-a2356a1475a8", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "llm_predictor = StructuredLLMPredictor()" - ] - }, - { - "cell_type": "markdown", - "id": "bc25edf7-9343-4e82-a3f1-eec4281a9371", - "metadata": {}, - "source": [ - "**Define custom QA and Refine Prompts**" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "2833d086-d240-4798-b3c5-a83ac4593b0e", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "from gpt_index.prompts.prompts import QuestionAnswerPrompt, RefinePrompt\n", - "from gpt_index.prompts.default_prompts import DEFAULT_TEXT_QA_PROMPT_TMPL, DEFAULT_REFINE_PROMPT_TMPL" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "a4b9201d-fe16-4cc0-8135-a08d9928625d", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# NOTE: we don't need to define the query_str in the rail spec, we can define during query-time.\n", - "rail_spec = (\"\"\"\n", - "<rail version=\"0.1\">\n", - "\n", - "<output>\n", - " <list name=\"points\" description=\"Bullet points regarding events in the author's life.\">\n", - " <object>\n", - " <string name=\"explanation\" format=\"one-line\" on-fail-one-line=\"noop\" />\n", - " <string name=\"explanation2\" format=\"one-line\" on-fail-one-line=\"noop\" />\n", - " <string name=\"explanation3\" format=\"one-line\" on-fail-one-line=\"noop\" />\n", - " </object>\n", - " </list>\n", - "</output>\n", - "\n", - "<prompt>\n", - "\n", - "Query string here.\n", - "\n", - "@xml_prefix_prompt\n", - "\n", - "{output_schema}\n", - "\n", - "@json_suffix_prompt_v2_wo_none\n", - "</prompt>\n", - "</rail>\n", - "\"\"\")" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "f7af4ebf-1dff-48ec-9fb7-8926af45b6a0", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "output_parser = GuardrailsOutputParser.from_rail_string(rail_spec, llm=llm_predictor.llm)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "a9b440d4-6fb4-46e6-973f-44207b432d3f", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# NOTE: we use the same output parser for both prompts, though you can choose to use different parsers\n", - "# NOTE: here we add formatting instructions to the prompts.\n", - "\n", - "fmt_qa_tmpl = output_parser.format(DEFAULT_TEXT_QA_PROMPT_TMPL)\n", - "fmt_refine_tmpl = output_parser.format(DEFAULT_REFINE_PROMPT_TMPL)\n", - "\n", - "qa_prompt = QuestionAnswerPrompt(fmt_qa_tmpl, output_parser=output_parser)\n", - "refine_prompt = RefinePrompt(fmt_refine_tmpl, output_parser=output_parser)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "1ba18a80-35f4-4fd4-9b13-9f13f84db4fe", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Context information is below. \n", - "---------------------\n", - "{context_str}\n", - "---------------------\n", - "Given the context information and not prior knowledge, answer the question: {query_str}\n", - "\n", - "\n", - "\n", - "Given below is XML that describes the information to extract from this document and the tags to extract it into.\n", - "\n", - "\n", - "<output>\n", - " <list name=\"points\" description=\"Bullet points regarding events in the author's life.\">\n", - " <object>\n", - " <string name=\"explanation\" format=\"one-line\"/>\n", - " <string name=\"explanation2\" format=\"one-line\"/>\n", - " <string name=\"explanation3\" format=\"one-line\"/>\n", - " </object>\n", - " </list>\n", - "</output>\n", - "\n", - "\n", - "\n", - "\n", - "ONLY return a valid JSON object (no other text is necessary). The JSON MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and specific types. Be correct and concise.\n", - "\n", - "JSON Output:\n", - "\n", - "\n" - ] - } - ], - "source": [ - "# take a look at the new QA template! \n", - "print(fmt_qa_tmpl)" - ] - }, - { - "cell_type": "markdown", - "id": "b6caf93b-6345-4c65-a346-a95b0f1746c4", - "metadata": {}, - "source": [ - "#### Query Index" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "fb9cdf43-0f31-4c36-869b-df9fa50aebdb", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "INFO:gpt_index.token_counter.token_counter:> [query] Total LLM token usage: 754 tokens\n", - "> [query] Total LLM token usage: 754 tokens\n", - "INFO:gpt_index.token_counter.token_counter:> [query] Total embedding token usage: 11 tokens\n", - "> [query] Total embedding token usage: 11 tokens\n" - ] - } - ], - "source": [ - "response = index.query(\n", - " \"What are the three items the author did growing up?\", \n", - " text_qa_template=qa_prompt, \n", - " refine_template=refine_prompt, \n", - " llm_predictor=llm_predictor\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "bc7760b6-5be3-4303-b97e-3f5edacf674b", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'points': [{'explanation': 'Writing short stories', 'explanation2': 'Programming on an IBM 1401', 'explanation3': 'Using microcomputers'}]}\n" - ] - } - ], - "source": [ - "print(response)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "llama_index_shreyar", - "language": "python", - "name": "llama_index_shreyar" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.10" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file + "cells": [ + { + "cell_type": "markdown", + "id": "9c48213d-6e6a-4c10-838a-2a7c710c3a05", + "metadata": {}, + "source": [ + "# Simple Index Demo Using Gaurdrails" + ] + }, + { + "cell_type": "markdown", + "id": "50d3b817-b70e-4667-be4f-d3a0fe4bd119", + "metadata": {}, + "source": [ + "#### Load documents, build the GPTSimpleVectorIndex" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "690a6918-7c75-4f95-9ccc-d2c4a1fe00d7", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "import sys\n", + "\n", + "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", + "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))\n", + "\n", + "from gpt_index import GPTSimpleVectorIndex, SimpleDirectoryReader\n", + "from IPython.display import Markdown, display" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "03d1691e-544b-454f-825b-5ee12f7faa8a", + "metadata": {}, + "outputs": [], + "source": [ + "# load documents\n", + "documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ad144ee7-96da-4dd6-be00-fd6cf0c78e58", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:gpt_index.token_counter.token_counter:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", + "> [build_index_from_documents] Total LLM token usage: 0 tokens\n", + "INFO:gpt_index.token_counter.token_counter:> [build_index_from_documents] Total embedding token usage: 18579 tokens\n", + "> [build_index_from_documents] Total embedding token usage: 18579 tokens\n" + ] + } + ], + "source": [ + "index = GPTSimpleVectorIndex.from_documents(documents, chunk_size_limit=512)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "2bbccf1d-ac39-427c-b3a3-f8e9d1d12348", + "metadata": {}, + "outputs": [], + "source": [ + "# save index to disk\n", + "index.save_to_disk('index_simple.json')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "197ca78e-1310-474d-91e3-877c3636b901", + "metadata": {}, + "outputs": [], + "source": [ + "# load index from disk\n", + "index = GPTSimpleVectorIndex.load_from_disk('index_simple.json')" + ] + }, + { + "cell_type": "markdown", + "id": "8b7d7c61-b5d7-4b8f-b90b-3ebee1103f27", + "metadata": {}, + "source": [ + "#### Define Query + Guardrails Spec" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "6fb88295-0840-4e2d-b79b-def0b0a63a7f", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from gpt_index.output_parsers import GuardrailsOutputParser\n", + "from gpt_index.llm_predictor import StructuredLLMPredictor" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "057139d2-09e8-4b8d-83a1-a2356a1475a8", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "llm_predictor = StructuredLLMPredictor()" + ] + }, + { + "cell_type": "markdown", + "id": "bc25edf7-9343-4e82-a3f1-eec4281a9371", + "metadata": {}, + "source": [ + "**Define custom QA and Refine Prompts**" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2833d086-d240-4798-b3c5-a83ac4593b0e", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from gpt_index.prompts.prompts import QuestionAnswerPrompt, RefinePrompt\n", + "from gpt_index.prompts.default_prompts import DEFAULT_TEXT_QA_PROMPT_TMPL, DEFAULT_REFINE_PROMPT_TMPL" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "a4b9201d-fe16-4cc0-8135-a08d9928625d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# NOTE: we don't need to define the query_str in the rail spec, we can define during query-time.\n", + "rail_spec = (\"\"\"\n", + "<rail version=\"0.1\">\n", + "\n", + "<output>\n", + " <list name=\"points\" description=\"Bullet points regarding events in the author's life.\">\n", + " <object>\n", + " <string name=\"explanation\" format=\"one-line\" on-fail-one-line=\"noop\" />\n", + " <string name=\"explanation2\" format=\"one-line\" on-fail-one-line=\"noop\" />\n", + " <string name=\"explanation3\" format=\"one-line\" on-fail-one-line=\"noop\" />\n", + " </object>\n", + " </list>\n", + "</output>\n", + "\n", + "<prompt>\n", + "\n", + "Query string here.\n", + "\n", + "@xml_prefix_prompt\n", + "\n", + "{output_schema}\n", + "\n", + "@json_suffix_prompt_v2_wo_none\n", + "</prompt>\n", + "</rail>\n", + "\"\"\")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "f7af4ebf-1dff-48ec-9fb7-8926af45b6a0", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "output_parser = GuardrailsOutputParser.from_rail_string(rail_spec, llm=llm_predictor.llm)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "a9b440d4-6fb4-46e6-973f-44207b432d3f", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# NOTE: we use the same output parser for both prompts, though you can choose to use different parsers\n", + "# NOTE: here we add formatting instructions to the prompts.\n", + "\n", + "fmt_qa_tmpl = output_parser.format(DEFAULT_TEXT_QA_PROMPT_TMPL)\n", + "fmt_refine_tmpl = output_parser.format(DEFAULT_REFINE_PROMPT_TMPL)\n", + "\n", + "qa_prompt = QuestionAnswerPrompt(fmt_qa_tmpl, output_parser=output_parser)\n", + "refine_prompt = RefinePrompt(fmt_refine_tmpl, output_parser=output_parser)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "1ba18a80-35f4-4fd4-9b13-9f13f84db4fe", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Context information is below. \n", + "---------------------\n", + "{context_str}\n", + "---------------------\n", + "Given the context information and not prior knowledge, answer the question: {query_str}\n", + "\n", + "\n", + "\n", + "Given below is XML that describes the information to extract from this document and the tags to extract it into.\n", + "\n", + "\n", + "<output>\n", + " <list name=\"points\" description=\"Bullet points regarding events in the author's life.\">\n", + " <object>\n", + " <string name=\"explanation\" format=\"one-line\"/>\n", + " <string name=\"explanation2\" format=\"one-line\"/>\n", + " <string name=\"explanation3\" format=\"one-line\"/>\n", + " </object>\n", + " </list>\n", + "</output>\n", + "\n", + "\n", + "\n", + "\n", + "ONLY return a valid JSON object (no other text is necessary). The JSON MUST conform to the XML format, including any types and format requests e.g. requests for lists, objects and specific types. Be correct and concise.\n", + "\n", + "JSON Output:\n", + "\n", + "\n" + ] + } + ], + "source": [ + "# take a look at the new QA template! \n", + "print(fmt_qa_tmpl)" + ] + }, + { + "cell_type": "markdown", + "id": "b6caf93b-6345-4c65-a346-a95b0f1746c4", + "metadata": {}, + "source": [ + "#### Query Index" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "fb9cdf43-0f31-4c36-869b-df9fa50aebdb", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:gpt_index.token_counter.token_counter:> [query] Total LLM token usage: 754 tokens\n", + "> [query] Total LLM token usage: 754 tokens\n", + "INFO:gpt_index.token_counter.token_counter:> [query] Total embedding token usage: 11 tokens\n", + "> [query] Total embedding token usage: 11 tokens\n" + ] + } + ], + "source": [ + "response = index.query(\n", + " \"What are the three items the author did growing up?\", \n", + " text_qa_template=qa_prompt, \n", + " refine_template=refine_prompt, \n", + " llm_predictor=llm_predictor\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "bc7760b6-5be3-4303-b97e-3f5edacf674b", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'points': [{'explanation': 'Writing short stories', 'explanation2': 'Programming on an IBM 1401', 'explanation3': 'Using microcomputers'}]}\n" + ] + } + ], + "source": [ + "print(response)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/evaluation/LangchainOutputParserDemo.ipynb b/examples/evaluation/LangchainOutputParserDemo.ipynb index 91f6f5a2ff..541de8a864 100644 --- a/examples/evaluation/LangchainOutputParserDemo.ipynb +++ b/examples/evaluation/LangchainOutputParserDemo.ipynb @@ -1,333 +1,333 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "9c48213d-6e6a-4c10-838a-2a7c710c3a05", - "metadata": {}, - "source": [ - "# Simple Index Demo" - ] - }, - { - "cell_type": "markdown", - "id": "50d3b817-b70e-4667-be4f-d3a0fe4bd119", - "metadata": {}, - "source": [ - "#### Load documents, build the GPTSimpleVectorIndex" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "690a6918-7c75-4f95-9ccc-d2c4a1fe00d7", - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "import sys\n", - "\n", - "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", - "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))\n", - "\n", - "from gpt_index import GPTSimpleVectorIndex, SimpleDirectoryReader\n", - "from IPython.display import Markdown, display" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "03d1691e-544b-454f-825b-5ee12f7faa8a", - "metadata": {}, - "outputs": [], - "source": [ - "# load documents\n", - "documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "ad144ee7-96da-4dd6-be00-fd6cf0c78e58", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "INFO:gpt_index.token_counter.token_counter:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", - "> [build_index_from_documents] Total LLM token usage: 0 tokens\n", - "INFO:gpt_index.token_counter.token_counter:> [build_index_from_documents] Total embedding token usage: 18579 tokens\n", - "> [build_index_from_documents] Total embedding token usage: 18579 tokens\n" - ] - } - ], - "source": [ - "index = GPTSimpleVectorIndex.from_documents(documents, chunk_size_limit=512)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "2bbccf1d-ac39-427c-b3a3-f8e9d1d12348", - "metadata": {}, - "outputs": [], - "source": [ - "# save index to disk\n", - "index.save_to_disk('index_simple.json')" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "197ca78e-1310-474d-91e3-877c3636b901", - "metadata": {}, - "outputs": [], - "source": [ - "# load index from disk\n", - "index = GPTSimpleVectorIndex.load_from_disk('index_simple.json')" - ] - }, - { - "cell_type": "markdown", - "id": "8b7d7c61-b5d7-4b8f-b90b-3ebee1103f27", - "metadata": {}, - "source": [ - "#### Define Query + Langchain Output Parser" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "6fb88295-0840-4e2d-b79b-def0b0a63a7f", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "from gpt_index.output_parsers import LangchainOutputParser\n", - "from gpt_index.llm_predictor import StructuredLLMPredictor\n", - "from langchain.output_parsers import StructuredOutputParser, ResponseSchema" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "057139d2-09e8-4b8d-83a1-a2356a1475a8", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "llm_predictor = StructuredLLMPredictor()" - ] - }, - { - "cell_type": "markdown", - "id": "bc25edf7-9343-4e82-a3f1-eec4281a9371", - "metadata": {}, - "source": [ - "**Define custom QA and Refine Prompts**" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "2833d086-d240-4798-b3c5-a83ac4593b0e", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "from gpt_index.prompts.prompts import QuestionAnswerPrompt, RefinePrompt\n", - "from gpt_index.prompts.default_prompts import DEFAULT_TEXT_QA_PROMPT_TMPL, DEFAULT_REFINE_PROMPT_TMPL" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "a4b9201d-fe16-4cc0-8135-a08d9928625d", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "response_schemas = [\n", - " ResponseSchema(name=\"Education\", description=\"Describes the author's educational experience/background.\"),\n", - " ResponseSchema(name=\"Work\", description=\"Describes the author's work experience/background.\")\n", - "]" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "e73b87b8-90da-4ab8-9ff7-e40880277d9b", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "lc_output_parser = StructuredOutputParser.from_response_schemas(response_schemas)\n", - "output_parser = LangchainOutputParser(lc_output_parser)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "a9b440d4-6fb4-46e6-973f-44207b432d3f", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# NOTE: we use the same output parser for both prompts, though you can choose to use different parsers\n", - "# NOTE: here we add formatting instructions to the prompts.\n", - "\n", - "fmt_qa_tmpl = output_parser.format(DEFAULT_TEXT_QA_PROMPT_TMPL)\n", - "fmt_refine_tmpl = output_parser.format(DEFAULT_REFINE_PROMPT_TMPL)\n", - "\n", - "qa_prompt = QuestionAnswerPrompt(fmt_qa_tmpl, output_parser=output_parser)\n", - "refine_prompt = RefinePrompt(fmt_refine_tmpl, output_parser=output_parser)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "1ba18a80-35f4-4fd4-9b13-9f13f84db4fe", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Context information is below. \n", - "---------------------\n", - "{context_str}\n", - "---------------------\n", - "Given the context information and not prior knowledge, answer the question: {query_str}\n", - "\n", - "\n", - "The output should be a markdown code snippet formatted in the following schema:\n", - "\n", - "```json\n", - "{{\n", - "\t\"Education\": string // Describes the author's educational experience/background.\n", - "\t\"Work\": string // Describes the author's work experience/background.\n", - "}}\n", - "```\n" - ] - } - ], - "source": [ - "# take a look at the new QA template! \n", - "print(fmt_qa_tmpl)" - ] - }, - { - "cell_type": "markdown", - "id": "b6caf93b-6345-4c65-a346-a95b0f1746c4", - "metadata": {}, - "source": [ - "#### Query Index" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "fb9cdf43-0f31-4c36-869b-df9fa50aebdb", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:gpt_index.token_counter.token_counter:> [query] Total LLM token usage: 609 tokens\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> [query] Total LLM token usage: 609 tokens\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:gpt_index.token_counter.token_counter:> [query] Total embedding token usage: 11 tokens\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> [query] Total embedding token usage: 11 tokens\n" - ] - } - ], - "source": [ - "response = index.query(\n", - " \"What are a few things the author did growing up?\", \n", - " text_qa_template=qa_prompt, \n", - " refine_template=refine_prompt, \n", - " llm_predictor=llm_predictor\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "bc7760b6-5be3-4303-b97e-3f5edacf674b", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'Education': 'Before college, the author wrote short stories and experimented with programming on an IBM 1401.', 'Work': 'The author worked on writing and programming outside of school.'}\n" - ] - } - ], - "source": [ - "print(response)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "002a4b5f-51ac-437a-afe7-94e2687737a9", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "llama_index", - "language": "python", - "name": "llama_index" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.10" - } + "cells": [ + { + "cell_type": "markdown", + "id": "9c48213d-6e6a-4c10-838a-2a7c710c3a05", + "metadata": {}, + "source": [ + "# Simple Index Demo with Langchain Output Parsers" + ] + }, + { + "cell_type": "markdown", + "id": "50d3b817-b70e-4667-be4f-d3a0fe4bd119", + "metadata": {}, + "source": [ + "#### Load documents, build the GPTSimpleVectorIndex" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "690a6918-7c75-4f95-9ccc-d2c4a1fe00d7", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "import sys\n", + "\n", + "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", + "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))\n", + "\n", + "from gpt_index import GPTSimpleVectorIndex, SimpleDirectoryReader\n", + "from IPython.display import Markdown, display" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "03d1691e-544b-454f-825b-5ee12f7faa8a", + "metadata": {}, + "outputs": [], + "source": [ + "# load documents\n", + "documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ad144ee7-96da-4dd6-be00-fd6cf0c78e58", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:gpt_index.token_counter.token_counter:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", + "> [build_index_from_documents] Total LLM token usage: 0 tokens\n", + "INFO:gpt_index.token_counter.token_counter:> [build_index_from_documents] Total embedding token usage: 18579 tokens\n", + "> [build_index_from_documents] Total embedding token usage: 18579 tokens\n" + ] + } + ], + "source": [ + "index = GPTSimpleVectorIndex.from_documents(documents, chunk_size_limit=512)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "2bbccf1d-ac39-427c-b3a3-f8e9d1d12348", + "metadata": {}, + "outputs": [], + "source": [ + "# save index to disk\n", + "index.save_to_disk('index_simple.json')" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "197ca78e-1310-474d-91e3-877c3636b901", + "metadata": {}, + "outputs": [], + "source": [ + "# load index from disk\n", + "index = GPTSimpleVectorIndex.load_from_disk('index_simple.json')" + ] + }, + { + "cell_type": "markdown", + "id": "8b7d7c61-b5d7-4b8f-b90b-3ebee1103f27", + "metadata": {}, + "source": [ + "#### Define Query + Langchain Output Parser" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "6fb88295-0840-4e2d-b79b-def0b0a63a7f", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from gpt_index.output_parsers import LangchainOutputParser\n", + "from gpt_index.llm_predictor import StructuredLLMPredictor\n", + "from langchain.output_parsers import StructuredOutputParser, ResponseSchema" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "057139d2-09e8-4b8d-83a1-a2356a1475a8", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "llm_predictor = StructuredLLMPredictor()" + ] + }, + { + "cell_type": "markdown", + "id": "bc25edf7-9343-4e82-a3f1-eec4281a9371", + "metadata": {}, + "source": [ + "**Define custom QA and Refine Prompts**" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "2833d086-d240-4798-b3c5-a83ac4593b0e", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from gpt_index.prompts.prompts import QuestionAnswerPrompt, RefinePrompt\n", + "from gpt_index.prompts.default_prompts import DEFAULT_TEXT_QA_PROMPT_TMPL, DEFAULT_REFINE_PROMPT_TMPL" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "a4b9201d-fe16-4cc0-8135-a08d9928625d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "response_schemas = [\n", + " ResponseSchema(name=\"Education\", description=\"Describes the author's educational experience/background.\"),\n", + " ResponseSchema(name=\"Work\", description=\"Describes the author's work experience/background.\")\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "e73b87b8-90da-4ab8-9ff7-e40880277d9b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "lc_output_parser = StructuredOutputParser.from_response_schemas(response_schemas)\n", + "output_parser = LangchainOutputParser(lc_output_parser)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "a9b440d4-6fb4-46e6-973f-44207b432d3f", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# NOTE: we use the same output parser for both prompts, though you can choose to use different parsers\n", + "# NOTE: here we add formatting instructions to the prompts.\n", + "\n", + "fmt_qa_tmpl = output_parser.format(DEFAULT_TEXT_QA_PROMPT_TMPL)\n", + "fmt_refine_tmpl = output_parser.format(DEFAULT_REFINE_PROMPT_TMPL)\n", + "\n", + "qa_prompt = QuestionAnswerPrompt(fmt_qa_tmpl, output_parser=output_parser)\n", + "refine_prompt = RefinePrompt(fmt_refine_tmpl, output_parser=output_parser)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "1ba18a80-35f4-4fd4-9b13-9f13f84db4fe", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Context information is below. \n", + "---------------------\n", + "{context_str}\n", + "---------------------\n", + "Given the context information and not prior knowledge, answer the question: {query_str}\n", + "\n", + "\n", + "The output should be a markdown code snippet formatted in the following schema:\n", + "\n", + "```json\n", + "{{\n", + "\t\"Education\": string // Describes the author's educational experience/background.\n", + "\t\"Work\": string // Describes the author's work experience/background.\n", + "}}\n", + "```\n" + ] + } + ], + "source": [ + "# take a look at the new QA template! \n", + "print(fmt_qa_tmpl)" + ] + }, + { + "cell_type": "markdown", + "id": "b6caf93b-6345-4c65-a346-a95b0f1746c4", + "metadata": {}, + "source": [ + "#### Query Index" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "fb9cdf43-0f31-4c36-869b-df9fa50aebdb", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:gpt_index.token_counter.token_counter:> [query] Total LLM token usage: 609 tokens\n" + ] }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> [query] Total LLM token usage: 609 tokens\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:gpt_index.token_counter.token_counter:> [query] Total embedding token usage: 11 tokens\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> [query] Total embedding token usage: 11 tokens\n" + ] + } + ], + "source": [ + "response = index.query(\n", + " \"What are a few things the author did growing up?\", \n", + " text_qa_template=qa_prompt, \n", + " refine_template=refine_prompt, \n", + " llm_predictor=llm_predictor\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "bc7760b6-5be3-4303-b97e-3f5edacf674b", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'Education': 'Before college, the author wrote short stories and experimented with programming on an IBM 1401.', 'Work': 'The author worked on writing and programming outside of school.'}\n" + ] + } + ], + "source": [ + "print(response)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "002a4b5f-51ac-437a-afe7-94e2687737a9", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "llama_index", + "language": "python", + "name": "llama_index" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/evaluation/TestNYC-Evaluation.ipynb b/examples/evaluation/TestNYC-Evaluation.ipynb index 1a15885d7f..f7c3ffa074 100644 --- a/examples/evaluation/TestNYC-Evaluation.ipynb +++ b/examples/evaluation/TestNYC-Evaluation.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "040fd65f", + "metadata": {}, + "source": [ + "# NYC Wiki Evaluation" + ] + }, { "cell_type": "code", "execution_count": 1, @@ -501,7 +509,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.0" } }, "nbformat": 4, diff --git a/examples/gatsby/TestGatsby.ipynb b/examples/gatsby/TestGatsby.ipynb index b7c5f3be54..1c2b45f8cd 100644 --- a/examples/gatsby/TestGatsby.ipynb +++ b/examples/gatsby/TestGatsby.ipynb @@ -1,184 +1,192 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "ffeb4eee", - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "import sys\n", - "\n", - "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", - "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f1a9eb90-335c-4214-8bb6-fd1edbe3ccbd", - "metadata": {}, - "outputs": [], - "source": [ - "# My OpenAI Key\n", - "import os\n", - "os.environ['OPENAI_API_KEY'] = \"INSERT OPENAI KEY\"" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "8d0b2364-4806-4656-81e7-3f6e4b910b5b", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import GPTTreeIndex, SimpleDirectoryReader\n", - "from IPython.display import Markdown, display" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "1298bbb4-c99e-431e-93ef-eb32c0a2fc2a", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Building index from nodes: 9 chunks\n", - "0/95\n", - "10/95\n", - "20/95\n", - "30/95\n", - "40/95\n", - "50/95\n", - "60/95\n", - "70/95\n", - "80/95\n", - "90/95\n", - "> [build_index_from_documents] Total token usage: 34226 tokens\n" - ] - } - ], - "source": [ - "documents = SimpleDirectoryReader('data').load_data()\n", - "index = GPTTreeIndex.from_documents(documents)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "0b4fe9b6-5762-4e86-b51e-aac45d3ecdb1", - "metadata": {}, - "outputs": [], - "source": [ - "index.save_to_disk('index_gatsby.json')" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "5eec265d-211b-4f26-b05b-5b4e7072bc6e", - "metadata": {}, - "outputs": [], - "source": [ - "# try loading\n", - "new_index = GPTTreeIndex.load_from_disk('index_gatsby.json')" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "68c9ebfe-b1b6-4f4e-9278-174346de8c90", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Starting query: What did the narrator do after getting back to Chicago?\n", - ">[Level 0] Selected node: [8]/[8]\n", - ">[Level 1] Selected node: [8]/[8]\n", - "> [query] Total token usage: 6058 tokens\n" - ] - } - ], - "source": [ - "# set Logging to DEBUG for more detailed outputs\n", - "\n", - "response = new_index.query(\"What did the narrator do after getting back to Chicago?\")" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "91581e60-6051-40ae-bba6-8fa08ffbb728", - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "<b>The narrator returned to his home in Chicago and began calling people to inform them of Gatsby's funeral. He was worried that the funeral would draw a sightseeing crowd and wanted to keep it private. He was relieved when Klipspringer called and promised to tell anyone who might be interested about the funeral. He then asked Klipspringer to commit to attending the funeral, but Klipspringer hesitated.</b>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ca10a9c1-9dff-476d-b218-3208a1b8e7f6", - "metadata": {}, - "outputs": [], - "source": [ - "# GPT is confused by the text evidence\n", - "response = new_index.query(\"What did Gatsby do before he met Daisy?\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4fc3f18a-0ef9-453c-acf8-7aedd784cdcf", - "metadata": {}, - "outputs": [], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.1" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file + "cells": [ + { + "cell_type": "markdown", + "id": "abf838d6", + "metadata": {}, + "source": [ + "# Gatsby Test" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ffeb4eee", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "import sys\n", + "\n", + "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", + "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f1a9eb90-335c-4214-8bb6-fd1edbe3ccbd", + "metadata": {}, + "outputs": [], + "source": [ + "# My OpenAI Key\n", + "import os\n", + "os.environ['OPENAI_API_KEY'] = \"INSERT OPENAI KEY\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "8d0b2364-4806-4656-81e7-3f6e4b910b5b", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import GPTTreeIndex, SimpleDirectoryReader\n", + "from IPython.display import Markdown, display" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "1298bbb4-c99e-431e-93ef-eb32c0a2fc2a", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Building index from nodes: 9 chunks\n", + "0/95\n", + "10/95\n", + "20/95\n", + "30/95\n", + "40/95\n", + "50/95\n", + "60/95\n", + "70/95\n", + "80/95\n", + "90/95\n", + "> [build_index_from_documents] Total token usage: 34226 tokens\n" + ] + } + ], + "source": [ + "documents = SimpleDirectoryReader('data').load_data()\n", + "index = GPTTreeIndex.from_documents(documents)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "0b4fe9b6-5762-4e86-b51e-aac45d3ecdb1", + "metadata": {}, + "outputs": [], + "source": [ + "index.save_to_disk('index_gatsby.json')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "5eec265d-211b-4f26-b05b-5b4e7072bc6e", + "metadata": {}, + "outputs": [], + "source": [ + "# try loading\n", + "new_index = GPTTreeIndex.load_from_disk('index_gatsby.json')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "68c9ebfe-b1b6-4f4e-9278-174346de8c90", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Starting query: What did the narrator do after getting back to Chicago?\n", + ">[Level 0] Selected node: [8]/[8]\n", + ">[Level 1] Selected node: [8]/[8]\n", + "> [query] Total token usage: 6058 tokens\n" + ] + } + ], + "source": [ + "# set Logging to DEBUG for more detailed outputs\n", + "\n", + "response = new_index.query(\"What did the narrator do after getting back to Chicago?\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "91581e60-6051-40ae-bba6-8fa08ffbb728", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "<b>The narrator returned to his home in Chicago and began calling people to inform them of Gatsby's funeral. He was worried that the funeral would draw a sightseeing crowd and wanted to keep it private. He was relieved when Klipspringer called and promised to tell anyone who might be interested about the funeral. He then asked Klipspringer to commit to attending the funeral, but Klipspringer hesitated.</b>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ca10a9c1-9dff-476d-b218-3208a1b8e7f6", + "metadata": {}, + "outputs": [], + "source": [ + "# GPT is confused by the text evidence\n", + "response = new_index.query(\"What did Gatsby do before he met Daisy?\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4fc3f18a-0ef9-453c-acf8-7aedd784cdcf", + "metadata": {}, + "outputs": [], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/knowledge_graph/KnowledgeGraphDemo.ipynb b/examples/knowledge_graph/KnowledgeGraphDemo.ipynb index 70ade12dd8..1a7a2c2033 100644 --- a/examples/knowledge_graph/KnowledgeGraphDemo.ipynb +++ b/examples/knowledge_graph/KnowledgeGraphDemo.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "45043ecd", + "metadata": {}, + "source": [ + "# Knowledge Graph Demo" + ] + }, { "cell_type": "code", "execution_count": 1, @@ -546,7 +554,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.0" } }, "nbformat": 4, diff --git a/examples/langchain_demo/LangchainDemo.ipynb b/examples/langchain_demo/LangchainDemo.ipynb index 2e74d40700..781d922448 100644 --- a/examples/langchain_demo/LangchainDemo.ipynb +++ b/examples/langchain_demo/LangchainDemo.ipynb @@ -5,7 +5,7 @@ "id": "3bf01a75-a01b-472e-bc0c-9fe97658eb46", "metadata": {}, "source": [ - "## GPT Index <> Langchain Integrations\n", + "# GPT Index <> Langchain Integrations\n", "\n", "This demo notebook shows how you can provide integrations between GPT Index and Langchain. It provides the following examples:\n", "- Using GPT Index as a callable tool with a Langchain agent\n", diff --git a/examples/multimodal/Multimodal.ipynb b/examples/multimodal/Multimodal.ipynb index 8a42426e2c..8d65da0bc3 100644 --- a/examples/multimodal/Multimodal.ipynb +++ b/examples/multimodal/Multimodal.ipynb @@ -1,594 +1,611 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": 13, - "id": "d4073749", - "metadata": {}, - "outputs": [], - "source": [ - "from gpt_index import SimpleDirectoryReader, GPTSimpleVectorIndex\n", - "from gpt_index.readers.file.base import (\n", - " DEFAULT_FILE_EXTRACTOR, \n", - " ImageParser,\n", - ")\n", - "from gpt_index.response.notebook_utils import (\n", - " display_response, \n", - " display_image,\n", - ")\n", - "from gpt_index.indices.query.query_transform.base import (\n", - " ImageOutputQueryTransform,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "a4b74e87", - "metadata": {}, - "outputs": [], - "source": [ - "# NOTE: By default, image parser converts image into text and discard the original image. \n", - "# Here, we explicitly keep both the original image and parsed text in an image document\n", - "image_parser = ImageParser(keep_image=True, parse_text=True)\n", - "file_extractor = DEFAULT_FILE_EXTRACTOR\n", - "file_extractor.update(\n", - "{\n", - " \".jpg\": image_parser,\n", - " \".png\": image_parser,\n", - " \".jpeg\": image_parser,\n", - "})\n", - "\n", - "# NOTE: we add filename as metadata for all documents\n", - "filename_fn = lambda filename: {'file_name': filename}" - ] - }, - { - "cell_type": "markdown", - "id": "ca801c8c", - "metadata": {}, - "source": [ - "# Q&A over Receipt Images" - ] - }, - { - "cell_type": "markdown", - "id": "80cce8e4", - "metadata": {}, - "source": [ - "We first ingest our receipt images with the *custom* `image parser` and `metadata function` defined above. \n", - "This gives us `image documents` instead of only text documents." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "dbc28f2d", - "metadata": {}, - "outputs": [], - "source": [ - "receipt_reader = SimpleDirectoryReader(\n", - " input_dir='data/receipts', \n", - " file_extractor=file_extractor, \n", - " file_metadata=filename_fn,\n", - ")\n", - "receipt_documents = receipt_reader.load_data()" - ] - }, - { - "cell_type": "markdown", - "id": "12fd6f45", - "metadata": {}, - "source": [ - "We build a simple vector index as usual, but unlike before, our index holds images in addition to text." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "629cab63", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", - "INFO:root:> [build_index_from_documents] Total embedding token usage: 2180 tokens\n" - ] - } - ], - "source": [ - "receipts_index = GPTSimpleVectorIndex.from_documents(receipt_documents)" - ] - }, - { - "cell_type": "markdown", - "id": "8fef454f", - "metadata": {}, - "source": [ - "We can now ask a question that prompts for response with both text and image. \n", - "We use a custom query transform `ImageOutputQueryTransform` to add instruction on how to display the image nicely in the notebook." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "7c078dc0", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:> [query] Total LLM token usage: 1005 tokens\n", - "INFO:root:> [query] Total embedding token usage: 30 tokens\n" - ] - } - ], - "source": [ - "receipts_response = receipts_index.query(\n", - " 'When was the last time I went to McDonald\\'s and how much did I spend. \\\n", - " Also show me the receipt from my visit.',\n", - " query_transform=ImageOutputQueryTransform(width=400)\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "05c180ae", - "metadata": {}, - "source": [ - "We now have rich multimodal response with inline text and image! \n", - "\n", - "The source nodes section gives additional details on retrieved data used for synthesizing the final response. \n", - "In this case, we can verify that the receipt for McDonald's is correctly retrieved. " - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "810ad2e9", - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**`Final Response:`** The last time you went to McDonald's was on 03/10/2018 at 07:39:12 PM and you spent $26.15. Here is the receipt from your visit: <img src=\"data/receipts/1100-receipt.jpg\" width=\"400\" />" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "---" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**`Source Node 1/1`**" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**Document ID:** 3949d7d1-96bc-4d46-beb6-79d2acbb1fd6<br>**Similarity:** 0.7981321083637717<br>**Text:** file_name: data/receipts/1100-receipt.jpg\n", - "\n", - "<s_menu><s_nm> Story</s_nm><s_num> 16725 Stony Platin ...<br>**Image:**" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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BkSxCQSDjgez1M5hYzxumvGRzfWT483rZrKetFFV0R4DBts0i0taq40CslAIABYhXZyd860FyJ1LjeykikjWROiSaK8AqjT9UurTBa7L2V3n65LRL47LdQPwASZMvp11KSxCTtWaLWTOZShLtc7gUsLvrrkwJfsuFmwKZWyfSTYqWW97nFjTOpSyopRSoFZEPeynJagBwDEslRvZNwlRMYdj6wcgQqToqgnKuILaQJDl8LCkXC5Y22XD4dCavqzk2qrmLLyyiNRWO1sfg0kHKcFOby+gCojD9lphAQfnOllVIQYRwNDEtp0pKhCAgJheyiG9Olpff91+DVV/FhWIjA+UIHYWDgOgkJWS02V+QARlDgXBC6t0hj2CMbDtQJ/6tmnPnT37f/u//F8jEs+6QWyC4py5idHI0q9PGcQ2B5Vbov0HDhif912XmBFAWSeTyXe+851PP/qZjX37k4gCpNT9x//w799666311VXu+hhCbNrU9Ta2fG119YXnnvvv/82//af//J+JagiRpWuaBsqmxWVYXidry3aFqgWXSrDfmlqdEpyS2edoBhIQkS6GYYC2ifsT83DtQwdWVzkeSM3oUt9AM2IBQFZiRCVBIhIWaBABDRGILGxVWNiZv3a+nIAXRFjizR55pCrou/fo/U3Xu+XEF5FBr1kpdTeLsmYscSheAmmqChortWo0uStXVStp/9evg0vW5VK0sWpj2F01Uhxn8NSWn2Awr8yPDcu4ImbumAHQWpy4tMAREVRxe6w6J0XMcIFdG23xb+ccLp2KteznCrwdco9fLq3muiNclIhGo5FZjL537nBSydz77XQ5tez04dQc8rBql48LI9bzrCklAoXYrKytURyAEJTpF6oKIB6b8M3FAp2hpZ/AF1xjzu+VQbuIRkvYz8naTx2Kb2KGbr2lnjjXqntLVHcmOzs7O02I2qdIQbNjGbAYzE40BieYmEWBQvxn//y/2b9/f9d1Xd/1Xd/33Z/86Z+++LOfjZsREjbRZqtolwSVUZkQbrv7rpR4e2un73oQ7uezre2ds++9/9qrrwozEmrqSSBJr5Wq0EWQckHZXGY3OflaNjoVyK62be0dVzALngkqkkSFe0yAHTQUjmweOsRJu7gKsUmSlBkoASZAQRDEhpAMRE1VWBFFKRIRYeGomjNry9FJ2laOogWuKDn/u/T03d51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UIfooRpk5krYtz6EDN1p0YymyUUZKsolId+Ebv3IceZmJgBMmhaik0tceW9v79KlB8bd+M233jpy5Mjjn/rUqdOnf/TKK1u3b1+7fn3z+HEEdLhye7v19fX63Z2SVowXrMxp31JfwMqf6q8fehVqhCbQj1955dGPPTIeT5599nu/8Au/uLm58Qd/8L/t3tkG0Z+9/tNH//pf39vb62fThujF7790/vy5vb29F158/td+7dd+9MrL0+n0nXfePn/+nvl8ePbZZ/f39y9fvvzcc8998Ytf/PrXv/7www+fOHHihz/84cMPP/zcc88dP358NBrZxn73u989evToe++9d+XKlZs3b37zm9/8zd/8zQceeAAAgOlnr7/13jvvDn3/yU988iev/BgJU0q/9MUvmoJh5nfeeedP//RP/+E//IevvPLKiy88d+L48atXr166dGk2mxHRK6+8cu3atY2NjStXr06n0/Pnz3/wwQcbGxumUIcYiTElERLQRAQCabI23t9NW7c+Sjg+efxi17XF50FE5MDUaNu2gKCESqgIyGYdllMrqTdEVADDezdj0Pacl+v4cRkTw8VHzRFY9Ys75Zc/LQ66NorNNkjVFCyo5LLfto4Mqi6CMpCjPKAqVk2aYkKikpJABQVagIE4+VEZk+my0umz/mFFXGaDcanyjnMBiHGj6UPNpmzC0rPutwMw6MGlKm9fBJVZPVLg6yufLhtZZtd4kYg7TW6oo4EJLusHPxRdMmWRiAz6N8bBIxHLqmaJaSsRPgxDn1JUFfsvEQYmSb3EqAqK3E3WsemQ2FkbK1/ShN365uaDV65c/+jmK6+++r/90R/+4Ecvnz53drKx/sijj37605/uus6sU1tP3/deiraiUrQy2eoNr18EqgjLyv6vXM4GK7+XGCUOk/E49v3m+vrxY0f/7N/9u61bH50+ffKdt9+8+tCVtglHNjdOnTwhKe5s3zl58sTmkQ0FGYb+rbfefOSRhx997GOPfOzh/el+CGE8Hl+9etVsk09/+tNme25vb9+4cWNnZ8cid8x87do1RPzVX/3VDz/8cG1t7ezZs/fff/+lS5eI6Nvf/c6dne17zp//wi/8wv0XLz7//PNN0/z2b31lf2c3DnFra+uFF15o2/b48ePj8Xhvby+E8JWvfOXsmTNvvvkmlHK+1157bWNjI6b0jW9845ln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ABC1EHcBoyIA2/iqqoIoWnLBOqsoxk/iArPlEOiI1T6J1GrXKEIhIBGLQCFujzukfyomiazBuC3HaIvgaMgTAnLbDKsEhoqQ0oU615BCDCKtRZCVfeckiBUhgSQAihVTZBGAkXDnQcf8QcY0WBgYEULOghgRgjBq0BoCbdmyZc+ePcePH3/zzTd37dr1rW9968033wSAf/bP/tlrr732+c9/vtfraa0yrW06aFJmECDdzIuXrly6fOXd999fWVmZnp4BwKZJTZOWlpaPHv3gxImT11xzDQCk1CBC0wyZc7fb3bZta8qJQmCRwXB4z+c/f+edd9Z1PRgOASmEajAYXrhw8c0335yZmanrChEypxC0WhMKcKSgrlMEwKAqBoBGl4H2N8FOXWv9NmEWziAMgkTE2vMJWQuAqe0PitdC21uqvS8gqt9K90KU+hBBuIoxBMrMWQCQqk5HS23EEKtut+50qlhxFiIKFGOoLl++JFmqKt526yf/4fHHWfiWW26tO51+fyAggShwikIDkBAqYozInJfy8vmpOvWHmQdSd9dR6DEGYKxiFUJEZKLYsipnSioae2ujaONuAAS4LWuHiIAsnBIDNAEZALW2GQBwSmpcUPgwjmWyufaNMC4OTlgoZspRhxKPFwbx4OwP9i37Wb9upXWh1MMMpcaLl0Yn5Fb7VXEtILJIseESAwtAaCEPY4ycc86MLO3+s+RRFoTCBYpAREJTKABR0/baceDoyOm7W8GYR2oqlzR6U6zIVTxpRTtokRJa3yeUwCuLaETNBRdETcxX4lYDARDV3S7nPBgMMGddjwy5qirtziqZlWcq0UOBEB2eVt/QCXNmzpxzE2PQujQIBMIMAiGkCVPzR1xcmm230AShGaa66hAFRAohKjM4fPjwD37wg6WlpX379j377LNvvvnm/Pz8li1b7r777l/84hfD4bCqqrfffvvq1av33Xffa6+9dujwkbNnz/V6vcFgGAJdvbrw2c/e/cgjj/zt3/7t2TNnLl++cvz4iX379j399NNPPvlUjPG+++5Ladg0w6qKGzasP3369MrK8vz8HCEOU9uKev369evWrVNpJaXEWXq9qY0bN117zbVvH3q706lZMgCDkLCAgY2AsGBAEODciipYThhnlooRgHPSSAoA4JxQGIkCorBo1SE1F7YMuRAVIFYxgkhqEgur2sZs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Tte9Ox98NGjw5QZt3TcBQUeLfk9TzD0K5PT0VElTstaSabVa7e7up9pYpjO9Q4LywsxQmL3HT9DaUg79RkVKv3njpZ8v8Ea/eWO5s9vtPICuA9f2GX5Ai0WHKmWTihaVFgElU9I67pWVHnbEc/XTsgtNMPEtco5rhqUoOW5D4PigiDYnnR9lhS6YOaHqyHb0Rg4YY6kJV9yqFBPAO2Cftt9VQ4yiBgtJJAUUNKyAJuSqzMx2nH0U326TFfu+V/PYqJRBWgxdrQEEVHueNFTnREqYzc/3198Sd9ZYcZyxfXCbdJQLmFkE2nRRf8qNTbNdIKLawJuqSZiYiLgUoew5SnX7ao4CtwYUATEi+Y/z8V998pFmUYt2nUmzfmd83DHQnk0pffe73/3rv/7r1Wr1rne9673vfe8f/uEfPvDAA+973/ueeeaZD33oQ1au6D//5/9sfsOnnnrqHe94h+VeEdEbb7yhqnfu3Ln33nt/8IMffOMb3/jQhz70y7/8y6WU73znO8x87ty5ruve9ra3UbMQl1K++93vvvvd73799de//OUvf+ADH3j00UeDTFRznUopX/ziF998883d3d3f+q3fev7557/xjW889NBDH/nIR771rW89++yzDz70wK//+kedlsGDVmgM4HA8ccJtPiO7mmaqwzBUXSnk1qMy52JAsrOzs7PaIapSEvFIykMdHDPujeFRLg0lxTKlw93l+va69MebzBs6WRShLukgxsuLlGXOVu3Iss8ygamBASlIENfWYD7mIjgAuI1SPRSWiKwXeRlYq+Z4N+rj2B52UkGj0jS+rv5vtFeOWfVMBIaFunMLj9K5pcy21AzBCEzX42Yiv/e3YIuYaDARbMM/ZgTIBRAAJvY7G4SFigSNsYSo5TrvhmQ+oC/JNQ4XOONU3ETtwOG0XGTU5hLXBOuZ03F2zL6JZiSqBkJmJlosOqaxOHYpVZY2Js3MLM2+M1Xuouble9UYwkhNHKUxmomALSomoSaZfe9St7365z//+T/5J/8EwHe+853j4+Of/exnwzA88cQTr776qt2wXq/39vZ+67d+axiGvb09x09VffbZZw8PD69du6aqL7/88m//9m//+Z//+SOPPLJYLP7oj/7oE5/4xOnp6cWLFznETIjISy+99K53vevrX//6k08+eeXKFW1is+c95JzX6/X169c/9rGP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\n", - "text/plain": [ - "<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=384x512>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display_response(receipts_response)" - ] - }, - { - "cell_type": "markdown", - "id": "fa834925", - "metadata": {}, - "source": [ - "# Q & A over LlamaIndex Documentation" - ] - }, - { - "cell_type": "markdown", - "id": "f1a82a54", - "metadata": {}, - "source": [ - "We now demo the same for Q&A over LlamaIndex documentations. \n", - "This demo higlights the ability to synthesize multimodal output with a mixture of text and image documents" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "d5f04295", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Could not find image processor class in the image processor config or the model config. Loading based on pattern matching with the model's feature extractor configuration.\n" - ] - } - ], - "source": [ - "llama_reader = SimpleDirectoryReader(\n", - " input_dir='data/llama',\n", - " file_extractor=file_extractor, \n", - " file_metadata=filename_fn,\n", - ")\n", - "llama_documents = llama_reader.load_data(concatenate=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "46db4191", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", - "INFO:root:> [build_index_from_documents] Total embedding token usage: 965 tokens\n" - ] - } - ], - "source": [ - "llama_index = GPTSimpleVectorIndex.from_documents(llama_documents)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "4a4cc090", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:> [query] Total LLM token usage: 1592 tokens\n", - "INFO:root:> [query] Total embedding token usage: 13 tokens\n" - ] - } - ], - "source": [ - "llama_response = llama_index.query(\n", - " 'Show an image to illustrate how tree index works and explain briefly.', \n", - " query_transform=ImageOutputQueryTransform(width=400),\n", - " similarity_top_k=2\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "559624a6", - "metadata": {}, - "source": [ - "By inspecting the 2 source nodes, we see relevant text and image describing the tree index are retrieved for synthesizing the final multimodal response." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "5c5721d6", - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**`Final Response:`** Tree index is a data structure that organizes data in a hierarchical structure. It is often used to store and retrieve data quickly. The image below illustrates how tree index works. \n", - "\n", - "<img src=\"data/llama/tree_index.png\" width=\"400\" />\n", - "\n", - "At the top of the tree is the root node, which contains the main data. From the root node, the data is divided into smaller nodes, which are called child nodes. Each child node can have its own child nodes, and so on. To retrieve data, the tree index is traversed from the root node to the desired node. This allows for quick retrieval of data.\n", - "\n", - "In addition, LlamaIndex offers different methods of synthesizing a response from the tree index. The way to toggle this can be found in our Usage Pattern Guide. For example, the \"Create and Refine\" mode is an iterative way of generating a response. We first use the context in the first node, along with the query, to generate an initial answer. We then pass this answer, the query, and the context of the second node as input into a \"refine prompt\" to generate a refined answer. We refine through N-1 nodes, where" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "---" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**`Source Node 1/2`**" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**Document ID:** 589f9b15-f3b4-4bfc-b50e-28fb1a2d0173<br>**Similarity:** 0.8151716742235475<br>**Text:** file_name: data/llama/tree_index.png\n", - "\n", - "<s_menu><s_nm> Root Node</s_nm><s_unitprice> Parent</s_nm><...<br>**Image:**" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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Iscxuro7f/Hzqx5csqi1ue3VZ732iHnHCOmdC//+m2t/Vy6VDzx4/1KbUxdcRDffctOfr/u9ajj+uJPPOP2V9Vr10IPnnf+6CyeMGds8svWjl7+/vX3T5PGtUNruogFTMHYGUESqDLi3Xfy2JUsWXvfXPyelWBRgqme1L375sx3bOt7ylrcGDZ+74rM99e6759921VU/OPnkFx915ItuufU2YuKYf/+n39zw9z+/7oJXn3jy8d/83jcWPbTomKMOO+KQI3xAILErgXcbEQjsMz3nVa8m0p9ffVVUguTfcPL9H35r/vz73nDBG2ceMOMLX/rvFWsfX7Fq+Rf/57MHzN7/FWeeee+991Vr1aiEexfO/8GPv/fS01/y6tee89s//PpvN18/etSYy97+vmEtowJwy+23jBk9dtSoMSL7+tGafc0CoKB8RpMmTn/Tmy7+yVVXrV672iUxO16+4rEnVq1499s/eMS8Y9/x9n/a2t2+4OG7b7nj5hOPPek1r3zNGS992SknnS4pamnXX2/84yGHHRgnPH7CpOaW5ttuv5kUkoLUKanuaq0Zsx1V5XK57T3v/sDfbrzpnnvvS0oJObdla/u9991x8ZveefyRJ1504ZvHTRp9y903zF9819hRY9960dtOPO6E17zqfPKOGX+78Y/7TRs3asyIcqUyZfp+N936RxWSGpUT97ebf/+nv/z2nW9/f7nUkpcCAcTmAArLhoAKRwGQEjSr+Ze+5Ix7737429/5Sua3OUednd1NzXGl1Favabnc3NTc1r61s7unOnPahBDgBaNHjI8QSdBa1a9Ysb6359aQxTP3nztz/1le8oUrjqw1eR6072rtkIbZM+e+5lUXfPvb35w0tYVdc72WiqbD2obVa6CkNGL42K7OaprR8GFjgKhWxbC2UWXXKp66u2tbNnf+9fpbJLhSMmzOAQdlmVTK7ubbb/rGt7/+nss+dMicI7Ka5EuBycK6wOwMoHgIjUZGAO8ufcvb169btXjxfIabNH6/np7uFWuWNbXRmvUr2rdsmTFl9qQJkxc/tCDVmkZY/OACUl9KymNGTzh47uH/evm/fvRf/vnkE08+cObBHioMVUfKO6l4aXaGIBD1NT337FePHj3yppv+HDs3vHVkU7lpydIFSQs6uzc/tvyxaVNnTp00bcUTj7R3bSy1YslDC+r1rojjceMm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\n", - "text/plain": [ - "<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=512x431>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "---" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**`Source Node 2/2`**" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**Document ID:** d60e5289-64c9-4446-91be-afca6c2be723<br>**Similarity:** 0.8133374944584655<br>**Text:** How Each Index Works\n", - "\n", - "This guide describes how each index works with diagrams. We also visually h...<br>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display_response(llama_response)" - ] - }, - { - "cell_type": "markdown", - "id": "dbd7376e", - "metadata": {}, - "source": [ - "We show another example asking about vector store index instead." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "92569825", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:> [query] Total LLM token usage: 1567 tokens\n", - "INFO:root:> [query] Total embedding token usage: 14 tokens\n" - ] - } - ], - "source": [ - "llama_response = llama_index.query(\n", - " 'Show an image to illustrate how vector store index works and explain briefly.', \n", - " query_transform=ImageOutputQueryTransform(width=400),\n", - " similarity_top_k=2\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "7cfdd68d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "**`Final Response:`** Vector store index is a data structure used to store and retrieve data efficiently. It is a type of hash table that uses a hash function to map keys to their associated values. The image below illustrates how vector store index works. \n", - "\n", - "<img src=\"data/llama/vector_store_index.png\" width=\"400\" />\n", - "\n", - "In the image, the keys are represented by the numbers on the left side of the table, and the values are represented by the numbers on the right side. The hash function is used to map the keys to their associated values. The hash function takes the key as input and produces an index, which is used to locate the value in the table.\n", - "\n", - "Vector store index is one of the four index types used by LlamaIndex, a search engine for natural language processing. The other three index types are list index, tree index, and keyword table index. Each index type has its own way of storing and retrieving data. \n", - "\n", - "List index stores Nodes as a sequential chain. During query time, if no other query parameters are specified, LlamaIndex simply loads all Nodes in the list into our Reponse Synthesis module. The list index also offers numerous ways of querying a list" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "---" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**`Source Node 1/2`**" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**Document ID:** 80d8d2e9-412f-4b22-bc60-55dd131b73a9<br>**Similarity:** 0.8164705784668993<br>**Text:** file_name: data/llama/vector_store_index.png\n", - "\n", - "<s_menu><s_nm> Nodel</s_nm><s_unitprice> Node2</s_u...<br>**Image:**" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=512x313>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "---" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**`Source Node 2/2`**" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**Document ID:** d60e5289-64c9-4446-91be-afca6c2be723<br>**Similarity:** 0.7878578850577496<br>**Text:** How Each Index Works\n", - "\n", - "This guide describes how each index works with diagrams. We also visually h...<br>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display_response(llama_response)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.9" - } + "cells": [ + { + "cell_type": "markdown", + "id": "493dd86c", + "metadata": {}, + "source": [ + "# Multimodal Demo" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "d4073749", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import SimpleDirectoryReader, GPTSimpleVectorIndex\n", + "from llama_index.readers.file.base import (\n", + " DEFAULT_FILE_EXTRACTOR, \n", + " ImageParser,\n", + ")\n", + "from gpt_index.response.notebook_utils import (\n", + " display_response, \n", + " display_image,\n", + ")\n", + "from gpt_index.indices.query.query_transform.base import (\n", + " ImageOutputQueryTransform,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a4b74e87", + "metadata": {}, + "outputs": [], + "source": [ + "# NOTE: By default, image parser converts image into text and discard the original image. \n", + "# Here, we explicitly keep both the original image and parsed text in an image document\n", + "image_parser = ImageParser(keep_image=True, parse_text=True)\n", + "file_extractor = DEFAULT_FILE_EXTRACTOR\n", + "file_extractor.update(\n", + "{\n", + " \".jpg\": image_parser,\n", + " \".png\": image_parser,\n", + " \".jpeg\": image_parser,\n", + "})\n", + "\n", + "# NOTE: we add filename as metadata for all documents\n", + "filename_fn = lambda filename: {'file_name': filename}" + ] + }, + { + "cell_type": "markdown", + "id": "ca801c8c", + "metadata": {}, + "source": [ + "## Q&A over Receipt Images" + ] + }, + { + "cell_type": "markdown", + "id": "80cce8e4", + "metadata": {}, + "source": [ + "We first ingest our receipt images with the *custom* `image parser` and `metadata function` defined above. \n", + "This gives us `image documents` instead of only text documents." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "dbc28f2d", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Could not find image processor class in the image processor config or the model config. Loading based on pattern matching with the model's feature extractor configuration.\n" + ] + } + ], + "source": [ + "receipt_reader = SimpleDirectoryReader(\n", + " input_dir='data/receipts', \n", + " file_extractor=file_extractor, \n", + " file_metadata=filename_fn,\n", + ")\n", + "receipt_documents = receipt_reader.load_data()" + ] + }, + { + "cell_type": "markdown", + "id": "12fd6f45", + "metadata": {}, + "source": [ + "We build a simple vector index as usual, but unlike before, our index holds images in addition to text." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "629cab63", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:llama_index.token_counter.token_counter:> [build_index_from_nodes] Total LLM token usage: 0 tokens\n", + "INFO:llama_index.token_counter.token_counter:> [build_index_from_nodes] Total embedding token usage: 2180 tokens\n" + ] + } + ], + "source": [ + "receipts_index = GPTSimpleVectorIndex.from_documents(receipt_documents)" + ] + }, + { + "cell_type": "markdown", + "id": "8fef454f", + "metadata": {}, + "source": [ + "We can now ask a question that prompts for response with both text and image. \n", + "We use a custom query transform `ImageOutputQueryTransform` to add instruction on how to display the image nicely in the notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "7c078dc0", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:llama_index.token_counter.token_counter:> [query] Total LLM token usage: 1004 tokens\n", + "INFO:llama_index.token_counter.token_counter:> [query] Total embedding token usage: 30 tokens\n" + ] + } + ], + "source": [ + "receipts_response = receipts_index.query(\n", + " 'When was the last time I went to McDonald\\'s and how much did I spend. \\\n", + " Also show me the receipt from my visit.',\n", + " query_transform=ImageOutputQueryTransform(width=400)\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "05c180ae", + "metadata": {}, + "source": [ + "We now have rich multimodal response with inline text and image! \n", + "\n", + "The source nodes section gives additional details on retrieved data used for synthesizing the final response. \n", + "In this case, we can verify that the receipt for McDonald's is correctly retrieved. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "810ad2e9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "**`Final Response:`** The last time you went to McDonald's was on 03/10/2018 at 07:39:12 PM and you spent $26.15. Here is the receipt from your visit: <img src=\"data/receipts/1100-receipt.jpg\" width=\"400\" />" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file + { + "data": { + "text/markdown": [ + "--" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**`Source Node 1/1`**" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/loganm/miniconda3/envs/llama_index/lib/python3.11/site-packages/llama_index/data_structs/node_v2.py:144: UserWarning: .source_text is deprecated, use .node.get_text() instead\n", + " warnings.warn(\".source_text is deprecated, use .node.get_text() instead\")\n", + "/home/loganm/miniconda3/envs/llama_index/lib/python3.11/site-packages/llama_index/data_structs/node_v2.py:139: UserWarning: .doc_id is deprecated, use .node.ref_doc_id instead\n", + " warnings.warn(\".doc_id is deprecated, use .node.ref_doc_id instead\")\n", + "/home/loganm/miniconda3/envs/llama_index/lib/python3.11/site-packages/llama_index/data_structs/node_v2.py:159: UserWarning: .similarity is deprecated, use .score instead instead\n", + " warnings.warn(\".similarity is deprecated, use .score instead instead\")\n", + "/home/loganm/miniconda3/envs/llama_index/lib/python3.11/site-packages/llama_index/data_structs/node_v2.py:164: UserWarning: .image is deprecated, check if Node is an ImageNode and use .node.image instead\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/markdown": [ + "**Document ID:** 2421376f-875d-4d51-a828-ce66354b5145<br>**Similarity:** 0.7982013908158432<br>**Text:** file_name: data/receipts/1100-receipt.jpg\n", + "\n", + "<s_menu><s_nm> Story</s_nm><s_num> 16725 Stony Platin ...<br>**Image:**" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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BkSxCQSDjgez1M5hYzxumvGRzfWT483rZrKetFFV0R4DBts0i0taq40CslAIABYhXZyd860FyJ1LjeykikjWROiSaK8AqjT9UurTBa7L2V3n65LRL47LdQPwASZMvp11KSxCTtWaLWTOZShLtc7gUsLvrrkwJfsuFmwKZWyfSTYqWW97nFjTOpSyopRSoFZEPeynJagBwDEslRvZNwlRMYdj6wcgQqToqgnKuILaQJDl8LCkXC5Y22XD4dCavqzk2qrmLLyyiNRWO1sfg0kHKcFOby+gCojD9lphAQfnOllVIQYRwNDEtp0pKhCAgJheyiG9Olpff91+DVV/FhWIjA+UIHYWDgOgkJWS02V+QARlDgXBC6t0hj2CMbDtQJ/6tmnPnT37f/u//F8jEs+6QWyC4py5idHI0q9PGcQ2B5Vbov0HDhif912XmBFAWSeTyXe+851PP/qZjX37k4gCpNT9x//w799666311VXu+hhCbNrU9Ta2fG119YXnnvvv/82//af//J+JagiRpWuaBsqmxWVYXidry3aFqgWXSrDfmlqdEpyS2edoBhIQkS6GYYC2ifsT83DtQwdWVzkeSM3oUt9AM2IBQFZiRCVBIhIWaBABDRGILGxVWNiZv3a+nIAXRFjizR55pCrou/fo/U3Xu+XEF5FBr1kpdTeLsmYscSheAmmqChortWo0uStXVStp/9evg0vW5VK0sWpj2F01Uhxn8NSWn2Awr8yPDcu4ImbumAHQWpy4tMAREVRxe6w6J0XMcIFdG23xb+ccLp2KteznCrwdco9fLq3muiNclIhGo5FZjL537nBSydz77XQ5tez04dQc8rBql48LI9bzrCklAoXYrKytURyAEJTpF6oKIB6b8M3FAp2hpZ/AF1xjzu+VQbuIRkvYz8naTx2Kb2KGbr2lnjjXqntLVHcmOzs7O02I2qdIQbNjGbAYzE40BieYmEWBQvxn//y/2b9/f9d1Xd/1Xd/33Z/86Z+++LOfjZsREjbRZqtolwSVUZkQbrv7rpR4e2un73oQ7uezre2ds++9/9qrrwozEmrqSSBJr5Wq0EWQckHZXGY3OflaNjoVyK62be0dVzALngkqkkSFe0yAHTQUjmweOsRJu7gKsUmSlBkoASZAQRDEhpAMRE1VWBFFKRIRYeGomjNry9FJ2laOogWuKDn/u/T03d51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UIfooRpk5krYtz6EDN1p0YymyUUZKsolId+Ebv3IceZmJgBMmhaik0tceW9v79KlB8bd+M233jpy5Mjjn/rUqdOnf/TKK1u3b1+7fn3z+HEEdLhye7v19fX63Z2SVowXrMxp31JfwMqf6q8fehVqhCbQj1955dGPPTIeT5599nu/8Au/uLm58Qd/8L/t3tkG0Z+9/tNH//pf39vb62fThujF7790/vy5vb29F158/td+7dd+9MrL0+n0nXfePn/+nvl8ePbZZ/f39y9fvvzcc8998Ytf/PrXv/7www+fOHHihz/84cMPP/zcc88dP358NBrZxn73u989evToe++9d+XKlZs3b37zm9/8zd/8zQceeAAAgOlnr7/13jvvDn3/yU988iev/BgJU0q/9MUvmoJh5nfeeedP//RP/+E//IevvPLKiy88d+L48atXr166dGk2mxHRK6+8cu3atY2NjStXr06n0/Pnz3/wwQcbGxumUIcYiTElERLQRAQCabI23t9NW7c+Sjg+efxi17XF50FE5MDUaNu2gKCESqgIyGYdllMrqTdEVADDezdj0Pacl+v4cRkTw8VHzRFY9Ys75Zc/LQ66NorNNkjVFCyo5LLfto4Mqi6CMpCjPKAqVk2aYkKikpJABQVagIE4+VEZk+my0umz/mFFXGaDcanyjnMBiHGj6UPNpmzC0rPutwMw6MGlKm9fBJVZPVLg6yufLhtZZtd4kYg7TW6oo4EJLusHPxRdMmWRiAz6N8bBIxHLqmaJaSsRPgxDn1JUFfsvEQYmSb3EqAqK3E3WsemQ2FkbK1/ShN365uaDV65c/+jmK6+++r/90R/+4Ecvnz53drKx/sijj37605/uus6sU1tP3/deiraiUrQy2eoNr18EqgjLyv6vXM4GK7+XGCUOk/E49v3m+vrxY0f/7N/9u61bH50+ffKdt9+8+tCVtglHNjdOnTwhKe5s3zl58sTmkQ0FGYb+rbfefOSRhx997GOPfOzh/el+CGE8Hl+9etVsk09/+tNme25vb9+4cWNnZ8cid8x87do1RPzVX/3VDz/8cG1t7ezZs/fff/+lS5eI6Nvf/c6dne17zp//wi/8wv0XLz7//PNN0/z2b31lf2c3DnFra+uFF15o2/b48ePj8Xhvby+E8JWvfOXsmTNvvvkmlHK+1157bWNjI6b0jW9845ln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ABC1EHcBoyIA2/iqqoIoWnLBOqsoxk/iArPlEOiI1T6J1GrXKEIhIBGLQCFujzukfyomiazBuC3HaIvgaMgTAnLbDKsEhoqQ0oU615BCDCKtRZCVfeckiBUhgSQAihVTZBGAkXDnQcf8QcY0WBgYEULOghgRgjBq0BoCbdmyZc+ePcePH3/zzTd37dr1rW9968033wSAf/bP/tlrr732+c9/vtfraa0yrW06aFJmECDdzIuXrly6fOXd999fWVmZnp4BwKZJTZOWlpaPHv3gxImT11xzDQCk1CBC0wyZc7fb3bZta8qJQmCRwXB4z+c/f+edd9Z1PRgOASmEajAYXrhw8c0335yZmanrChEypxC0WhMKcKSgrlMEwKAqBoBGl4H2N8FOXWv9NmEWziAMgkTE2vMJWQuAqe0PitdC21uqvS8gqt9K90KU+hBBuIoxBMrMWQCQqk5HS23EEKtut+50qlhxFiIKFGOoLl++JFmqKt526yf/4fHHWfiWW26tO51+fyAggShwikIDkBAqYozInJfy8vmpOvWHmQdSd9dR6DEGYKxiFUJEZKLYsipnSioae2ujaONuAAS4LWuHiIAsnBIDNAEZALW2GQBwSmpcUPgwjmWyufaNMC4OTlgoZspRhxKPFwbx4OwP9i37Wb9upXWh1MMMpcaLl0Yn5Fb7VXEtILJIseESAwtAaCEPY4ycc86MLO3+s+RRFoTCBYpAREJTKABR0/baceDoyOm7W8GYR2oqlzR6U6zIVTxpRTtokRJa3yeUwCuLaETNBRdETcxX4lYDARDV3S7nPBgMMGddjwy5qirtziqZlWcq0UOBEB2eVt/QCXNmzpxzE2PQujQIBMIMAiGkCVPzR1xcmm230AShGaa66hAFRAohKjM4fPjwD37wg6WlpX379j377LNvvvnm/Pz8li1b7r777l/84hfD4bCqqrfffvvq1av33Xffa6+9dujwkbNnz/V6vcFgGAJdvbrw2c/e/cgjj/zt3/7t2TNnLl++cvz4iX379j399NNPPvlUjPG+++5Ladg0w6qKGzasP3369MrK8vz8HCEOU9uKev369evWrVNpJaXEWXq9qY0bN117zbVvH3q706lZMgCDkLCAgY2AsGBAEODciipYThhnlooRgHPSSAoA4JxQGIkCorBo1SE1F7YMuRAVIFYxgkhqEgur2sZs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Tte9Ox98NGjw5QZt3TcBQUeLfk9TzD0K5PT0VElTstaSabVa7e7up9pYpjO9Q4LywsxQmL3HT9DaUg79RkVKv3njpZ8v8Ea/eWO5s9vtPICuA9f2GX5Ai0WHKmWTihaVFgElU9I67pWVHnbEc/XTsgtNMPEtco5rhqUoOW5D4PigiDYnnR9lhS6YOaHqyHb0Rg4YY6kJV9yqFBPAO2Cftt9VQ4yiBgtJJAUUNKyAJuSqzMx2nH0U326TFfu+V/PYqJRBWgxdrQEEVHueNFTnREqYzc/3198Sd9ZYcZyxfXCbdJQLmFkE2nRRf8qNTbNdIKLawJuqSZiYiLgUoew5SnX7ao4CtwYUATEi+Y/z8V998pFmUYt2nUmzfmd83DHQnk0pffe73/3rv/7r1Wr1rne9673vfe8f/uEfPvDAA+973/ueeeaZD33oQ1au6D//5/9sfsOnnnrqHe94h+VeEdEbb7yhqnfu3Ln33nt/8IMffOMb3/jQhz70y7/8y6WU73znO8x87ty5ruve9ra3UbMQl1K++93vvvvd73799de//OUvf+ADH3j00UeDTFRznUopX/ziF998883d3d3f+q3fev7557/xjW889NBDH/nIR771rW89++yzDz70wK//+kedlsGDVmgM4HA8ccJtPiO7mmaqwzBUXSnk1qMy52JAsrOzs7PaIapSEvFIykMdHDPujeFRLg0lxTKlw93l+va69MebzBs6WRShLukgxsuLlGXOVu3Iss8ygamBASlIENfWYD7mIjgAuI1SPRSWiKwXeRlYq+Z4N+rj2B52UkGj0jS+rv5vtFeOWfVMBIaFunMLj9K5pcy21AzBCEzX42Yiv/e3YIuYaDARbMM/ZgTIBRAAJvY7G4SFigSNsYSo5TrvhmQ+oC/JNQ4XOONU3ETtwOG0XGTU5hLXBOuZ03F2zL6JZiSqBkJmJlosOqaxOHYpVZY2Js3MLM2+M1Xuouble9UYwkhNHKUxmomALSomoSaZfe9St7365z//+T/5J/8EwHe+853j4+Of/exnwzA88cQTr776qt2wXq/39vZ+67d+axiGvb09x09VffbZZw8PD69du6aqL7/88m//9m//+Z//+SOPPLJYLP7oj/7oE5/4xOnp6cWLFznETIjISy+99K53vevrX//6k08+eeXKFW1is+c95JzX6/X169c/9rGP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", + "text/plain": [ + "<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=384x512>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_response(receipts_response)" + ] + }, + { + "cell_type": "markdown", + "id": "fa834925", + "metadata": {}, + "source": [ + "## Q & A over LlamaIndex Documentation" + ] + }, + { + "cell_type": "markdown", + "id": "f1a82a54", + "metadata": {}, + "source": [ + "We now demo the same for Q&A over LlamaIndex documentations. \n", + "This demo higlights the ability to synthesize multimodal output with a mixture of text and image documents" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "d5f04295", + "metadata": {}, + "outputs": [], + "source": [ + "llama_reader = SimpleDirectoryReader(\n", + " input_dir='data/llama',\n", + " file_extractor=file_extractor, \n", + " file_metadata=filename_fn,\n", + ")\n", + "llama_documents = llama_reader.load_data(concatenate=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "46db4191", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:llama_index.token_counter.token_counter:> [build_index_from_nodes] Total LLM token usage: 0 tokens\n", + "INFO:llama_index.token_counter.token_counter:> [build_index_from_nodes] Total embedding token usage: 965 tokens\n" + ] + } + ], + "source": [ + "llama_index = GPTSimpleVectorIndex.from_documents(llama_documents)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "4a4cc090", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:llama_index.token_counter.token_counter:> [query] Total LLM token usage: 1475 tokens\n", + "INFO:llama_index.token_counter.token_counter:> [query] Total embedding token usage: 13 tokens\n" + ] + } + ], + "source": [ + "llama_response = llama_index.query(\n", + " 'Show an image to illustrate how tree index works and explain briefly.', \n", + " query_transform=ImageOutputQueryTransform(width=400),\n", + " similarity_top_k=2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "559624a6", + "metadata": {}, + "source": [ + "By inspecting the 2 source nodes, we see relevant text and image describing the tree index are retrieved for synthesizing the final multimodal response." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "5c5721d6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "**`Final Response:`** This image illustrates how a tree index works. A tree index is a type of data structure that stores data in a hierarchical structure. It is composed of nodes, which can have multiple children and a single parent. Each node contains data, such as a key, value, or other information. The tree index is used to quickly search for data by traversing the tree from the root node to the desired node. During query time, we traverse from root nodes down to leaf nodes. By default, (`child_branch_factor=1`), a query chooses one child node given a parent node. If `child_branch_factor=2`, a query chooses two child nodes per parent. LlamaIndex also offers different methods of synthesizing a response, such as Create and Refine and Tree Summarize. Create and Refine is an iterative way of generating a response, while Tree Summarize builds a tree index over the set of candidate nodes with a summary prompt seeded with the query." + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "--" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**`Source Node 1/2`**" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**Document ID:** 8d50b8e8-4505-4b75-979c-2f068f3afaba<br>**Similarity:** 0.8147614150754062<br>**Text:** file_name: data/llama/tree_index.png\n", + "\n", + "<s_menu><s_nm> Root Node</s_nm><s_unitprice> Parent</s_nm><...<br>**Image:**" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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Iscxuro7f/Hzqx5csqi1ue3VZ732iHnHCOmdC//+m2t/Vy6VDzx4/1KbUxdcRDffctOfr/u9ajj+uJPPOP2V9Vr10IPnnf+6CyeMGds8svWjl7+/vX3T5PGtUNruogFTMHYGUESqDLi3Xfy2JUsWXvfXPyelWBRgqme1L375sx3bOt7ylrcGDZ+74rM99e6759921VU/OPnkFx915ItuufU2YuKYf/+n39zw9z+/7oJXn3jy8d/83jcWPbTomKMOO+KQI3xAILErgXcbEQjsMz3nVa8m0p9ffVVUguTfcPL9H35r/vz73nDBG2ceMOMLX/rvFWsfX7Fq+Rf/57MHzN7/FWeeee+991Vr1aiEexfO/8GPv/fS01/y6tee89s//PpvN18/etSYy97+vmEtowJwy+23jBk9dtSoMSL7+tGafc0CoKB8RpMmTn/Tmy7+yVVXrV672iUxO16+4rEnVq1499s/eMS8Y9/x9n/a2t2+4OG7b7nj5hOPPek1r3zNGS992SknnS4pamnXX2/84yGHHRgnPH7CpOaW5ttuv5kUkoLUKanuaq0Zsx1V5XK57T3v/sDfbrzpnnvvS0oJObdla/u9991x8ZveefyRJ1504ZvHTRp9y903zF9819hRY9960dtOPO6E17zqfPKOGX+78Y/7TRs3asyIcqUyZfp+N936RxWSGpUT97ebf/+nv/z2nW9/f7nUkpcCAcTmAArLhoAKRwGQEjSr+Ze+5Ix7737429/5Sua3OUednd1NzXGl1Favabnc3NTc1r61s7unOnPahBDgBaNHjI8QSdBa1a9Ysb6359aQxTP3nztz/1le8oUrjqw1eR6072rtkIbZM+e+5lUXfPvb35w0tYVdc72WiqbD2obVa6CkNGL42K7OaprR8GFjgKhWxbC2UWXXKp66u2tbNnf+9fpbJLhSMmzOAQdlmVTK7ubbb/rGt7/+nss+dMicI7Ka5EuBycK6wOwMoHgIjUZGAO8ufcvb169btXjxfIabNH6/np7uFWuWNbXRmvUr2rdsmTFl9qQJkxc/tCDVmkZY/OACUl9KymNGTzh47uH/evm/fvRf/vnkE08+cObBHioMVUfKO6l4aXaGIBD1NT337FePHj3yppv+HDs3vHVkU7lpydIFSQs6uzc/tvyxaVNnTp00bcUTj7R3bSy1YslDC+r1rojjceMm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", + "text/plain": [ + "<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=512x431>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "--" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**`Source Node 2/2`**" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**Document ID:** 673418ff-7052-4921-9c9f-9d3fe8f6af49<br>**Similarity:** 0.8138599661902355<br>**Text:** How Each Index Works\n", + "\n", + "This guide describes how each index works with diagrams. We also visually h...<br>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_response(llama_response)" + ] + }, + { + "cell_type": "markdown", + "id": "dbd7376e", + "metadata": {}, + "source": [ + "We show another example asking about vector store index instead." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "92569825", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:llama_index.token_counter.token_counter:> [query] Total LLM token usage: 1404 tokens\n", + "INFO:llama_index.token_counter.token_counter:> [query] Total embedding token usage: 14 tokens\n" + ] + } + ], + "source": [ + "llama_response = llama_index.query(\n", + " 'Show an image to illustrate how vector store index works and explain briefly.', \n", + " query_transform=ImageOutputQueryTransform(width=400),\n", + " similarity_top_k=2\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "7cfdd68d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "**`Final Response:`** <img src=\"data/llama/vector_store_index.png\" width=\"400\" />\n", + "Vector store index is a way of storing data in a vector format. It is used to store data in a way that is easy to access and manipulate. The data is stored in a vector format, which is a collection of numbers that represent the data. This makes it easier to access and manipulate the data, as well as to store it in a more efficient way. Vector store index stores each Node and a corresponding embedding in a Vector Store. During query time, we extract relevant keywords from the query, and match those with pre-extracted Node keywords to fetch the corresponding Nodes. The extracted Nodes are passed to our Response Synthesis module, which can be configured to use different methods of synthesizing a response, such as Create and Refine or Tree Summarize." + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "--" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**`Source Node 1/2`**" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**Document ID:** 2c05e859-9d49-4a87-8cb7-4c755aa72dd4<br>**Similarity:** 0.816241967681269<br>**Text:** file_name: data/llama/vector_store_index.png\n", + "\n", + "<s_menu><s_nm> Nodel</s_nm><s_unitprice> Node2</s_u...<br>**Image:**" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=512x313>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "--" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**`Source Node 2/2`**" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**Document ID:** 673418ff-7052-4921-9c9f-9d3fe8f6af49<br>**Similarity:** 0.7878806797032482<br>**Text:** How Each Index Works\n", + "\n", + "This guide describes how each index works with diagrams. We also visually h...<br>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_response(llama_response)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f459baab", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "llama_index", + "language": "python", + "name": "llama_index" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/optimizer/OptimizerDemo.ipynb b/examples/optimizer/OptimizerDemo.ipynb index 7ff686f826..84e6be9edf 100644 --- a/examples/optimizer/OptimizerDemo.ipynb +++ b/examples/optimizer/OptimizerDemo.ipynb @@ -1,198 +1,204 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "839c4a87", - "metadata": {}, - "outputs": [], - "source": [ - "# My OpenAI Key\n", - "import os\n", - "os.environ['OPENAI_API_KEY'] = \"INSERT OPENAI KEY\"" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "40cf0773", - "metadata": {}, - "source": [ - "### Setup" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "fa34cd83", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import download_loader\n", - "\n", - "WikipediaReader = download_loader(\"WikipediaReader\")\n", - "\n", - "loader = WikipediaReader()\n", - "documents = loader.load_data(pages=['Berlin'])" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "f59e6c18", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "<class 'llama_index.readers.schema.base.Document'>\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", - "INFO:root:> [build_index_from_documents] Total embedding token usage: 18390 tokens\n" - ] - } - ], - "source": [ - "from llama_index import GPTSimpleVectorIndex\n", - "index = GPTSimpleVectorIndex.from_documents(documents)\n", - "# save index to file\n", - "index.save_to_disk(\"simple_vector_index.json\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "827ada33", - "metadata": {}, - "source": [ - "Compare query with and without optimization for LLM token usage, Embedding Model usage on query, Embedding model usage for optimizer, and total time." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "a04e4535", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Without optimization\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:> [query] Total LLM token usage: 3545 tokens\n", - "INFO:root:> [query] Total embedding token usage: 7 tokens\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Total time elapsed: 2.8928110599517822\n", - "Answer: \n", - "The population of Berlin in 1949 was approximately 2.2 million inhabitants. After the fall of the Berlin Wall in 1989, the population of Berlin increased to approximately 3.7 million inhabitants.\n", - "\n", - "With optimization\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:> [optimize] Total embedding token usage: 7 tokens\n", - "INFO:root:> [query] Total LLM token usage: 1779 tokens\n", - "INFO:root:> [query] Total embedding token usage: 7 tokens\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Total time elapsed: 2.346346139907837\n", - "Answer: \n", - "The population of Berlin is around 4.5 million.\n", - "Alternate optimization cutoff\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:> [optimize] Total embedding token usage: 7 tokens\n", - "INFO:root:> [query] Total LLM token usage: 3215 tokens\n", - "INFO:root:> [query] Total embedding token usage: 7 tokens\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Total time elapsed: 2.101111888885498\n", - "Answer: \n", - "The population of Berlin is around 4.5 million.\n" - ] - } - ], - "source": [ - "import time\n", - "from gpt_index import GPTSimpleVectorIndex\n", - "from gpt_index.optimization.optimizer import SentenceEmbeddingOptimizer\n", - "# load from disk\n", - "index = GPTSimpleVectorIndex.load_from_disk('simple_vector_index.json')\n", - "\n", - "print(\"Without optimization\")\n", - "start_time = time.time()\n", - "res = index.query(\"What is the population of Berlin?\")\n", - "end_time = time.time()\n", - "print(\"Total time elapsed: {}\".format(end_time - start_time))\n", - "print(\"Answer: {}\".format(res))\n", - "\n", - "print(\"With optimization\")\n", - "start_time = time.time()\n", - "res = index.query(\"What is the population of Berlin?\", optimizer=SentenceEmbeddingOptimizer(percentile_cutoff=0.5))\n", - "end_time = time.time()\n", - "print(\"Total time elapsed: {}\".format(end_time - start_time))\n", - "print(\"Answer: {}\".format(res))\n", - "\n", - "print(\"Alternate optimization cutoff\")\n", - "start_time = time.time()\n", - "res = index.query(\"What is the population of Berlin?\", optimizer=SentenceEmbeddingOptimizer(threshold_cutoff=0.7))\n", - "end_time = time.time()\n", - "print(\"Total time elapsed: {}\".format(end_time - start_time))\n", - "print(\"Answer: {}\".format(res))" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.0" - } + "cells": [ + { + "cell_type": "markdown", + "id": "df32a9f0", + "metadata": {}, + "source": [ + "# Optimizer Demo" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "839c4a87", + "metadata": {}, + "outputs": [], + "source": [ + "# My OpenAI Key\n", + "import os\n", + "os.environ['OPENAI_API_KEY'] = \"INSERT OPENAI KEY\"" + ] + }, + { + "cell_type": "markdown", + "id": "40cf0773", + "metadata": {}, + "source": [ + "### Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "fa34cd83", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import download_loader\n", + "\n", + "WikipediaReader = download_loader(\"WikipediaReader\")\n", + "\n", + "loader = WikipediaReader()\n", + "documents = loader.load_data(pages=['Berlin'])" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "f59e6c18", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<class 'llama_index.readers.schema.base.Document'>\n" + ] }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", + "INFO:root:> [build_index_from_documents] Total embedding token usage: 18390 tokens\n" + ] + } + ], + "source": [ + "from llama_index import GPTSimpleVectorIndex\n", + "index = GPTSimpleVectorIndex.from_documents(documents)\n", + "# save index to file\n", + "index.save_to_disk(\"simple_vector_index.json\")" + ] + }, + { + "cell_type": "markdown", + "id": "827ada33", + "metadata": {}, + "source": [ + "Compare query with and without optimization for LLM token usage, Embedding Model usage on query, Embedding model usage for optimizer, and total time." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "a04e4535", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Without optimization\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:> [query] Total LLM token usage: 3545 tokens\n", + "INFO:root:> [query] Total embedding token usage: 7 tokens\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total time elapsed: 2.8928110599517822\n", + "Answer: \n", + "The population of Berlin in 1949 was approximately 2.2 million inhabitants. After the fall of the Berlin Wall in 1989, the population of Berlin increased to approximately 3.7 million inhabitants.\n", + "\n", + "With optimization\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:> [optimize] Total embedding token usage: 7 tokens\n", + "INFO:root:> [query] Total LLM token usage: 1779 tokens\n", + "INFO:root:> [query] Total embedding token usage: 7 tokens\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total time elapsed: 2.346346139907837\n", + "Answer: \n", + "The population of Berlin is around 4.5 million.\n", + "Alternate optimization cutoff\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:> [optimize] Total embedding token usage: 7 tokens\n", + "INFO:root:> [query] Total LLM token usage: 3215 tokens\n", + "INFO:root:> [query] Total embedding token usage: 7 tokens\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total time elapsed: 2.101111888885498\n", + "Answer: \n", + "The population of Berlin is around 4.5 million.\n" + ] + } + ], + "source": [ + "import time\n", + "from gpt_index import GPTSimpleVectorIndex\n", + "from gpt_index.optimization.optimizer import SentenceEmbeddingOptimizer\n", + "# load from disk\n", + "index = GPTSimpleVectorIndex.load_from_disk('simple_vector_index.json')\n", + "\n", + "print(\"Without optimization\")\n", + "start_time = time.time()\n", + "res = index.query(\"What is the population of Berlin?\")\n", + "end_time = time.time()\n", + "print(\"Total time elapsed: {}\".format(end_time - start_time))\n", + "print(\"Answer: {}\".format(res))\n", + "\n", + "print(\"With optimization\")\n", + "start_time = time.time()\n", + "res = index.query(\"What is the population of Berlin?\", optimizer=SentenceEmbeddingOptimizer(percentile_cutoff=0.5))\n", + "end_time = time.time()\n", + "print(\"Total time elapsed: {}\".format(end_time - start_time))\n", + "print(\"Answer: {}\".format(res))\n", + "\n", + "print(\"Alternate optimization cutoff\")\n", + "start_time = time.time()\n", + "res = index.query(\"What is the population of Berlin?\", optimizer=SentenceEmbeddingOptimizer(threshold_cutoff=0.7))\n", + "end_time = time.time()\n", + "print(\"Total time elapsed: {}\".format(end_time - start_time))\n", + "print(\"Answer: {}\".format(res))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/paul_graham_essay/DavinciComparison.ipynb b/examples/paul_graham_essay/DavinciComparison.ipynb index 978ad7d6a6..40670a9fb4 100644 --- a/examples/paul_graham_essay/DavinciComparison.ipynb +++ b/examples/paul_graham_essay/DavinciComparison.ipynb @@ -1,17 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "df7cb4c1-a1b8-4e80-ad88-8878008bde89", - "metadata": {}, - "outputs": [], - "source": [ - "# My OpenAI Key\n", - "import os\n", - "os.environ['OPENAI_API_KEY'] = \"INSERT OPENAI KEY\"" - ] - }, { "cell_type": "markdown", "id": "7096589b-daaf-440a-b89d-b4956f2db4b2", @@ -24,6 +12,18 @@ "Does text-davinci-003 do better?" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "df7cb4c1-a1b8-4e80-ad88-8878008bde89", + "metadata": {}, + "outputs": [], + "source": [ + "# My OpenAI Key\n", + "import os\n", + "os.environ['OPENAI_API_KEY'] = \"INSERT OPENAI KEY\"" + ] + }, { "cell_type": "markdown", "id": "d8cfbe6f-4c50-4c4f-90f9-03bb91201ef5", @@ -209,7 +209,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.0" } }, "nbformat": 4, diff --git a/examples/paul_graham_essay/GPT4Comparison.ipynb b/examples/paul_graham_essay/GPT4Comparison.ipynb index e555cc38b5..ce45dbb13b 100644 --- a/examples/paul_graham_essay/GPT4Comparison.ipynb +++ b/examples/paul_graham_essay/GPT4Comparison.ipynb @@ -1,646 +1,654 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": 62, - "id": "4921c412", - "metadata": {}, - "outputs": [], - "source": [ - "from gpt_index import GPTListIndex, SimpleDirectoryReader, LLMPredictor, PromptHelper, ServiceContext\n", - "from gpt_index.response.notebook_utils import display_response\n", - "from langchain import OpenAI\n", - "from langchain.chat_models import ChatOpenAI\n", - "from IPython.display import Markdown, display" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "261d923e", - "metadata": {}, - "outputs": [], - "source": [ - "documents = SimpleDirectoryReader('data').load_data()" - ] - }, - { - "cell_type": "markdown", - "id": "f23b5169", - "metadata": {}, - "source": [ - "# davinci-003" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "0c635cdb", - "metadata": {}, - "outputs": [], - "source": [ - "llm_predictor = LLMPredictor(llm=OpenAI(temperature=0, model_name=\"text-davinci-003\"))\n", - "service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "b8ad1a2a", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:gpt_index.token_counter.token_counter:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", - "INFO:gpt_index.token_counter.token_counter:> [build_index_from_documents] Total embedding token usage: 0 tokens\n" - ] - } - ], - "source": [ - "davinci_index = GPTListIndex.from_documents(documents, service_context=service_context)" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "c9925597", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Document is split into 6 nodes.'" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f'Document is split into {len(davinci_index._index_struct.nodes)} nodes.'" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "id": "fa1d7242", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:gpt_index.indices.common.tree.base:> Building index from nodes: 5 chunks\n", - "INFO:gpt_index.token_counter.token_counter:> [query] Total LLM token usage: 19882 tokens\n", - "INFO:gpt_index.token_counter.token_counter:> [query] Total embedding token usage: 0 tokens\n" - ] - } - ], - "source": [ - "response = davinci_index.query(\n", - " \"What happened on one night in October 2003?\", \n", - " response_mode=\"tree_summarize\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "id": "d758bdb7", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/markdown": [ - "**`Final Response:`** It is not possible to answer this question with the given context information." - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "---" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**`Source Node 1/6`**" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**Document ID:** 2ea119c7-fc3d-4090-a47a-8dd2a0d37416<br>**Similarity:** None<br>**Text:** What I Worked On\n", - "\n", - "February 2021\n", - "\n", - "Before college the two main things I worked on, outside of schoo...<br>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "---" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**`Source Node 2/6`**" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**Document ID:** 2ea119c7-fc3d-4090-a47a-8dd2a0d37416<br>**Similarity:** None<br>**Text:** whereby the students wouldn't require the faculty to teach anything, and in return the faculty wo...<br>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "---" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**`Source Node 3/6`**" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**Document ID:** 2ea119c7-fc3d-4090-a47a-8dd2a0d37416<br>**Similarity:** None<br>**Text:** fact that our software worked via the web, and we got $10,000 in seed funding from Idelle's husba...<br>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "---" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**`Source Node 4/6`**" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**Document ID:** 2ea119c7-fc3d-4090-a47a-8dd2a0d37416<br>**Similarity:** None<br>**Text:** project was the new Lisp, whose parentheses I now wouldn't even have to hide. A lot of Lisp hacke...<br>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "---" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**`Source Node 5/6`**" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**Document ID:** 2ea119c7-fc3d-4090-a47a-8dd2a0d37416<br>**Similarity:** None<br>**Text:** chance it had to do with HN, and a 40% chance it had do with everything else combined. [17]\n", - "\n", - "As w...<br>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "---" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**`Source Node 6/6`**" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**Document ID:** 2ea119c7-fc3d-4090-a47a-8dd2a0d37416<br>**Similarity:** None<br>**Text:** and some people dislike being told such things.\n", - "\n", - "[11] People put plenty of stuff on the internet ...<br>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display_response(response)" - ] - }, - { - "cell_type": "markdown", - "id": "3f843a73", - "metadata": {}, - "source": [ - "# gpt-4" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "id": "0849d860", - "metadata": {}, - "outputs": [], - "source": [ - "llm_predictor = LLMPredictor(llm=ChatOpenAI(temperature=0, model_name=\"gpt-4\"))\n", - "service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "id": "bb9eff4a", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:gpt_index.token_counter.token_counter:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", - "INFO:gpt_index.token_counter.token_counter:> [build_index_from_documents] Total embedding token usage: 0 tokens\n" - ] - } - ], - "source": [ - "gpt4_index = GPTListIndex.from_documents(documents, service_context=service_context)" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "id": "cb56a205", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Document is split into 3 nodes.'" - ] - }, - "execution_count": 65, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f'Document is split into {len(gpt4_index._index_struct.nodes)} nodes.'" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "id": "44dda700", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:gpt_index.indices.common.tree.base:> Building index from nodes: 2 chunks\n", - "INFO:gpt_index.token_counter.token_counter:> [query] Total LLM token usage: 18006 tokens\n", - "INFO:gpt_index.token_counter.token_counter:> [query] Total embedding token usage: 0 tokens\n" - ] - } - ], - "source": [ - "response = gpt4_index.query(\n", - " \"What happened on one night in October 2003?\", \n", - " response_mode=\"tree_summarize\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "id": "42bd0984", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/markdown": [ - "**`Final Response:`** On one night in October 2003, there was a big party at Paul Graham's house, organized by his friend Maria Daniels. At this party, Paul met Jessica Livingston, who would later become his partner in starting Y Combinator. Additionally, Paul Graham had a conversation with his friend Robert Morris about starting a new kind of venture firm that would fund startups in batches, which eventually led to the creation of Y Combinator." - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "---" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**`Source Node 1/3`**" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**Document ID:** 2ea119c7-fc3d-4090-a47a-8dd2a0d37416<br>**Similarity:** 0.740238551627948<br>**Text:** What I Worked On\n", - "\n", - "February 2021\n", - "\n", - "Before college the two main things I worked on, outside of schoo...<br>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "---" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**`Source Node 2/3`**" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**Document ID:** 2ea119c7-fc3d-4090-a47a-8dd2a0d37416<br>**Similarity:** None<br>**Text:** really good. He recommended Trevor Blackwell, which surprised me at first, because at that point ...<br>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "---" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**`Source Node 3/3`**" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "**Document ID:** 2ea119c7-fc3d-4090-a47a-8dd2a0d37416<br>**Similarity:** None<br>**Text:** make nuclear reactors. But I kept at it, and in October 2013 he finally agreed. We decided he'd t...<br>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display_response(response)" - ] - }, - { - "cell_type": "markdown", - "id": "fd981e5e", - "metadata": {}, - "source": [ - "# gpt-4-32k" - ] - }, - { - "cell_type": "markdown", - "id": "9d9f20a9", - "metadata": {}, - "source": [ - "NOTE: not available yet" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "71137f57", - "metadata": {}, - "outputs": [], - "source": [ - "llm_predictor = LLMPredictor(llm=ChatOpenAI(temperature=0, model_name=\"gpt-4-32k\"))\n", - "service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bb619782", - "metadata": {}, - "outputs": [], - "source": [ - "gpt4_32k_index = GPTSimpleVectorIndex.from_documents(documents, service_context=service_context)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7d417f6a", - "metadata": {}, - "outputs": [], - "source": [ - "len(gpt4_32k_index._index_struct.nodes_dict)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.9" - } + "cells": [ + { + "cell_type": "markdown", + "id": "65850ded", + "metadata": {}, + "source": [ + "# GPT-4 Comparison" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "4921c412", + "metadata": {}, + "outputs": [], + "source": [ + "from gpt_index import GPTListIndex, SimpleDirectoryReader, LLMPredictor, PromptHelper, ServiceContext\n", + "from gpt_index.response.notebook_utils import display_response\n", + "from langchain import OpenAI\n", + "from langchain.chat_models import ChatOpenAI\n", + "from IPython.display import Markdown, display" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "261d923e", + "metadata": {}, + "outputs": [], + "source": [ + "documents = SimpleDirectoryReader('data').load_data()" + ] + }, + { + "cell_type": "markdown", + "id": "f23b5169", + "metadata": {}, + "source": [ + "## davinci-003" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "0c635cdb", + "metadata": {}, + "outputs": [], + "source": [ + "llm_predictor = LLMPredictor(llm=OpenAI(temperature=0, model_name=\"text-davinci-003\"))\n", + "service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "b8ad1a2a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:gpt_index.token_counter.token_counter:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", + "INFO:gpt_index.token_counter.token_counter:> [build_index_from_documents] Total embedding token usage: 0 tokens\n" + ] + } + ], + "source": [ + "davinci_index = GPTListIndex.from_documents(documents, service_context=service_context)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "c9925597", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Document is split into 6 nodes.'" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f'Document is split into {len(davinci_index._index_struct.nodes)} nodes.'" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "id": "fa1d7242", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:gpt_index.indices.common.tree.base:> Building index from nodes: 5 chunks\n", + "INFO:gpt_index.token_counter.token_counter:> [query] Total LLM token usage: 19882 tokens\n", + "INFO:gpt_index.token_counter.token_counter:> [query] Total embedding token usage: 0 tokens\n" + ] + } + ], + "source": [ + "response = davinci_index.query(\n", + " \"What happened on one night in October 2003?\", \n", + " response_mode=\"tree_summarize\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "d758bdb7", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/markdown": [ + "**`Final Response:`** It is not possible to answer this question with the given context information." + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" }, - "nbformat": 4, - "nbformat_minor": 5 + { + "data": { + "text/markdown": [ + "--" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**`Source Node 1/6`**" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**Document ID:** 2ea119c7-fc3d-4090-a47a-8dd2a0d37416<br>**Similarity:** None<br>**Text:** What I Worked On\n", + "\n", + "February 2021\n", + "\n", + "Before college the two main things I worked on, outside of schoo...<br>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "--" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**`Source Node 2/6`**" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**Document ID:** 2ea119c7-fc3d-4090-a47a-8dd2a0d37416<br>**Similarity:** None<br>**Text:** whereby the students wouldn't require the faculty to teach anything, and in return the faculty wo...<br>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "--" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**`Source Node 3/6`**" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**Document ID:** 2ea119c7-fc3d-4090-a47a-8dd2a0d37416<br>**Similarity:** None<br>**Text:** fact that our software worked via the web, and we got $10,000 in seed funding from Idelle's husba...<br>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "--" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**`Source Node 4/6`**" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**Document ID:** 2ea119c7-fc3d-4090-a47a-8dd2a0d37416<br>**Similarity:** None<br>**Text:** project was the new Lisp, whose parentheses I now wouldn't even have to hide. A lot of Lisp hacke...<br>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "--" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**`Source Node 5/6`**" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**Document ID:** 2ea119c7-fc3d-4090-a47a-8dd2a0d37416<br>**Similarity:** None<br>**Text:** chance it had to do with HN, and a 40% chance it had do with everything else combined. [17]\n", + "\n", + "As w...<br>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "--" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**`Source Node 6/6`**" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**Document ID:** 2ea119c7-fc3d-4090-a47a-8dd2a0d37416<br>**Similarity:** None<br>**Text:** and some people dislike being told such things.\n", + "\n", + "[11] People put plenty of stuff on the internet ...<br>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_response(response)" + ] + }, + { + "cell_type": "markdown", + "id": "3f843a73", + "metadata": {}, + "source": [ + "## gpt-4" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "0849d860", + "metadata": {}, + "outputs": [], + "source": [ + "llm_predictor = LLMPredictor(llm=ChatOpenAI(temperature=0, model_name=\"gpt-4\"))\n", + "service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "bb9eff4a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:gpt_index.token_counter.token_counter:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", + "INFO:gpt_index.token_counter.token_counter:> [build_index_from_documents] Total embedding token usage: 0 tokens\n" + ] + } + ], + "source": [ + "gpt4_index = GPTListIndex.from_documents(documents, service_context=service_context)" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "cb56a205", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Document is split into 3 nodes.'" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f'Document is split into {len(gpt4_index._index_struct.nodes)} nodes.'" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "44dda700", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:gpt_index.indices.common.tree.base:> Building index from nodes: 2 chunks\n", + "INFO:gpt_index.token_counter.token_counter:> [query] Total LLM token usage: 18006 tokens\n", + "INFO:gpt_index.token_counter.token_counter:> [query] Total embedding token usage: 0 tokens\n" + ] + } + ], + "source": [ + "response = gpt4_index.query(\n", + " \"What happened on one night in October 2003?\", \n", + " response_mode=\"tree_summarize\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "42bd0984", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/markdown": [ + "**`Final Response:`** On one night in October 2003, there was a big party at Paul Graham's house, organized by his friend Maria Daniels. At this party, Paul met Jessica Livingston, who would later become his partner in starting Y Combinator. Additionally, Paul Graham had a conversation with his friend Robert Morris about starting a new kind of venture firm that would fund startups in batches, which eventually led to the creation of Y Combinator." + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "--" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**`Source Node 1/3`**" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**Document ID:** 2ea119c7-fc3d-4090-a47a-8dd2a0d37416<br>**Similarity:** 0.740238551627948<br>**Text:** What I Worked On\n", + "\n", + "February 2021\n", + "\n", + "Before college the two main things I worked on, outside of schoo...<br>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "--" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**`Source Node 2/3`**" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**Document ID:** 2ea119c7-fc3d-4090-a47a-8dd2a0d37416<br>**Similarity:** None<br>**Text:** really good. He recommended Trevor Blackwell, which surprised me at first, because at that point ...<br>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "--" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**`Source Node 3/3`**" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "**Document ID:** 2ea119c7-fc3d-4090-a47a-8dd2a0d37416<br>**Similarity:** None<br>**Text:** make nuclear reactors. But I kept at it, and in October 2013 he finally agreed. We decided he'd t...<br>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_response(response)" + ] + }, + { + "cell_type": "markdown", + "id": "fd981e5e", + "metadata": {}, + "source": [ + "## gpt-4-32k" + ] + }, + { + "cell_type": "markdown", + "id": "9d9f20a9", + "metadata": {}, + "source": [ + "NOTE: not available yet" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "71137f57", + "metadata": {}, + "outputs": [], + "source": [ + "llm_predictor = LLMPredictor(llm=ChatOpenAI(temperature=0, model_name=\"gpt-4-32k\"))\n", + "service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bb619782", + "metadata": {}, + "outputs": [], + "source": [ + "gpt4_32k_index = GPTSimpleVectorIndex.from_documents(documents, service_context=service_context)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7d417f6a", + "metadata": {}, + "outputs": [], + "source": [ + "len(gpt4_32k_index._index_struct.nodes_dict)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/examples/paul_graham_essay/InsertDemo.ipynb b/examples/paul_graham_essay/InsertDemo.ipynb index 3e6e23cd6c..afdd4334f4 100644 --- a/examples/paul_graham_essay/InsertDemo.ipynb +++ b/examples/paul_graham_essay/InsertDemo.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "48d79af8", + "metadata": {}, + "source": [ + "# Insert Demo" + ] + }, { "cell_type": "markdown", "id": "46e5110c-ed35-463e-a9f6-cff9cda6221b", @@ -321,7 +329,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.0" } }, "nbformat": 4, diff --git a/examples/paul_graham_essay/KeywordTableComparison.ipynb b/examples/paul_graham_essay/KeywordTableComparison.ipynb index 23c964f600..d2923c566c 100644 --- a/examples/paul_graham_essay/KeywordTableComparison.ipynb +++ b/examples/paul_graham_essay/KeywordTableComparison.ipynb @@ -1,428 +1,428 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "a6457769-dfaf-4241-ab32-dcf901dde902", - "metadata": { - "tags": [] - }, - "source": [ - "## GPT Keyword Table Index Comparisons\n", - "\n", - "Comparing GPTSimpleKeywordTableIndex, GPTRAKEKeywordTableIndex, GPTKeywordTableIndex.\n", - "\n", - "- GPTSimpleKeywordTableIndex - uses simple regex to extract keywords.\n", - "- GPTRAKEKeywordTableIndex - uses RAKE to extract keywords.\n", - "- GPTKeywordTableIndex - uses GPT to extract keywords." - ] - }, - { - "cell_type": "markdown", - "id": "075080e5-c255-4a5c-9330-9da11532e1c8", - "metadata": { - "tags": [] - }, - "source": [ - "#### GPTSimpleKeywordTableIndex" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "b367b7ef-6a7d-4aee-b174-dba6ec4d2e21", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[nltk_data] Downloading package stopwords to /home/jerry/nltk_data...\n", - "[nltk_data] Package stopwords is already up-to-date!\n" - ] - } - ], - "source": [ - "from llama_index import GPTSimpleKeywordTableIndex, SimpleDirectoryReader\n", - "from IPython.display import Markdown, display" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1f8248fa-e0bd-494a-ad68-8192ccc87696", - "metadata": {}, - "outputs": [], - "source": [ - "# build keyword index\n", - "documents = SimpleDirectoryReader('data').load_data()\n", - "index = GPTSimpleKeywordTableIndex(documents)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "53833655-0296-4bcb-b501-259b043d68b3", - "metadata": {}, - "outputs": [], - "source": [ - "response = index.query(\"What did the author do after his time at YC?\")" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "62bcca18-b644-4393-ad29-6c5f0424fb22", - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "<b>\n", - "\n", - "The author went on to write essays and work on other projects, including a new version of the Arc programming language and Hacker News. He also started painting, but stopped after a few months. In 2015, he started working on a new Lisp programming language, which he finished in 2019. The author then moved to England in 2016 with his family and continued writing essays. In 2019, he finished Bel and wrote a bunch of essays on various topics.\n", - "\n", - "The author also worked on building online stores in 1995 after finishing ANSI Common Lisp. He ran the software on servers and let users control it by clicking on links, which was a new concept at the time. In 1996, he co-founded Viaweb with Robert Morris, which was later acquired by Yahoo in 1998. After leaving Yahoo, the author moved back to New York and started painting again. In 2000, he had the idea for a web application that would let people edit code on a server and host the resulting applications, which later became known as \"Reddit\".</b>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "markdown", - "id": "d24f9a20-48a6-4131-91b9-b01448c6ecb5", - "metadata": {}, - "source": [ - "#### GPTRAKEKeywordTableIndex" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "c4d3f293-e608-4b90-86aa-9bce666dbcd5", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[nltk_data] Downloading package stopwords to /home/jerry/nltk_data...\n", - "[nltk_data] Package stopwords is already up-to-date!\n" - ] - } - ], - "source": [ - "from llama_index import GPTRAKEKeywordTableIndex, SimpleDirectoryReader\n", - "from IPython.display import Markdown, display" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "66b1da3b-8231-4da9-8026-4f95481c79df", - "metadata": { - "scrolled": true, - "tags": [] - }, - "outputs": [], - "source": [ - "# build keyword index\n", - "documents = SimpleDirectoryReader('data').load_data()\n", - "index = GPTRAKEKeywordTableIndex(documents)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "f13e5543-c6cb-4651-986c-ecde0f4bf789", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Starting query: What did the author do after his time at YC?\n", - "Extracted keywords: []\n" - ] - } - ], - "source": [ - "response = index.query(\"What did the author do after his time at YC?\")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "5ae01ac3-55fa-43a3-9b24-f733072d5f8d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "<b>Empty response</b>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "markdown", - "id": "59cee6cf-92df-40d8-8dad-a40b792de96f", - "metadata": {}, - "source": [ - "#### GPTKeywordTableIndex" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "78d59ef6-70b0-47bb-818d-7237a3b7de75", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import GPTKeywordTableIndex, SimpleDirectoryReader\n", - "from IPython.display import Markdown, display" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5a3f1c67-6d73-4f37-afcf-9e637002fcff", - "metadata": {}, - "outputs": [], - "source": [ - "# build keyword index\n", - "documents = SimpleDirectoryReader('data').load_data()\n", - "index = GPTKeywordTableIndex.from_documents(documents)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "69d4f686-6825-49cf-a113-d2fdd484de77", - "metadata": {}, - "outputs": [], - "source": [ - "response = index.query(\"What did the author do after his time at Y Combinator?\")" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "a483514d-4ab5-489d-8b99-7250df491ce3", - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "<b>\n", - "\n", - "After a few years, the author decided to step away from Y Combinator to focus on other projects, such as painting and writing essays. In 2013, he handed over control of Y Combinator to Sam Altman. The author's mother passed away in 2014, and after taking some time to grieve, he returned to writing essays and working on Lisp. He continued working on Lisp until 2019, when he finally completed the project.\n", - "\n", - "In 2015, the author decided to move to England with his family. They originally intended to only stay for a year, but ended up liking it so much that they remained there. The author wrote Bel while living in England. In 2019, he finally finished the project. After completing Bel, the author wrote a number of essays on various topics. He continued writing essays through 2020, but also started thinking about other things he could work on.</b>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "markdown", - "id": "112e21ee-587c-4d8b-871e-cb99b94e3778", - "metadata": {}, - "source": [ - "## GPT Keyword Table Query Comparisons\n", - "Compare mode={\"default\", \"simple\", \"rake\"}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3029961a-ec22-42a1-90d6-f5892eb81e34", - "metadata": {}, - "outputs": [], - "source": [ - "# build table with default GPTKeywordTableIndex\n", - "from llama_index import GPTKeywordTableIndex, SimpleDirectoryReader\n", - "from IPython.display import Markdown, display\n", - "\n", - "documents = SimpleDirectoryReader('data').load_data()\n", - "index = GPTKeywordTableIndex.from_documents(documents)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "d75b31da-4788-4295-8642-07ac5c4f11a5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Starting query: What did the author do after his time at Y Combinator?\n", - "Extracted keywords: ['y combinator', 'combinator']\n", - "> Querying with idx: 235042210695008001: of excluding them, because there were so many s...\n", - "> Querying with idx: 7029274505691774319: it was like living in another country, and sinc...\n", - "> Querying with idx: 1773317813360405038: browser, and then host the resulting applicatio...\n", - "> Querying with idx: 3866067077574405334: person, and from those we picked 8 to fund. The...\n" - ] - }, - { - "data": { - "text/markdown": [ - "<b>\n", - "\n", - "The author went on to write a book about his experiences at Y Combinator, and then moved to England. He started writing essays again and also began working on a new Lisp programming language. He also wrote an essay about how he chooses what to work on.</b>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# default\n", - "response = index.query(\"What did the author do after his time at Y Combinator?\", mode=\"default\")\n", - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "07b713f4-adfc-46f7-a795-5b333e33d49d", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Starting query: What did the author do after his time at Y Combinator?\n", - "Extracted keywords: ['combinator']\n", - "> Querying with idx: 235042210695008001: of excluding them, because there were so many s...\n", - "> Querying with idx: 7029274505691774319: it was like living in another country, and sinc...\n", - "> Querying with idx: 1773317813360405038: browser, and then host the resulting applicatio...\n", - "> Querying with idx: 3866067077574405334: person, and from those we picked 8 to fund. The...\n" - ] - }, - { - "data": { - "text/markdown": [ - "<b>\n", - "\n", - "The author went on to write a book about his experiences at Y Combinator, and then moved to England. He started writing essays again and also began working on a new Lisp programming language. He also wrote an essay about how he chooses what to work on.</b>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# simple\n", - "response = index.query(\"What did the author do after his time at Y Combinator?\", mode=\"simple\")\n", - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "d2e19ad9-3190-45e5-a28d-235c28296d70", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Starting query: What did the author do after his time at Y Combinator?\n", - "Extracted keywords: ['combinator']\n", - "> Querying with idx: 235042210695008001: of excluding them, because there were so many s...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[nltk_data] Downloading package punkt to /home/jerry/nltk_data...\n", - "[nltk_data] Package punkt is already up-to-date!\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Querying with idx: 7029274505691774319: it was like living in another country, and sinc...\n", - "> Querying with idx: 1773317813360405038: browser, and then host the resulting applicatio...\n", - "> Querying with idx: 3866067077574405334: person, and from those we picked 8 to fund. The...\n" - ] - }, - { - "data": { - "text/markdown": [ - "<b>\n", - "\n", - "The author went on to write a book about his experiences at Y Combinator, and then moved to England. He started writing essays again and also began working on a new Lisp programming language. He also wrote an essay about how he chooses what to work on.</b>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# rake\n", - "response = index.query(\"What did the author do after his time at Y Combinator?\", mode=\"rake\")\n", - "display(Markdown(f\"<b>{response}</b>\"))" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "myvenv", - "language": "python", - "name": "myvenv" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.0" - } + "cells": [ + { + "cell_type": "markdown", + "id": "a6457769-dfaf-4241-ab32-dcf901dde902", + "metadata": { + "tags": [] + }, + "source": [ + "# GPT Keyword Table Index Comparisons\n", + "\n", + "Comparing GPTSimpleKeywordTableIndex, GPTRAKEKeywordTableIndex, GPTKeywordTableIndex.\n", + "\n", + "- GPTSimpleKeywordTableIndex - uses simple regex to extract keywords.\n", + "- GPTRAKEKeywordTableIndex - uses RAKE to extract keywords.\n", + "- GPTKeywordTableIndex - uses GPT to extract keywords." + ] + }, + { + "cell_type": "markdown", + "id": "075080e5-c255-4a5c-9330-9da11532e1c8", + "metadata": { + "tags": [] + }, + "source": [ + "#### GPTSimpleKeywordTableIndex" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "b367b7ef-6a7d-4aee-b174-dba6ec4d2e21", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package stopwords to /home/jerry/nltk_data...\n", + "[nltk_data] Package stopwords is already up-to-date!\n" + ] + } + ], + "source": [ + "from llama_index import GPTSimpleKeywordTableIndex, SimpleDirectoryReader\n", + "from IPython.display import Markdown, display" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1f8248fa-e0bd-494a-ad68-8192ccc87696", + "metadata": {}, + "outputs": [], + "source": [ + "# build keyword index\n", + "documents = SimpleDirectoryReader('data').load_data()\n", + "index = GPTSimpleKeywordTableIndex(documents)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "53833655-0296-4bcb-b501-259b043d68b3", + "metadata": {}, + "outputs": [], + "source": [ + "response = index.query(\"What did the author do after his time at YC?\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "62bcca18-b644-4393-ad29-6c5f0424fb22", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "<b>\n", + "\n", + "The author went on to write essays and work on other projects, including a new version of the Arc programming language and Hacker News. He also started painting, but stopped after a few months. In 2015, he started working on a new Lisp programming language, which he finished in 2019. The author then moved to England in 2016 with his family and continued writing essays. In 2019, he finished Bel and wrote a bunch of essays on various topics.\n", + "\n", + "The author also worked on building online stores in 1995 after finishing ANSI Common Lisp. He ran the software on servers and let users control it by clicking on links, which was a new concept at the time. In 1996, he co-founded Viaweb with Robert Morris, which was later acquired by Yahoo in 1998. After leaving Yahoo, the author moved back to New York and started painting again. In 2000, he had the idea for a web application that would let people edit code on a server and host the resulting applications, which later became known as \"Reddit\".</b>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "markdown", + "id": "d24f9a20-48a6-4131-91b9-b01448c6ecb5", + "metadata": {}, + "source": [ + "#### GPTRAKEKeywordTableIndex" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "c4d3f293-e608-4b90-86aa-9bce666dbcd5", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package stopwords to /home/jerry/nltk_data...\n", + "[nltk_data] Package stopwords is already up-to-date!\n" + ] + } + ], + "source": [ + "from llama_index import GPTRAKEKeywordTableIndex, SimpleDirectoryReader\n", + "from IPython.display import Markdown, display" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "66b1da3b-8231-4da9-8026-4f95481c79df", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "# build keyword index\n", + "documents = SimpleDirectoryReader('data').load_data()\n", + "index = GPTRAKEKeywordTableIndex(documents)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "f13e5543-c6cb-4651-986c-ecde0f4bf789", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Starting query: What did the author do after his time at YC?\n", + "Extracted keywords: []\n" + ] + } + ], + "source": [ + "response = index.query(\"What did the author do after his time at YC?\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "5ae01ac3-55fa-43a3-9b24-f733072d5f8d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "<b>Empty response</b>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "markdown", + "id": "59cee6cf-92df-40d8-8dad-a40b792de96f", + "metadata": {}, + "source": [ + "#### GPTKeywordTableIndex" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "78d59ef6-70b0-47bb-818d-7237a3b7de75", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import GPTKeywordTableIndex, SimpleDirectoryReader\n", + "from IPython.display import Markdown, display" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5a3f1c67-6d73-4f37-afcf-9e637002fcff", + "metadata": {}, + "outputs": [], + "source": [ + "# build keyword index\n", + "documents = SimpleDirectoryReader('data').load_data()\n", + "index = GPTKeywordTableIndex.from_documents(documents)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69d4f686-6825-49cf-a113-d2fdd484de77", + "metadata": {}, + "outputs": [], + "source": [ + "response = index.query(\"What did the author do after his time at Y Combinator?\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "a483514d-4ab5-489d-8b99-7250df491ce3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "<b>\n", + "\n", + "After a few years, the author decided to step away from Y Combinator to focus on other projects, such as painting and writing essays. In 2013, he handed over control of Y Combinator to Sam Altman. The author's mother passed away in 2014, and after taking some time to grieve, he returned to writing essays and working on Lisp. He continued working on Lisp until 2019, when he finally completed the project.\n", + "\n", + "In 2015, the author decided to move to England with his family. They originally intended to only stay for a year, but ended up liking it so much that they remained there. The author wrote Bel while living in England. In 2019, he finally finished the project. After completing Bel, the author wrote a number of essays on various topics. He continued writing essays through 2020, but also started thinking about other things he could work on.</b>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "markdown", + "id": "112e21ee-587c-4d8b-871e-cb99b94e3778", + "metadata": {}, + "source": [ + "## GPT Keyword Table Query Comparisons\n", + "Compare mode={\"default\", \"simple\", \"rake\"}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3029961a-ec22-42a1-90d6-f5892eb81e34", + "metadata": {}, + "outputs": [], + "source": [ + "# build table with default GPTKeywordTableIndex\n", + "from llama_index import GPTKeywordTableIndex, SimpleDirectoryReader\n", + "from IPython.display import Markdown, display\n", + "\n", + "documents = SimpleDirectoryReader('data').load_data()\n", + "index = GPTKeywordTableIndex.from_documents(documents)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "d75b31da-4788-4295-8642-07ac5c4f11a5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Starting query: What did the author do after his time at Y Combinator?\n", + "Extracted keywords: ['y combinator', 'combinator']\n", + "> Querying with idx: 235042210695008001: of excluding them, because there were so many s...\n", + "> Querying with idx: 7029274505691774319: it was like living in another country, and sinc...\n", + "> Querying with idx: 1773317813360405038: browser, and then host the resulting applicatio...\n", + "> Querying with idx: 3866067077574405334: person, and from those we picked 8 to fund. The...\n" + ] }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file + { + "data": { + "text/markdown": [ + "<b>\n", + "\n", + "The author went on to write a book about his experiences at Y Combinator, and then moved to England. He started writing essays again and also began working on a new Lisp programming language. He also wrote an essay about how he chooses what to work on.</b>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# default\n", + "response = index.query(\"What did the author do after his time at Y Combinator?\", mode=\"default\")\n", + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "07b713f4-adfc-46f7-a795-5b333e33d49d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Starting query: What did the author do after his time at Y Combinator?\n", + "Extracted keywords: ['combinator']\n", + "> Querying with idx: 235042210695008001: of excluding them, because there were so many s...\n", + "> Querying with idx: 7029274505691774319: it was like living in another country, and sinc...\n", + "> Querying with idx: 1773317813360405038: browser, and then host the resulting applicatio...\n", + "> Querying with idx: 3866067077574405334: person, and from those we picked 8 to fund. The...\n" + ] + }, + { + "data": { + "text/markdown": [ + "<b>\n", + "\n", + "The author went on to write a book about his experiences at Y Combinator, and then moved to England. He started writing essays again and also began working on a new Lisp programming language. He also wrote an essay about how he chooses what to work on.</b>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# simple\n", + "response = index.query(\"What did the author do after his time at Y Combinator?\", mode=\"simple\")\n", + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "d2e19ad9-3190-45e5-a28d-235c28296d70", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Starting query: What did the author do after his time at Y Combinator?\n", + "Extracted keywords: ['combinator']\n", + "> Querying with idx: 235042210695008001: of excluding them, because there were so many s...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package punkt to /home/jerry/nltk_data...\n", + "[nltk_data] Package punkt is already up-to-date!\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Querying with idx: 7029274505691774319: it was like living in another country, and sinc...\n", + "> Querying with idx: 1773317813360405038: browser, and then host the resulting applicatio...\n", + "> Querying with idx: 3866067077574405334: person, and from those we picked 8 to fund. The...\n" + ] + }, + { + "data": { + "text/markdown": [ + "<b>\n", + "\n", + "The author went on to write a book about his experiences at Y Combinator, and then moved to England. He started writing essays again and also began working on a new Lisp programming language. He also wrote an essay about how he chooses what to work on.</b>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# rake\n", + "response = index.query(\"What did the author do after his time at Y Combinator?\", mode=\"rake\")\n", + "display(Markdown(f\"<b>{response}</b>\"))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/paul_graham_essay/TestEssay.ipynb b/examples/paul_graham_essay/TestEssay.ipynb index 3e1661492c..064cddeb66 100644 --- a/examples/paul_graham_essay/TestEssay.ipynb +++ b/examples/paul_graham_essay/TestEssay.ipynb @@ -1,660 +1,668 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "f1a9eb90-335c-4214-8bb6-fd1edbe3ccbd", - "metadata": {}, - "outputs": [], - "source": [ - "# My OpenAI Key\n", - "import os\n", - "os.environ['OPENAI_API_KEY'] = \"INSERT OPENAI KEY\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6a712b56", - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "import sys\n", - "\n", - "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", - "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" - ] - }, - { - "cell_type": "markdown", - "id": "be3f7baa-1c0a-430b-981b-83ddca9e71f2", - "metadata": { - "tags": [] - }, - "source": [ - "## Using GPT Tree Index" - ] - }, - { - "cell_type": "markdown", - "id": "0881f151-279e-4910-95c7-f49d3d6a4c69", - "metadata": {}, - "source": [ - "#### [Demo] Default leaf traversal " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8d0b2364-4806-4656-81e7-3f6e4b910b5b", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import GPTTreeIndex, SimpleDirectoryReader\n", - "from IPython.display import Markdown, display" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "1c297fd3-3424-41d8-9d0d-25fe6310ab62", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "documents = SimpleDirectoryReader('data').load_data()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "370fd08f-56ff-4c24-b0c4-c93116a6d482", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "index = GPTTreeIndex.from_documents(documents)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0b4fe9b6-5762-4e86-b51e-aac45d3ecdb1", - "metadata": {}, - "outputs": [], - "source": [ - "index.save_to_disk('index.json')" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "5eec265d-211b-4f26-b05b-5b4e7072bc6e", - "metadata": {}, - "outputs": [], - "source": [ - "# try loading\n", - "new_index = GPTTreeIndex.load_from_disk('index.json')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bd14686d-1c53-4637-9340-3745f2121ae2", - "metadata": {}, - "outputs": [], - "source": [ - "# set Logging to DEBUG for more detailed outputs\n", - "response = new_index.query(\"What did the author do growing up?\")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "b4c87d14-d2d8-4d80-89f6-1e5972973528", - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "<b>The author wrote short stories and tried to program on an IBM 1401.</b>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "68c9ebfe-b1b6-4f4e-9278-174346de8c90", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# set Logging to DEBUG for more detailed outputs\n", - "response = new_index.query(\"What did the author do after his time at Y Combinator?\")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "a5ab5943-7c84-4c2b-ac99-ec4b5fc67e64", - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "<b>The author went on to start his own company.</b>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "markdown", - "id": "85c62ec3-c3cf-467e-ab0f-88ffb9f990be", - "metadata": {}, - "source": [ - "#### [Demo] Leaf traversal with child_branch_factor=2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "46714db4-9592-4c55-9ca7-916758f2ce68", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# try using branching factor 2\n", - "response = new_index.query(\"What did the author do growing up?\", child_branch_factor=2)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "1ea7f891-b7e1-497a-a965-14201b220404", - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "<b>The author grew up writing simple programs on a TRS-80 computer, as well as trying to program on an IBM 1401. In the early 1990s, the author was a student at the Rhode Island School of Design (RISD) and then the Accademia di Belle Arti in Florence, Italy. They eventually dropped out of RISD and moved to New York City, where they got a job at Interleaf, a software company. While working there, they learned about a new markup language called HTML, which would later become a big part of their life. He also wrote a book on Lisp programming.</b>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "markdown", - "id": "3c572726-bb95-49c3-a762-d966de59ee5f", - "metadata": {}, - "source": [ - "#### [Demo] Build Tree Index during Query-Time" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "255fb052-1ff6-4f27-881f-28d4790e9520", - "metadata": {}, - "outputs": [], - "source": [ - "documents = SimpleDirectoryReader('data').load_data()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "85371256-292c-473e-9485-7de5c1997a59", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> [build_index_from_documents] Total token usage: 0 tokens\n" - ] - } - ], - "source": [ - "index_light = GPTTreeIndex.from_documents(documents, build_tree=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "77b0acb3-5593-4f00-8eef-315a031fedc2", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Starting query: What did the author do after his time at Y Combinator?\n", - "> Building index from nodes: 5 chunks\n", - "0/57\n", - "10/57\n", - "20/57\n", - "30/57\n", - "40/57\n", - "50/57\n", - "> [query] Total token usage: 18200 tokens\n" - ] - }, - { - "data": { - "text/plain": [ - "'\\nThe author went back to painting.'" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "index_light.query(\"What did the author do after his time at Y Combinator?\", mode=\"summarize\")" - ] - }, - { - "cell_type": "markdown", - "id": "f9773497-9aa6-4a16-884a-cd882e63d012", - "metadata": {}, - "source": [ - "#### [Demo] Build Tree Index with a custom Summary Prompt, directly retrieve answer from root node" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "8ab6d3ad-95e1-477a-a0dc-2ce4763ff2c4", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import SummaryPrompt" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "5a91a445-6ab2-457c-850e-79c5386129db", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Building index from nodes: 5 chunks\n", - "0/57\n", - "10/57\n", - "20/57\n", - "30/57\n", - "40/57\n", - "50/57\n", - "> [build_index_from_documents] Total token usage: 18031 tokens\n" - ] - } - ], - "source": [ - "documents = SimpleDirectoryReader('data').load_data()\n", - "\n", - "query_str = \"What did the author do growing up?\"\n", - "SUMMARY_PROMPT_TMPL = (\n", - " \"Context information is below. \\n\"\n", - " \"---------------------\\n\"\n", - " \"{context_str}\"\n", - " \"\\n---------------------\\n\"\n", - " \"Given the context information and not prior knowledge, \"\n", - " f\"answer the question: {query_str}\\n\"\n", - ")\n", - "SUMMARY_PROMPT = SummaryPrompt(SUMMARY_PROMPT_TMPL)\n", - "index_with_query = GPTTreeIndex.from_documents(documents, summary_template=SUMMARY_PROMPT)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "985dad0c-1ede-4576-a4c9-c077b815edd8", - "metadata": {}, - "outputs": [], - "source": [ - "index_with_query.save_to_disk(\"index_with_query.json\")" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "de04fce5-88f9-41b7-87d9-dcde8f84a872", - "metadata": {}, - "outputs": [], - "source": [ - "index_with_query = GPTTreeIndex.load_from_disk(\"index_with_query.json\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9223ffa8-d49d-4de3-821a-701b2a0352d4", - "metadata": {}, - "outputs": [], - "source": [ - "# directly retrieve response from root nodes instead of traversing tree\n", - "response = index_with_query.query(query_str, mode=\"retrieve\")" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "fdca6970-2f3f-4741-ae98-555db8d3d9a0", - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "<b>\n", - "The author was homeschooled and then attended a prestigious art school. The author grew up writing essays and thinking about other things he could work on.</b>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "markdown", - "id": "a6457769-dfaf-4241-ab32-dcf901dde902", - "metadata": {}, - "source": [ - "## Using GPT Keyword Table Index" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "78d59ef6-70b0-47bb-818d-7237a3b7de75", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import GPTKeywordTableIndex, SimpleDirectoryReader\n", - "from IPython.display import Markdown, display" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "5a3f1c67-6d73-4f37-afcf-9e637002fcff", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Processing chunk 0 of 6: \t\t\n", - "\n", - "What I Worked On\n", - "\n", - "February 2021\n", - "\n", - "Before col...\n", - "> Keywords: ['painting', 'computers', 'programming', 'lisp', 'ai', 'college', 'graduate school', 'graduate', 'school', 'writing']\n", - "> Processing chunk 1 of 6: of excluding them, because there were so many s...\n", - "> Keywords: ['school', 'students', 'painting', 'florence', 'risd', 'accademia', 'still lives', 'still', 'lives', 'color', 'new york', 'new', 'york', 'yorkville', 'idelle weber', 'idelle', 'weber', 'harvard', 'world wide web', 'world', 'wide', 'web', 'y combinator', 'combinator', 'software', 'lisp']\n", - "> Processing chunk 2 of 6: an alarming prospect, because neither of us kne...\n", - "> Keywords: ['windows', 'unix', 'lisp', 'web app', 'web', 'app', 'browser', 'store builder', 'store', 'builder', 'ecommerce', 'startup', 'painting']\n", - "> Processing chunk 3 of 6: browser, and then host the resulting applicatio...\n", - "> Keywords: ['y combinator', 'combinator', 'investment', 'summer founders program', 'summer', 'founders', 'program', 'microsoft', 'goldman sachs', 'goldman', 'sachs']\n", - "> Processing chunk 4 of 6: person, and from those we picked 8 to fund. The...\n", - "> Keywords: ['y combinator', 'combinator', 'yc', 'lisp', 'bel', 'essays', 'writing', 'software', 'programming', 'arc']\n", - "> Processing chunk 5 of 6: it was like living in another country, and sinc...\n", - "> Keywords: ['software', 'technology', 'y combinator', 'combinator', 'essays', 'online publishing', 'online', 'publishing', 'venture capital', 'venture', 'capital', 'startups', 'space aliens', 'space', 'aliens', 'lisp']\n" - ] - } - ], - "source": [ - "# build keyword index\n", - "documents = SimpleDirectoryReader('data').load_data()\n", - "index = GPTKeywordTableIndex.from_documents(documents)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "7ec97988-0190-4df7-b19a-e3130122298f", - "metadata": {}, - "outputs": [], - "source": [ - "# save index\n", - "index.save_to_disk('index_table.json')" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "d94d0fe0-43c1-41cd-901b-0d748d30f1c7", - "metadata": {}, - "outputs": [], - "source": [ - "# reload index\n", - "index = GPTKeywordTableIndex.load_from_disk('index_table.json')" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "69d4f686-6825-49cf-a113-d2fdd484de77", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Starting query: What did the author do after his time at Y Combinator?\n", - "Extracted keywords: ['y combinator', 'combinator']\n", - "> Querying with idx: 7143669651211954504: of excluding them, because there were so many s...\n", - "> Querying with idx: 4978118451876167434: browser, and then host the resulting applicatio...\n", - "> Querying with idx: 7378313280237489139: person, and from those we picked 8 to fund. The...\n", - "> Querying with idx: 2670584622494666310: it was like living in another country, and sinc...\n" - ] - } - ], - "source": [ - "# set Logging to DEBUG for more detailed outputs\n", - "response = index.query(\"What did the author do after his time at Y Combinator?\")" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "a483514d-4ab5-489d-8b99-7250df491ce3", - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "<b>\n", - "\n", - "After a few years, the author decided to step away from Y Combinator to focus on other projects, such as painting and writing essays. In 2013, he handed over control of Y Combinator to Sam Altman. The author's mother passed away in 2014, and after taking some time to grieve, he returned to writing essays and working on Lisp. He continued working on Lisp until 2019, when he finally completed the project.\n", - "\n", - "In 2015, the author decided to move to England with his family. They originally intended to only stay for a year, but ended up liking it so much that they remained there. The author wrote Bel while living in England. In 2019, he finally finished the project. After completing Bel, the author wrote a number of essays on various topics. He continued writing essays through 2020, but also started thinking about other things he could work on.</b>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "markdown", - "id": "aae1bea9-b534-430a-a52b-1f4414957ac9", - "metadata": {}, - "source": [ - "## Using GPT List Index" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1aa8c8c1-7fce-4737-9141-d14fd37a779c", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import GPTListIndex, SimpleDirectoryReader\n", - "from IPython.display import Markdown, display" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "191caa65-a77f-4d8c-b095-4aed61300ea5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Adding chunk: \t\t\n", - "\n", - "What I Worked On\n", - "\n", - "February 2021\n", - "\n", - "Before col...\n", - "> Adding chunk: only up to age 25 and already there are such co...\n", - "> Adding chunk: clear that it was even possible. To find out, w...\n", - "> Adding chunk: a name for the kind of company Viaweb was, an \"...\n", - "> Adding chunk: get their initial set of customers almost entir...\n", - "> Adding chunk: had smart people and built impressive technolog...\n", - "> [build_index_from_documents] Total token usage: 0 tokens\n" - ] - } - ], - "source": [ - "# build linked list index\n", - "documents = SimpleDirectoryReader('data').load_data()\n", - "index = GPTListIndex.from_documents(documents)\n", - "# save index\n", - "index.save_to_disk('index_list.json')" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "af2d049d-518d-4ec4-b84f-1fab8aece04f", - "metadata": {}, - "outputs": [], - "source": [ - "# load index from disk\n", - "index = GPTListIndex.load_from_disk('index_list.json')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1b3d4bd8-7540-4c6f-8616-ab2d8c6ae2b2", - "metadata": {}, - "outputs": [], - "source": [ - "# set Logging to DEBUG for more detailed outputs\n", - "response = index.query(\"What did the author do after his time at Y Combinator?\")" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "5101b979-175f-490e-9b32-27689fe4b789", - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "<b>\n", - "\n", - "After his time at Y Combinator, the author moved back to Providence to continue at RISD. However, he found that art school was not what he expected it to be and dropped out. He then moved to New York City and started writing a book on Lisp. When that didn't work out, he started a company to put art galleries online. However, that also failed. He then had the idea to start a company to build online stores, which became a success.\n", - "\n", - "The author then left his position at Yahoo to pursue painting full-time. However, he found it difficult to get back into the painting mindset and eventually returned to New York City. It was there that he had the idea to create a web application that would allow users to create and host their own web applications.</b>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "65cfce56-853e-431b-888e-946771c3b07e", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.16" - } + "cells": [ + { + "cell_type": "markdown", + "id": "9f9e2065", + "metadata": {}, + "source": [ + "# Paul Graham Essay Test" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f1a9eb90-335c-4214-8bb6-fd1edbe3ccbd", + "metadata": {}, + "outputs": [], + "source": [ + "# My OpenAI Key\n", + "import os\n", + "os.environ['OPENAI_API_KEY'] = \"INSERT OPENAI KEY\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6a712b56", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "import sys\n", + "\n", + "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", + "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" + ] + }, + { + "cell_type": "markdown", + "id": "be3f7baa-1c0a-430b-981b-83ddca9e71f2", + "metadata": { + "tags": [] + }, + "source": [ + "## Using GPT Tree Index" + ] + }, + { + "cell_type": "markdown", + "id": "0881f151-279e-4910-95c7-f49d3d6a4c69", + "metadata": {}, + "source": [ + "#### [Demo] Default leaf traversal " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d0b2364-4806-4656-81e7-3f6e4b910b5b", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import GPTTreeIndex, SimpleDirectoryReader\n", + "from IPython.display import Markdown, display" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "1c297fd3-3424-41d8-9d0d-25fe6310ab62", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "documents = SimpleDirectoryReader('data').load_data()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "370fd08f-56ff-4c24-b0c4-c93116a6d482", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "index = GPTTreeIndex.from_documents(documents)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0b4fe9b6-5762-4e86-b51e-aac45d3ecdb1", + "metadata": {}, + "outputs": [], + "source": [ + "index.save_to_disk('index.json')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5eec265d-211b-4f26-b05b-5b4e7072bc6e", + "metadata": {}, + "outputs": [], + "source": [ + "# try loading\n", + "new_index = GPTTreeIndex.load_from_disk('index.json')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd14686d-1c53-4637-9340-3745f2121ae2", + "metadata": {}, + "outputs": [], + "source": [ + "# set Logging to DEBUG for more detailed outputs\n", + "response = new_index.query(\"What did the author do growing up?\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "b4c87d14-d2d8-4d80-89f6-1e5972973528", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "<b>The author wrote short stories and tried to program on an IBM 1401.</b>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "68c9ebfe-b1b6-4f4e-9278-174346de8c90", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# set Logging to DEBUG for more detailed outputs\n", + "response = new_index.query(\"What did the author do after his time at Y Combinator?\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "a5ab5943-7c84-4c2b-ac99-ec4b5fc67e64", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "<b>The author went on to start his own company.</b>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "markdown", + "id": "85c62ec3-c3cf-467e-ab0f-88ffb9f990be", + "metadata": {}, + "source": [ + "#### [Demo] Leaf traversal with child_branch_factor=2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "46714db4-9592-4c55-9ca7-916758f2ce68", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# try using branching factor 2\n", + "response = new_index.query(\"What did the author do growing up?\", child_branch_factor=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "1ea7f891-b7e1-497a-a965-14201b220404", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "<b>The author grew up writing simple programs on a TRS-80 computer, as well as trying to program on an IBM 1401. In the early 1990s, the author was a student at the Rhode Island School of Design (RISD) and then the Accademia di Belle Arti in Florence, Italy. They eventually dropped out of RISD and moved to New York City, where they got a job at Interleaf, a software company. While working there, they learned about a new markup language called HTML, which would later become a big part of their life. He also wrote a book on Lisp programming.</b>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "markdown", + "id": "3c572726-bb95-49c3-a762-d966de59ee5f", + "metadata": {}, + "source": [ + "#### [Demo] Build Tree Index during Query-Time" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "255fb052-1ff6-4f27-881f-28d4790e9520", + "metadata": {}, + "outputs": [], + "source": [ + "documents = SimpleDirectoryReader('data').load_data()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "85371256-292c-473e-9485-7de5c1997a59", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> [build_index_from_documents] Total token usage: 0 tokens\n" + ] + } + ], + "source": [ + "index_light = GPTTreeIndex.from_documents(documents, build_tree=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "77b0acb3-5593-4f00-8eef-315a031fedc2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Starting query: What did the author do after his time at Y Combinator?\n", + "> Building index from nodes: 5 chunks\n", + "0/57\n", + "10/57\n", + "20/57\n", + "30/57\n", + "40/57\n", + "50/57\n", + "> [query] Total token usage: 18200 tokens\n" + ] }, - "nbformat": 4, - "nbformat_minor": 5 + { + "data": { + "text/plain": [ + "'\\nThe author went back to painting.'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "index_light.query(\"What did the author do after his time at Y Combinator?\", mode=\"summarize\")" + ] + }, + { + "cell_type": "markdown", + "id": "f9773497-9aa6-4a16-884a-cd882e63d012", + "metadata": {}, + "source": [ + "#### [Demo] Build Tree Index with a custom Summary Prompt, directly retrieve answer from root node" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "8ab6d3ad-95e1-477a-a0dc-2ce4763ff2c4", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import SummaryPrompt" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "5a91a445-6ab2-457c-850e-79c5386129db", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Building index from nodes: 5 chunks\n", + "0/57\n", + "10/57\n", + "20/57\n", + "30/57\n", + "40/57\n", + "50/57\n", + "> [build_index_from_documents] Total token usage: 18031 tokens\n" + ] + } + ], + "source": [ + "documents = SimpleDirectoryReader('data').load_data()\n", + "\n", + "query_str = \"What did the author do growing up?\"\n", + "SUMMARY_PROMPT_TMPL = (\n", + " \"Context information is below. \\n\"\n", + " \"---------------------\\n\"\n", + " \"{context_str}\"\n", + " \"\\n---------------------\\n\"\n", + " \"Given the context information and not prior knowledge, \"\n", + " f\"answer the question: {query_str}\\n\"\n", + ")\n", + "SUMMARY_PROMPT = SummaryPrompt(SUMMARY_PROMPT_TMPL)\n", + "index_with_query = GPTTreeIndex.from_documents(documents, summary_template=SUMMARY_PROMPT)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "985dad0c-1ede-4576-a4c9-c077b815edd8", + "metadata": {}, + "outputs": [], + "source": [ + "index_with_query.save_to_disk(\"index_with_query.json\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "de04fce5-88f9-41b7-87d9-dcde8f84a872", + "metadata": {}, + "outputs": [], + "source": [ + "index_with_query = GPTTreeIndex.load_from_disk(\"index_with_query.json\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9223ffa8-d49d-4de3-821a-701b2a0352d4", + "metadata": {}, + "outputs": [], + "source": [ + "# directly retrieve response from root nodes instead of traversing tree\n", + "response = index_with_query.query(query_str, mode=\"retrieve\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "fdca6970-2f3f-4741-ae98-555db8d3d9a0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "<b>\n", + "The author was homeschooled and then attended a prestigious art school. The author grew up writing essays and thinking about other things he could work on.</b>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "markdown", + "id": "a6457769-dfaf-4241-ab32-dcf901dde902", + "metadata": {}, + "source": [ + "## Using GPT Keyword Table Index" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "78d59ef6-70b0-47bb-818d-7237a3b7de75", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import GPTKeywordTableIndex, SimpleDirectoryReader\n", + "from IPython.display import Markdown, display" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5a3f1c67-6d73-4f37-afcf-9e637002fcff", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Processing chunk 0 of 6: \t\t\n", + "\n", + "What I Worked On\n", + "\n", + "February 2021\n", + "\n", + "Before col...\n", + "> Keywords: ['painting', 'computers', 'programming', 'lisp', 'ai', 'college', 'graduate school', 'graduate', 'school', 'writing']\n", + "> Processing chunk 1 of 6: of excluding them, because there were so many s...\n", + "> Keywords: ['school', 'students', 'painting', 'florence', 'risd', 'accademia', 'still lives', 'still', 'lives', 'color', 'new york', 'new', 'york', 'yorkville', 'idelle weber', 'idelle', 'weber', 'harvard', 'world wide web', 'world', 'wide', 'web', 'y combinator', 'combinator', 'software', 'lisp']\n", + "> Processing chunk 2 of 6: an alarming prospect, because neither of us kne...\n", + "> Keywords: ['windows', 'unix', 'lisp', 'web app', 'web', 'app', 'browser', 'store builder', 'store', 'builder', 'ecommerce', 'startup', 'painting']\n", + "> Processing chunk 3 of 6: browser, and then host the resulting applicatio...\n", + "> Keywords: ['y combinator', 'combinator', 'investment', 'summer founders program', 'summer', 'founders', 'program', 'microsoft', 'goldman sachs', 'goldman', 'sachs']\n", + "> Processing chunk 4 of 6: person, and from those we picked 8 to fund. The...\n", + "> Keywords: ['y combinator', 'combinator', 'yc', 'lisp', 'bel', 'essays', 'writing', 'software', 'programming', 'arc']\n", + "> Processing chunk 5 of 6: it was like living in another country, and sinc...\n", + "> Keywords: ['software', 'technology', 'y combinator', 'combinator', 'essays', 'online publishing', 'online', 'publishing', 'venture capital', 'venture', 'capital', 'startups', 'space aliens', 'space', 'aliens', 'lisp']\n" + ] + } + ], + "source": [ + "# build keyword index\n", + "documents = SimpleDirectoryReader('data').load_data()\n", + "index = GPTKeywordTableIndex.from_documents(documents)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7ec97988-0190-4df7-b19a-e3130122298f", + "metadata": {}, + "outputs": [], + "source": [ + "# save index\n", + "index.save_to_disk('index_table.json')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "d94d0fe0-43c1-41cd-901b-0d748d30f1c7", + "metadata": {}, + "outputs": [], + "source": [ + "# reload index\n", + "index = GPTKeywordTableIndex.load_from_disk('index_table.json')" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "69d4f686-6825-49cf-a113-d2fdd484de77", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Starting query: What did the author do after his time at Y Combinator?\n", + "Extracted keywords: ['y combinator', 'combinator']\n", + "> Querying with idx: 7143669651211954504: of excluding them, because there were so many s...\n", + "> Querying with idx: 4978118451876167434: browser, and then host the resulting applicatio...\n", + "> Querying with idx: 7378313280237489139: person, and from those we picked 8 to fund. The...\n", + "> Querying with idx: 2670584622494666310: it was like living in another country, and sinc...\n" + ] + } + ], + "source": [ + "# set Logging to DEBUG for more detailed outputs\n", + "response = index.query(\"What did the author do after his time at Y Combinator?\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "a483514d-4ab5-489d-8b99-7250df491ce3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "<b>\n", + "\n", + "After a few years, the author decided to step away from Y Combinator to focus on other projects, such as painting and writing essays. In 2013, he handed over control of Y Combinator to Sam Altman. The author's mother passed away in 2014, and after taking some time to grieve, he returned to writing essays and working on Lisp. He continued working on Lisp until 2019, when he finally completed the project.\n", + "\n", + "In 2015, the author decided to move to England with his family. They originally intended to only stay for a year, but ended up liking it so much that they remained there. The author wrote Bel while living in England. In 2019, he finally finished the project. After completing Bel, the author wrote a number of essays on various topics. He continued writing essays through 2020, but also started thinking about other things he could work on.</b>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "markdown", + "id": "aae1bea9-b534-430a-a52b-1f4414957ac9", + "metadata": {}, + "source": [ + "## Using GPT List Index" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1aa8c8c1-7fce-4737-9141-d14fd37a779c", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import GPTListIndex, SimpleDirectoryReader\n", + "from IPython.display import Markdown, display" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "191caa65-a77f-4d8c-b095-4aed61300ea5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Adding chunk: \t\t\n", + "\n", + "What I Worked On\n", + "\n", + "February 2021\n", + "\n", + "Before col...\n", + "> Adding chunk: only up to age 25 and already there are such co...\n", + "> Adding chunk: clear that it was even possible. To find out, w...\n", + "> Adding chunk: a name for the kind of company Viaweb was, an \"...\n", + "> Adding chunk: get their initial set of customers almost entir...\n", + "> Adding chunk: had smart people and built impressive technolog...\n", + "> [build_index_from_documents] Total token usage: 0 tokens\n" + ] + } + ], + "source": [ + "# build linked list index\n", + "documents = SimpleDirectoryReader('data').load_data()\n", + "index = GPTListIndex.from_documents(documents)\n", + "# save index\n", + "index.save_to_disk('index_list.json')" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "af2d049d-518d-4ec4-b84f-1fab8aece04f", + "metadata": {}, + "outputs": [], + "source": [ + "# load index from disk\n", + "index = GPTListIndex.load_from_disk('index_list.json')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1b3d4bd8-7540-4c6f-8616-ab2d8c6ae2b2", + "metadata": {}, + "outputs": [], + "source": [ + "# set Logging to DEBUG for more detailed outputs\n", + "response = index.query(\"What did the author do after his time at Y Combinator?\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "5101b979-175f-490e-9b32-27689fe4b789", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "<b>\n", + "\n", + "After his time at Y Combinator, the author moved back to Providence to continue at RISD. However, he found that art school was not what he expected it to be and dropped out. He then moved to New York City and started writing a book on Lisp. When that didn't work out, he started a company to put art galleries online. However, that also failed. He then had the idea to start a company to build online stores, which became a success.\n", + "\n", + "The author then left his position at Yahoo to pursue painting full-time. However, he found it difficult to get back into the painting mindset and eventually returned to New York City. It was there that he had the idea to create a web application that would allow users to create and host their own web applications.</b>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "65cfce56-853e-431b-888e-946771c3b07e", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/examples/playground/PlaygroundDemo.ipynb b/examples/playground/PlaygroundDemo.ipynb index b73d81c932..52c25f1b64 100644 --- a/examples/playground/PlaygroundDemo.ipynb +++ b/examples/playground/PlaygroundDemo.ipynb @@ -1,413 +1,421 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "839c4a87", - "metadata": {}, - "outputs": [], - "source": [ - "# My OpenAI Key\n", - "import os\n", - "os.environ['OPENAI_API_KEY'] = \"INSERT OPENAI KEY\"" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "d726e871", - "metadata": {}, - "outputs": [], - "source": [ - "# Hide INFO logs regarding token usage, etc\n", - "import logging\n", - "logger = logging.getLogger()\n", - "logger.setLevel(logging.CRITICAL)" - ] - }, - { - "cell_type": "markdown", - "id": "40cf0773", - "metadata": {}, - "source": [ - "## Setup\n", - "\n", - "### Generate some example Documents" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fa34cd83", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import download_loader\n", - "from llama_index.indices.vector_store import GPTSimpleVectorIndex\n", - "from llama_index.indices.tree.base import GPTTreeIndex\n", - "\n", - "WikipediaReader = download_loader(\"WikipediaReader\")\n", - "\n", - "loader = WikipediaReader()\n", - "documents = loader.load_data(pages=['Berlin'])" - ] - }, - { - "cell_type": "markdown", - "id": "0c32392b", - "metadata": {}, - "source": [ - "### Create a list of any sort of indices (custom LLMs, custom embeddings, etc)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f59e6c18", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", - "INFO:root:> [build_index_from_documents] Total embedding token usage: 18344 tokens\n", - "INFO:root:> Building index from nodes: 5 chunks\n" - ] - } - ], - "source": [ - "indices = [GPTSimpleVectorIndex.from_documents(documents), GPTTreeIndex.from_documents(documents)]" - ] - }, - { - "cell_type": "markdown", - "id": "827ada33", - "metadata": {}, - "source": [ - "## Using the Playground\n", - "\n", - "\n", - "### Initialize with indices" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "a04e4535", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index.playground import Playground\n", - "\n", - "playground = Playground(indices=indices)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "5f6999fc", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:openai:error_code=None error_message='Rate limit reached for default-global-with-image-limits in organization org-ehTdCqs0FpsxuTTwsJIlNSdZ on requests per min. Limit: 60.000000 / min. Current: 110.000000 / min. Contact support@openai.com if you continue to have issues. Please add a payment method to your account to increase your rate limit. Visit https://platform.openai.com/account/billing to add a payment method.' error_param=None error_type=requests message='OpenAI API error received' stream_error=False\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1mQuery:\u001b[0m\n", - "What is the population of Berlin?\n", - "\n", - "Trying 10 combinations...\n", - "\n", - "\n", - "\u001b[1mGPTSimpleVectorIndex\u001b[0m, mode = default\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:openai:error_code=None error_message='Rate limit reached for default-global-with-image-limits in organization org-ehTdCqs0FpsxuTTwsJIlNSdZ on requests per min. Limit: 60.000000 / min. Current: 90.000000 / min. Contact support@openai.com if you continue to have issues. Please add a payment method to your account to increase your rate limit. Visit https://platform.openai.com/account/billing to add a payment method.' error_param=None error_type=requests message='OpenAI API error received' stream_error=False\n", - "INFO:openai:error_code=None error_message='Rate limit reached for default-global-with-image-limits in organization org-ehTdCqs0FpsxuTTwsJIlNSdZ on requests per min. Limit: 60.000000 / min. Current: 90.000000 / min. Contact support@openai.com if you continue to have issues. Please add a payment method to your account to increase your rate limit. Visit https://platform.openai.com/account/billing to add a payment method.' error_param=None error_type=requests message='OpenAI API error received' stream_error=False\n", - "INFO:openai:error_code=None error_message='Rate limit reached for default-global-with-image-limits in organization org-ehTdCqs0FpsxuTTwsJIlNSdZ on requests per min. Limit: 60.000000 / min. Current: 80.000000 / min. Contact support@openai.com if you continue to have issues. Please add a payment method to your account to increase your rate limit. Visit https://platform.openai.com/account/billing to add a payment method.' error_param=None error_type=requests message='OpenAI API error received' stream_error=False\n", - "INFO:root:> [query] Total LLM token usage: 3545 tokens\n", - "INFO:root:> [query] Total embedding token usage: 7 tokens\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[36;1m\u001b[1;3m\n", - "The population of Berlin in 1949 was approximately 2.2 million inhabitants. After the fall of the Berlin Wall in 1989, the population of Berlin increased to approximately 3.7 million inhabitants.\u001b[0m\n", - "\n", - "\u001b[1mGPTSimpleVectorIndex\u001b[0m, mode = embedding\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:> [query] Total LLM token usage: 3545 tokens\n", - "INFO:root:> [query] Total embedding token usage: 7 tokens\n", - "INFO:root:> Starting query: What is the population of Berlin?\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[36;1m\u001b[1;3m\n", - "The population of Berlin in 1949 was approximately 2.2 million inhabitants. After the fall of the Berlin Wall in 1989, the population of Berlin increased to approximately 3.7 million inhabitants.\u001b[0m\n", - "\n", - "\u001b[1mGPTTreeIndex\u001b[0m, mode = default\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:>[Level 0] Selected node: [1]/[1]\n", - "INFO:root:>[Level 1] Selected node: [3]/[3]\n", - "INFO:root:> [query] Total LLM token usage: 5168 tokens\n", - "INFO:root:> [query] Total embedding token usage: 0 tokens\n", - "INFO:root:> Starting query: What is the population of Berlin?\n", - "INFO:root:> Building index from nodes: 6 chunks\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[33;1m\u001b[1;3mThe population of Berlin is approximately 3.7 million people.\u001b[0m\n", - "\n", - "\u001b[1mGPTTreeIndex\u001b[0m, mode = summarize\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:> [query] Total LLM token usage: 21617 tokens\n", - "INFO:root:> [query] Total embedding token usage: 0 tokens\n", - "INFO:root:> Starting query: What is the population of Berlin?\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[33;1m\u001b[1;3m\n", - "The population of Berlin is approximately 3.7 million people.\u001b[0m\n", - "\n", - "\u001b[1mGPTTreeIndex\u001b[0m, mode = embedding\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:> [query] Total LLM token usage: 368 tokens\n", - "INFO:root:> [query] Total embedding token usage: 4598 tokens\n", - "INFO:root:> Starting query: What is the population of Berlin?\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[33;1m\u001b[1;3mApproximately 3.7 million people.\u001b[0m\n", - "\n", - "\u001b[1mGPTTreeIndex\u001b[0m, mode = retrieve\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:> [query] Total LLM token usage: 1439 tokens\n", - "INFO:root:> [query] Total embedding token usage: 0 tokens\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[33;1m\u001b[1;3m\n", - "The population of Berlin is 3.75 million registered inhabitants.\u001b[0m\n", - "\n", - "\n", - "Ran 6 combinations in total.\n" - ] - }, - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>Index</th>\n", - " <th>Mode</th>\n", - " <th>Output</th>\n", - " <th>Duration</th>\n", - " <th>LLM Tokens</th>\n", - " <th>Embedding Tokens</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>GPTSimpleVectorIndex</td>\n", - " <td>default</td>\n", - " <td>\\nThe population of Berlin in 1949 was approxi...</td>\n", - " <td>52.319133</td>\n", - " <td>3545</td>\n", - " <td>7</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>GPTSimpleVectorIndex</td>\n", - " <td>embedding</td>\n", - " <td>\\nThe population of Berlin in 1949 was approxi...</td>\n", - " <td>8.192025</td>\n", - " <td>3545</td>\n", - " <td>7</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>GPTTreeIndex</td>\n", - " <td>default</td>\n", - " <td>The population of Berlin is approximately 3.7 ...</td>\n", - " <td>12.542335</td>\n", - " <td>5168</td>\n", - " <td>0</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>GPTTreeIndex</td>\n", - " <td>summarize</td>\n", - " <td>\\nThe population of Berlin is approximately 3....</td>\n", - " <td>18.665586</td>\n", - " <td>21617</td>\n", - " <td>0</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>GPTTreeIndex</td>\n", - " <td>embedding</td>\n", - " <td>Approximately 3.7 million people.</td>\n", - " <td>3.573458</td>\n", - " <td>368</td>\n", - " <td>4598</td>\n", - " </tr>\n", - " <tr>\n", - " <th>5</th>\n", - " <td>GPTTreeIndex</td>\n", - " <td>retrieve</td>\n", - " <td>\\nThe population of Berlin is 3.75 million reg...</td>\n", - " <td>2.269598</td>\n", - " <td>1439</td>\n", - " <td>0</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " Index Mode \\\n", - "0 GPTSimpleVectorIndex default \n", - "1 GPTSimpleVectorIndex embedding \n", - "2 GPTTreeIndex default \n", - "3 GPTTreeIndex summarize \n", - "4 GPTTreeIndex embedding \n", - "5 GPTTreeIndex retrieve \n", - "\n", - " Output Duration LLM Tokens \\\n", - "0 \\nThe population of Berlin in 1949 was approxi... 52.319133 3545 \n", - "1 \\nThe population of Berlin in 1949 was approxi... 8.192025 3545 \n", - "2 The population of Berlin is approximately 3.7 ... 12.542335 5168 \n", - "3 \\nThe population of Berlin is approximately 3.... 18.665586 21617 \n", - "4 Approximately 3.7 million people. 3.573458 368 \n", - "5 \\nThe population of Berlin is 3.75 million reg... 2.269598 1439 \n", - "\n", - " Embedding Tokens \n", - "0 7 \n", - "1 7 \n", - "2 0 \n", - "3 0 \n", - "4 4598 \n", - "5 0 " - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "playground.compare(\"What is the population of Berlin?\")" - ] - }, - { - "cell_type": "markdown", - "id": "8829a829", - "metadata": {}, - "source": [ - "### Initialize with Documents" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "dfbc8ade", - "metadata": {}, - "outputs": [], - "source": [ - "# Uses documents in a preset list of indices\n", - "playground = Playground.from_docs(documents=documents)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.6" - } + "cells": [ + { + "cell_type": "markdown", + "id": "c283d4df", + "metadata": {}, + "source": [ + "# Playground Demo" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "839c4a87", + "metadata": {}, + "outputs": [], + "source": [ + "# My OpenAI Key\n", + "import os\n", + "os.environ['OPENAI_API_KEY'] = \"INSERT OPENAI KEY\"" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "d726e871", + "metadata": {}, + "outputs": [], + "source": [ + "# Hide INFO logs regarding token usage, etc\n", + "import logging\n", + "logger = logging.getLogger()\n", + "logger.setLevel(logging.CRITICAL)" + ] + }, + { + "cell_type": "markdown", + "id": "40cf0773", + "metadata": {}, + "source": [ + "## Setup\n", + "\n", + "### Generate some example Documents" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fa34cd83", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import download_loader\n", + "from llama_index.indices.vector_store import GPTSimpleVectorIndex\n", + "from llama_index.indices.tree.base import GPTTreeIndex\n", + "\n", + "WikipediaReader = download_loader(\"WikipediaReader\")\n", + "\n", + "loader = WikipediaReader()\n", + "documents = loader.load_data(pages=['Berlin'])" + ] + }, + { + "cell_type": "markdown", + "id": "0c32392b", + "metadata": {}, + "source": [ + "### Create a list of any sort of indices (custom LLMs, custom embeddings, etc)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f59e6c18", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", + "INFO:root:> [build_index_from_documents] Total embedding token usage: 18344 tokens\n", + "INFO:root:> Building index from nodes: 5 chunks\n" + ] + } + ], + "source": [ + "indices = [GPTSimpleVectorIndex.from_documents(documents), GPTTreeIndex.from_documents(documents)]" + ] + }, + { + "cell_type": "markdown", + "id": "827ada33", + "metadata": {}, + "source": [ + "## Using the Playground\n", + "\n", + "\n", + "### Initialize with indices" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "a04e4535", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index.playground import Playground\n", + "\n", + "playground = Playground(indices=indices)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "5f6999fc", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:openai:error_code=None error_message='Rate limit reached for default-global-with-image-limits in organization org-ehTdCqs0FpsxuTTwsJIlNSdZ on requests per min. Limit: 60.000000 / min. Current: 110.000000 / min. Contact support@openai.com if you continue to have issues. Please add a payment method to your account to increase your rate limit. Visit https://platform.openai.com/account/billing to add a payment method.' error_param=None error_type=requests message='OpenAI API error received' stream_error=False\n" + ] }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1mQuery:\u001b[0m\n", + "What is the population of Berlin?\n", + "\n", + "Trying 10 combinations...\n", + "\n", + "\n", + "\u001b[1mGPTSimpleVectorIndex\u001b[0m, mode = default\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:openai:error_code=None error_message='Rate limit reached for default-global-with-image-limits in organization org-ehTdCqs0FpsxuTTwsJIlNSdZ on requests per min. Limit: 60.000000 / min. Current: 90.000000 / min. Contact support@openai.com if you continue to have issues. Please add a payment method to your account to increase your rate limit. Visit https://platform.openai.com/account/billing to add a payment method.' error_param=None error_type=requests message='OpenAI API error received' stream_error=False\n", + "INFO:openai:error_code=None error_message='Rate limit reached for default-global-with-image-limits in organization org-ehTdCqs0FpsxuTTwsJIlNSdZ on requests per min. Limit: 60.000000 / min. Current: 90.000000 / min. Contact support@openai.com if you continue to have issues. Please add a payment method to your account to increase your rate limit. Visit https://platform.openai.com/account/billing to add a payment method.' error_param=None error_type=requests message='OpenAI API error received' stream_error=False\n", + "INFO:openai:error_code=None error_message='Rate limit reached for default-global-with-image-limits in organization org-ehTdCqs0FpsxuTTwsJIlNSdZ on requests per min. Limit: 60.000000 / min. Current: 80.000000 / min. Contact support@openai.com if you continue to have issues. Please add a payment method to your account to increase your rate limit. Visit https://platform.openai.com/account/billing to add a payment method.' error_param=None error_type=requests message='OpenAI API error received' stream_error=False\n", + "INFO:root:> [query] Total LLM token usage: 3545 tokens\n", + "INFO:root:> [query] Total embedding token usage: 7 tokens\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[36;1m\u001b[1;3m\n", + "The population of Berlin in 1949 was approximately 2.2 million inhabitants. After the fall of the Berlin Wall in 1989, the population of Berlin increased to approximately 3.7 million inhabitants.\u001b[0m\n", + "\n", + "\u001b[1mGPTSimpleVectorIndex\u001b[0m, mode = embedding\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:> [query] Total LLM token usage: 3545 tokens\n", + "INFO:root:> [query] Total embedding token usage: 7 tokens\n", + "INFO:root:> Starting query: What is the population of Berlin?\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[36;1m\u001b[1;3m\n", + "The population of Berlin in 1949 was approximately 2.2 million inhabitants. After the fall of the Berlin Wall in 1989, the population of Berlin increased to approximately 3.7 million inhabitants.\u001b[0m\n", + "\n", + "\u001b[1mGPTTreeIndex\u001b[0m, mode = default\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:>[Level 0] Selected node: [1]/[1]\n", + "INFO:root:>[Level 1] Selected node: [3]/[3]\n", + "INFO:root:> [query] Total LLM token usage: 5168 tokens\n", + "INFO:root:> [query] Total embedding token usage: 0 tokens\n", + "INFO:root:> Starting query: What is the population of Berlin?\n", + "INFO:root:> Building index from nodes: 6 chunks\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33;1m\u001b[1;3mThe population of Berlin is approximately 3.7 million people.\u001b[0m\n", + "\n", + "\u001b[1mGPTTreeIndex\u001b[0m, mode = summarize\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:> [query] Total LLM token usage: 21617 tokens\n", + "INFO:root:> [query] Total embedding token usage: 0 tokens\n", + "INFO:root:> Starting query: What is the population of Berlin?\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33;1m\u001b[1;3m\n", + "The population of Berlin is approximately 3.7 million people.\u001b[0m\n", + "\n", + "\u001b[1mGPTTreeIndex\u001b[0m, mode = embedding\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:> [query] Total LLM token usage: 368 tokens\n", + "INFO:root:> [query] Total embedding token usage: 4598 tokens\n", + "INFO:root:> Starting query: What is the population of Berlin?\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33;1m\u001b[1;3mApproximately 3.7 million people.\u001b[0m\n", + "\n", + "\u001b[1mGPTTreeIndex\u001b[0m, mode = retrieve\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:> [query] Total LLM token usage: 1439 tokens\n", + "INFO:root:> [query] Total embedding token usage: 0 tokens\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33;1m\u001b[1;3m\n", + "The population of Berlin is 3.75 million registered inhabitants.\u001b[0m\n", + "\n", + "\n", + "Ran 6 combinations in total.\n" + ] + }, + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Index</th>\n", + " <th>Mode</th>\n", + " <th>Output</th>\n", + " <th>Duration</th>\n", + " <th>LLM Tokens</th>\n", + " <th>Embedding Tokens</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>GPTSimpleVectorIndex</td>\n", + " <td>default</td>\n", + " <td>\\nThe population of Berlin in 1949 was approxi...</td>\n", + " <td>52.319133</td>\n", + " <td>3545</td>\n", + " <td>7</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>GPTSimpleVectorIndex</td>\n", + " <td>embedding</td>\n", + " <td>\\nThe population of Berlin in 1949 was approxi...</td>\n", + " <td>8.192025</td>\n", + " <td>3545</td>\n", + " <td>7</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>GPTTreeIndex</td>\n", + " <td>default</td>\n", + " <td>The population of Berlin is approximately 3.7 ...</td>\n", + " <td>12.542335</td>\n", + " <td>5168</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>GPTTreeIndex</td>\n", + " <td>summarize</td>\n", + " <td>\\nThe population of Berlin is approximately 3....</td>\n", + " <td>18.665586</td>\n", + " <td>21617</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>GPTTreeIndex</td>\n", + " <td>embedding</td>\n", + " <td>Approximately 3.7 million people.</td>\n", + " <td>3.573458</td>\n", + " <td>368</td>\n", + " <td>4598</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5</th>\n", + " <td>GPTTreeIndex</td>\n", + " <td>retrieve</td>\n", + " <td>\\nThe population of Berlin is 3.75 million reg...</td>\n", + " <td>2.269598</td>\n", + " <td>1439</td>\n", + " <td>0</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Index Mode \\\n", + "0 GPTSimpleVectorIndex default \n", + "1 GPTSimpleVectorIndex embedding \n", + "2 GPTTreeIndex default \n", + "3 GPTTreeIndex summarize \n", + "4 GPTTreeIndex embedding \n", + "5 GPTTreeIndex retrieve \n", + "\n", + " Output Duration LLM Tokens \\\n", + "0 \\nThe population of Berlin in 1949 was approxi... 52.319133 3545 \n", + "1 \\nThe population of Berlin in 1949 was approxi... 8.192025 3545 \n", + "2 The population of Berlin is approximately 3.7 ... 12.542335 5168 \n", + "3 \\nThe population of Berlin is approximately 3.... 18.665586 21617 \n", + "4 Approximately 3.7 million people. 3.573458 368 \n", + "5 \\nThe population of Berlin is 3.75 million reg... 2.269598 1439 \n", + "\n", + " Embedding Tokens \n", + "0 7 \n", + "1 7 \n", + "2 0 \n", + "3 0 \n", + "4 4598 \n", + "5 0 " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "playground.compare(\"What is the population of Berlin?\")" + ] + }, + { + "cell_type": "markdown", + "id": "8829a829", + "metadata": {}, + "source": [ + "### Initialize with Documents" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dfbc8ade", + "metadata": {}, + "outputs": [], + "source": [ + "# Uses documents in a preset list of indices\n", + "playground = Playground.from_docs(documents=documents)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/query_transformations/HyDEQueryTransformDemo.ipynb b/examples/query_transformations/HyDEQueryTransformDemo.ipynb index 945d504591..a069e823db 100644 --- a/examples/query_transformations/HyDEQueryTransformDemo.ipynb +++ b/examples/query_transformations/HyDEQueryTransformDemo.ipynb @@ -389,7 +389,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.0" } }, "nbformat": 4, diff --git a/examples/struct_indices/PandasIndexDemo.ipynb b/examples/struct_indices/PandasIndexDemo.ipynb index 9395b2403b..32465aec10 100644 --- a/examples/struct_indices/PandasIndexDemo.ipynb +++ b/examples/struct_indices/PandasIndexDemo.ipynb @@ -335,7 +335,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.0" } }, "nbformat": 4, diff --git a/examples/struct_indices/SQLIndexDemo-Context.ipynb b/examples/struct_indices/SQLIndexDemo-Context.ipynb index 66498629f0..8eb00a25d5 100644 --- a/examples/struct_indices/SQLIndexDemo-Context.ipynb +++ b/examples/struct_indices/SQLIndexDemo-Context.ipynb @@ -1,319 +1,319 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "e45f9b60-cd6b-4c15-958f-1feca5438128", - "metadata": {}, - "source": [ - "# SQL Index Demo\n", - "\n", - "Demo where table contains context." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "fbd7317b", - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "import sys\n", - "\n", - "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", - "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "107396a9-4aa7-49b3-9f0f-a755726c19ba", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import GPTSQLStructStoreIndex, SQLDatabase, SimpleDirectoryReader, WikipediaReader, Document\n", - "from llama_index.indices.struct_store import SQLContextContainerBuilder\n", - "from IPython.display import Markdown, display" - ] - }, - { - "cell_type": "markdown", - "id": "77ac8d94-cd61-4869-a32b-0b2e7d18b83f", - "metadata": {}, - "source": [ - "### Load Wikipedia Data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "93301fcf-a52b-430c-98a3-5360e6c8fc4a", - "metadata": {}, - "outputs": [], - "source": [ - "# install wikipedia python package\n", - "!pip install wikipedia" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ba3f7e5e-cdc4-4529-bba9-db45d8457dba", - "metadata": {}, - "outputs": [], - "source": [ - "wiki_docs = WikipediaReader().load_data(pages=['Toronto', 'Berlin', 'Tokyo'])" - ] - }, - { - "cell_type": "markdown", - "id": "461438c8-302d-45c5-8e69-16ad604686d1", - "metadata": {}, - "source": [ - "### Create Database Schema" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a370b266-66f5-4624-bbf9-2ad57f0511f8", - "metadata": {}, - "outputs": [], - "source": [ - "from sqlalchemy import create_engine, MetaData, Table, Column, String, Integer, select, column" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ea24f794-f10b-42e6-922d-9258b7167405", - "metadata": {}, - "outputs": [], - "source": [ - "engine = create_engine(\"sqlite:///:memory:\")\n", - "metadata_obj = MetaData(bind=engine)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b4154b29-7e23-4c26-a507-370a66186ae7", - "metadata": {}, - "outputs": [], - "source": [ - "# create city SQL table\n", - "table_name = \"city_stats\"\n", - "city_stats_table = Table(\n", - " table_name,\n", - " metadata_obj,\n", - " Column(\"city_name\", String(16), primary_key=True),\n", - " Column(\"population\", Integer),\n", - " Column(\"country\", String(16), nullable=False),\n", - ")\n", - "metadata_obj.create_all()" - ] - }, - { - "cell_type": "markdown", - "id": "1c09089a-6bcd-48db-8120-a84c8da3f82e", - "metadata": { - "tags": [] - }, - "source": [ - "### Build Index with Context" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "611319e5-d3c2-4286-a84f-ed2459896c58", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import GPTSQLStructStoreIndex, SQLDatabase\n", - "from llama_index.indices.struct_store import SQLContextContainerBuilder" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3fc2dfab-90ea-4f01-9e28-d21fdc5f0758", - "metadata": {}, - "outputs": [], - "source": [ - "sql_database = SQLDatabase(engine, include_tables=[\"city_stats\"])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "89f6f1d1-a022-43d7-b135-a79ec9407956", - "metadata": {}, - "outputs": [], - "source": [ - "sql_database.table_info" - ] - }, - { - "cell_type": "markdown", - "id": "331ff0ce-9131-4680-a5f2-3f41c73e018e", - "metadata": {}, - "source": [ - "We either set the context manually, or have GPT extract the context for us" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a743f365-21c6-4eae-a2f4-fc72d4199daa", - "metadata": {}, - "outputs": [], - "source": [ - "# manually set context text\n", - "city_stats_text = (\n", - " \"This table gives information regarding the population and country of a given city.\\n\"\n", - " \"The user will query with codewords, where 'foo' corresponds to population and 'bar'\"\n", - " \"corresponds to city.\"\n", - ")\n", - "table_context_dict={\"city_stats\": city_stats_text}\n", - "context_builder = SQLContextContainerBuilder(sql_database, context_dict=table_context_dict)\n", - "context_container = context_builder.build_context_container()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b15ffc74-4a44-40b4-87b1-44f952ebfd58", - "metadata": {}, - "outputs": [], - "source": [ - "index = GPTSQLStructStoreIndex.from_documents(\n", - " wiki_docs, \n", - " sql_database=sql_database, \n", - " table_name=\"city_stats\",\n", - " sql_context_container=context_container\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5cdcc666-4b51-4ed5-92ca-e98e8a01fdd0", - "metadata": {}, - "outputs": [], - "source": [ - "# extract context from a raw Document using GPT\n", - "city_stats_text = (\n", - " \"This table gives information regarding the population and country of a given city.\\n\"\n", - ")\n", - "context_documents_dict = {\"city_stats\": [Document(city_stats_text)]}\n", - "context_builder = SQLContextContainerBuilder.from_documents(\n", - " context_documents_dict, \n", - " sql_database\n", - ")\n", - "context_container = context_builder.build_context_container()\n", - "\n", - "index = GPTSQLStructStoreIndex.from_documents(\n", - " wiki_docs, \n", - " sql_database=sql_database, \n", - " table_name=\"city_stats\",\n", - " sql_context_container=context_container,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b315b8ff-7dd7-4e7d-ac47-8c5a0c3e7ae9", - "metadata": {}, - "outputs": [], - "source": [ - "# view current table\n", - "stmt = select(\n", - " [column(\"city_name\"), column(\"population\"), column(\"country\")]\n", - ").select_from(city_stats_table)\n", - "\n", - "with engine.connect() as connection:\n", - " results = connection.execute(stmt).fetchall()\n", - " print(results)\n" - ] - }, - { - "cell_type": "markdown", - "id": "051a171f-8c97-40ed-ae17-4e3fa3785487", - "metadata": {}, - "source": [ - "### Query Index" - ] - }, - { - "cell_type": "markdown", - "id": "91139712-f232-47e1-9683-cbbd49cd331b", - "metadata": {}, - "source": [ - "Here we show a natural language query, which is translated to a SQL query under the hood." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a76d1816-4f70-4914-80af-7b968c614592", - "metadata": {}, - "outputs": [], - "source": [ - "# set Logging to DEBUG for more detailed outputs\n", - "response = index.query(\"Which city has the highest population?\", mode=\"default\")" - ] - }, - { - "cell_type": "markdown", - "id": "5dc2f7bf-6f6c-42ba-8f42-47afea6606ad", - "metadata": {}, - "source": [ - "We can also use codewords during the NL query! " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d71045c0-7a96-4e86-b38c-c378b7759aa4", - "metadata": {}, - "outputs": [], - "source": [ - "# set Logging to DEBUG for more detailed outputs\n", - "response = index.query(\"Which bar has the highest foo?\", mode=\"default\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e713d73e-73ed-4748-8673-f476899fac8e", - "metadata": {}, - "outputs": [], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.16" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file + "cells": [ + { + "cell_type": "markdown", + "id": "e45f9b60-cd6b-4c15-958f-1feca5438128", + "metadata": {}, + "source": [ + "# SQL Index Demo - Table Context\n", + "\n", + "Demo where table contains context." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "fbd7317b", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "import sys\n", + "\n", + "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", + "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "107396a9-4aa7-49b3-9f0f-a755726c19ba", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import GPTSQLStructStoreIndex, SQLDatabase, SimpleDirectoryReader, WikipediaReader, Document\n", + "from llama_index.indices.struct_store import SQLContextContainerBuilder\n", + "from IPython.display import Markdown, display" + ] + }, + { + "cell_type": "markdown", + "id": "77ac8d94-cd61-4869-a32b-0b2e7d18b83f", + "metadata": {}, + "source": [ + "### Load Wikipedia Data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "93301fcf-a52b-430c-98a3-5360e6c8fc4a", + "metadata": {}, + "outputs": [], + "source": [ + "# install wikipedia python package\n", + "!pip install wikipedia" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba3f7e5e-cdc4-4529-bba9-db45d8457dba", + "metadata": {}, + "outputs": [], + "source": [ + "wiki_docs = WikipediaReader().load_data(pages=['Toronto', 'Berlin', 'Tokyo'])" + ] + }, + { + "cell_type": "markdown", + "id": "461438c8-302d-45c5-8e69-16ad604686d1", + "metadata": {}, + "source": [ + "### Create Database Schema" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a370b266-66f5-4624-bbf9-2ad57f0511f8", + "metadata": {}, + "outputs": [], + "source": [ + "from sqlalchemy import create_engine, MetaData, Table, Column, String, Integer, select, column" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea24f794-f10b-42e6-922d-9258b7167405", + "metadata": {}, + "outputs": [], + "source": [ + "engine = create_engine(\"sqlite:///:memory:\")\n", + "metadata_obj = MetaData(bind=engine)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b4154b29-7e23-4c26-a507-370a66186ae7", + "metadata": {}, + "outputs": [], + "source": [ + "# create city SQL table\n", + "table_name = \"city_stats\"\n", + "city_stats_table = Table(\n", + " table_name,\n", + " metadata_obj,\n", + " Column(\"city_name\", String(16), primary_key=True),\n", + " Column(\"population\", Integer),\n", + " Column(\"country\", String(16), nullable=False),\n", + ")\n", + "metadata_obj.create_all()" + ] + }, + { + "cell_type": "markdown", + "id": "1c09089a-6bcd-48db-8120-a84c8da3f82e", + "metadata": { + "tags": [] + }, + "source": [ + "### Build Index with Context" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "611319e5-d3c2-4286-a84f-ed2459896c58", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import GPTSQLStructStoreIndex, SQLDatabase\n", + "from llama_index.indices.struct_store import SQLContextContainerBuilder" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3fc2dfab-90ea-4f01-9e28-d21fdc5f0758", + "metadata": {}, + "outputs": [], + "source": [ + "sql_database = SQLDatabase(engine, include_tables=[\"city_stats\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "89f6f1d1-a022-43d7-b135-a79ec9407956", + "metadata": {}, + "outputs": [], + "source": [ + "sql_database.table_info" + ] + }, + { + "cell_type": "markdown", + "id": "331ff0ce-9131-4680-a5f2-3f41c73e018e", + "metadata": {}, + "source": [ + "We either set the context manually, or have GPT extract the context for us" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a743f365-21c6-4eae-a2f4-fc72d4199daa", + "metadata": {}, + "outputs": [], + "source": [ + "# manually set context text\n", + "city_stats_text = (\n", + " \"This table gives information regarding the population and country of a given city.\\n\"\n", + " \"The user will query with codewords, where 'foo' corresponds to population and 'bar'\"\n", + " \"corresponds to city.\"\n", + ")\n", + "table_context_dict={\"city_stats\": city_stats_text}\n", + "context_builder = SQLContextContainerBuilder(sql_database, context_dict=table_context_dict)\n", + "context_container = context_builder.build_context_container()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b15ffc74-4a44-40b4-87b1-44f952ebfd58", + "metadata": {}, + "outputs": [], + "source": [ + "index = GPTSQLStructStoreIndex.from_documents(\n", + " wiki_docs, \n", + " sql_database=sql_database, \n", + " table_name=\"city_stats\",\n", + " sql_context_container=context_container\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5cdcc666-4b51-4ed5-92ca-e98e8a01fdd0", + "metadata": {}, + "outputs": [], + "source": [ + "# extract context from a raw Document using GPT\n", + "city_stats_text = (\n", + " \"This table gives information regarding the population and country of a given city.\\n\"\n", + ")\n", + "context_documents_dict = {\"city_stats\": [Document(city_stats_text)]}\n", + "context_builder = SQLContextContainerBuilder.from_documents(\n", + " context_documents_dict, \n", + " sql_database\n", + ")\n", + "context_container = context_builder.build_context_container()\n", + "\n", + "index = GPTSQLStructStoreIndex.from_documents(\n", + " wiki_docs, \n", + " sql_database=sql_database, \n", + " table_name=\"city_stats\",\n", + " sql_context_container=context_container,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b315b8ff-7dd7-4e7d-ac47-8c5a0c3e7ae9", + "metadata": {}, + "outputs": [], + "source": [ + "# view current table\n", + "stmt = select(\n", + " [column(\"city_name\"), column(\"population\"), column(\"country\")]\n", + ").select_from(city_stats_table)\n", + "\n", + "with engine.connect() as connection:\n", + " results = connection.execute(stmt).fetchall()\n", + " print(results)\n" + ] + }, + { + "cell_type": "markdown", + "id": "051a171f-8c97-40ed-ae17-4e3fa3785487", + "metadata": {}, + "source": [ + "### Query Index" + ] + }, + { + "cell_type": "markdown", + "id": "91139712-f232-47e1-9683-cbbd49cd331b", + "metadata": {}, + "source": [ + "Here we show a natural language query, which is translated to a SQL query under the hood." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a76d1816-4f70-4914-80af-7b968c614592", + "metadata": {}, + "outputs": [], + "source": [ + "# set Logging to DEBUG for more detailed outputs\n", + "response = index.query(\"Which city has the highest population?\", mode=\"default\")" + ] + }, + { + "cell_type": "markdown", + "id": "5dc2f7bf-6f6c-42ba-8f42-47afea6606ad", + "metadata": {}, + "source": [ + "We can also use codewords during the NL query! " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d71045c0-7a96-4e86-b38c-c378b7759aa4", + "metadata": {}, + "outputs": [], + "source": [ + "# set Logging to DEBUG for more detailed outputs\n", + "response = index.query(\"Which bar has the highest foo?\", mode=\"default\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e713d73e-73ed-4748-8673-f476899fac8e", + "metadata": {}, + "outputs": [], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/struct_indices/SQLIndexDemo-ManyTables.ipynb b/examples/struct_indices/SQLIndexDemo-ManyTables.ipynb index ba2dd0ce17..c2a0c5067a 100644 --- a/examples/struct_indices/SQLIndexDemo-ManyTables.ipynb +++ b/examples/struct_indices/SQLIndexDemo-ManyTables.ipynb @@ -1,400 +1,400 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "e45f9b60-cd6b-4c15-958f-1feca5438128", - "metadata": {}, - "source": [ - "# SQL Index Demo\n", - "\n", - "Demo where table contains context." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "fbd7317b", - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "import sys\n", - "\n", - "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", - "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "107396a9-4aa7-49b3-9f0f-a755726c19ba", - "metadata": {}, - "outputs": [], - "source": [ - "from gpt_index import GPTSQLStructStoreIndex, SQLDatabase, SimpleDirectoryReader, WikipediaReader, Document\n", - "from gpt_index.indices.struct_store import SQLContextContainerBuilder\n", - "from IPython.display import Markdown, display" - ] - }, - { - "cell_type": "markdown", - "id": "461438c8-302d-45c5-8e69-16ad604686d1", - "metadata": {}, - "source": [ - "### Create Database Schema + Test Data\n", - "\n", - "Here we introduce a toy scenario where there are 100 tables (too big to fit into the prompt)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "a370b266-66f5-4624-bbf9-2ad57f0511f8", - "metadata": {}, - "outputs": [], - "source": [ - "from sqlalchemy import create_engine, MetaData, Table, Column, String, Integer, select, column" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "ea24f794-f10b-42e6-922d-9258b7167405", - "metadata": {}, - "outputs": [], - "source": [ - "engine = create_engine(\"sqlite:///:memory:\")\n", - "metadata_obj = MetaData(bind=engine)" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "b4154b29-7e23-4c26-a507-370a66186ae7", - "metadata": {}, - "outputs": [], - "source": [ - "# create city SQL table\n", - "table_name = \"city_stats\"\n", - "city_stats_table = Table(\n", - " table_name,\n", - " metadata_obj,\n", - " Column(\"city_name\", String(16), primary_key=True),\n", - " Column(\"population\", Integer),\n", - " Column(\"country\", String(16), nullable=False),\n", - ")\n", - "all_table_names = [\"city_stats\"]\n", - "# create a ton of dummy tables\n", - "n = 100\n", - "for i in range(n):\n", - " tmp_table_name = f\"tmp_table_{i}\"\n", - " tmp_table = Table(\n", - " tmp_table_name,\n", - " metadata_obj,\n", - " Column(f\"tmp_field_{i}_1\", String(16), primary_key=True),\n", - " Column(f\"tmp_field_{i}_2\", Integer),\n", - " Column(f\"tmp_field_{i}_3\", String(16), nullable=False),\n", - " )\n", - " all_table_names.append(f\"tmp_table_{i}\")\n", - "\n", - "metadata_obj.create_all()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4768bcb4-c40e-4d5d-8d70-7cb3228b50ab", - "metadata": {}, - "outputs": [], - "source": [ - "# print tables\n", - "metadata_obj.tables.keys()" - ] - }, - { - "cell_type": "markdown", - "id": "4c0eb518-5da3-4215-8280-0776d07806a0", - "metadata": {}, - "source": [ - "We introduce some test data into the `city_stats` table" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "d15192b6-99f9-4f72-b637-82e885ea057f", - "metadata": {}, - "outputs": [], - "source": [ - "from sqlalchemy import insert\n", - "rows = [\n", - " {\"city_name\": \"Toronto\", \"population\": 2930000, \"country\": \"Canada\"},\n", - " {\"city_name\": \"Tokyo\", \"population\": 13960000, \"country\": \"Japan\"},\n", - " {\"city_name\": \"Chicago\", \"population\": 2679000, \"country\": \"United States\"},\n", - " {\"city_name\": \"Seoul\", \"population\": 9776000, \"country\": \"South Korea\"},\n", - "]\n", - "for row in rows:\n", - " stmt = insert(city_stats_table).values(**row)\n", - " with engine.connect() as connection:\n", - " cursor = connection.execute(stmt)" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "bfc2e4a4-e11d-4d8f-bf1f-7f777a1dc6e2", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('Toronto', 2930000, 'Canada'), ('Tokyo', 13960000, 'Japan'), ('Chicago', 2679000, 'United States'), ('Seoul', 9776000, 'South Korea')]\n" - ] - } - ], - "source": [ - "with engine.connect() as connection:\n", - " cursor = connection.exec_driver_sql(\"SELECT * FROM city_stats\")\n", - " print(cursor.fetchall())" - ] - }, - { - "cell_type": "markdown", - "id": "1c09089a-6bcd-48db-8120-a84c8da3f82e", - "metadata": { - "tags": [] - }, - "source": [ - "### Using GPT Index to Store Table Schema Context" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "611319e5-d3c2-4286-a84f-ed2459896c58", - "metadata": {}, - "outputs": [], - "source": [ - "from gpt_index import GPTSQLStructStoreIndex, SQLDatabase, GPTSimpleVectorIndex\n", - "from gpt_index.indices.struct_store import SQLContextContainerBuilder" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "3fc2dfab-90ea-4f01-9e28-d21fdc5f0758", - "metadata": {}, - "outputs": [], - "source": [ - "sql_database = SQLDatabase(engine)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "89f6f1d1-a022-43d7-b135-a79ec9407956", - "metadata": {}, - "outputs": [], - "source": [ - "sql_database.table_info" - ] - }, - { - "cell_type": "markdown", - "id": "331ff0ce-9131-4680-a5f2-3f41c73e018e", - "metadata": {}, - "source": [ - "We dump the table schema information into a vector index. The vector index is stored within the context builder for future use." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1e86d548-a3f4-436a-a754-5247871ebe55", - "metadata": { - "scrolled": true, - "tags": [] - }, - "outputs": [], - "source": [ - "# build a vector index from the table schema information\n", - "context_builder = SQLContextContainerBuilder(sql_database)\n", - "table_schema_index = context_builder.derive_index_from_context(\n", - " GPTSimpleVectorIndex,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a743f365-21c6-4eae-a2f4-fc72d4199daa", - "metadata": {}, - "outputs": [], - "source": [ - "# NOTE: not ingesting any unstructured documents atm\n", - "index = GPTSQLStructStoreIndex.from_documents(\n", - " [],\n", - " sql_database=sql_database, \n", - " table_name=\"city_stats\",\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "051a171f-8c97-40ed-ae17-4e3fa3785487", - "metadata": {}, - "source": [ - "### Query Index" - ] - }, - { - "cell_type": "markdown", - "id": "91139712-f232-47e1-9683-cbbd49cd331b", - "metadata": {}, - "source": [ - "Here we show a natural language query. \n", - "1. We first query for the right table schema. Note that we build a context container during query-time.\n", - "2. Given this context container, we execute the NL query against the db." - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "id": "eabededd-3c17-45b7-aabc-06a2457bc3cb", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "INFO:root:> [query] Total LLM token usage: 135 tokens\n", - "> [query] Total LLM token usage: 135 tokens\n", - "INFO:root:> [query] Total embedding token usage: 23 tokens\n", - "> [query] Total embedding token usage: 23 tokens\n", - "\n", - "Table 'city_stats':\n", - "city_name (VARCHAR(16)), population (INTEGER), country (VARCHAR(16))\n" - ] - } - ], - "source": [ - "query_str = \"Which city has the highest population?\"\n", - "context_builder.query_index_for_context(table_schema_index, query_str, store_context_str=True)\n", - "context_container = context_builder.build_context_container()" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "a80ee856-6ac3-4b37-b390-be583024bed4", - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "<b>\n", - "Table 'city_stats':\n", - "city_name (VARCHAR(16)), population (INTEGER), country (VARCHAR(16))</b>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(Markdown(f\"<b>{context_container.context_str}</b>\"))" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "64671ddc-9768-40c2-8898-ab7c0cf10917", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "INFO:root:> Table desc str: \n", - "Table 'city_stats':\n", - "city_name (VARCHAR(16)), population (INTEGER), country (VARCHAR(16))\n", - "> Table desc str: \n", - "Table 'city_stats':\n", - "city_name (VARCHAR(16)), population (INTEGER), country (VARCHAR(16))\n", - "INFO:root:> [query] Total LLM token usage: 134 tokens\n", - "> [query] Total LLM token usage: 134 tokens\n", - "INFO:root:> [query] Total embedding token usage: 0 tokens\n", - "> [query] Total embedding token usage: 0 tokens\n" - ] - } - ], - "source": [ - "response = index.query(query_str, sql_context_container=context_container)" - ] - }, - { - "cell_type": "markdown", - "id": "5dc2f7bf-6f6c-42ba-8f42-47afea6606ad", - "metadata": {}, - "source": [ - "We can also use codewords during the NL query! " - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "id": "25c11645-56bd-433a-85f4-420413f8970d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\"[('Tokyo',)]\"" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "str(response)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3f72abc6-54d7-4f85-abf8-32978d94f558", - "metadata": {}, - "outputs": [], - "source": [ - "response.extra_info" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "gpt_retrieve_venv", - "language": "python", - "name": "gpt_retrieve_venv" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.16" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file + "cells": [ + { + "cell_type": "markdown", + "id": "e45f9b60-cd6b-4c15-958f-1feca5438128", + "metadata": {}, + "source": [ + "# SQL Index Demo - Many Tables\n", + "\n", + "Demo where table contains context." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "fbd7317b", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "import sys\n", + "\n", + "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", + "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "107396a9-4aa7-49b3-9f0f-a755726c19ba", + "metadata": {}, + "outputs": [], + "source": [ + "from gpt_index import GPTSQLStructStoreIndex, SQLDatabase, SimpleDirectoryReader, WikipediaReader, Document\n", + "from gpt_index.indices.struct_store import SQLContextContainerBuilder\n", + "from IPython.display import Markdown, display" + ] + }, + { + "cell_type": "markdown", + "id": "461438c8-302d-45c5-8e69-16ad604686d1", + "metadata": {}, + "source": [ + "### Create Database Schema + Test Data\n", + "\n", + "Here we introduce a toy scenario where there are 100 tables (too big to fit into the prompt)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "a370b266-66f5-4624-bbf9-2ad57f0511f8", + "metadata": {}, + "outputs": [], + "source": [ + "from sqlalchemy import create_engine, MetaData, Table, Column, String, Integer, select, column" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "ea24f794-f10b-42e6-922d-9258b7167405", + "metadata": {}, + "outputs": [], + "source": [ + "engine = create_engine(\"sqlite:///:memory:\")\n", + "metadata_obj = MetaData(bind=engine)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "b4154b29-7e23-4c26-a507-370a66186ae7", + "metadata": {}, + "outputs": [], + "source": [ + "# create city SQL table\n", + "table_name = \"city_stats\"\n", + "city_stats_table = Table(\n", + " table_name,\n", + " metadata_obj,\n", + " Column(\"city_name\", String(16), primary_key=True),\n", + " Column(\"population\", Integer),\n", + " Column(\"country\", String(16), nullable=False),\n", + ")\n", + "all_table_names = [\"city_stats\"]\n", + "# create a ton of dummy tables\n", + "n = 100\n", + "for i in range(n):\n", + " tmp_table_name = f\"tmp_table_{i}\"\n", + " tmp_table = Table(\n", + " tmp_table_name,\n", + " metadata_obj,\n", + " Column(f\"tmp_field_{i}_1\", String(16), primary_key=True),\n", + " Column(f\"tmp_field_{i}_2\", Integer),\n", + " Column(f\"tmp_field_{i}_3\", String(16), nullable=False),\n", + " )\n", + " all_table_names.append(f\"tmp_table_{i}\")\n", + "\n", + "metadata_obj.create_all()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4768bcb4-c40e-4d5d-8d70-7cb3228b50ab", + "metadata": {}, + "outputs": [], + "source": [ + "# print tables\n", + "metadata_obj.tables.keys()" + ] + }, + { + "cell_type": "markdown", + "id": "4c0eb518-5da3-4215-8280-0776d07806a0", + "metadata": {}, + "source": [ + "We introduce some test data into the `city_stats` table" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "d15192b6-99f9-4f72-b637-82e885ea057f", + "metadata": {}, + "outputs": [], + "source": [ + "from sqlalchemy import insert\n", + "rows = [\n", + " {\"city_name\": \"Toronto\", \"population\": 2930000, \"country\": \"Canada\"},\n", + " {\"city_name\": \"Tokyo\", \"population\": 13960000, \"country\": \"Japan\"},\n", + " {\"city_name\": \"Chicago\", \"population\": 2679000, \"country\": \"United States\"},\n", + " {\"city_name\": \"Seoul\", \"population\": 9776000, \"country\": \"South Korea\"},\n", + "]\n", + "for row in rows:\n", + " stmt = insert(city_stats_table).values(**row)\n", + " with engine.connect() as connection:\n", + " cursor = connection.execute(stmt)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "bfc2e4a4-e11d-4d8f-bf1f-7f777a1dc6e2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('Toronto', 2930000, 'Canada'), ('Tokyo', 13960000, 'Japan'), ('Chicago', 2679000, 'United States'), ('Seoul', 9776000, 'South Korea')]\n" + ] + } + ], + "source": [ + "with engine.connect() as connection:\n", + " cursor = connection.exec_driver_sql(\"SELECT * FROM city_stats\")\n", + " print(cursor.fetchall())" + ] + }, + { + "cell_type": "markdown", + "id": "1c09089a-6bcd-48db-8120-a84c8da3f82e", + "metadata": { + "tags": [] + }, + "source": [ + "### Using GPT Index to Store Table Schema Context" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "611319e5-d3c2-4286-a84f-ed2459896c58", + "metadata": {}, + "outputs": [], + "source": [ + "from gpt_index import GPTSQLStructStoreIndex, SQLDatabase, GPTSimpleVectorIndex\n", + "from gpt_index.indices.struct_store import SQLContextContainerBuilder" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "3fc2dfab-90ea-4f01-9e28-d21fdc5f0758", + "metadata": {}, + "outputs": [], + "source": [ + "sql_database = SQLDatabase(engine)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "89f6f1d1-a022-43d7-b135-a79ec9407956", + "metadata": {}, + "outputs": [], + "source": [ + "sql_database.table_info" + ] + }, + { + "cell_type": "markdown", + "id": "331ff0ce-9131-4680-a5f2-3f41c73e018e", + "metadata": {}, + "source": [ + "We dump the table schema information into a vector index. The vector index is stored within the context builder for future use." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1e86d548-a3f4-436a-a754-5247871ebe55", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "# build a vector index from the table schema information\n", + "context_builder = SQLContextContainerBuilder(sql_database)\n", + "table_schema_index = context_builder.derive_index_from_context(\n", + " GPTSimpleVectorIndex,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a743f365-21c6-4eae-a2f4-fc72d4199daa", + "metadata": {}, + "outputs": [], + "source": [ + "# NOTE: not ingesting any unstructured documents atm\n", + "index = GPTSQLStructStoreIndex.from_documents(\n", + " [],\n", + " sql_database=sql_database, \n", + " table_name=\"city_stats\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "051a171f-8c97-40ed-ae17-4e3fa3785487", + "metadata": {}, + "source": [ + "### Query Index" + ] + }, + { + "cell_type": "markdown", + "id": "91139712-f232-47e1-9683-cbbd49cd331b", + "metadata": {}, + "source": [ + "Here we show a natural language query. \n", + "1. We first query for the right table schema. Note that we build a context container during query-time.\n", + "2. Given this context container, we execute the NL query against the db." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "eabededd-3c17-45b7-aabc-06a2457bc3cb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:root:> [query] Total LLM token usage: 135 tokens\n", + "> [query] Total LLM token usage: 135 tokens\n", + "INFO:root:> [query] Total embedding token usage: 23 tokens\n", + "> [query] Total embedding token usage: 23 tokens\n", + "\n", + "Table 'city_stats':\n", + "city_name (VARCHAR(16)), population (INTEGER), country (VARCHAR(16))\n" + ] + } + ], + "source": [ + "query_str = \"Which city has the highest population?\"\n", + "context_builder.query_index_for_context(table_schema_index, query_str, store_context_str=True)\n", + "context_container = context_builder.build_context_container()" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "a80ee856-6ac3-4b37-b390-be583024bed4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "<b>\n", + "Table 'city_stats':\n", + "city_name (VARCHAR(16)), population (INTEGER), country (VARCHAR(16))</b>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(Markdown(f\"<b>{context_container.context_str}</b>\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "64671ddc-9768-40c2-8898-ab7c0cf10917", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:root:> Table desc str: \n", + "Table 'city_stats':\n", + "city_name (VARCHAR(16)), population (INTEGER), country (VARCHAR(16))\n", + "> Table desc str: \n", + "Table 'city_stats':\n", + "city_name (VARCHAR(16)), population (INTEGER), country (VARCHAR(16))\n", + "INFO:root:> [query] Total LLM token usage: 134 tokens\n", + "> [query] Total LLM token usage: 134 tokens\n", + "INFO:root:> [query] Total embedding token usage: 0 tokens\n", + "> [query] Total embedding token usage: 0 tokens\n" + ] + } + ], + "source": [ + "response = index.query(query_str, sql_context_container=context_container)" + ] + }, + { + "cell_type": "markdown", + "id": "5dc2f7bf-6f6c-42ba-8f42-47afea6606ad", + "metadata": {}, + "source": [ + "We can also use codewords during the NL query! " + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "25c11645-56bd-433a-85f4-420413f8970d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"[('Tokyo',)]\"" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "str(response)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3f72abc6-54d7-4f85-abf8-32978d94f558", + "metadata": {}, + "outputs": [], + "source": [ + "response.extra_info" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/struct_indices/SQLIndexDemo.ipynb b/examples/struct_indices/SQLIndexDemo.ipynb index 29b0e5eaf0..4deb993677 100644 --- a/examples/struct_indices/SQLIndexDemo.ipynb +++ b/examples/struct_indices/SQLIndexDemo.ipynb @@ -5,7 +5,7 @@ "id": "e45f9b60-cd6b-4c15-958f-1feca5438128", "metadata": {}, "source": [ - "# SQL Index Demo" + "# SQL Index Demo - Basic" ] }, { @@ -452,7 +452,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.0" } }, "nbformat": 4, diff --git a/examples/test_wiki/TestNYC-Benchmark-GPT4.ipynb b/examples/test_wiki/TestNYC-Benchmark-GPT4.ipynb index 70eb75082d..bd9b68b8a6 100644 --- a/examples/test_wiki/TestNYC-Benchmark-GPT4.ipynb +++ b/examples/test_wiki/TestNYC-Benchmark-GPT4.ipynb @@ -1,1700 +1,1708 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": 17, - "id": "9080b39e", - "metadata": {}, - "outputs": [], - "source": [ - "import logging, sys\n", - "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", - "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))\n", - "\n", - "# Uncomment if you want to temporarily disable logger\n", - "logging.disable(sys.maxsize)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "7de92ce3", - "metadata": {}, - "outputs": [], - "source": [ - "# NOTE: only necessary for querying with `use_async=True` in notebook\n", - "import nest_asyncio\n", - "nest_asyncio.apply()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "f1a9eb90-335c-4214-8bb6-fd1edbe3ccbd", - "metadata": {}, - "outputs": [], - "source": [ - "# My OpenAI Key\n", - "import os\n", - "os.environ['OPENAI_API_KEY'] = \"\"" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "8d0b2364-4806-4656-81e7-3f6e4b910b5b", - "metadata": {}, - "outputs": [], - "source": [ - "from gpt_index import GPTTreeIndex, SimpleDirectoryReader, LLMPredictor, GPTSimpleVectorIndex, GPTListIndex, Prompt, ServiceContext\n", - "from gpt_index.indices.base import BaseGPTIndex\n", - "from gpt_index.langchain_helpers.text_splitter import TokenTextSplitter\n", - "from langchain.chat_models import ChatOpenAI\n", - "from langchain.llms import OpenAI\n", - "from gpt_index.response.schema import Response\n", - "import pandas as pd\n", - "from typing import Tuple" - ] - }, - { - "cell_type": "markdown", - "id": "707662e5", - "metadata": {}, - "source": [ - "# Setup data" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "b4b4387b-413e-4016-ba1e-88b3d9410a38", - "metadata": {}, - "outputs": [], - "source": [ - "# fetch \"New York City\" page from Wikipedia\n", - "from pathlib import Path\n", - "\n", - "import requests\n", - "response = requests.get(\n", - " 'https://en.wikipedia.org/w/api.php',\n", - " params={\n", - " 'action': 'query',\n", - " 'format': 'json',\n", - " 'titles': 'New York City',\n", - " 'prop': 'extracts',\n", - " # 'exintro': True,\n", - " 'explaintext': True,\n", - " }\n", - ").json()\n", - "page = next(iter(response['query']['pages'].values()))\n", - "nyc_text = page['extract']\n", - "\n", - "data_path = Path('data')\n", - "if not data_path.exists():\n", - " Path.mkdir(data_path)\n", - "\n", - "with open('data/nyc_text.txt', 'w') as fp:\n", - " fp.write(nyc_text)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "523fbebe-6e79-4d7b-b400-188b711a0e8f", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "DEBUG:gpt_index.readers.file.base:> [SimpleDirectoryReader] Total files added: 1\n", - "> [SimpleDirectoryReader] Total files added: 1\n" - ] - } - ], - "source": [ - "documents = SimpleDirectoryReader('data').load_data()" - ] - }, - { - "cell_type": "markdown", - "id": "f4a269bd", - "metadata": {}, - "source": [ - "# Setup benchmark" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "62f01ddf", - "metadata": {}, - "outputs": [], - "source": [ - "from dataclasses import dataclass\n", - "from typing import List" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "4ff13cd4", - "metadata": {}, - "outputs": [], - "source": [ - "@dataclass\n", - "class TestCase:\n", - " query: str \n", - " must_contain: List[str]" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "9c653b72", - "metadata": {}, - "outputs": [], - "source": [ - "@dataclass\n", - "class TestOutcome:\n", - " test: TestCase\n", - " response: Response\n", - " \n", - " @property\n", - " def is_correct_response(self) -> bool:\n", - " is_correct = True\n", - " for answer in self.test.must_contain:\n", - " if answer not in self.response.response:\n", - " is_correct = False\n", - " return is_correct\n", - " \n", - " @property\n", - " def is_correct_source(self) -> bool:\n", - " is_correct = True\n", - " for answer in self.test.must_contain:\n", - " if all(answer not in node.source_text for node in self.response.source_nodes):\n", - " is_correct = False\n", - " return is_correct" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "b9cd18ae", - "metadata": {}, - "outputs": [], - "source": [ - "class Benchmark:\n", - " def __init__(self, tests: List[TestCase]) -> None:\n", - " self._tests = tests\n", - " \n", - " def test(self, index: BaseGPTIndex, llm_predictor: LLMPredictor, **kwargs) -> List[TestOutcome]:\n", - " outcomes: List[TestOutcome] = []\n", - " service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)\n", - " for test in self._tests:\n", - " response = index.query(\n", - " test.query,\n", - " service_context=service_context,\n", - " **kwargs\n", - " )\n", - " outcome = TestOutcome(test=test, response=response)\n", - " outcomes.append(outcome)\n", - " return outcomes" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "8edad985", - "metadata": {}, - "outputs": [], - "source": [ - "def analyze_outcome(outcomes: List[TestOutcome]) -> None:\n", - " rows = []\n", - " for outcome in outcomes:\n", - " row = [outcome.test.query, outcome.is_correct_response, outcome.is_correct_source]\n", - " rows.append(row)\n", - " df = pd.DataFrame(rows, columns=['Test Query', 'Correct Response', 'Correct Source'])\n", - " return df" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "4bc38077", - "metadata": {}, - "outputs": [], - "source": [ - "test_battle = TestCase(\n", - " query=\"What battles took place in New York City in the American Revolution?\",\n", - " must_contain=[\"Battle of Long Island\"]\n", - ")\n", - "\n", - "test_mayor = TestCase(\n", - " query='Who was elected as the mayor after the Great Depression?',\n", - " must_contain=[\"Fiorello La Guardia\"]\n", - ")\n", - "\n", - "test_tourists = TestCase(\n", - " query='How many tourists visited New York City in 2019?',\n", - " must_contain=['66.6 million']\n", - ")\n", - "test_airport = TestCase(\n", - " query='What are the airports in New York City?',\n", - " must_contain=['LaGuardia Airport']\n", - ")\n", - "test_visit = TestCase(\n", - " query='When was the first documented visit into New York Harbor?',\n", - " must_contain=['1524']\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "f159dadb", - "metadata": {}, - "outputs": [], - "source": [ - "bm = Benchmark([\n", - " test_battle,\n", - " test_mayor,\n", - " test_tourists,\n", - " test_airport,\n", - " test_visit,\n", - "])" - ] - }, - { - "cell_type": "markdown", - "id": "65ddbd56", - "metadata": {}, - "source": [ - "# LLM based evaluation" - ] - }, - { - "cell_type": "code", - "execution_count": 592, - "id": "ed175de5", - "metadata": {}, - "outputs": [], - "source": [ - "from gpt_index.prompts.prompt_type import PromptType\n", - "\n", - "EVAL_PROMPT_TMPL = (\n", - " \"Given the question below. \\n\"\n", - " \"---------------------\\n\"\n", - " \"{query_str}\"\n", - " \"\\n---------------------\\n\"\n", - " \"Decide if the following retreived context is relevant. \\n\"\n", - " \"\\n---------------------\\n\"\n", - " \"{context_str}\"\n", - " \"\\n---------------------\\n\"\n", - " \"Then decide if the answer is correct. \\n\"\n", - " \"\\n---------------------\\n\"\n", - " \"{answer_str}\"\n", - " \"\\n---------------------\\n\"\n", - " \"Answer in the following format:\\n\"\n", - " \"'Context is relevant: <True>\\nAnswer is correct: <True>' \"\n", - " \"and explain why.\"\n", - ")\n", - "\n", - "class EvalPrompt(Prompt):\n", - " prompt_type: PromptType = PromptType.CUSTOM\n", - " input_variables: List[str] = [\"query_str\", 'context_str', 'answer_str']\n", - "\n", - "DEFAULT_EVAL_PROMPT = EvalPrompt(EVAL_PROMPT_TMPL)" - ] - }, - { - "cell_type": "code", - "execution_count": 593, - "id": "93c498b6", - "metadata": {}, - "outputs": [], - "source": [ - "import re\n", - "def extract_eval_result(result_str: str):\n", - " boolean_pattern = r\"(True|False)\"\n", - " matches = re.findall(boolean_pattern, result_str)\n", - " return [match == \"True\" for match in matches] " - ] - }, - { - "cell_type": "code", - "execution_count": 594, - "id": "4c8109c3", - "metadata": {}, - "outputs": [], - "source": [ - "def analyze_outcome_llm_single(outcome: TestOutcome, llm_predictor: LLMPredictor) -> Tuple[bool, bool]:\n", - " try:\n", - " source_text = outcome.response.source_nodes[0].source_text\n", - " except:\n", - " source_text = \"Failed to retrieve any context\"\n", - " result_str, _ = llm_predictor.predict(\n", - " DEFAULT_EVAL_PROMPT,\n", - " query_str=outcome.test.query,\n", - " context_str=source_text,\n", - " answer_str=outcome.response.response\n", - " )\n", - " is_context_relevant, is_answer_correct = extract_eval_result(result_str)\n", - " return is_answer_correct, is_context_relevant, result_str\n", - "\n", - "def analyze_outcome_llm(outcomes: List[TestOutcome], llm_predictor: LLMPredictor) -> None:\n", - " rows = []\n", - " for outcome in outcomes:\n", - " is_correct_response, is_correct_source, result_str = analyze_outcome_llm_single(outcome, llm_predictor)\n", - " row = [outcome.test.query, is_correct_response, is_correct_source, result_str]\n", - " rows.append(row)\n", - " df = pd.DataFrame(rows, columns=['Test Query', 'Correct Response (LLM)', 'Correct Source (LLM)', 'Eval (LLM)'])\n", - " return df" - ] - }, - { - "cell_type": "markdown", - "id": "5a9f43a6", - "metadata": {}, - "source": [ - "# Build Indices" - ] - }, - { - "cell_type": "code", - "execution_count": 643, - "id": "790bad05", - "metadata": {}, - "outputs": [], - "source": [ - "vector_index = GPTSimpleVectorIndex.from_documents(\n", - " documents, \n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 473, - "id": "64c970e0", - "metadata": {}, - "outputs": [], - "source": [ - "list_index = GPTListIndex.from_documents(\n", - " documents, \n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 468, - "id": "bacc4f1c", - "metadata": {}, - "outputs": [], - "source": [ - "tree_index = GPTTreeIndex.from_documents(documents)" - ] - }, - { - "cell_type": "code", - "execution_count": 632, - "id": "a600d4de", - "metadata": {}, - "outputs": [], - "source": [ - "# Save indices\n", - "vector_index.save_to_disk('vector_index.json')\n", - "tree_index.save_to_disk('tree_index.json')\n", - "list_index.save_to_disk('list_index.json')" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "5eec265d-211b-4f26-b05b-5b4e7072bc6e", - "metadata": {}, - "outputs": [], - "source": [ - "# Load indices\n", - "tree_index = GPTTreeIndex.load_from_disk('tree_index.json')\n", - "list_index = GPTListIndex.load_from_disk('list_index.json')\n", - "vector_index = GPTSimpleVectorIndex.load_from_disk('vector_index.json')" - ] - }, - { - "cell_type": "markdown", - "id": "5b2e7fdd", - "metadata": {}, - "source": [ - "# Create LLMPredictors" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "4766ac56-ac8d-4f33-b994-6901964241ea", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# gpt-4\n", - "llm_predictor_gpt4 = LLMPredictor(\n", - " llm=ChatOpenAI(temperature=0, model_name=\"gpt-4\")\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 169, - "id": "c8692cf6", - "metadata": {}, - "outputs": [], - "source": [ - "# gpt-3 (text-davinci-003)\n", - "llm_predictor_gpt3 = LLMPredictor(llm=OpenAI(temperature=0, model_name=\"text-davinci-003\"))" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "fb74ec62", - "metadata": {}, - "outputs": [], - "source": [ - "# chatgpt (gpt-3.5-turbo)\n", - "llm_predictor_chatgpt = LLMPredictor(llm=ChatOpenAI(temperature=0, model_name=\"gpt-3.5-turbo\"))" - ] - }, - { - "cell_type": "markdown", - "id": "1354f668", - "metadata": {}, - "source": [ - "# Benchmarking " - ] - }, - { - "cell_type": "markdown", - "id": "01124a3f", - "metadata": {}, - "source": [ - "### Tree Index + GPT4" - ] - }, - { - "cell_type": "code", - "execution_count": 583, - "id": "6f418554", - "metadata": {}, - "outputs": [], - "source": [ - "outcomes_tree_gpt4 = bm.test(tree_index, llm_predictor_gpt4)" - ] - }, - { - "cell_type": "code", - "execution_count": 584, - "id": "de98ceba", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>Test Query</th>\n", - " <th>Correct Response</th>\n", - " <th>Correct Source</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>What battles took place in New York City in th...</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>Who was elected as the mayor after the Great D...</td>\n", - " <td>False</td>\n", - " <td>False</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>How many tourists visited New York City in 2019?</td>\n", - " <td>False</td>\n", - " <td>False</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>What are the airports in New York City?</td>\n", - " <td>False</td>\n", - " <td>False</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>When was the first documented visit into New Y...</td>\n", - " <td>False</td>\n", - " <td>False</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " Test Query Correct Response \\\n", - "0 What battles took place in New York City in th... True \n", - "1 Who was elected as the mayor after the Great D... False \n", - "2 How many tourists visited New York City in 2019? False \n", - "3 What are the airports in New York City? False \n", - "4 When was the first documented visit into New Y... False \n", - "\n", - " Correct Source \n", - "0 True \n", - "1 False \n", - "2 False \n", - "3 False \n", - "4 False " - ] - }, - "execution_count": 584, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "analyze_outcome(outcomes_tree_gpt4)" - ] - }, - { - "cell_type": "markdown", - "id": "f5ef33a0", - "metadata": {}, - "source": [ - "### Tree Index + GPT3" - ] - }, - { - "cell_type": "code", - "execution_count": 549, - "id": "ba871d2a", - "metadata": {}, - "outputs": [], - "source": [ - "outcomes_tree_gpt3 = bm.test(tree_index, llm_predictor_gpt3)" - ] - }, - { - "cell_type": "code", - "execution_count": 550, - "id": "7d4c6930", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>Test Query</th>\n", - " <th>Correct Response</th>\n", - " <th>Correct Source</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>What battles took place in New York City in th...</td>\n", - " <td>True</td>\n", - " <td>False</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>Who was elected as the mayor after the Great D...</td>\n", - " <td>False</td>\n", - " <td>False</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>How many tourists visited New York City in 2019?</td>\n", - " <td>False</td>\n", - " <td>False</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>What are the airports in New York City?</td>\n", - " <td>True</td>\n", - " <td>False</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>When was the first documented visit into New Y...</td>\n", - " <td>True</td>\n", - " <td>False</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " Test Query Correct Response \\\n", - "0 What battles took place in New York City in th... True \n", - "1 Who was elected as the mayor after the Great D... False \n", - "2 How many tourists visited New York City in 2019? False \n", - "3 What are the airports in New York City? True \n", - "4 When was the first documented visit into New Y... True \n", - "\n", - " Correct Source \n", - "0 False \n", - "1 False \n", - "2 False \n", - "3 False \n", - "4 False " - ] - }, - "execution_count": 550, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "analyze_outcome(outcomes_tree_gpt3)" - ] - }, - { - "cell_type": "markdown", - "id": "30a9ba34", - "metadata": {}, - "source": [ - "### List Index + GPT4" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "bc0f05d1", - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "outcomes_list_gpt4 = bm.test(list_index, llm_predictor_gpt4, response_mode=\"tree_summarize\", use_async=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "2d2e879d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>Test Query</th>\n", - " <th>Correct Response</th>\n", - " <th>Correct Source</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>What battles took place in New York City in th...</td>\n", - " <td>False</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>Who was elected as the mayor after the Great D...</td>\n", - " <td>False</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>How many tourists visited New York City in 2019?</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>What are the airports in New York City?</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>When was the first documented visit into New Y...</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " Test Query Correct Response \\\n", - "0 What battles took place in New York City in th... False \n", - "1 Who was elected as the mayor after the Great D... False \n", - "2 How many tourists visited New York City in 2019? True \n", - "3 What are the airports in New York City? True \n", - "4 When was the first documented visit into New Y... True \n", - "\n", - " Correct Source \n", - "0 True \n", - "1 True \n", - "2 True \n", - "3 True \n", - "4 True " - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "analyze_outcome(outcomes_list_gpt4)" - ] - }, - { - "cell_type": "markdown", - "id": "8cba793c", - "metadata": {}, - "source": [ - "### List Index + GPT3" - ] - }, - { - "cell_type": "code", - "execution_count": 501, - "id": "66cfa3fa", - "metadata": {}, - "outputs": [], - "source": [ - "outcomes_list_gpt3 = bm.test(list_index, llm_predictor_gpt3, response_mode=\"tree_summarize\", use_async=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 502, - "id": "06bc98d8", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>Test Query</th>\n", - " <th>Correct Response</th>\n", - " <th>Correct Source</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>What battles took place in New York City in th...</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>Who was elected as the mayor during the Great ...</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>How many tourists visited New York City in 2019?</td>\n", - " <td>False</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>What are the airports in New York City?</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>When was the first documented visit into New Y...</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " Test Query Correct Response \\\n", - "0 What battles took place in New York City in th... True \n", - "1 Who was elected as the mayor during the Great ... True \n", - "2 How many tourists visited New York City in 2019? False \n", - "3 What are the airports in New York City? True \n", - "4 When was the first documented visit into New Y... True \n", - "\n", - " Correct Source \n", - "0 True \n", - "1 True \n", - "2 True \n", - "3 True \n", - "4 True " - ] - }, - "execution_count": 502, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "analyze_outcome(outcomes_list_gpt3)" - ] - }, - { - "cell_type": "markdown", - "id": "c4d0b3eb", - "metadata": {}, - "source": [ - "### List Index + ChatGPT" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "f146c74e", - "metadata": {}, - "outputs": [], - "source": [ - "outcomes_list_chatgpt = bm.test(list_index, llm_predictor_chatgpt, response_mode=\"tree_summarize\", use_async=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "8eb9d392", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>Test Query</th>\n", - " <th>Correct Response</th>\n", - " <th>Correct Source</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>What battles took place in New York City in th...</td>\n", - " <td>False</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>Who was elected as the mayor after the Great D...</td>\n", - " <td>False</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>How many tourists visited New York City in 2019?</td>\n", - " <td>False</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>What are the airports in New York City?</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>When was the first documented visit into New Y...</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " Test Query Correct Response \\\n", - "0 What battles took place in New York City in th... False \n", - "1 Who was elected as the mayor after the Great D... False \n", - "2 How many tourists visited New York City in 2019? False \n", - "3 What are the airports in New York City? True \n", - "4 When was the first documented visit into New Y... True \n", - "\n", - " Correct Source \n", - "0 True \n", - "1 True \n", - "2 True \n", - "3 True \n", - "4 True " - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "analyze_outcome(outcomes_list_chatgpt)" - ] - }, - { - "cell_type": "markdown", - "id": "38fc1438", - "metadata": {}, - "source": [ - "### Vector Store Index + GPT4 " - ] - }, - { - "cell_type": "code", - "execution_count": 487, - "id": "5349d1e7", - "metadata": {}, - "outputs": [], - "source": [ - "outcomes_vector_gpt4 = bm.test(vector_index, llm_predictor_gpt4)" - ] - }, - { - "cell_type": "code", - "execution_count": 488, - "id": "7fc53e19", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>Test Query</th>\n", - " <th>Correct Response</th>\n", - " <th>Correct Source</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>What battles took place in New York City in th...</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>Who was elected as the mayor during the Great ...</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>How many tourists visited New York City in 2019?</td>\n", - " <td>False</td>\n", - " <td>False</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>What are the airports in New York City?</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>When was the first documented visit into New Y...</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " Test Query Correct Response \\\n", - "0 What battles took place in New York City in th... True \n", - "1 Who was elected as the mayor during the Great ... True \n", - "2 How many tourists visited New York City in 2019? False \n", - "3 What are the airports in New York City? True \n", - "4 When was the first documented visit into New Y... True \n", - "\n", - " Correct Source \n", - "0 True \n", - "1 True \n", - "2 False \n", - "3 True \n", - "4 True " - ] - }, - "execution_count": 488, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "analyze_outcome(outcomes_vector_gpt4)" - ] - }, - { - "cell_type": "markdown", - "id": "70eb711f", - "metadata": {}, - "source": [ - "### Vector Store Index + GPT3" - ] - }, - { - "cell_type": "code", - "execution_count": 644, - "id": "e35ebdf9", - "metadata": {}, - "outputs": [], - "source": [ - "outcomes_vector_gpt3 = bm.test(vector_index, llm_predictor_gpt3)" - ] - }, - { - "cell_type": "code", - "execution_count": 645, - "id": "95c49697", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>Test Query</th>\n", - " <th>Correct Response</th>\n", - " <th>Correct Source</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>What battles took place in New York City in th...</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>Who was elected as the mayor after the Great D...</td>\n", - " <td>True</td>\n", - " <td>False</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>How many tourists visited New York City in 2019?</td>\n", - " <td>False</td>\n", - " <td>False</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>What are the airports in New York City?</td>\n", - " <td>True</td>\n", - " <td>False</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>When was the first documented visit into New Y...</td>\n", - " <td>True</td>\n", - " <td>False</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " Test Query Correct Response \\\n", - "0 What battles took place in New York City in th... True \n", - "1 Who was elected as the mayor after the Great D... True \n", - "2 How many tourists visited New York City in 2019? False \n", - "3 What are the airports in New York City? True \n", - "4 When was the first documented visit into New Y... True \n", - "\n", - " Correct Source \n", - "0 True \n", - "1 False \n", - "2 False \n", - "3 False \n", - "4 False " - ] - }, - "execution_count": 645, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "analyze_outcome(outcomes_vector_gpt3)" - ] - }, - { - "cell_type": "markdown", - "id": "a36ba2ee", - "metadata": {}, - "source": [ - "# LLM based Evaluation" - ] - }, - { - "cell_type": "code", - "execution_count": 646, - "id": "59ff561c", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>Test Query</th>\n", - " <th>Correct Response</th>\n", - " <th>Correct Source</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>What battles took place in New York City in th...</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>Who was elected as the mayor after the Great D...</td>\n", - " <td>True</td>\n", - " <td>False</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>How many tourists visited New York City in 2019?</td>\n", - " <td>False</td>\n", - " <td>False</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>What are the airports in New York City?</td>\n", - " <td>True</td>\n", - " <td>False</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>When was the first documented visit into New Y...</td>\n", - " <td>True</td>\n", - " <td>False</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " Test Query Correct Response \\\n", - "0 What battles took place in New York City in th... True \n", - "1 Who was elected as the mayor after the Great D... True \n", - "2 How many tourists visited New York City in 2019? False \n", - "3 What are the airports in New York City? True \n", - "4 When was the first documented visit into New Y... True \n", - "\n", - " Correct Source \n", - "0 True \n", - "1 False \n", - "2 False \n", - "3 False \n", - "4 False " - ] - }, - "execution_count": 646, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "analyze_outcome(outcomes_vector_gpt3)" - ] - }, - { - "cell_type": "code", - "execution_count": 647, - "id": "e4ffaca6", - "metadata": {}, - "outputs": [], - "source": [ - "eval_gpt4 = analyze_outcome_llm(outcomes_vector_gpt3, llm_predictor_gpt4)" - ] - }, - { - "cell_type": "code", - "execution_count": 657, - "id": "85c4e415", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>Test Query</th>\n", - " <th>Correct Response (LLM)</th>\n", - " <th>Correct Source (LLM)</th>\n", - " <th>Eval (LLM)</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>What battles took place in New York City in th...</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " <td>Context is relevant: True\\nAnswer is correct: ...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>Who was elected as the mayor after the Great D...</td>\n", - " <td>True</td>\n", - " <td>False</td>\n", - " <td>Context is relevant: False\\nAnswer is correct:...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>How many tourists visited New York City in 2019?</td>\n", - " <td>True</td>\n", - " <td>False</td>\n", - " <td>Context is relevant: False\\nAnswer is correct:...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>What are the airports in New York City?</td>\n", - " <td>True</td>\n", - " <td>False</td>\n", - " <td>Context is relevant: False\\nAnswer is correct:...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>When was the first documented visit into New Y...</td>\n", - " <td>True</td>\n", - " <td>False</td>\n", - " <td>Context is relevant: False\\nAnswer is correct:...</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " Test Query Correct Response (LLM) \\\n", - "0 What battles took place in New York City in th... True \n", - "1 Who was elected as the mayor after the Great D... True \n", - "2 How many tourists visited New York City in 2019? True \n", - "3 What are the airports in New York City? True \n", - "4 When was the first documented visit into New Y... True \n", - "\n", - " Correct Source (LLM) Eval (LLM) \n", - "0 True Context is relevant: True\\nAnswer is correct: ... \n", - "1 False Context is relevant: False\\nAnswer is correct:... \n", - "2 False Context is relevant: False\\nAnswer is correct:... \n", - "3 False Context is relevant: False\\nAnswer is correct:... \n", - "4 False Context is relevant: False\\nAnswer is correct:... " - ] - }, - "execution_count": 657, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "eval_gpt4" - ] - }, - { - "cell_type": "code", - "execution_count": 651, - "id": "3efb66d6", - "metadata": {}, - "outputs": [], - "source": [ - "eval_chatgpt = analyze_outcome_llm(outcomes_vector_gpt3, llm_predictor_chatgpt)" - ] - }, - { - "cell_type": "code", - "execution_count": 652, - "id": "4c452767", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>Test Query</th>\n", - " <th>Correct Response (LLM)</th>\n", - " <th>Correct Source (LLM)</th>\n", - " <th>Eval (LLM)</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>What battles took place in New York City in th...</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " <td>\\n\\nContext is relevant: True\\nAnswer is corre...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>Who was elected as the mayor after the Great D...</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " <td>\\n\\nContext is relevant: True\\nAnswer is corre...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>How many tourists visited New York City in 2019?</td>\n", - " <td>False</td>\n", - " <td>False</td>\n", - " <td>\\n\\nContext is relevant: False\\nAnswer is corr...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>What are the airports in New York City?</td>\n", - " <td>True</td>\n", - " <td>False</td>\n", - " <td>\\n\\nContext is relevant: False\\nAnswer is corr...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>When was the first documented visit into New Y...</td>\n", - " <td>False</td>\n", - " <td>True</td>\n", - " <td>\\n\\nContext is relevant: True\\nAnswer is corre...</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " Test Query Correct Response (LLM) \\\n", - "0 What battles took place in New York City in th... True \n", - "1 Who was elected as the mayor after the Great D... True \n", - "2 How many tourists visited New York City in 2019? False \n", - "3 What are the airports in New York City? True \n", - "4 When was the first documented visit into New Y... False \n", - "\n", - " Correct Source (LLM) Eval (LLM) \n", - "0 True \\n\\nContext is relevant: True\\nAnswer is corre... \n", - "1 True \\n\\nContext is relevant: True\\nAnswer is corre... \n", - "2 False \\n\\nContext is relevant: False\\nAnswer is corr... \n", - "3 False \\n\\nContext is relevant: False\\nAnswer is corr... \n", - "4 True \\n\\nContext is relevant: True\\nAnswer is corre... " - ] - }, - "execution_count": 652, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "eval_chatgpt" - ] - }, - { - "cell_type": "code", - "execution_count": 649, - "id": "61e8dad2", - "metadata": {}, - "outputs": [], - "source": [ - "eval_gpt3 = analyze_outcome_llm(outcomes_vector_gpt3, llm_predictor_gpt3)" - ] - }, - { - "cell_type": "code", - "execution_count": 650, - "id": "170400c3", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>Test Query</th>\n", - " <th>Correct Response (LLM)</th>\n", - " <th>Correct Source (LLM)</th>\n", - " <th>Eval (LLM)</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>What battles took place in New York City in th...</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " <td>\\n\\nContext is relevant: True\\nAnswer is corre...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>Who was elected as the mayor after the Great D...</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " <td>\\n\\nContext is relevant: True\\nAnswer is corre...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>How many tourists visited New York City in 2019?</td>\n", - " <td>False</td>\n", - " <td>False</td>\n", - " <td>\\n\\nContext is relevant: False\\nAnswer is corr...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>What are the airports in New York City?</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " <td>\\n\\nContext is relevant: True\\nAnswer is corre...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>When was the first documented visit into New Y...</td>\n", - " <td>True</td>\n", - " <td>True</td>\n", - " <td>\\n\\nContext is relevant: True\\nAnswer is corre...</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " Test Query Correct Response (LLM) \\\n", - "0 What battles took place in New York City in th... True \n", - "1 Who was elected as the mayor after the Great D... True \n", - "2 How many tourists visited New York City in 2019? False \n", - "3 What are the airports in New York City? True \n", - "4 When was the first documented visit into New Y... True \n", - "\n", - " Correct Source (LLM) Eval (LLM) \n", - "0 True \\n\\nContext is relevant: True\\nAnswer is corre... \n", - "1 True \\n\\nContext is relevant: True\\nAnswer is corre... \n", - "2 False \\n\\nContext is relevant: False\\nAnswer is corr... \n", - "3 True \\n\\nContext is relevant: True\\nAnswer is corre... \n", - "4 True \\n\\nContext is relevant: True\\nAnswer is corre... " - ] - }, - "execution_count": 650, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "eval_gpt3" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "cells": [ + { + "cell_type": "markdown", + "id": "36f92b98", + "metadata": {}, + "source": [ + "# GPT4 NYC Wiki Benchmark" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "9080b39e", + "metadata": {}, + "outputs": [], + "source": [ + "import logging, sys\n", + "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", + "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))\n", + "\n", + "# Uncomment if you want to temporarily disable logger\n", + "logging.disable(sys.maxsize)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7de92ce3", + "metadata": {}, + "outputs": [], + "source": [ + "# NOTE: only necessary for querying with `use_async=True` in notebook\n", + "import nest_asyncio\n", + "nest_asyncio.apply()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f1a9eb90-335c-4214-8bb6-fd1edbe3ccbd", + "metadata": {}, + "outputs": [], + "source": [ + "# My OpenAI Key\n", + "import os\n", + "os.environ['OPENAI_API_KEY'] = \"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "8d0b2364-4806-4656-81e7-3f6e4b910b5b", + "metadata": {}, + "outputs": [], + "source": [ + "from gpt_index import GPTTreeIndex, SimpleDirectoryReader, LLMPredictor, GPTSimpleVectorIndex, GPTListIndex, Prompt, ServiceContext\n", + "from gpt_index.indices.base import BaseGPTIndex\n", + "from gpt_index.langchain_helpers.text_splitter import TokenTextSplitter\n", + "from langchain.chat_models import ChatOpenAI\n", + "from langchain.llms import OpenAI\n", + "from gpt_index.response.schema import Response\n", + "import pandas as pd\n", + "from typing import Tuple" + ] + }, + { + "cell_type": "markdown", + "id": "707662e5", + "metadata": {}, + "source": [ + "## Setup data" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "b4b4387b-413e-4016-ba1e-88b3d9410a38", + "metadata": {}, + "outputs": [], + "source": [ + "# fetch \"New York City\" page from Wikipedia\n", + "from pathlib import Path\n", + "\n", + "import requests\n", + "response = requests.get(\n", + " 'https://en.wikipedia.org/w/api.php',\n", + " params={\n", + " 'action': 'query',\n", + " 'format': 'json',\n", + " 'titles': 'New York City',\n", + " 'prop': 'extracts',\n", + " # 'exintro': True,\n", + " 'explaintext': True,\n", + " }\n", + ").json()\n", + "page = next(iter(response['query']['pages'].values()))\n", + "nyc_text = page['extract']\n", + "\n", + "data_path = Path('data')\n", + "if not data_path.exists():\n", + " Path.mkdir(data_path)\n", + "\n", + "with open('data/nyc_text.txt', 'w') as fp:\n", + " fp.write(nyc_text)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "523fbebe-6e79-4d7b-b400-188b711a0e8f", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DEBUG:gpt_index.readers.file.base:> [SimpleDirectoryReader] Total files added: 1\n", + "> [SimpleDirectoryReader] Total files added: 1\n" + ] + } + ], + "source": [ + "documents = SimpleDirectoryReader('data').load_data()" + ] + }, + { + "cell_type": "markdown", + "id": "f4a269bd", + "metadata": {}, + "source": [ + "## Setup benchmark" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "62f01ddf", + "metadata": {}, + "outputs": [], + "source": [ + "from dataclasses import dataclass\n", + "from typing import List" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "4ff13cd4", + "metadata": {}, + "outputs": [], + "source": [ + "@dataclass\n", + "class TestCase:\n", + " query: str \n", + " must_contain: List[str]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "9c653b72", + "metadata": {}, + "outputs": [], + "source": [ + "@dataclass\n", + "class TestOutcome:\n", + " test: TestCase\n", + " response: Response\n", + " \n", + " @property\n", + " def is_correct_response(self) -> bool:\n", + " is_correct = True\n", + " for answer in self.test.must_contain:\n", + " if answer not in self.response.response:\n", + " is_correct = False\n", + " return is_correct\n", + " \n", + " @property\n", + " def is_correct_source(self) -> bool:\n", + " is_correct = True\n", + " for answer in self.test.must_contain:\n", + " if all(answer not in node.source_text for node in self.response.source_nodes):\n", + " is_correct = False\n", + " return is_correct" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "b9cd18ae", + "metadata": {}, + "outputs": [], + "source": [ + "class Benchmark:\n", + " def __init__(self, tests: List[TestCase]) -> None:\n", + " self._tests = tests\n", + " \n", + " def test(self, index: BaseGPTIndex, llm_predictor: LLMPredictor, **kwargs) -> List[TestOutcome]:\n", + " outcomes: List[TestOutcome] = []\n", + " service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)\n", + " for test in self._tests:\n", + " response = index.query(\n", + " test.query,\n", + " service_context=service_context,\n", + " **kwargs\n", + " )\n", + " outcome = TestOutcome(test=test, response=response)\n", + " outcomes.append(outcome)\n", + " return outcomes" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8edad985", + "metadata": {}, + "outputs": [], + "source": [ + "def analyze_outcome(outcomes: List[TestOutcome]) -> None:\n", + " rows = []\n", + " for outcome in outcomes:\n", + " row = [outcome.test.query, outcome.is_correct_response, outcome.is_correct_source]\n", + " rows.append(row)\n", + " df = pd.DataFrame(rows, columns=['Test Query', 'Correct Response', 'Correct Source'])\n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "4bc38077", + "metadata": {}, + "outputs": [], + "source": [ + "test_battle = TestCase(\n", + " query=\"What battles took place in New York City in the American Revolution?\",\n", + " must_contain=[\"Battle of Long Island\"]\n", + ")\n", + "\n", + "test_mayor = TestCase(\n", + " query='Who was elected as the mayor after the Great Depression?',\n", + " must_contain=[\"Fiorello La Guardia\"]\n", + ")\n", + "\n", + "test_tourists = TestCase(\n", + " query='How many tourists visited New York City in 2019?',\n", + " must_contain=['66.6 million']\n", + ")\n", + "test_airport = TestCase(\n", + " query='What are the airports in New York City?',\n", + " must_contain=['LaGuardia Airport']\n", + ")\n", + "test_visit = TestCase(\n", + " query='When was the first documented visit into New York Harbor?',\n", + " must_contain=['1524']\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "f159dadb", + "metadata": {}, + "outputs": [], + "source": [ + "bm = Benchmark([\n", + " test_battle,\n", + " test_mayor,\n", + " test_tourists,\n", + " test_airport,\n", + " test_visit,\n", + "])" + ] + }, + { + "cell_type": "markdown", + "id": "65ddbd56", + "metadata": {}, + "source": [ + "## LLM based evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": 592, + "id": "ed175de5", + "metadata": {}, + "outputs": [], + "source": [ + "from gpt_index.prompts.prompt_type import PromptType\n", + "\n", + "EVAL_PROMPT_TMPL = (\n", + " \"Given the question below. \\n\"\n", + " \"---------------------\\n\"\n", + " \"{query_str}\"\n", + " \"\\n---------------------\\n\"\n", + " \"Decide if the following retreived context is relevant. \\n\"\n", + " \"\\n---------------------\\n\"\n", + " \"{context_str}\"\n", + " \"\\n---------------------\\n\"\n", + " \"Then decide if the answer is correct. \\n\"\n", + " \"\\n---------------------\\n\"\n", + " \"{answer_str}\"\n", + " \"\\n---------------------\\n\"\n", + " \"Answer in the following format:\\n\"\n", + " \"'Context is relevant: <True>\\nAnswer is correct: <True>' \"\n", + " \"and explain why.\"\n", + ")\n", + "\n", + "class EvalPrompt(Prompt):\n", + " prompt_type: PromptType = PromptType.CUSTOM\n", + " input_variables: List[str] = [\"query_str\", 'context_str', 'answer_str']\n", + "\n", + "DEFAULT_EVAL_PROMPT = EvalPrompt(EVAL_PROMPT_TMPL)" + ] + }, + { + "cell_type": "code", + "execution_count": 593, + "id": "93c498b6", + "metadata": {}, + "outputs": [], + "source": [ + "import re\n", + "def extract_eval_result(result_str: str):\n", + " boolean_pattern = r\"(True|False)\"\n", + " matches = re.findall(boolean_pattern, result_str)\n", + " return [match == \"True\" for match in matches] " + ] + }, + { + "cell_type": "code", + "execution_count": 594, + "id": "4c8109c3", + "metadata": {}, + "outputs": [], + "source": [ + "def analyze_outcome_llm_single(outcome: TestOutcome, llm_predictor: LLMPredictor) -> Tuple[bool, bool]:\n", + " try:\n", + " source_text = outcome.response.source_nodes[0].source_text\n", + " except:\n", + " source_text = \"Failed to retrieve any context\"\n", + " result_str, _ = llm_predictor.predict(\n", + " DEFAULT_EVAL_PROMPT,\n", + " query_str=outcome.test.query,\n", + " context_str=source_text,\n", + " answer_str=outcome.response.response\n", + " )\n", + " is_context_relevant, is_answer_correct = extract_eval_result(result_str)\n", + " return is_answer_correct, is_context_relevant, result_str\n", + "\n", + "def analyze_outcome_llm(outcomes: List[TestOutcome], llm_predictor: LLMPredictor) -> None:\n", + " rows = []\n", + " for outcome in outcomes:\n", + " is_correct_response, is_correct_source, result_str = analyze_outcome_llm_single(outcome, llm_predictor)\n", + " row = [outcome.test.query, is_correct_response, is_correct_source, result_str]\n", + " rows.append(row)\n", + " df = pd.DataFrame(rows, columns=['Test Query', 'Correct Response (LLM)', 'Correct Source (LLM)', 'Eval (LLM)'])\n", + " return df" + ] + }, + { + "cell_type": "markdown", + "id": "5a9f43a6", + "metadata": {}, + "source": [ + "## Build Indices" + ] + }, + { + "cell_type": "code", + "execution_count": 643, + "id": "790bad05", + "metadata": {}, + "outputs": [], + "source": [ + "vector_index = GPTSimpleVectorIndex.from_documents(\n", + " documents, \n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 473, + "id": "64c970e0", + "metadata": {}, + "outputs": [], + "source": [ + "list_index = GPTListIndex.from_documents(\n", + " documents, \n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 468, + "id": "bacc4f1c", + "metadata": {}, + "outputs": [], + "source": [ + "tree_index = GPTTreeIndex.from_documents(documents)" + ] + }, + { + "cell_type": "code", + "execution_count": 632, + "id": "a600d4de", + "metadata": {}, + "outputs": [], + "source": [ + "# Save indices\n", + "vector_index.save_to_disk('vector_index.json')\n", + "tree_index.save_to_disk('tree_index.json')\n", + "list_index.save_to_disk('list_index.json')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "5eec265d-211b-4f26-b05b-5b4e7072bc6e", + "metadata": {}, + "outputs": [], + "source": [ + "# Load indices\n", + "tree_index = GPTTreeIndex.load_from_disk('tree_index.json')\n", + "list_index = GPTListIndex.load_from_disk('list_index.json')\n", + "vector_index = GPTSimpleVectorIndex.load_from_disk('vector_index.json')" + ] + }, + { + "cell_type": "markdown", + "id": "5b2e7fdd", + "metadata": {}, + "source": [ + "## Create LLMPredictors" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "4766ac56-ac8d-4f33-b994-6901964241ea", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# gpt-4\n", + "llm_predictor_gpt4 = LLMPredictor(\n", + " llm=ChatOpenAI(temperature=0, model_name=\"gpt-4\")\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "id": "c8692cf6", + "metadata": {}, + "outputs": [], + "source": [ + "# gpt-3 (text-davinci-003)\n", + "llm_predictor_gpt3 = LLMPredictor(llm=OpenAI(temperature=0, model_name=\"text-davinci-003\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "fb74ec62", + "metadata": {}, + "outputs": [], + "source": [ + "# chatgpt (gpt-3.5-turbo)\n", + "llm_predictor_chatgpt = LLMPredictor(llm=ChatOpenAI(temperature=0, model_name=\"gpt-3.5-turbo\"))" + ] + }, + { + "cell_type": "markdown", + "id": "1354f668", + "metadata": {}, + "source": [ + "## Benchmarking " + ] + }, + { + "cell_type": "markdown", + "id": "01124a3f", + "metadata": {}, + "source": [ + "### Tree Index + GPT4" + ] + }, + { + "cell_type": "code", + "execution_count": 583, + "id": "6f418554", + "metadata": {}, + "outputs": [], + "source": [ + "outcomes_tree_gpt4 = bm.test(tree_index, llm_predictor_gpt4)" + ] + }, + { + "cell_type": "code", + "execution_count": 584, + "id": "de98ceba", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Test Query</th>\n", + " <th>Correct Response</th>\n", + " <th>Correct Source</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>What battles took place in New York City in th...</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>Who was elected as the mayor after the Great D...</td>\n", + " <td>False</td>\n", + " <td>False</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>How many tourists visited New York City in 2019?</td>\n", + " <td>False</td>\n", + " <td>False</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>What are the airports in New York City?</td>\n", + " <td>False</td>\n", + " <td>False</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>When was the first documented visit into New Y...</td>\n", + " <td>False</td>\n", + " <td>False</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Test Query Correct Response \\\n", + "0 What battles took place in New York City in th... True \n", + "1 Who was elected as the mayor after the Great D... False \n", + "2 How many tourists visited New York City in 2019? False \n", + "3 What are the airports in New York City? False \n", + "4 When was the first documented visit into New Y... False \n", + "\n", + " Correct Source \n", + "0 True \n", + "1 False \n", + "2 False \n", + "3 False \n", + "4 False " + ] + }, + "execution_count": 584, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "analyze_outcome(outcomes_tree_gpt4)" + ] + }, + { + "cell_type": "markdown", + "id": "f5ef33a0", + "metadata": {}, + "source": [ + "### Tree Index + GPT3" + ] + }, + { + "cell_type": "code", + "execution_count": 549, + "id": "ba871d2a", + "metadata": {}, + "outputs": [], + "source": [ + "outcomes_tree_gpt3 = bm.test(tree_index, llm_predictor_gpt3)" + ] + }, + { + "cell_type": "code", + "execution_count": 550, + "id": "7d4c6930", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Test Query</th>\n", + " <th>Correct Response</th>\n", + " <th>Correct Source</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>What battles took place in New York City in th...</td>\n", + " <td>True</td>\n", + " <td>False</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>Who was elected as the mayor after the Great D...</td>\n", + " <td>False</td>\n", + " <td>False</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>How many tourists visited New York City in 2019?</td>\n", + " <td>False</td>\n", + " <td>False</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>What are the airports in New York City?</td>\n", + " <td>True</td>\n", + " <td>False</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>When was the first documented visit into New Y...</td>\n", + " <td>True</td>\n", + " <td>False</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Test Query Correct Response \\\n", + "0 What battles took place in New York City in th... True \n", + "1 Who was elected as the mayor after the Great D... False \n", + "2 How many tourists visited New York City in 2019? False \n", + "3 What are the airports in New York City? True \n", + "4 When was the first documented visit into New Y... True \n", + "\n", + " Correct Source \n", + "0 False \n", + "1 False \n", + "2 False \n", + "3 False \n", + "4 False " + ] + }, + "execution_count": 550, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "analyze_outcome(outcomes_tree_gpt3)" + ] + }, + { + "cell_type": "markdown", + "id": "30a9ba34", + "metadata": {}, + "source": [ + "### List Index + GPT4" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "bc0f05d1", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "outcomes_list_gpt4 = bm.test(list_index, llm_predictor_gpt4, response_mode=\"tree_summarize\", use_async=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "2d2e879d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Test Query</th>\n", + " <th>Correct Response</th>\n", + " <th>Correct Source</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>What battles took place in New York City in th...</td>\n", + " <td>False</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>Who was elected as the mayor after the Great D...</td>\n", + " <td>False</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>How many tourists visited New York City in 2019?</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>What are the airports in New York City?</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>When was the first documented visit into New Y...</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Test Query Correct Response \\\n", + "0 What battles took place in New York City in th... False \n", + "1 Who was elected as the mayor after the Great D... False \n", + "2 How many tourists visited New York City in 2019? True \n", + "3 What are the airports in New York City? True \n", + "4 When was the first documented visit into New Y... True \n", + "\n", + " Correct Source \n", + "0 True \n", + "1 True \n", + "2 True \n", + "3 True \n", + "4 True " + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "analyze_outcome(outcomes_list_gpt4)" + ] + }, + { + "cell_type": "markdown", + "id": "8cba793c", + "metadata": {}, + "source": [ + "### List Index + GPT3" + ] + }, + { + "cell_type": "code", + "execution_count": 501, + "id": "66cfa3fa", + "metadata": {}, + "outputs": [], + "source": [ + "outcomes_list_gpt3 = bm.test(list_index, llm_predictor_gpt3, response_mode=\"tree_summarize\", use_async=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 502, + "id": "06bc98d8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Test Query</th>\n", + " <th>Correct Response</th>\n", + " <th>Correct Source</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>What battles took place in New York City in th...</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>Who was elected as the mayor during the Great ...</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>How many tourists visited New York City in 2019?</td>\n", + " <td>False</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>What are the airports in New York City?</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>When was the first documented visit into New Y...</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Test Query Correct Response \\\n", + "0 What battles took place in New York City in th... True \n", + "1 Who was elected as the mayor during the Great ... True \n", + "2 How many tourists visited New York City in 2019? False \n", + "3 What are the airports in New York City? True \n", + "4 When was the first documented visit into New Y... True \n", + "\n", + " Correct Source \n", + "0 True \n", + "1 True \n", + "2 True \n", + "3 True \n", + "4 True " + ] + }, + "execution_count": 502, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "analyze_outcome(outcomes_list_gpt3)" + ] + }, + { + "cell_type": "markdown", + "id": "c4d0b3eb", + "metadata": {}, + "source": [ + "### List Index + ChatGPT" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "f146c74e", + "metadata": {}, + "outputs": [], + "source": [ + "outcomes_list_chatgpt = bm.test(list_index, llm_predictor_chatgpt, response_mode=\"tree_summarize\", use_async=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "8eb9d392", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Test Query</th>\n", + " <th>Correct Response</th>\n", + " <th>Correct Source</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>What battles took place in New York City in th...</td>\n", + " <td>False</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>Who was elected as the mayor after the Great D...</td>\n", + " <td>False</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>How many tourists visited New York City in 2019?</td>\n", + " <td>False</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>What are the airports in New York City?</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>When was the first documented visit into New Y...</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Test Query Correct Response \\\n", + "0 What battles took place in New York City in th... False \n", + "1 Who was elected as the mayor after the Great D... False \n", + "2 How many tourists visited New York City in 2019? False \n", + "3 What are the airports in New York City? True \n", + "4 When was the first documented visit into New Y... True \n", + "\n", + " Correct Source \n", + "0 True \n", + "1 True \n", + "2 True \n", + "3 True \n", + "4 True " + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "analyze_outcome(outcomes_list_chatgpt)" + ] + }, + { + "cell_type": "markdown", + "id": "38fc1438", + "metadata": {}, + "source": [ + "### Vector Store Index + GPT4 " + ] + }, + { + "cell_type": "code", + "execution_count": 487, + "id": "5349d1e7", + "metadata": {}, + "outputs": [], + "source": [ + "outcomes_vector_gpt4 = bm.test(vector_index, llm_predictor_gpt4)" + ] + }, + { + "cell_type": "code", + "execution_count": 488, + "id": "7fc53e19", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Test Query</th>\n", + " <th>Correct Response</th>\n", + " <th>Correct Source</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>What battles took place in New York City in th...</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>Who was elected as the mayor during the Great ...</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>How many tourists visited New York City in 2019?</td>\n", + " <td>False</td>\n", + " <td>False</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>What are the airports in New York City?</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>When was the first documented visit into New Y...</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Test Query Correct Response \\\n", + "0 What battles took place in New York City in th... True \n", + "1 Who was elected as the mayor during the Great ... True \n", + "2 How many tourists visited New York City in 2019? False \n", + "3 What are the airports in New York City? True \n", + "4 When was the first documented visit into New Y... True \n", + "\n", + " Correct Source \n", + "0 True \n", + "1 True \n", + "2 False \n", + "3 True \n", + "4 True " + ] + }, + "execution_count": 488, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "analyze_outcome(outcomes_vector_gpt4)" + ] + }, + { + "cell_type": "markdown", + "id": "70eb711f", + "metadata": {}, + "source": [ + "### Vector Store Index + GPT3" + ] + }, + { + "cell_type": "code", + "execution_count": 644, + "id": "e35ebdf9", + "metadata": {}, + "outputs": [], + "source": [ + "outcomes_vector_gpt3 = bm.test(vector_index, llm_predictor_gpt3)" + ] + }, + { + "cell_type": "code", + "execution_count": 645, + "id": "95c49697", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Test Query</th>\n", + " <th>Correct Response</th>\n", + " <th>Correct Source</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>What battles took place in New York City in th...</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>Who was elected as the mayor after the Great D...</td>\n", + " <td>True</td>\n", + " <td>False</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>How many tourists visited New York City in 2019?</td>\n", + " <td>False</td>\n", + " <td>False</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>What are the airports in New York City?</td>\n", + " <td>True</td>\n", + " <td>False</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>When was the first documented visit into New Y...</td>\n", + " <td>True</td>\n", + " <td>False</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Test Query Correct Response \\\n", + "0 What battles took place in New York City in th... True \n", + "1 Who was elected as the mayor after the Great D... True \n", + "2 How many tourists visited New York City in 2019? False \n", + "3 What are the airports in New York City? True \n", + "4 When was the first documented visit into New Y... True \n", + "\n", + " Correct Source \n", + "0 True \n", + "1 False \n", + "2 False \n", + "3 False \n", + "4 False " + ] + }, + "execution_count": 645, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "analyze_outcome(outcomes_vector_gpt3)" + ] + }, + { + "cell_type": "markdown", + "id": "a36ba2ee", + "metadata": {}, + "source": [ + "## LLM based Evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": 646, + "id": "59ff561c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Test Query</th>\n", + " <th>Correct Response</th>\n", + " <th>Correct Source</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>What battles took place in New York City in th...</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>Who was elected as the mayor after the Great D...</td>\n", + " <td>True</td>\n", + " <td>False</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>How many tourists visited New York City in 2019?</td>\n", + " <td>False</td>\n", + " <td>False</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>What are the airports in New York City?</td>\n", + " <td>True</td>\n", + " <td>False</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>When was the first documented visit into New Y...</td>\n", + " <td>True</td>\n", + " <td>False</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Test Query Correct Response \\\n", + "0 What battles took place in New York City in th... True \n", + "1 Who was elected as the mayor after the Great D... True \n", + "2 How many tourists visited New York City in 2019? False \n", + "3 What are the airports in New York City? True \n", + "4 When was the first documented visit into New Y... True \n", + "\n", + " Correct Source \n", + "0 True \n", + "1 False \n", + "2 False \n", + "3 False \n", + "4 False " + ] + }, + "execution_count": 646, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "analyze_outcome(outcomes_vector_gpt3)" + ] + }, + { + "cell_type": "code", + "execution_count": 647, + "id": "e4ffaca6", + "metadata": {}, + "outputs": [], + "source": [ + "eval_gpt4 = analyze_outcome_llm(outcomes_vector_gpt3, llm_predictor_gpt4)" + ] + }, + { + "cell_type": "code", + "execution_count": 657, + "id": "85c4e415", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Test Query</th>\n", + " <th>Correct Response (LLM)</th>\n", + " <th>Correct Source (LLM)</th>\n", + " <th>Eval (LLM)</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>What battles took place in New York City in th...</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " <td>Context is relevant: True\\nAnswer is correct: ...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>Who was elected as the mayor after the Great D...</td>\n", + " <td>True</td>\n", + " <td>False</td>\n", + " <td>Context is relevant: False\\nAnswer is correct:...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>How many tourists visited New York City in 2019?</td>\n", + " <td>True</td>\n", + " <td>False</td>\n", + " <td>Context is relevant: False\\nAnswer is correct:...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>What are the airports in New York City?</td>\n", + " <td>True</td>\n", + " <td>False</td>\n", + " <td>Context is relevant: False\\nAnswer is correct:...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>When was the first documented visit into New Y...</td>\n", + " <td>True</td>\n", + " <td>False</td>\n", + " <td>Context is relevant: False\\nAnswer is correct:...</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Test Query Correct Response (LLM) \\\n", + "0 What battles took place in New York City in th... True \n", + "1 Who was elected as the mayor after the Great D... True \n", + "2 How many tourists visited New York City in 2019? True \n", + "3 What are the airports in New York City? True \n", + "4 When was the first documented visit into New Y... True \n", + "\n", + " Correct Source (LLM) Eval (LLM) \n", + "0 True Context is relevant: True\\nAnswer is correct: ... \n", + "1 False Context is relevant: False\\nAnswer is correct:... \n", + "2 False Context is relevant: False\\nAnswer is correct:... \n", + "3 False Context is relevant: False\\nAnswer is correct:... \n", + "4 False Context is relevant: False\\nAnswer is correct:... " + ] + }, + "execution_count": 657, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "eval_gpt4" + ] + }, + { + "cell_type": "code", + "execution_count": 651, + "id": "3efb66d6", + "metadata": {}, + "outputs": [], + "source": [ + "eval_chatgpt = analyze_outcome_llm(outcomes_vector_gpt3, llm_predictor_chatgpt)" + ] + }, + { + "cell_type": "code", + "execution_count": 652, + "id": "4c452767", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Test Query</th>\n", + " <th>Correct Response (LLM)</th>\n", + " <th>Correct Source (LLM)</th>\n", + " <th>Eval (LLM)</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>What battles took place in New York City in th...</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " <td>\\n\\nContext is relevant: True\\nAnswer is corre...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>Who was elected as the mayor after the Great D...</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " <td>\\n\\nContext is relevant: True\\nAnswer is corre...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>How many tourists visited New York City in 2019?</td>\n", + " <td>False</td>\n", + " <td>False</td>\n", + " <td>\\n\\nContext is relevant: False\\nAnswer is corr...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>What are the airports in New York City?</td>\n", + " <td>True</td>\n", + " <td>False</td>\n", + " <td>\\n\\nContext is relevant: False\\nAnswer is corr...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>When was the first documented visit into New Y...</td>\n", + " <td>False</td>\n", + " <td>True</td>\n", + " <td>\\n\\nContext is relevant: True\\nAnswer is corre...</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Test Query Correct Response (LLM) \\\n", + "0 What battles took place in New York City in th... True \n", + "1 Who was elected as the mayor after the Great D... True \n", + "2 How many tourists visited New York City in 2019? False \n", + "3 What are the airports in New York City? True \n", + "4 When was the first documented visit into New Y... False \n", + "\n", + " Correct Source (LLM) Eval (LLM) \n", + "0 True \\n\\nContext is relevant: True\\nAnswer is corre... \n", + "1 True \\n\\nContext is relevant: True\\nAnswer is corre... \n", + "2 False \\n\\nContext is relevant: False\\nAnswer is corr... \n", + "3 False \\n\\nContext is relevant: False\\nAnswer is corr... \n", + "4 True \\n\\nContext is relevant: True\\nAnswer is corre... " + ] + }, + "execution_count": 652, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "eval_chatgpt" + ] + }, + { + "cell_type": "code", + "execution_count": 649, + "id": "61e8dad2", + "metadata": {}, + "outputs": [], + "source": [ + "eval_gpt3 = analyze_outcome_llm(outcomes_vector_gpt3, llm_predictor_gpt3)" + ] + }, + { + "cell_type": "code", + "execution_count": 650, + "id": "170400c3", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Test Query</th>\n", + " <th>Correct Response (LLM)</th>\n", + " <th>Correct Source (LLM)</th>\n", + " <th>Eval (LLM)</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>What battles took place in New York City in th...</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " <td>\\n\\nContext is relevant: True\\nAnswer is corre...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>Who was elected as the mayor after the Great D...</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " <td>\\n\\nContext is relevant: True\\nAnswer is corre...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>How many tourists visited New York City in 2019?</td>\n", + " <td>False</td>\n", + " <td>False</td>\n", + " <td>\\n\\nContext is relevant: False\\nAnswer is corr...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>What are the airports in New York City?</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " <td>\\n\\nContext is relevant: True\\nAnswer is corre...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>When was the first documented visit into New Y...</td>\n", + " <td>True</td>\n", + " <td>True</td>\n", + " <td>\\n\\nContext is relevant: True\\nAnswer is corre...</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Test Query Correct Response (LLM) \\\n", + "0 What battles took place in New York City in th... True \n", + "1 Who was elected as the mayor after the Great D... True \n", + "2 How many tourists visited New York City in 2019? False \n", + "3 What are the airports in New York City? True \n", + "4 When was the first documented visit into New Y... True \n", + "\n", + " Correct Source (LLM) Eval (LLM) \n", + "0 True \\n\\nContext is relevant: True\\nAnswer is corre... \n", + "1 True \\n\\nContext is relevant: True\\nAnswer is corre... \n", + "2 False \\n\\nContext is relevant: False\\nAnswer is corr... \n", + "3 True \\n\\nContext is relevant: True\\nAnswer is corre... \n", + "4 True \\n\\nContext is relevant: True\\nAnswer is corre... " + ] + }, + "execution_count": 650, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "eval_gpt3" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/examples/test_wiki/TestNYC-Tree-GPT4.ipynb b/examples/test_wiki/TestNYC-Tree-GPT4.ipynb index 0e4865b09c..ceef063e4c 100644 --- a/examples/test_wiki/TestNYC-Tree-GPT4.ipynb +++ b/examples/test_wiki/TestNYC-Tree-GPT4.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "cf0f06c0", + "metadata": {}, + "source": [ + "# GPT4 NYC Wiki Tree Index" + ] + }, { "cell_type": "code", "execution_count": 18, @@ -984,7 +992,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.0" } }, "nbformat": 4, diff --git a/examples/test_wiki/TestNYC.ipynb b/examples/test_wiki/TestNYC.ipynb index dd0526b19e..4a91651ae4 100644 --- a/examples/test_wiki/TestNYC.ipynb +++ b/examples/test_wiki/TestNYC.ipynb @@ -1,180 +1,188 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "9080b39e", - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "import sys\n", - "\n", - "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", - "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b4b4387b-413e-4016-ba1e-88b3d9410a38", - "metadata": {}, - "outputs": [], - "source": [ - "# fetch \"New York City\" page from Wikipedia\n", - "from pathlib import Path\n", - "\n", - "import requests\n", - "response = requests.get(\n", - " 'https://en.wikipedia.org/w/api.php',\n", - " params={\n", - " 'action': 'query',\n", - " 'format': 'json',\n", - " 'titles': 'New York City',\n", - " 'prop': 'extracts',\n", - " # 'exintro': True,\n", - " 'explaintext': True,\n", - " }\n", - ").json()\n", - "page = next(iter(response['query']['pages'].values()))\n", - "nyc_text = page['extract']\n", - "\n", - "data_path = Path('data')\n", - "if not data_path.exists():\n", - " Path.mkdir(data_path)\n", - "\n", - "with open('data/nyc_text.txt', 'w') as fp:\n", - " fp.write(nyc_text)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f1a9eb90-335c-4214-8bb6-fd1edbe3ccbd", - "metadata": {}, - "outputs": [], - "source": [ - "# My OpenAI Key\n", - "import os\n", - "os.environ['OPENAI_API_KEY'] = \"INSERT OPENAI KEY\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8d0b2364-4806-4656-81e7-3f6e4b910b5b", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import GPTTreeIndex, SimpleDirectoryReader" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1298bbb4-c99e-431e-93ef-eb32c0a2fc2a", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "documents = SimpleDirectoryReader('data').load_data()\n", - "index = GPTTreeIndex.from_documents(documents)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0b4fe9b6-5762-4e86-b51e-aac45d3ecdb1", - "metadata": {}, - "outputs": [], - "source": [ - "index.save_to_disk('index.json')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5eec265d-211b-4f26-b05b-5b4e7072bc6e", - "metadata": {}, - "outputs": [], - "source": [ - "# try loading\n", - "new_index = GPTTreeIndex.load_from_disk('index.json')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "68c9ebfe-b1b6-4f4e-9278-174346de8c90", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# GPT doesn't find the corresponding evidence in the leaf node, but still gives the correct answer\n", - "# set Logging to DEBUG for more detailed outputs\n", - "\n", - "new_index.query(\"What is the name of the professional women's basketball team in New York City?\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4fc3f18a-0ef9-453c-acf8-7aedd784cdcf", - "metadata": {}, - "outputs": [], - "source": [ - "# GPT doesn't find the corresponding evidence in the leaf node, but still gives the correct answer\n", - "# set Logging to DEBUG for more detailed outputs\n", - "\n", - "new_index.query(\"What battles took place in New York City in the American Revolution?\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "97f3ddf1-8dc2-4fb8-831f-2c06649e0955", - "metadata": {}, - "outputs": [], - "source": [ - "# GPT doesn't find the corresponding evidence in the leaf node, but still gives the correct answer\n", - "# set Logging to DEBUG for more detailed outputs\n", - "\n", - "new_index.query(\"What are the airports in New York City?\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "53265fd4-da98-4cf9-abfb-3f76105fd2ff", - "metadata": {}, - "outputs": [], - "source": [ - "# Try using embedding query\n", - "new_index.query(\"What are the airports in New York City?\", mode=\"embedding\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.10" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file + "cells": [ + { + "cell_type": "markdown", + "id": "b8a16e85", + "metadata": {}, + "source": [ + "# NYC Wiki Demo" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9080b39e", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "import sys\n", + "\n", + "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", + "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b4b4387b-413e-4016-ba1e-88b3d9410a38", + "metadata": {}, + "outputs": [], + "source": [ + "# fetch \"New York City\" page from Wikipedia\n", + "from pathlib import Path\n", + "\n", + "import requests\n", + "response = requests.get(\n", + " 'https://en.wikipedia.org/w/api.php',\n", + " params={\n", + " 'action': 'query',\n", + " 'format': 'json',\n", + " 'titles': 'New York City',\n", + " 'prop': 'extracts',\n", + " # 'exintro': True,\n", + " 'explaintext': True,\n", + " }\n", + ").json()\n", + "page = next(iter(response['query']['pages'].values()))\n", + "nyc_text = page['extract']\n", + "\n", + "data_path = Path('data')\n", + "if not data_path.exists():\n", + " Path.mkdir(data_path)\n", + "\n", + "with open('data/nyc_text.txt', 'w') as fp:\n", + " fp.write(nyc_text)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f1a9eb90-335c-4214-8bb6-fd1edbe3ccbd", + "metadata": {}, + "outputs": [], + "source": [ + "# My OpenAI Key\n", + "import os\n", + "os.environ['OPENAI_API_KEY'] = \"INSERT OPENAI KEY\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d0b2364-4806-4656-81e7-3f6e4b910b5b", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import GPTTreeIndex, SimpleDirectoryReader" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1298bbb4-c99e-431e-93ef-eb32c0a2fc2a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "documents = SimpleDirectoryReader('data').load_data()\n", + "index = GPTTreeIndex.from_documents(documents)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0b4fe9b6-5762-4e86-b51e-aac45d3ecdb1", + "metadata": {}, + "outputs": [], + "source": [ + "index.save_to_disk('index.json')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5eec265d-211b-4f26-b05b-5b4e7072bc6e", + "metadata": {}, + "outputs": [], + "source": [ + "# try loading\n", + "new_index = GPTTreeIndex.load_from_disk('index.json')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "68c9ebfe-b1b6-4f4e-9278-174346de8c90", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# GPT doesn't find the corresponding evidence in the leaf node, but still gives the correct answer\n", + "# set Logging to DEBUG for more detailed outputs\n", + "\n", + "new_index.query(\"What is the name of the professional women's basketball team in New York City?\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4fc3f18a-0ef9-453c-acf8-7aedd784cdcf", + "metadata": {}, + "outputs": [], + "source": [ + "# GPT doesn't find the corresponding evidence in the leaf node, but still gives the correct answer\n", + "# set Logging to DEBUG for more detailed outputs\n", + "\n", + "new_index.query(\"What battles took place in New York City in the American Revolution?\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "97f3ddf1-8dc2-4fb8-831f-2c06649e0955", + "metadata": {}, + "outputs": [], + "source": [ + "# GPT doesn't find the corresponding evidence in the leaf node, but still gives the correct answer\n", + "# set Logging to DEBUG for more detailed outputs\n", + "\n", + "new_index.query(\"What are the airports in New York City?\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "53265fd4-da98-4cf9-abfb-3f76105fd2ff", + "metadata": {}, + "outputs": [], + "source": [ + "# Try using embedding query\n", + "new_index.query(\"What are the airports in New York City?\", mode=\"embedding\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/test_wiki/TestNYC_Embeddings.ipynb b/examples/test_wiki/TestNYC_Embeddings.ipynb index f2b79c1d07..5f61e4e587 100644 --- a/examples/test_wiki/TestNYC_Embeddings.ipynb +++ b/examples/test_wiki/TestNYC_Embeddings.ipynb @@ -1,445 +1,445 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "7a9f093e-e027-405b-ae3d-17dda9e30cd0", - "metadata": {}, - "source": [ - "# NYC Wikipedia Embeddings Demo" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cadae9f2", - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "import sys\n", - "\n", - "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", - "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" - ] - }, - { - "cell_type": "markdown", - "id": "3e594a62-110e-40b3-ad1e-c99f49a4e537", - "metadata": {}, - "source": [ - "Demonstrate embedding capabilities in GPTTreeIndex and GPTListIndex" - ] - }, - { - "cell_type": "markdown", - "id": "b145f093-afb0-46b8-a81f-466af8478439", - "metadata": {}, - "source": [ - "### Setup + Data Prep" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d038dcc1", - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "import sys\n", - "\n", - "logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)\n", - "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b4b4387b-413e-4016-ba1e-88b3d9410a38", - "metadata": {}, - "outputs": [], - "source": [ - "# fetch \"New York City\" page from Wikipedia\n", - "from pathlib import Path\n", - "\n", - "import requests\n", - "response = requests.get(\n", - " 'https://en.wikipedia.org/w/api.php',\n", - " params={\n", - " 'action': 'query',\n", - " 'format': 'json',\n", - " 'titles': 'New York City',\n", - " 'prop': 'extracts',\n", - " # 'exintro': True,\n", - " 'explaintext': True,\n", - " }\n", - ").json()\n", - "page = next(iter(response['query']['pages'].values()))\n", - "nyc_text = page['extract']\n", - "\n", - "data_path = Path('data')\n", - "if not data_path.exists():\n", - " Path.mkdir(data_path)\n", - "\n", - "with open('data/nyc_text.txt', 'w') as fp:\n", - " fp.write(nyc_text)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f1a9eb90-335c-4214-8bb6-fd1edbe3ccbd", - "metadata": {}, - "outputs": [], - "source": [ - "# My OpenAI Key\n", - "import os\n", - "os.environ['OPENAI_API_KEY'] = \"INSERT OPENAI KEY\"" - ] - }, - { - "cell_type": "markdown", - "id": "def4eca7-ba03-48e2-b18f-fd669b91a5fc", - "metadata": {}, - "source": [ - "### GPTTreeIndex - Embedding-based Query" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8d0b2364-4806-4656-81e7-3f6e4b910b5b", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "None of PyTorch, TensorFlow >= 2.0, or Flax have been found. Models won't be available and only tokenizers, configuration and file/data utilities can be used.\n" - ] - } - ], - "source": [ - "from llama_index import GPTTreeIndex, SimpleDirectoryReader\n", - "from IPython.display import Markdown" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1298bbb4-c99e-431e-93ef-eb32c0a2fc2a", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "documents = SimpleDirectoryReader('data').load_data()\n", - "index = GPTTreeIndex.from_documents(documents)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0b4fe9b6-5762-4e86-b51e-aac45d3ecdb1", - "metadata": {}, - "outputs": [], - "source": [ - "index.save_to_disk('index.json')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5eec265d-211b-4f26-b05b-5b4e7072bc6e", - "metadata": {}, - "outputs": [], - "source": [ - "new_index = GPTTreeIndex.load_from_disk('index.json')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "68c9ebfe-b1b6-4f4e-9278-174346de8c90", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# set Logging to DEBUG for more detailed outputs\n", - "response = new_index.query(\"What is the name of the professional women's basketball team in New York City?\", mode=\"embedding\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e1000018-18de-410d-b6d9-c66bf37ccf1d", - "metadata": {}, - "outputs": [], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4fc3f18a-0ef9-453c-acf8-7aedd784cdcf", - "metadata": {}, - "outputs": [], - "source": [ - "response = new_index.query(\n", - " \"What battles took place in New York City in the American Revolution?\", \n", - " mode=\"embedding\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5588289b-9fdc-4b86-bab9-808c97be05e1", - "metadata": {}, - "outputs": [], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "53265fd4-da98-4cf9-abfb-3f76105fd2ff", - "metadata": {}, - "outputs": [], - "source": [ - "# set Logging to DEBUG for more detailed outputs\n", - "response = new_index.query(\"What are the airports in New York City?\", mode=\"embedding\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bc08060f-b031-4dc5-a980-427dd2407b5d", - "metadata": {}, - "outputs": [], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "markdown", - "id": "63009734-deda-4159-9f2b-0af19720e913", - "metadata": {}, - "source": [ - "### GPTListIndex - Embedding-based Query" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fd8920ae-8115-457c-b092-21e50cc3bcc0", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import GPTListIndex, SimpleDirectoryReader\n", - "from IPython.display import Markdown" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "27c8bbee-daf5-494d-ba66-b60142592a96", - "metadata": {}, - "outputs": [], - "source": [ - "documents = SimpleDirectoryReader('data').load_data()\n", - "index = GPTListIndex.from_documents(documents)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c3d5a589-ee75-40bd-9529-75f693874ed7", - "metadata": {}, - "outputs": [], - "source": [ - "index.save_to_disk('index_list_emb.json')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9dfbef52-50fb-46ca-b82b-c44cfa2301ef", - "metadata": {}, - "outputs": [], - "source": [ - "# try loading\n", - "new_index = GPTListIndex.load_from_disk('index_list_emb.json')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2cbf24c2-060e-4216-9188-a6746af1830d", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# set Logging to DEBUG for more detailed outputs\n", - "response = new_index.query(\"What is the name of the professional women's basketball team in New York City?\", mode=\"embedding\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "14e1b19f-fbf7-49fd-a96f-cbb37bafd498", - "metadata": {}, - "outputs": [], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "48b86c8d-9149-4395-9d52-6070597c814d", - "metadata": {}, - "outputs": [], - "source": [ - "# set Logging to DEBUG for more detailed outputs\n", - "response = new_index.query(\"What battles took place in New York City in the American Revolution?\", mode=\"embedding\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "57fbd90c-a8d3-4738-8531-e8f48a953167", - "metadata": {}, - "outputs": [], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7ab01446-9b07-4222-a577-eeb4617ce4fc", - "metadata": {}, - "outputs": [], - "source": [ - "# set Logging to DEBUG for more detailed outputs\n", - "response = new_index.query(\"What are the airports in New York City?\", mode=\"embedding\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "091afaea-a61e-4a7c-b2f1-7df387380b8b", - "metadata": {}, - "outputs": [], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "markdown", - "id": "aca03087-d6cc-4d87-8ec6-185fa03d9fea", - "metadata": {}, - "source": [ - "## Try out other embeddings! \n", - "(courtesy of langchain)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "27c24411-7049-45c7-862c-0857c03db580", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import GPTListIndex, SimpleDirectoryReader, ServiceContext\n", - "from IPython.display import Markdown" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b9ff1944-a06a-4b05-adae-a2ef25e74e8b", - "metadata": {}, - "outputs": [], - "source": [ - "# load in HF embedding model from langchain\n", - "from langchain.embeddings.huggingface import HuggingFaceEmbeddings\n", - "from llama_index import LangchainEmbedding\n", - "embed_model = LangchainEmbedding(HuggingFaceEmbeddings())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3049d517-05db-459b-9e32-711e380fda67", - "metadata": {}, - "outputs": [], - "source": [ - "# try loading index\n", - "new_index = GPTListIndex.load_from_disk('index_list_emb.json')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1494cabb-0123-408a-9d81-8e02db9b3acd", - "metadata": {}, - "outputs": [], - "source": [ - "# configure\n", - "service_context = ServiceContext.from_defaults(embed_model=embed_model)\n", - "\n", - "# set Logging to DEBUG for more detailed outputs\n", - "response = new_index.query(\n", - " \"What is the name of the professional women's basketball team in New York City?\", \n", - " mode=\"embedding\", \n", - " service_context=service_context, \n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4d96a2e7-4eb1-474e-b855-eca3efed1bad", - "metadata": {}, - "outputs": [], - "source": [ - "response" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "80510d3a-8bf8-47f2-b1d4-3d1bd0d5a1bb", - "metadata": {}, - "outputs": [], - "source": [] - } + "cells": [ + { + "cell_type": "markdown", + "id": "7a9f093e-e027-405b-ae3d-17dda9e30cd0", + "metadata": {}, + "source": [ + "# NYC Wikipedia Embeddings Demo" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cadae9f2", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "import sys\n", + "\n", + "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", + "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" + ] + }, + { + "cell_type": "markdown", + "id": "3e594a62-110e-40b3-ad1e-c99f49a4e537", + "metadata": {}, + "source": [ + "Demonstrate embedding capabilities in GPTTreeIndex and GPTListIndex" + ] + }, + { + "cell_type": "markdown", + "id": "b145f093-afb0-46b8-a81f-466af8478439", + "metadata": {}, + "source": [ + "### Setup + Data Prep" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d038dcc1", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "import sys\n", + "\n", + "logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)\n", + "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b4b4387b-413e-4016-ba1e-88b3d9410a38", + "metadata": {}, + "outputs": [], + "source": [ + "# fetch \"New York City\" page from Wikipedia\n", + "from pathlib import Path\n", + "\n", + "import requests\n", + "response = requests.get(\n", + " 'https://en.wikipedia.org/w/api.php',\n", + " params={\n", + " 'action': 'query',\n", + " 'format': 'json',\n", + " 'titles': 'New York City',\n", + " 'prop': 'extracts',\n", + " # 'exintro': True,\n", + " 'explaintext': True,\n", + " }\n", + ").json()\n", + "page = next(iter(response['query']['pages'].values()))\n", + "nyc_text = page['extract']\n", + "\n", + "data_path = Path('data')\n", + "if not data_path.exists():\n", + " Path.mkdir(data_path)\n", + "\n", + "with open('data/nyc_text.txt', 'w') as fp:\n", + " fp.write(nyc_text)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f1a9eb90-335c-4214-8bb6-fd1edbe3ccbd", + "metadata": {}, + "outputs": [], + "source": [ + "# My OpenAI Key\n", + "import os\n", + "os.environ['OPENAI_API_KEY'] = \"INSERT OPENAI KEY\"" + ] + }, + { + "cell_type": "markdown", + "id": "def4eca7-ba03-48e2-b18f-fd669b91a5fc", + "metadata": {}, + "source": [ + "### GPTTreeIndex - Embedding-based Query" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d0b2364-4806-4656-81e7-3f6e4b910b5b", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "None of PyTorch, TensorFlow >= 2.0, or Flax have been found. Models won't be available and only tokenizers, configuration and file/data utilities can be used.\n" + ] + } ], + "source": [ + "from llama_index import GPTTreeIndex, SimpleDirectoryReader\n", + "from IPython.display import Markdown" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1298bbb4-c99e-431e-93ef-eb32c0a2fc2a", "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.9" - } + "tags": [] }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file + "outputs": [], + "source": [ + "documents = SimpleDirectoryReader('data').load_data()\n", + "index = GPTTreeIndex.from_documents(documents)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0b4fe9b6-5762-4e86-b51e-aac45d3ecdb1", + "metadata": {}, + "outputs": [], + "source": [ + "index.save_to_disk('index.json')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5eec265d-211b-4f26-b05b-5b4e7072bc6e", + "metadata": {}, + "outputs": [], + "source": [ + "new_index = GPTTreeIndex.load_from_disk('index.json')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "68c9ebfe-b1b6-4f4e-9278-174346de8c90", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# set Logging to DEBUG for more detailed outputs\n", + "response = new_index.query(\"What is the name of the professional women's basketball team in New York City?\", mode=\"embedding\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e1000018-18de-410d-b6d9-c66bf37ccf1d", + "metadata": {}, + "outputs": [], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4fc3f18a-0ef9-453c-acf8-7aedd784cdcf", + "metadata": {}, + "outputs": [], + "source": [ + "response = new_index.query(\n", + " \"What battles took place in New York City in the American Revolution?\", \n", + " mode=\"embedding\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5588289b-9fdc-4b86-bab9-808c97be05e1", + "metadata": {}, + "outputs": [], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "53265fd4-da98-4cf9-abfb-3f76105fd2ff", + "metadata": {}, + "outputs": [], + "source": [ + "# set Logging to DEBUG for more detailed outputs\n", + "response = new_index.query(\"What are the airports in New York City?\", mode=\"embedding\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bc08060f-b031-4dc5-a980-427dd2407b5d", + "metadata": {}, + "outputs": [], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "markdown", + "id": "63009734-deda-4159-9f2b-0af19720e913", + "metadata": {}, + "source": [ + "### GPTListIndex - Embedding-based Query" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fd8920ae-8115-457c-b092-21e50cc3bcc0", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import GPTListIndex, SimpleDirectoryReader\n", + "from IPython.display import Markdown" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27c8bbee-daf5-494d-ba66-b60142592a96", + "metadata": {}, + "outputs": [], + "source": [ + "documents = SimpleDirectoryReader('data').load_data()\n", + "index = GPTListIndex.from_documents(documents)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c3d5a589-ee75-40bd-9529-75f693874ed7", + "metadata": {}, + "outputs": [], + "source": [ + "index.save_to_disk('index_list_emb.json')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9dfbef52-50fb-46ca-b82b-c44cfa2301ef", + "metadata": {}, + "outputs": [], + "source": [ + "# try loading\n", + "new_index = GPTListIndex.load_from_disk('index_list_emb.json')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2cbf24c2-060e-4216-9188-a6746af1830d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# set Logging to DEBUG for more detailed outputs\n", + "response = new_index.query(\"What is the name of the professional women's basketball team in New York City?\", mode=\"embedding\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14e1b19f-fbf7-49fd-a96f-cbb37bafd498", + "metadata": {}, + "outputs": [], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "48b86c8d-9149-4395-9d52-6070597c814d", + "metadata": {}, + "outputs": [], + "source": [ + "# set Logging to DEBUG for more detailed outputs\n", + "response = new_index.query(\"What battles took place in New York City in the American Revolution?\", mode=\"embedding\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57fbd90c-a8d3-4738-8531-e8f48a953167", + "metadata": {}, + "outputs": [], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7ab01446-9b07-4222-a577-eeb4617ce4fc", + "metadata": {}, + "outputs": [], + "source": [ + "# set Logging to DEBUG for more detailed outputs\n", + "response = new_index.query(\"What are the airports in New York City?\", mode=\"embedding\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "091afaea-a61e-4a7c-b2f1-7df387380b8b", + "metadata": {}, + "outputs": [], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "markdown", + "id": "aca03087-d6cc-4d87-8ec6-185fa03d9fea", + "metadata": {}, + "source": [ + "## Try out other embeddings! \n", + "(courtesy of langchain)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27c24411-7049-45c7-862c-0857c03db580", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import GPTListIndex, SimpleDirectoryReader, ServiceContext\n", + "from IPython.display import Markdown" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b9ff1944-a06a-4b05-adae-a2ef25e74e8b", + "metadata": {}, + "outputs": [], + "source": [ + "# load in HF embedding model from langchain\n", + "from langchain.embeddings.huggingface import HuggingFaceEmbeddings\n", + "from llama_index import LangchainEmbedding\n", + "embed_model = LangchainEmbedding(HuggingFaceEmbeddings())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3049d517-05db-459b-9e32-711e380fda67", + "metadata": {}, + "outputs": [], + "source": [ + "# try loading index\n", + "new_index = GPTListIndex.load_from_disk('index_list_emb.json')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1494cabb-0123-408a-9d81-8e02db9b3acd", + "metadata": {}, + "outputs": [], + "source": [ + "# configure\n", + "service_context = ServiceContext.from_defaults(embed_model=embed_model)\n", + "\n", + "# set Logging to DEBUG for more detailed outputs\n", + "response = new_index.query(\n", + " \"What is the name of the professional women's basketball team in New York City?\", \n", + " mode=\"embedding\", \n", + " service_context=service_context, \n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4d96a2e7-4eb1-474e-b855-eca3efed1bad", + "metadata": {}, + "outputs": [], + "source": [ + "response" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "80510d3a-8bf8-47f2-b1d4-3d1bd0d5a1bb", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/test_wiki/TestWikiReader.ipynb b/examples/test_wiki/TestWikiReader.ipynb index a919e7c340..d8a30a42d6 100644 --- a/examples/test_wiki/TestWikiReader.ipynb +++ b/examples/test_wiki/TestWikiReader.ipynb @@ -1,289 +1,297 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "52295407", - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "import sys\n", - "\n", - "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", - "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c5d167a5-81f8-4d2c-b42f-0a190577132f", - "metadata": {}, - "outputs": [], - "source": [ - "# My OpenAI Key\n", - "import os\n", - "os.environ['OPENAI_API_KEY'] = \"INSERT OPENAI KEY\"" - ] - }, - { - "cell_type": "markdown", - "id": "575750cc-479f-4b1f-b93f-4b00ed756d52", - "metadata": {}, - "source": [ - "## Wikipedia Reader + Keyword Table" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "5f60348e-731d-4a95-bae2-426e184a914e", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import GPTKeywordTableIndex, WikipediaReader" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "952c4659-7fbb-447e-8caf-06916412cc37", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "page: Covid-19\n" - ] - } - ], - "source": [ - "wiki_docs = WikipediaReader().load_data(pages=['Covid-19'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3be202db-a4c7-41d2-ba7d-446d1f934830", - "metadata": {}, - "outputs": [], - "source": [ - "index = GPTKeywordTableIndex.from_documents(wiki_docs)" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "7f5667a9-6758-447b-9af2-5e5a4d008a29", - "metadata": {}, - "outputs": [], - "source": [ - "# save index to docs\n", - "index.save_to_disk('index_covid.json')" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "77340460-8319-474f-91eb-545ea5790127", - "metadata": {}, - "outputs": [], - "source": [ - "new_index = GPTKeywordTableIndex.load_from_disk('index_covid.json')" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "id": "28d7163e-f26f-4ad8-89d5-9cb7662c4d9c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Starting query: Which country included tocilizumab in treatment for covid-19?\n", - "Extracted keywords: ['tocilizumab', 'treatment', 'covid-19', 'covid', '19']\n", - "> Querying with idx: 1105763466456338724: of age or older weighing at least 40 kilograms ...\n", - "> Querying with idx: 2820318727532393752: Coronavirus disease 2019 (COVID-19) is a contag...\n", - "> Querying with idx: 897499143815831368: if the mask includes an exhalation valve, a wea...\n", - "> Querying with idx: 8628144746434065339: pulmonary fibrosis, cystic fibrosis. Evidence s...\n" - ] - }, - { - "data": { - "text/plain": [ - "'\\n\\nChina'" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# GPT doesn't find the corresponding evidence in the leaf node, but still gives the correct answer\n", - "# set Logging to DEBUG for more detailed outputs\n", - "new_index.query(\"Which country included tocilizumab in treatment for covid-19?\")" - ] - }, - { - "cell_type": "markdown", - "id": "addb0c4d-f1ae-40c1-8b69-5a989609672f", - "metadata": {}, - "source": [ - "## Wikipedia Reader + List" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a0fc24e1-eca5-4267-a962-f7fe0fc5c7df", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import GPTListIndex, WikipediaReader" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "872a651a-ca4a-43e2-8b29-e4f667f9d3c5", - "metadata": {}, - "outputs": [], - "source": [ - "wiki_docs = WikipediaReader().load_data(pages=['Covid-19'])" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "37e85af0-b1c3-4c18-b239-6e32a7acf8d6", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Adding chunk: Coronavirus disease 2019 (COVID-19) is a contag...\n", - "> Adding chunk: people with COVID‑19 and acute respiratory dist...\n", - "> Adding chunk: encourage or mandate the use of face masks or c...\n", - "> Adding chunk: have elevated liver enzymes, reflecting liver i...\n", - "> Adding chunk: insofar as their drug use may have caused lung ...\n", - "> Adding chunk: treatment of mild-to-moderate COVID‑19 in adult...\n" - ] - } - ], - "source": [ - "index = GPTListIndex.from_documents(wiki_docs)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "ec0119ef-786e-40ea-89af-f1ca0ad26de6", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Starting query: Which country included tocilizumab in treatment for covid-19?\n" - ] - } - ], - "source": [ - "# set Logging to DEBUG for more detailed outputs\n", - "# with keyword lookup\n", - "response = index.query(\n", - " \"Which country included tocilizumab in treatment for covid-19?\", \n", - " required_keywords=[\"tocilizumab\"]\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "b4087a84-0939-444f-93f2-a1a7aa32db3f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'China'" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(response.strip())" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "fb155bc7-cb50-47b6-b92b-895852c2d8f4", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Starting query: Which country included tocilizumab in treatment for covid-19?\n" - ] - } - ], - "source": [ - "# set Logging to DEBUG for more detailed outputs\n", - "# without keyword lookup\n", - "response = index.query(\n", - " \"Which country included tocilizumab in treatment for covid-19?\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "5b45c07a-4e76-4a45-86b6-6b2df1ef4f7b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'There is no definite answer to this question as different countries have different treatment methods for covid-19. However, according to the context information, it is known that the virus SARS-CoV-2 can cause severe damage to various organs in the human body by inducing systemic inflammation. Therefore, it is possible that tocilizumab, which is a drug that inhibits the virus, may be included in treatment for covid-19 in some countries in order to prevent or reduce the severity of a cytokine storm. Additionally, passive antibodies may be used to treat people with active COVID-19 in order to help them recover.'" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(response.strip())" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.1" - } + "cells": [ + { + "cell_type": "markdown", + "id": "3e3d4fcb", + "metadata": {}, + "source": [ + "# Test Wiki Reader" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "52295407", + "metadata": {}, + "outputs": [], + "source": [ + "imporat logging\n", + "import sys\n", + "\n", + "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", + "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c5d167a5-81f8-4d2c-b42f-0a190577132f", + "metadata": {}, + "outputs": [], + "source": [ + "# My OpenAI Key\n", + "import os\n", + "os.environ['OPENAI_API_KEY'] = \"INSERT OPENAI KEY\"" + ] + }, + { + "cell_type": "markdown", + "id": "575750cc-479f-4b1f-b93f-4b00ed756d52", + "metadata": {}, + "source": [ + "## Wikipedia Reader + Keyword Table" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "5f60348e-731d-4a95-bae2-426e184a914e", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import GPTKeywordTableIndex, WikipediaReader" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "952c4659-7fbb-447e-8caf-06916412cc37", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "page: Covid-19\n" + ] + } + ], + "source": [ + "wiki_docs = WikipediaReader().load_data(pages=['Covid-19'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3be202db-a4c7-41d2-ba7d-446d1f934830", + "metadata": {}, + "outputs": [], + "source": [ + "index = GPTKeywordTableIndex.from_documents(wiki_docs)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "7f5667a9-6758-447b-9af2-5e5a4d008a29", + "metadata": {}, + "outputs": [], + "source": [ + "# save index to docs\n", + "index.save_to_disk('index_covid.json')" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "77340460-8319-474f-91eb-545ea5790127", + "metadata": {}, + "outputs": [], + "source": [ + "new_index = GPTKeywordTableIndex.load_from_disk('index_covid.json')" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "28d7163e-f26f-4ad8-89d5-9cb7662c4d9c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Starting query: Which country included tocilizumab in treatment for covid-19?\n", + "Extracted keywords: ['tocilizumab', 'treatment', 'covid-19', 'covid', '19']\n", + "> Querying with idx: 1105763466456338724: of age or older weighing at least 40 kilograms ...\n", + "> Querying with idx: 2820318727532393752: Coronavirus disease 2019 (COVID-19) is a contag...\n", + "> Querying with idx: 897499143815831368: if the mask includes an exhalation valve, a wea...\n", + "> Querying with idx: 8628144746434065339: pulmonary fibrosis, cystic fibrosis. Evidence s...\n" + ] }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file + { + "data": { + "text/plain": [ + "'\\n\\nChina'" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# GPT doesn't find the corresponding evidence in the leaf node, but still gives the correct answer\n", + "# set Logging to DEBUG for more detailed outputs\n", + "new_index.query(\"Which country included tocilizumab in treatment for covid-19?\")" + ] + }, + { + "cell_type": "markdown", + "id": "addb0c4d-f1ae-40c1-8b69-5a989609672f", + "metadata": {}, + "source": [ + "## Wikipedia Reader + List" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a0fc24e1-eca5-4267-a962-f7fe0fc5c7df", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import GPTListIndex, WikipediaReader" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "872a651a-ca4a-43e2-8b29-e4f667f9d3c5", + "metadata": {}, + "outputs": [], + "source": [ + "wiki_docs = WikipediaReader().load_data(pages=['Covid-19'])" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "37e85af0-b1c3-4c18-b239-6e32a7acf8d6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Adding chunk: Coronavirus disease 2019 (COVID-19) is a contag...\n", + "> Adding chunk: people with COVID‑19 and acute respiratory dist...\n", + "> Adding chunk: encourage or mandate the use of face masks or c...\n", + "> Adding chunk: have elevated liver enzymes, reflecting liver i...\n", + "> Adding chunk: insofar as their drug use may have caused lung ...\n", + "> Adding chunk: treatment of mild-to-moderate COVID‑19 in adult...\n" + ] + } + ], + "source": [ + "index = GPTListIndex.from_documents(wiki_docs)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "ec0119ef-786e-40ea-89af-f1ca0ad26de6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Starting query: Which country included tocilizumab in treatment for covid-19?\n" + ] + } + ], + "source": [ + "# set Logging to DEBUG for more detailed outputs\n", + "# with keyword lookup\n", + "response = index.query(\n", + " \"Which country included tocilizumab in treatment for covid-19?\", \n", + " required_keywords=[\"tocilizumab\"]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "b4087a84-0939-444f-93f2-a1a7aa32db3f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'China'" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(response.strip())" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "fb155bc7-cb50-47b6-b92b-895852c2d8f4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Starting query: Which country included tocilizumab in treatment for covid-19?\n" + ] + } + ], + "source": [ + "# set Logging to DEBUG for more detailed outputs\n", + "# without keyword lookup\n", + "response = index.query(\n", + " \"Which country included tocilizumab in treatment for covid-19?\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "5b45c07a-4e76-4a45-86b6-6b2df1ef4f7b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'There is no definite answer to this question as different countries have different treatment methods for covid-19. However, according to the context information, it is known that the virus SARS-CoV-2 can cause severe damage to various organs in the human body by inducing systemic inflammation. Therefore, it is possible that tocilizumab, which is a drug that inhibits the virus, may be included in treatment for covid-19 in some countries in order to prevent or reduce the severity of a cytokine storm. Additionally, passive antibodies may be used to treat people with active COVID-19 in order to help them recover.'" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(response.strip())" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/vector_indices/AsyncIndexCreationDemo.ipynb b/examples/vector_indices/AsyncIndexCreationDemo.ipynb index fcd75314e6..9f1b82f1f1 100644 --- a/examples/vector_indices/AsyncIndexCreationDemo.ipynb +++ b/examples/vector_indices/AsyncIndexCreationDemo.ipynb @@ -1,215 +1,215 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "f57c7b08", - "metadata": {}, - "source": [ - "# Async Index Creation Demo" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "5db0283d", - "metadata": {}, - "outputs": [], - "source": [ - "import time\n", - "\n", - "# Helps asyncio run within Jupyter\n", - "import nest_asyncio\n", - "nest_asyncio.apply()\n", - "\n", - "# My OpenAI Key\n", - "import os\n", - "os.environ['OPENAI_API_KEY'] = \"[YOUR_API_KEY]\"" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "50e3bb2e", - "metadata": {}, - "outputs": [], - "source": [ - "from llama_index import GPTSimpleVectorIndex, download_loader\n", - "\n", - "WikipediaReader = download_loader(\"WikipediaReader\")\n", - "\n", - "loader = WikipediaReader()\n", - "documents = loader.load_data(pages=['Berlin', 'Santiago', 'Moscow', 'Tokyo', 'Jakarta', 'Cairo', 'Bogota', 'Shanghai', 'Damascus'])" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "d14b17bf", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "9" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(documents)" - ] - }, - { - "cell_type": "markdown", - "id": "2684824b", - "metadata": {}, - "source": [ - "9 Wikipedia articles downloaded as documents" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "4537def9", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", - "INFO:root:> [build_index_from_documents] Total embedding token usage: 142295 tokens\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "7.691995083000052\n" - ] - } - ], - "source": [ - "start_time = time.perf_counter()\n", - "index = GPTSimpleVectorIndex.from_documents(documents)\n", - "duration = time.perf_counter() - start_time\n", - "print(duration)" - ] - }, - { - "cell_type": "markdown", - "id": "6374ac99", - "metadata": {}, - "source": [ - "Standard index creation took 7.69 seconds" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "60a7c522", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings processing_ms=245 request_id=314b145a07f65fd34e707f633cc1a444 response_code=200\n", - "INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings processing_ms=432 request_id=bb9e796d0b8f9c2365b68de8a56009ff response_code=200\n", - "INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings processing_ms=433 request_id=7a94707fe2f8916e9cdd8276a5748207 response_code=200\n", - "INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings processing_ms=499 request_id=cda679215293c3a13ed57c2eae3dc582 response_code=200\n", - "INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings processing_ms=527 request_id=5e1c3e74aa3f9f950e4035f81a0f0a15 response_code=200\n", - "INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings processing_ms=585 request_id=81983fe76eab95f73f82df881ff7b2d9 response_code=200\n", - "INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings processing_ms=574 request_id=702a182b54a29a33719205f722378c8e response_code=200\n", - "INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings processing_ms=575 request_id=d1df11775c59a3ba403dda253081f8eb response_code=200\n", - "INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings processing_ms=575 request_id=47929f13469569527505b51958cd8e71 response_code=200\n", - "INFO:root:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", - "INFO:root:> [build_index_from_documents] Total embedding token usage: 142295 tokens\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.3730635830000892\n" - ] - } - ], - "source": [ - "start_time = time.perf_counter()\n", - "index = GPTSimpleVectorIndex(documents, use_async=True)\n", - "duration = time.perf_counter() - start_time\n", - "print(duration)" - ] - }, - { - "cell_type": "markdown", - "id": "8bd9de0b", - "metadata": {}, - "source": [ - "Async index creation took 2.37 seconds" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "d0db93cb", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:root:> [query] Total LLM token usage: 4075 tokens\n", - "INFO:root:> [query] Total embedding token usage: 8 tokens\n" - ] - }, - { - "data": { - "text/plain": [ - "Response(response=\"\\n\\nThe name 'Jakarta' is derived from the word Jayakarta (Devanagari: जयकर्त) which is ultimately derived from the Sanskrit जय jaya (victorious), and कृत krta (accomplished, acquired), thus Jayakarta translates as 'victorious deed', 'complete act' or 'complete victory'. It was named for the Muslim troops of Fatahillah which successfully defeated and drove the Portuguese away from the city in 1527. Before it was called Jayakarta, the city was known as 'Sunda Kelapa'. Tomé Pires, a Portuguese apothecary wrote the name of the city on his magnum opus as Jacatra or Jacarta during his journey to East Indies. The city is located in a low-lying area ranging from −2 to 91 m (−7 to 299 ft) with an average elevation of 8 m (26 ft) above sea level with historically extensive swampy areas. Some parts of the city have been constructed on reclaimed tidal flats that occur around the area. Thirteen rivers flow through Jakarta, including the Ciliwung River, Kalibaru, Pesanggra\", source_nodes=[SourceNode(source_text=\"Jakarta (; Indonesian pronunciation: [dʒaˈkarta] (listen)), officially the Special Capital Region of Jakarta (Indonesian: Daerah Khusus Ibukota Jakarta), is the capital and largest city of Indonesia. Lying on the northwest coast of Java, the world's most populous island, Jakarta is the largest city in Southeast Asia and serves as the diplomatic capital of ASEAN.\\nThe city is the economic, cultural, and political centre of Indonesia. It possesses a province-level status and has a population of 10,562,088 as of mid-2021. Although Jakarta extends over only 664.01 km2 (256.38 sq mi) and thus has the smallest area of any Indonesian province, its metropolitan area covers 9,957.08 km2 (3,844.45 sq mi), which includes the satellite cities Bogor, Depok, Tangerang, South Tangerang, and Bekasi, and has an estimated population of 35 million as of 2021, making it the largest urban area in Indonesia and the second-largest in the world (after Tokyo). Jakarta ranks first among the Indonesian provinces in the human development index. Jakarta's business and employment opportunities, along with its ability to offer a potentially higher standard of living compared to other parts of the country, have attracted migrants from across the Indonesian archipelago, making it a melting pot of numerous cultures.\\nJakarta is one of the oldest continuously inhabited cities in Southeast Asia. Established in the fourth century as Sunda Kelapa, the city became an important trading port for the Sunda Kingdom. At one time, it was the de facto capital of the Dutch East Indies, when it was known as Batavia. Jakarta was officially a city within West Java until 1960 when its official status was changed to a province with special capital region distinction. As a province, its government consists of five administrative cities and one administrative regency. Jakarta is an alpha world city and is the seat of the ASEAN secretariat. Financial institutions such as the Bank of Indonesia, Indonesia Stock Exchange, and corporate headquarters of numerous Indonesian companies and multinational corporations are located in the city. In 2021, the city's GRP PPP was estimated at US$602.946 billion.\\nJakarta's main challenges include rapid urban growth, ecological breakdown, gridlocked traffic, congestion, and flooding. Jakarta is sinking up to 17 cm (6.7 inches) annually, which coupled with the rising of sea levels, has made the city more prone to flooding. Hence, it is one of the fastest-sinking capitals in the world. In response to these challenges, in August 2019, President Joko Widodo announced that the capital of Indonesia would be moved from Jakarta to the planned city of Nusantara, in the province of East Kalimantan on the island of Borneo.\\n\\n\\n== Name ==\\n\\nJakarta has been home to multiple settlements. Below is the list of names used during its existence:\\n\\nSunda Kelapa (397–1527)\\nJayakarta (1527–1619)\\nBatavia (1619–1942)\\nDjakarta (1942–1972)\\nJakarta (1972–present)The name 'Jakarta' is derived from the word Jayakarta (Devanagari: जयकर्त) which is ultimately derived from the Sanskrit जय jaya (victorious), and कृत krta (accomplished, acquired), thus Jayakarta translates as 'victorious deed', 'complete act' or 'complete victory'. It was named for the Muslim troops of Fatahillah which successfully defeated and drove the Portuguese away from the city in 1527. Before it was called Jayakarta, the city was known as 'Sunda Kelapa'. Tomé Pires, a Portuguese apothecary wrote the name of the city on his magnum opus as Jacatra or Jacarta during his journey to East Indies. \\nIn the 17th century, the city was known as Koningin van het Oosten (Queen of the Orient), a name that was given for the urban beauty of downtown Batavia's canals, mansions and ordered city layout. After expanding to the south in the 19th century, this nickname came to be more associated with the suburbs (e.g. Menteng and the area around Merdeka Square), with their wide lanes, green spaces and villas. During the Japanese occupation, the city was renamed as Jakaruta Tokubetsu-shi (ジャカルタ特別市, Jakarta Special City).\\n\\n\\n== History ==\\n\\n\\n=== Precolonial era ===\\n\\nThe north coast area of western Java including Jakarta was the location of prehistoric Buni culture that flourished from 400 BC to 100 AD. The area in and around modern Jakarta was part of the 4th-century Sundanese kingdom of Tarumanagara, one of the oldest Hindu kingdoms in Indonesia. The area of North Jakarta around Tugu became a populated settlement in the early 5th century. The Tugu inscription (probably written around 417 AD) discovered in Batutumbuh hamlet, Tugu village, Koja, North Jakarta, mentions that King Purnawarman of Tarumanagara undertook hydraulic projects; the irrigation and water drainage project of the Chandrabhaga river and the Gomati river near his capital. Following the decline of Tarumanagara, its territories, including the Jakarta area, became part of the Hindu Kingdom of Sunda. From the 7th to the early 13th century, the port of Sunda was under the Srivijaya maritime empire. According to the Chinese source, Chu-fan-chi, written circa 1225, Chou Ju-kua reported in the early 13th century that Srivijaya still ruled Sumatra, the Malay peninsula and western Java (Sunda). The source says the port of Sunda is strategic and thriving, mentioning pepper from Sunda as among the best in quality. The people worked in agriculture, and their houses were built on wooden piles. The harbour area became known as Sunda Kelapa, (Sundanese: ᮞᮥᮔ᮪ᮓ ᮊᮨᮜᮕ) and by the 14th century, it was an important trading port for the Sunda Kingdom.\\nThe first European fleet, four Portuguese ships from Malacca, arrived in 1513 while looking for a route for spices. The Sunda Kingdom made an alliance treaty with the Portuguese by allowing them to build a port in 1522 to defend against the rising power of Demak Sultanate from central Java. In 1527, Fatahillah, a Javanese general from Demak attacked and conquered Sunda Kelapa, driving out the Portuguese. Sunda Kelapa was renamed Jayakarta, and became a fiefdom of the Banten Sultanate, which became a major Southeast Asian trading centre.\\nThrough the relationship with Prince Jayawikarta of the Banten Sultanate, Dutch ships arrived in 1596. In 1602, the British East India Company's first voyage, commanded by Sir James Lancaster, arrived in Aceh and sailed on to Banten where they were allowed to build a trading post. This site became the centre of British trade in the Indonesian archipelago until 1682. Jayawikarta is thought to have made trading connections with the British merchants, rivals of the Dutch, by allowing them to build houses directly across from the Dutch buildings in 1615.\\n\\n\\n=== Colonial era ===\\n\\nWhen relations between Prince Jayawikarta and the Dutch deteriorated, his soldiers attacked the Dutch fortress. His army and the British, however, were defeated by the Dutch, in part owing to the timely arrival of Jan Pieterszoon Coen. The Dutch burned the British fort and forced them to retreat on their ships. The victory consolidated Dutch power, and they renamed the city Batavia in 1619.\\n\\nCommercial opportunities in the city attracted native and especially Chinese and Arab immigrants. This sudden population increase created burdens on the city. Tensions grew as the colonial government tried to restrict Chinese migration through deportations. Following a revolt, 5,000 Chinese were massacred by the Dutch and natives on 9 October 1740, and the following year, Chinese inhabitants were moved to Glodok outside the city walls. At the beginning of the 19th century, around 400 Arabs and Moors lived in Batavia, a number that changed little during the following decades. Among the commodities traded were fabrics, mainly imported cotton, batik and clothing worn by Arab communities.The city began to expand further south as epidemics in 1835 and 1870 forced residents to move away from the port. The Koningsplein, now Merdeka Square was completed in 1818, the housing park of Menteng was started in 1913, and Kebayoran Baru was the last Dutch-built residential area. By 1930, Batavia had more than 500,000 inhabitants, including 37,067 Europeans.On 5 March 1942, the Japanese captured Batavia from Dutch control, and the city was named Jakarta (Jakarta Special City (ジャカルタ特別市, Jakaruta tokubetsu-shi), under the special status that was assigned to the city). After the war, the Dutch name Batavia was internationally recognised until full Indonesian independence on 27 December 1949. The city, now renamed Jakarta, was officially proclaimed the national capital of Indonesia.\\n\\n\\n=== Independence era ===\\n\\nAfter World War II ended, Indonesian nationalists declared independence on 17 August 1945, and the government of Jakarta City was changed into the Jakarta National Administration in the following month. During the Indonesian National Revolution, Indonesian Republicans withdrew from Allied-occupied Jakarta and established their capital in Yogyakarta.\\nAfter securing full independence, Jakarta again became the national capital in 1950. With Jakarta selected to host the 1962 Asian Games, Soekarno, envisaging Jakarta as a great international city, instigated large government-funded projects with openly nationalistic and modernist architecture. Projects included a cloverleaf interchange, a major boulevard (Jalan MH Thamrin-Sudirman), monuments such as The National Monument, Hotel Indonesia, a shopping centre, and a new building intended to be the headquarters of CONEFO. In October 1965, Jakarta was the site of an abortive coup attempt in which six top generals were killed, precipitating a violent anti-communist purge which killed at least 500,000 people, including some ethnic Chinese. The event marked the beginning of Suharto's New Order. The first government was led by a mayor until the end of 1960 when the office was changed to that of a governor. The last mayor of Jakarta was Soediro until he was replaced by Soemarno Sosroatmodjo as governor. Based on law No. 5 of 1974 relating to regional governments, Jakarta was confirmed as the capital of Indonesia and one of the country's then 26 provinces.In 1966, Jakarta was declared a 'special capital region' (Daerah Khusus Ibukota), with a status equivalent to that of a province. Lieutenant General Ali Sadikin served as governor from 1966 to 1977; he rehabilitated roads and bridges, encouraged the arts, built hospitals and a large number of schools. He cleared out slum dwellers for new development projects — some for the benefit of the Suharto family,— and attempted to eliminate rickshaws and ban street vendors. He began control of migration to the city to stem overcrowding and poverty. Foreign investment contributed to a real estate boom that transformed the face of Jakarta. The boom ended with the 1997 Asian financial crisis, putting Jakarta at the centre of violence, protest, and political manoeuvring.\\nAfter three decades in power, support for President Suharto began to wane. Tensions peaked when four students were shot dead at Trisakti University by security forces. Four days of riots and violence in 1998 ensued that killed an estimated 1,200, and destroyed or damaged 6,000 buildings, forcing Suharto to resign. Much of the rioting targeted Chinese Indonesians. In the post-Suharto era, Jakarta has remained the focal point of democratic change in Indonesia. Jemaah Islamiah-connected bombings occurred almost annually in the city between 2000 and 2005, with another in 2009. In August 2007, Jakarta held its first-ever election to choose a governor as part of a nationwide decentralisation program that allows direct local elections in several areas. Previously, governors were elected by the city's legislative body.During the Jokowi presidency, the Government adopted a plan to move Indonesia's capital to East Kalimantan.Between 2016 and 2017, a series of terrorist attacks rocked Jakarta with scenes of multiple suicide bombings and gunfire. In suspicion to its links, the Islamic State, the perpetrator led by Abu Bakr al-Baghdadi claimed responsibility for the attacks.\\n\\n\\n== Geography ==\\n\\nJakarta covers 699.5 km2 (270.1 sq mi), the smallest among any Indonesian provinces. However, its metropolitan area covers 6,392 km2 (2,468 sq mi), which extends into two of the bordering provinces of West Java and Banten. The Greater Jakarta area includes three bordering regencies (Bekasi Regency, Tangerang Regency and Bogor Regency) and five adjacent cities (Bogor, Depok, Bekasi, Tangerang and South Tangerang).\\n\\nJakarta is situated on the northwest coast of Java, at the mouth of the Ciliwung River on Jakarta Bay, an inlet of the Java Sea. It is strategically located near the Sunda Strait. The northern part of Jakarta is plain land, some areas of which are below sea level, and subject to frequent flooding. The southern parts of the city are hilly. It is one of only two Asian capital cities located in the southern hemisphere (along with East Timor's Dili). Officially, the area of the Jakarta Special District is 662 km2 (256 sq mi) of land area and 6,977 km2 (2,694 sq mi) of sea area. The Thousand Islands, which are administratively a part of Jakarta, are located in Jakarta Bay, north of the city.\\nJakarta lies in a low and flat alluvial plain, ranging from −2 to 91 m (−7 to 299 ft) with an average elevation of 8 m (26 ft) above sea level with historically extensive swampy areas. Some parts of the city have been constructed on reclaimed tidal flats that occur around the area. Thirteen rivers flow through Jakarta. They are Ciliwung River, Kalibaru, Pesanggrahan, Cipinang, Angke River, Maja, Mookervart, Krukut, Buaran, West Tarum, Cakung, Petukangan, Sunter River and Grogol River. They flow from the Puncak highlands to the south of the city, then across the city northwards towards the Java Sea. The Ciliwung River divides the city into the western and eastern districts.\\nThese rivers, combined with the wet season rains and insufficient\", doc_id='eeb6ef32-c857-44e2-b0c5-dff6e29a9cd7', extra_info=None, node_info={'start': 0, 'end': 13970}, similarity=0.8701780916463354)], extra_info=None)" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "index.query(\"What is the etymology of Jakarta?\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4d2e2a79", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.6" - } + "cells": [ + { + "cell_type": "markdown", + "id": "f57c7b08", + "metadata": {}, + "source": [ + "# Async Index Creation Demo" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "5db0283d", + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "\n", + "# Helps asyncio run within Jupyter\n", + "import nest_asyncio\n", + "nest_asyncio.apply()\n", + "\n", + "# My OpenAI Key\n", + "import os\n", + "os.environ['OPENAI_API_KEY'] = \"[YOUR_API_KEY]\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "50e3bb2e", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index import GPTSimpleVectorIndex, download_loader\n", + "\n", + "WikipediaReader = download_loader(\"WikipediaReader\")\n", + "\n", + "loader = WikipediaReader()\n", + "documents = loader.load_data(pages=['Berlin', 'Santiago', 'Moscow', 'Tokyo', 'Jakarta', 'Cairo', 'Bogota', 'Shanghai', 'Damascus'])" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "d14b17bf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "9" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(documents)" + ] + }, + { + "cell_type": "markdown", + "id": "2684824b", + "metadata": {}, + "source": [ + "9 Wikipedia articles downloaded as documents" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "4537def9", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", + "INFO:root:> [build_index_from_documents] Total embedding token usage: 142295 tokens\n" + ] }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file + { + "name": "stdout", + "output_type": "stream", + "text": [ + "7.691995083000052\n" + ] + } + ], + "source": [ + "start_time = time.perf_counter()\n", + "index = GPTSimpleVectorIndex.from_documents(documents)\n", + "duration = time.perf_counter() - start_time\n", + "print(duration)" + ] + }, + { + "cell_type": "markdown", + "id": "6374ac99", + "metadata": {}, + "source": [ + "Standard index creation took 7.69 seconds" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "60a7c522", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings processing_ms=245 request_id=314b145a07f65fd34e707f633cc1a444 response_code=200\n", + "INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings processing_ms=432 request_id=bb9e796d0b8f9c2365b68de8a56009ff response_code=200\n", + "INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings processing_ms=433 request_id=7a94707fe2f8916e9cdd8276a5748207 response_code=200\n", + "INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings processing_ms=499 request_id=cda679215293c3a13ed57c2eae3dc582 response_code=200\n", + "INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings processing_ms=527 request_id=5e1c3e74aa3f9f950e4035f81a0f0a15 response_code=200\n", + "INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings processing_ms=585 request_id=81983fe76eab95f73f82df881ff7b2d9 response_code=200\n", + "INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings processing_ms=574 request_id=702a182b54a29a33719205f722378c8e response_code=200\n", + "INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings processing_ms=575 request_id=d1df11775c59a3ba403dda253081f8eb response_code=200\n", + "INFO:openai:message='OpenAI API response' path=https://api.openai.com/v1/engines/text-embedding-ada-002/embeddings processing_ms=575 request_id=47929f13469569527505b51958cd8e71 response_code=200\n", + "INFO:root:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", + "INFO:root:> [build_index_from_documents] Total embedding token usage: 142295 tokens\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.3730635830000892\n" + ] + } + ], + "source": [ + "start_time = time.perf_counter()\n", + "index = GPTSimpleVectorIndex(documents, use_async=True)\n", + "duration = time.perf_counter() - start_time\n", + "print(duration)" + ] + }, + { + "cell_type": "markdown", + "id": "8bd9de0b", + "metadata": {}, + "source": [ + "Async index creation took 2.37 seconds" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "d0db93cb", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:> [query] Total LLM token usage: 4075 tokens\n", + "INFO:root:> [query] Total embedding token usage: 8 tokens\n" + ] + }, + { + "data": { + "text/plain": [ + "Response(response=\"\\n\\nThe name 'Jakarta' is derived from the word Jayakarta (Devanagari: जयकर्त) which is ultimately derived from the Sanskrit जय jaya (victorious), and कृत krta (accomplished, acquired), thus Jayakarta translates as 'victorious deed', 'complete act' or 'complete victory'. It was named for the Muslim troops of Fatahillah which successfully defeated and drove the Portuguese away from the city in 1527. Before it was called Jayakarta, the city was known as 'Sunda Kelapa'. Tomé Pires, a Portuguese apothecary wrote the name of the city on his magnum opus as Jacatra or Jacarta during his journey to East Indies. The city is located in a low-lying area ranging from −2 to 91 m (−7 to 299 ft) with an average elevation of 8 m (26 ft) above sea level with historically extensive swampy areas. Some parts of the city have been constructed on reclaimed tidal flats that occur around the area. Thirteen rivers flow through Jakarta, including the Ciliwung River, Kalibaru, Pesanggra\", source_nodes=[SourceNode(source_text=\"Jakarta (; Indonesian pronunciation: [dʒaˈkarta] (listen)), officially the Special Capital Region of Jakarta (Indonesian: Daerah Khusus Ibukota Jakarta), is the capital and largest city of Indonesia. Lying on the northwest coast of Java, the world's most populous island, Jakarta is the largest city in Southeast Asia and serves as the diplomatic capital of ASEAN.\\nThe city is the economic, cultural, and political centre of Indonesia. It possesses a province-level status and has a population of 10,562,088 as of mid-2021. Although Jakarta extends over only 664.01 km2 (256.38 sq mi) and thus has the smallest area of any Indonesian province, its metropolitan area covers 9,957.08 km2 (3,844.45 sq mi), which includes the satellite cities Bogor, Depok, Tangerang, South Tangerang, and Bekasi, and has an estimated population of 35 million as of 2021, making it the largest urban area in Indonesia and the second-largest in the world (after Tokyo). Jakarta ranks first among the Indonesian provinces in the human development index. Jakarta's business and employment opportunities, along with its ability to offer a potentially higher standard of living compared to other parts of the country, have attracted migrants from across the Indonesian archipelago, making it a melting pot of numerous cultures.\\nJakarta is one of the oldest continuously inhabited cities in Southeast Asia. Established in the fourth century as Sunda Kelapa, the city became an important trading port for the Sunda Kingdom. At one time, it was the de facto capital of the Dutch East Indies, when it was known as Batavia. Jakarta was officially a city within West Java until 1960 when its official status was changed to a province with special capital region distinction. As a province, its government consists of five administrative cities and one administrative regency. Jakarta is an alpha world city and is the seat of the ASEAN secretariat. Financial institutions such as the Bank of Indonesia, Indonesia Stock Exchange, and corporate headquarters of numerous Indonesian companies and multinational corporations are located in the city. In 2021, the city's GRP PPP was estimated at US$602.946 billion.\\nJakarta's main challenges include rapid urban growth, ecological breakdown, gridlocked traffic, congestion, and flooding. Jakarta is sinking up to 17 cm (6.7 inches) annually, which coupled with the rising of sea levels, has made the city more prone to flooding. Hence, it is one of the fastest-sinking capitals in the world. In response to these challenges, in August 2019, President Joko Widodo announced that the capital of Indonesia would be moved from Jakarta to the planned city of Nusantara, in the province of East Kalimantan on the island of Borneo.\\n\\n\\n== Name ==\\n\\nJakarta has been home to multiple settlements. Below is the list of names used during its existence:\\n\\nSunda Kelapa (397–1527)\\nJayakarta (1527–1619)\\nBatavia (1619–1942)\\nDjakarta (1942–1972)\\nJakarta (1972–present)The name 'Jakarta' is derived from the word Jayakarta (Devanagari: जयकर्त) which is ultimately derived from the Sanskrit जय jaya (victorious), and कृत krta (accomplished, acquired), thus Jayakarta translates as 'victorious deed', 'complete act' or 'complete victory'. It was named for the Muslim troops of Fatahillah which successfully defeated and drove the Portuguese away from the city in 1527. Before it was called Jayakarta, the city was known as 'Sunda Kelapa'. Tomé Pires, a Portuguese apothecary wrote the name of the city on his magnum opus as Jacatra or Jacarta during his journey to East Indies. \\nIn the 17th century, the city was known as Koningin van het Oosten (Queen of the Orient), a name that was given for the urban beauty of downtown Batavia's canals, mansions and ordered city layout. After expanding to the south in the 19th century, this nickname came to be more associated with the suburbs (e.g. Menteng and the area around Merdeka Square), with their wide lanes, green spaces and villas. During the Japanese occupation, the city was renamed as Jakaruta Tokubetsu-shi (ジャカルタ特別市, Jakarta Special City).\\n\\n\\n== History ==\\n\\n\\n=== Precolonial era ===\\n\\nThe north coast area of western Java including Jakarta was the location of prehistoric Buni culture that flourished from 400 BC to 100 AD. The area in and around modern Jakarta was part of the 4th-century Sundanese kingdom of Tarumanagara, one of the oldest Hindu kingdoms in Indonesia. The area of North Jakarta around Tugu became a populated settlement in the early 5th century. The Tugu inscription (probably written around 417 AD) discovered in Batutumbuh hamlet, Tugu village, Koja, North Jakarta, mentions that King Purnawarman of Tarumanagara undertook hydraulic projects; the irrigation and water drainage project of the Chandrabhaga river and the Gomati river near his capital. Following the decline of Tarumanagara, its territories, including the Jakarta area, became part of the Hindu Kingdom of Sunda. From the 7th to the early 13th century, the port of Sunda was under the Srivijaya maritime empire. According to the Chinese source, Chu-fan-chi, written circa 1225, Chou Ju-kua reported in the early 13th century that Srivijaya still ruled Sumatra, the Malay peninsula and western Java (Sunda). The source says the port of Sunda is strategic and thriving, mentioning pepper from Sunda as among the best in quality. The people worked in agriculture, and their houses were built on wooden piles. The harbour area became known as Sunda Kelapa, (Sundanese: ᮞᮥᮔ᮪ᮓ ᮊᮨᮜᮕ) and by the 14th century, it was an important trading port for the Sunda Kingdom.\\nThe first European fleet, four Portuguese ships from Malacca, arrived in 1513 while looking for a route for spices. The Sunda Kingdom made an alliance treaty with the Portuguese by allowing them to build a port in 1522 to defend against the rising power of Demak Sultanate from central Java. In 1527, Fatahillah, a Javanese general from Demak attacked and conquered Sunda Kelapa, driving out the Portuguese. Sunda Kelapa was renamed Jayakarta, and became a fiefdom of the Banten Sultanate, which became a major Southeast Asian trading centre.\\nThrough the relationship with Prince Jayawikarta of the Banten Sultanate, Dutch ships arrived in 1596. In 1602, the British East India Company's first voyage, commanded by Sir James Lancaster, arrived in Aceh and sailed on to Banten where they were allowed to build a trading post. This site became the centre of British trade in the Indonesian archipelago until 1682. Jayawikarta is thought to have made trading connections with the British merchants, rivals of the Dutch, by allowing them to build houses directly across from the Dutch buildings in 1615.\\n\\n\\n=== Colonial era ===\\n\\nWhen relations between Prince Jayawikarta and the Dutch deteriorated, his soldiers attacked the Dutch fortress. His army and the British, however, were defeated by the Dutch, in part owing to the timely arrival of Jan Pieterszoon Coen. The Dutch burned the British fort and forced them to retreat on their ships. The victory consolidated Dutch power, and they renamed the city Batavia in 1619.\\n\\nCommercial opportunities in the city attracted native and especially Chinese and Arab immigrants. This sudden population increase created burdens on the city. Tensions grew as the colonial government tried to restrict Chinese migration through deportations. Following a revolt, 5,000 Chinese were massacred by the Dutch and natives on 9 October 1740, and the following year, Chinese inhabitants were moved to Glodok outside the city walls. At the beginning of the 19th century, around 400 Arabs and Moors lived in Batavia, a number that changed little during the following decades. Among the commodities traded were fabrics, mainly imported cotton, batik and clothing worn by Arab communities.The city began to expand further south as epidemics in 1835 and 1870 forced residents to move away from the port. The Koningsplein, now Merdeka Square was completed in 1818, the housing park of Menteng was started in 1913, and Kebayoran Baru was the last Dutch-built residential area. By 1930, Batavia had more than 500,000 inhabitants, including 37,067 Europeans.On 5 March 1942, the Japanese captured Batavia from Dutch control, and the city was named Jakarta (Jakarta Special City (ジャカルタ特別市, Jakaruta tokubetsu-shi), under the special status that was assigned to the city). After the war, the Dutch name Batavia was internationally recognised until full Indonesian independence on 27 December 1949. The city, now renamed Jakarta, was officially proclaimed the national capital of Indonesia.\\n\\n\\n=== Independence era ===\\n\\nAfter World War II ended, Indonesian nationalists declared independence on 17 August 1945, and the government of Jakarta City was changed into the Jakarta National Administration in the following month. During the Indonesian National Revolution, Indonesian Republicans withdrew from Allied-occupied Jakarta and established their capital in Yogyakarta.\\nAfter securing full independence, Jakarta again became the national capital in 1950. With Jakarta selected to host the 1962 Asian Games, Soekarno, envisaging Jakarta as a great international city, instigated large government-funded projects with openly nationalistic and modernist architecture. Projects included a cloverleaf interchange, a major boulevard (Jalan MH Thamrin-Sudirman), monuments such as The National Monument, Hotel Indonesia, a shopping centre, and a new building intended to be the headquarters of CONEFO. In October 1965, Jakarta was the site of an abortive coup attempt in which six top generals were killed, precipitating a violent anti-communist purge which killed at least 500,000 people, including some ethnic Chinese. The event marked the beginning of Suharto's New Order. The first government was led by a mayor until the end of 1960 when the office was changed to that of a governor. The last mayor of Jakarta was Soediro until he was replaced by Soemarno Sosroatmodjo as governor. Based on law No. 5 of 1974 relating to regional governments, Jakarta was confirmed as the capital of Indonesia and one of the country's then 26 provinces.In 1966, Jakarta was declared a 'special capital region' (Daerah Khusus Ibukota), with a status equivalent to that of a province. Lieutenant General Ali Sadikin served as governor from 1966 to 1977; he rehabilitated roads and bridges, encouraged the arts, built hospitals and a large number of schools. He cleared out slum dwellers for new development projects — some for the benefit of the Suharto family,— and attempted to eliminate rickshaws and ban street vendors. He began control of migration to the city to stem overcrowding and poverty. Foreign investment contributed to a real estate boom that transformed the face of Jakarta. The boom ended with the 1997 Asian financial crisis, putting Jakarta at the centre of violence, protest, and political manoeuvring.\\nAfter three decades in power, support for President Suharto began to wane. Tensions peaked when four students were shot dead at Trisakti University by security forces. Four days of riots and violence in 1998 ensued that killed an estimated 1,200, and destroyed or damaged 6,000 buildings, forcing Suharto to resign. Much of the rioting targeted Chinese Indonesians. In the post-Suharto era, Jakarta has remained the focal point of democratic change in Indonesia. Jemaah Islamiah-connected bombings occurred almost annually in the city between 2000 and 2005, with another in 2009. In August 2007, Jakarta held its first-ever election to choose a governor as part of a nationwide decentralisation program that allows direct local elections in several areas. Previously, governors were elected by the city's legislative body.During the Jokowi presidency, the Government adopted a plan to move Indonesia's capital to East Kalimantan.Between 2016 and 2017, a series of terrorist attacks rocked Jakarta with scenes of multiple suicide bombings and gunfire. In suspicion to its links, the Islamic State, the perpetrator led by Abu Bakr al-Baghdadi claimed responsibility for the attacks.\\n\\n\\n== Geography ==\\n\\nJakarta covers 699.5 km2 (270.1 sq mi), the smallest among any Indonesian provinces. However, its metropolitan area covers 6,392 km2 (2,468 sq mi), which extends into two of the bordering provinces of West Java and Banten. The Greater Jakarta area includes three bordering regencies (Bekasi Regency, Tangerang Regency and Bogor Regency) and five adjacent cities (Bogor, Depok, Bekasi, Tangerang and South Tangerang).\\n\\nJakarta is situated on the northwest coast of Java, at the mouth of the Ciliwung River on Jakarta Bay, an inlet of the Java Sea. It is strategically located near the Sunda Strait. The northern part of Jakarta is plain land, some areas of which are below sea level, and subject to frequent flooding. The southern parts of the city are hilly. It is one of only two Asian capital cities located in the southern hemisphere (along with East Timor's Dili). Officially, the area of the Jakarta Special District is 662 km2 (256 sq mi) of land area and 6,977 km2 (2,694 sq mi) of sea area. The Thousand Islands, which are administratively a part of Jakarta, are located in Jakarta Bay, north of the city.\\nJakarta lies in a low and flat alluvial plain, ranging from −2 to 91 m (−7 to 299 ft) with an average elevation of 8 m (26 ft) above sea level with historically extensive swampy areas. Some parts of the city have been constructed on reclaimed tidal flats that occur around the area. Thirteen rivers flow through Jakarta. They are Ciliwung River, Kalibaru, Pesanggrahan, Cipinang, Angke River, Maja, Mookervart, Krukut, Buaran, West Tarum, Cakung, Petukangan, Sunter River and Grogol River. They flow from the Puncak highlands to the south of the city, then across the city northwards towards the Java Sea. The Ciliwung River divides the city into the western and eastern districts.\\nThese rivers, combined with the wet season rains and insufficient\", doc_id='eeb6ef32-c857-44e2-b0c5-dff6e29a9cd7', extra_info=None, node_info={'start': 0, 'end': 13970}, similarity=0.8701780916463354)], extra_info=None)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "index.query(\"What is the etymology of Jakarta?\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4d2e2a79", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/vector_indices/SimpleIndexDemo-ChatGPT.ipynb b/examples/vector_indices/SimpleIndexDemo-ChatGPT.ipynb index 12a648260b..a74dcb2292 100644 --- a/examples/vector_indices/SimpleIndexDemo-ChatGPT.ipynb +++ b/examples/vector_indices/SimpleIndexDemo-ChatGPT.ipynb @@ -1,426 +1,433 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "9c48213d-6e6a-4c10-838a-2a7c710c3a05", - "metadata": {}, - "source": [ - "# Simple Index Demo + ChatGPT" - ] - }, - { - "cell_type": "markdown", - "id": "e34da56e-bc3b-433e-b65c-96edea4db5dd", - "metadata": {}, - "source": [ - "Use a very simple wrapper around the ChatGPT API" - ] - }, - { - "cell_type": "markdown", - "id": "50d3b817-b70e-4667-be4f-d3a0fe4bd119", - "metadata": {}, - "source": [ - "#### Load documents, build the GPTSimpleVectorIndex" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "690a6918-7c75-4f95-9ccc-d2c4a1fe00d7", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/jerryliu/Programming/gpt_index/.venv/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n" - ] - } - ], - "source": [ - "import logging\n", - "import sys\n", - "\n", - "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", - "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))\n", - "\n", - "from gpt_index import GPTSimpleVectorIndex, SimpleDirectoryReader, LLMPredictor, ServiceContext\n", - "from langchain.chat_models import ChatOpenAI\n", - "from IPython.display import Markdown, display" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "03d1691e-544b-454f-825b-5ee12f7faa8a", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# load documents\n", - "documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6cc980e8-f4e1-4fad-93f8-ab1bbaa874f3", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "INFO:gpt_index.token_counter.token_counter:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", - "> [build_index_from_documents] Total LLM token usage: 0 tokens\n", - "INFO:gpt_index.token_counter.token_counter:> [build_index_from_documents] Total embedding token usage: 18579 tokens\n", - "> [build_index_from_documents] Total embedding token usage: 18579 tokens\n" - ] - } - ], - "source": [ - "# LLM Predictor (gpt-3.5-turbo) + service context\n", - "llm_predictor = LLMPredictor(llm=ChatOpenAI(temperature=0, model_name=\"gpt-3.5-turbo\"))\n", - "service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor, chunk_size_limit=512)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ad144ee7-96da-4dd6-be00-fd6cf0c78e58", - "metadata": { - "scrolled": true, - "tags": [] - }, - "outputs": [], - "source": [ - "index = GPTSimpleVectorIndex.from_documents(documents, service_context=service_context)" - ] - }, - { - "cell_type": "markdown", - "id": "b6caf93b-6345-4c65-a346-a95b0f1746c4", - "metadata": {}, - "source": [ - "#### Query Index" - ] - }, - { - "cell_type": "markdown", - "id": "83e2905e-3789-4793-82b9-0ac488246824", - "metadata": {}, - "source": [ - "By default, with the help of langchain's PromptSelector abstraction, we use \n", - "a modified refine prompt tailored for ChatGPT-use if the ChatGPT model is used." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "85466fdf-93f3-4cb1-a5f9-0056a8245a6f", - "metadata": { - "scrolled": true, - "tags": [] - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n", - "KeyboardInterrupt\n", - "\n" - ] - } - ], - "source": [ - "response = index.query(\n", - " \"What did the author do growing up?\", \n", - " service_context=service_context,\n", - " similarity_top_k=3\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "bdda1b2c-ae46-47cf-91d7-3153e8d0473b", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/markdown": [ - "<b>Before college, the author worked on writing essays and programming. They wrote short stories and essays on various topics. They also tried programming on an IBM 1401 in 9th grade using an early version of Fortran. In college, the author studied painting and art history and spent a year in Florence, Italy, where they painted portraits of people and still life. After college, the author worked on software development and co-founded a startup called Viaweb. Later, the author spent three months writing essays in 2015 before returning to work on Bel, a programming language they had been developing for years. The author worked intensively on Bel, often having chunks of the code in their head and working on it while watching their children play. Most of Bel was written while the author was living in England, where they moved with their family in 2016. In the fall of 2019, Bel was finally finished, and the author resumed writing essays and thinking about other projects.</b>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ec88df57", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "response = index.query(\n", - " \"What did the author do during his time at RISD?\", \n", - " service_context=service_context,\n", - " similarity_top_k=5\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "67e8e675-1b03-423a-b53e-23ab278ba03b", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/markdown": [ - "<b>The author attended RISD to learn how to paint and took a color class there. However, he mostly taught himself to paint and dropped out in 1993. He then moved to New York City to pursue his career as an artist.</b>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "markdown", - "id": "88ca1808-d112-4c28-b110-b65dcc9b7207", - "metadata": {}, - "source": [ - "**Refine Prompt**: Here is the chat refine prompt " - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "2f0c270d-9de5-40bf-88fc-83a360523db0", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "from gpt_index.prompts.chat_prompts import CHAT_REFINE_PROMPT" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "4db38651-9790-4a61-ac3d-689ce6dfa369", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'input_variables': ['context_msg', 'query_str', 'existing_answer'],\n", - " 'output_parser': None,\n", - " 'partial_variables': {},\n", - " 'messages': [HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['query_str'], output_parser=None, partial_variables={}, template='{query_str}', template_format='f-string', validate_template=True), additional_kwargs={}),\n", - " AIMessagePromptTemplate(prompt=PromptTemplate(input_variables=['existing_answer'], output_parser=None, partial_variables={}, template='{existing_answer}', template_format='f-string', validate_template=True), additional_kwargs={}),\n", - " HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['context_msg'], output_parser=None, partial_variables={}, template=\"We have the opportunity to refine the above answer (only if needed) with some more context below.\\n------------\\n{context_msg}\\n------------\\nGiven the new context, refine the original answer to better answer the question. If the context isn't useful, output the original answer again.\", template_format='f-string', validate_template=True), additional_kwargs={})]}" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dict(CHAT_REFINE_PROMPT.prompt)" - ] - }, - { - "cell_type": "markdown", - "id": "6cb664e8-f53f-4d6c-a086-1f2784cc1dc8", - "metadata": {}, - "source": [ - "#### Query Index (Using the standard Refine Prompt)\n", - "\n", - "If we use the \"standard\" refine prompt (where the prompt is one text template instead of multiple messages), we find that the results over ChatGPT are worse. " - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "29c416f8-d5ab-47d6-8b16-f615bfa58219", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "from gpt_index.prompts.default_prompts import DEFAULT_REFINE_PROMPT" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3df1acc4-735a-48ac-9fb4-73d9d7eabc02", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "response = index.query(\n", - " \"What did the author do during his time at RISD?\", \n", - " service_context=service_context,\n", - " refine_template=DEFAULT_REFINE_PROMPT,\n", - " similarity_top_k=5\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "b8938077-6527-4008-8d0c-af7a8178ff10", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/markdown": [ - "<b>\n", - "\n", - "The existing answer is not relevant to the new context provided and therefore the original answer remains sufficient. The author dropped out of RISD in 1993 and moved to New York to pursue painting.</b>" - ], - "text/plain": [ - "<IPython.core.display.Markdown object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(Markdown(f\"<b>{response}</b>\"))" - ] - }, - { - "cell_type": "markdown", - "id": "2e024521-97b5-417f-8c27-950983f52cda", - "metadata": {}, - "source": [ - "### [Beta] Use ChatGPTLLMPredictor\n", - "\n", - "Very simple GPT-Index-native ChatGPT wrapper. Note: this is a beta feature. If this doesn't work please\n", - "use the suggested flow above." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "a49d9a1b-21fb-4153-ad24-191a13513d64", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# use ChatGPT [beta]\n", - "from gpt_index.llm_predictor.chatgpt import ChatGPTLLMPredictor\n", - "from langchain.prompts.chat import SystemMessagePromptTemplate\n", - "\n", - "llm_predictor = ChatGPTLLMPredictor()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "596af2aa-7ddf-41f2-801b-4a24a4980dd8", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "response = index.query(\n", - " \"What did the author do during his time at RISD?\", \n", - " service_context=service_context\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "771e20ba-ccba-447e-89d6-8d731accc6f3", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'Arrr, the scallywag went to RISD and had to do the foundation classes in fundamental subjects like drawing, color, and design.'" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "str(response)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "829bb58d-910e-4a19-bbea-8a9546d24b92", - "metadata": {}, - "outputs": [], - "source": [] - } + "cells": [ + { + "cell_type": "markdown", + "id": "9c48213d-6e6a-4c10-838a-2a7c710c3a05", + "metadata": {}, + "source": [ + "# Simple Index Demo + ChatGPT" + ] + }, + { + "cell_type": "markdown", + "id": "e34da56e-bc3b-433e-b65c-96edea4db5dd", + "metadata": {}, + "source": [ + "Use a very simple wrapper around the ChatGPT API" + ] + }, + { + "cell_type": "markdown", + "id": "50d3b817-b70e-4667-be4f-d3a0fe4bd119", + "metadata": {}, + "source": [ + "#### Load documents, build the GPTSimpleVectorIndex" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "690a6918-7c75-4f95-9ccc-d2c4a1fe00d7", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/jerryliu/Programming/gpt_index/.venv/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], + "source": [ + "import logging\n", + "import sys\n", + "\n", + "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", + "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))\n", + "\n", + "from gpt_index import GPTSimpleVectorIndex, SimpleDirectoryReader, LLMPredictor, ServiceContext\n", + "from langchain.chat_models import ChatOpenAI\n", + "from IPython.display import Markdown, display" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "03d1691e-544b-454f-825b-5ee12f7faa8a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# load documents\n", + "documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6cc980e8-f4e1-4fad-93f8-ab1bbaa874f3", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:gpt_index.token_counter.token_counter:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", + "> [build_index_from_documents] Total LLM token usage: 0 tokens\n", + "INFO:gpt_index.token_counter.token_counter:> [build_index_from_documents] Total embedding token usage: 18579 tokens\n", + "> [build_index_from_documents] Total embedding token usage: 18579 tokens\n" + ] + } + ], + "source": [ + "# LLM Predictor (gpt-3.5-turbo) + service context\n", + "llm_predictor = LLMPredictor(llm=ChatOpenAI(temperature=0, model_name=\"gpt-3.5-turbo\"))\n", + "service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor, chunk_size_limit=512)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ad144ee7-96da-4dd6-be00-fd6cf0c78e58", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "index = GPTSimpleVectorIndex.from_documents(documents, service_context=service_context)" + ] + }, + { + "cell_type": "markdown", + "id": "b6caf93b-6345-4c65-a346-a95b0f1746c4", + "metadata": {}, + "source": [ + "#### Query Index" + ] + }, + { + "cell_type": "markdown", + "id": "83e2905e-3789-4793-82b9-0ac488246824", + "metadata": {}, + "source": [ + "By default, with the help of langchain's PromptSelector abstraction, we use \n", + "a modified refine prompt tailored for ChatGPT-use if the ChatGPT model is used." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "85466fdf-93f3-4cb1-a5f9-0056a8245a6f", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "KeyboardInterrupt\n", + "\n" + ] + } + ], + "source": [ + "response = index.query(\n", + " \"What did the author do growing up?\", \n", + " service_context=service_context,\n", + " similarity_top_k=3\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "bdda1b2c-ae46-47cf-91d7-3153e8d0473b", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/markdown": [ + "<b>Before college, the author worked on writing essays and programming. They wrote short stories and essays on various topics. They also tried programming on an IBM 1401 in 9th grade using an early version of Fortran. In college, the author studied painting and art history and spent a year in Florence, Italy, where they painted portraits of people and still life. After college, the author worked on software development and co-founded a startup called Viaweb. Later, the author spent three months writing essays in 2015 before returning to work on Bel, a programming language they had been developing for years. The author worked intensively on Bel, often having chunks of the code in their head and working on it while watching their children play. Most of Bel was written while the author was living in England, where they moved with their family in 2016. In the fall of 2019, Bel was finally finished, and the author resumed writing essays and thinking about other projects.</b>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ec88df57", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "response = index.query(\n", + " \"What did the author do during his time at RISD?\", \n", + " service_context=service_context,\n", + " similarity_top_k=5\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "67e8e675-1b03-423a-b53e-23ab278ba03b", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/markdown": [ + "<b>The author attended RISD to learn how to paint and took a color class there. However, he mostly taught himself to paint and dropped out in 1993. He then moved to New York City to pursue his career as an artist.</b>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "markdown", + "id": "88ca1808-d112-4c28-b110-b65dcc9b7207", + "metadata": {}, + "source": [ + "**Refine Prompt**: Here is the chat refine prompt " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "2f0c270d-9de5-40bf-88fc-83a360523db0", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from gpt_index.prompts.chat_prompts import CHAT_REFINE_PROMPT" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "4db38651-9790-4a61-ac3d-689ce6dfa369", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'input_variables': ['context_msg', 'query_str', 'existing_answer'],\n", + " 'output_parser': None,\n", + " 'partial_variables': {},\n", + " 'messages': [HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['query_str'], output_parser=None, partial_variables={}, template='{query_str}', template_format='f-string', validate_template=True), additional_kwargs={}),\n", + " AIMessagePromptTemplate(prompt=PromptTemplate(input_variables=['existing_answer'], output_parser=None, partial_variables={}, template='{existing_answer}', template_format='f-string', validate_template=True), additional_kwargs={}),\n", + " HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['context_msg'], output_parser=None, partial_variables={}, template=\"We have the opportunity to refine the above answer (only if needed) with some more context below.\\n------------\\n{context_msg}\\n------------\\nGiven the new context, refine the original answer to better answer the question. If the context isn't useful, output the original answer again.\", template_format='f-string', validate_template=True), additional_kwargs={})]}" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } ], + "source": [ + "dict(CHAT_REFINE_PROMPT.prompt)" + ] + }, + { + "cell_type": "markdown", + "id": "6cb664e8-f53f-4d6c-a086-1f2784cc1dc8", + "metadata": {}, + "source": [ + "#### Query Index (Using the standard Refine Prompt)\n", + "\n", + "If we use the \"standard\" refine prompt (where the prompt is one text template instead of multiple messages), we find that the results over ChatGPT are worse. " + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "29c416f8-d5ab-47d6-8b16-f615bfa58219", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from gpt_index.prompts.default_prompts import DEFAULT_REFINE_PROMPT" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3df1acc4-735a-48ac-9fb4-73d9d7eabc02", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "response = index.query(\n", + " \"What did the author do during his time at RISD?\", \n", + " service_context=service_context,\n", + " refine_template=DEFAULT_REFINE_PROMPT,\n", + " similarity_top_k=5\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "b8938077-6527-4008-8d0c-af7a8178ff10", "metadata": { - "kernelspec": { - "display_name": "llama_index", - "language": "python", - "name": "llama_index" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.10" - } + "tags": [] + }, + "outputs": [ + { + "data": { + "text/markdown": [ + "<b>\n", + "\n", + "The existing answer is not relevant to the new context provided and therefore the original answer remains sufficient. The author dropped out of RISD in 1993 and moved to New York to pursue painting.</b>" + ], + "text/plain": [ + "<IPython.core.display.Markdown object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(Markdown(f\"<b>{response}</b>\"))" + ] + }, + { + "cell_type": "markdown", + "id": "2e024521-97b5-417f-8c27-950983f52cda", + "metadata": {}, + "source": [ + "### [Beta] Use ChatGPTLLMPredictor\n", + "\n", + "Very simple GPT-Index-native ChatGPT wrapper. Note: this is a beta feature. If this doesn't work please\n", + "use the suggested flow above." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a49d9a1b-21fb-4153-ad24-191a13513d64", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# use ChatGPT [beta]\n", + "from llama_index.llm_predictor.chatgpt import ChatGPTLLMPredictor\n", + "from langchain.prompts.chat import SystemMessagePromptTemplate\n", + "\n", + "prepend_messages = [\n", + " SystemMessagePromptTemplate.from_template(\n", + " \"Talk like a pirate in every response.\"\n", + " )\n", + "]\n", + "\n", + "llm_predictor = ChatGPTLLMPredictor(prepend_messages=prepend_messages)\n", + "service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor, chunk_size_limit=512)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "596af2aa-7ddf-41f2-801b-4a24a4980dd8", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "response = index.query(\n", + " \"What did the author do during his time at RISD?\", \n", + " service_context=service_context\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "771e20ba-ccba-447e-89d6-8d731accc6f3", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'Arrr, the scallywag went to RISD and had to do the foundation classes in fundamental subjects like drawing, color, and design.'" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "str(response)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "829bb58d-910e-4a19-bbea-8a9546d24b92", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "llama_index", + "language": "python", + "name": "llama_index" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/vector_indices/SimpleIndexDemo-multistep.ipynb b/examples/vector_indices/SimpleIndexDemo-multistep.ipynb index 120c2cd156..c5cb8a3f71 100644 --- a/examples/vector_indices/SimpleIndexDemo-multistep.ipynb +++ b/examples/vector_indices/SimpleIndexDemo-multistep.ipynb @@ -5,7 +5,7 @@ "id": "9c48213d-6e6a-4c10-838a-2a7c710c3a05", "metadata": {}, "source": [ - "# Simple Index Demo" + "# Simple Index Demo - Multistep" ] }, { @@ -739,7 +739,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.0" } }, "nbformat": 4, diff --git a/examples/vector_indices/SimpleIndexDemo-streaming.ipynb b/examples/vector_indices/SimpleIndexDemo-streaming.ipynb index af20ea2071..672d0a652a 100644 --- a/examples/vector_indices/SimpleIndexDemo-streaming.ipynb +++ b/examples/vector_indices/SimpleIndexDemo-streaming.ipynb @@ -1,140 +1,140 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "9c48213d-6e6a-4c10-838a-2a7c710c3a05", - "metadata": {}, - "source": [ - "# Simple Index Demo" - ] - }, - { - "cell_type": "markdown", - "id": "50d3b817-b70e-4667-be4f-d3a0fe4bd119", - "metadata": {}, - "source": [ - "#### Load documents, build the GPTSimpleVectorIndex" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "690a6918-7c75-4f95-9ccc-d2c4a1fe00d7", - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "import sys\n", - "\n", - "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", - "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))\n", - "\n", - "from gpt_index import GPTSimpleVectorIndex, SimpleDirectoryReader\n", - "from IPython.display import Markdown, display" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "03d1691e-544b-454f-825b-5ee12f7faa8a", - "metadata": {}, - "outputs": [], - "source": [ - "# load documents\n", - "documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "ad144ee7-96da-4dd6-be00-fd6cf0c78e58", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "INFO:root:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", - "> [build_index_from_documents] Total LLM token usage: 0 tokens\n", - "> [build_index_from_documents] Total LLM token usage: 0 tokens\n", - "INFO:root:> [build_index_from_documents] Total embedding token usage: 18509 tokens\n", - "> [build_index_from_documents] Total embedding token usage: 18509 tokens\n", - "> [build_index_from_documents] Total embedding token usage: 18509 tokens\n" - ] - } - ], - "source": [ - "index = GPTSimpleVectorIndex.from_documents(documents, chunk_size_limit=1024)" - ] - }, - { - "cell_type": "markdown", - "id": "b6caf93b-6345-4c65-a346-a95b0f1746c4", - "metadata": {}, - "source": [ - "#### Query Index" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "85466fdf-93f3-4cb1-a5f9-0056a8245a6f", - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# set Logging to DEBUG for more detailed outputs\n", - "response_stream = index.query(\n", - " \"What did the author do growing up?\", \n", - " streaming=True,\n", - " similarity_top_k=1\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "16c15a25-15ed-4aed-813a-5c4c9182d7eb", - "metadata": {}, - "outputs": [], - "source": [ - "response_stream.print_response_stream()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bdda1b2c-ae46-47cf-91d7-3153e8d0473b", - "metadata": {}, - "outputs": [], - "source": [ - "# can also get a normal response object\n", - "response = response_stream.get_response()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "gpt_retrieve_venv", - "language": "python", - "name": "gpt_retrieve_venv" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.16" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file + "cells": [ + { + "cell_type": "markdown", + "id": "9c48213d-6e6a-4c10-838a-2a7c710c3a05", + "metadata": {}, + "source": [ + "# Simple Index Demo - Streaming" + ] + }, + { + "cell_type": "markdown", + "id": "50d3b817-b70e-4667-be4f-d3a0fe4bd119", + "metadata": {}, + "source": [ + "#### Load documents, build the GPTSimpleVectorIndex" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "690a6918-7c75-4f95-9ccc-d2c4a1fe00d7", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "import sys\n", + "\n", + "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", + "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))\n", + "\n", + "from gpt_index import GPTSimpleVectorIndex, SimpleDirectoryReader\n", + "from IPython.display import Markdown, display" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "03d1691e-544b-454f-825b-5ee12f7faa8a", + "metadata": {}, + "outputs": [], + "source": [ + "# load documents\n", + "documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "ad144ee7-96da-4dd6-be00-fd6cf0c78e58", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:root:> [build_index_from_documents] Total LLM token usage: 0 tokens\n", + "> [build_index_from_documents] Total LLM token usage: 0 tokens\n", + "> [build_index_from_documents] Total LLM token usage: 0 tokens\n", + "INFO:root:> [build_index_from_documents] Total embedding token usage: 18509 tokens\n", + "> [build_index_from_documents] Total embedding token usage: 18509 tokens\n", + "> [build_index_from_documents] Total embedding token usage: 18509 tokens\n" + ] + } + ], + "source": [ + "index = GPTSimpleVectorIndex.from_documents(documents, chunk_size_limit=1024)" + ] + }, + { + "cell_type": "markdown", + "id": "b6caf93b-6345-4c65-a346-a95b0f1746c4", + "metadata": {}, + "source": [ + "#### Query Index" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "85466fdf-93f3-4cb1-a5f9-0056a8245a6f", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# set Logging to DEBUG for more detailed outputs\n", + "response_stream = index.query(\n", + " \"What did the author do growing up?\", \n", + " streaming=True,\n", + " similarity_top_k=1\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16c15a25-15ed-4aed-813a-5c4c9182d7eb", + "metadata": {}, + "outputs": [], + "source": [ + "response_stream.print_response_stream()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bdda1b2c-ae46-47cf-91d7-3153e8d0473b", + "metadata": {}, + "outputs": [], + "source": [ + "# can also get a normal response object\n", + "response = response_stream.get_response()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/vector_indices/SimpleIndexDemo.ipynb b/examples/vector_indices/SimpleIndexDemo.ipynb index 7450584124..fcc61febb2 100644 --- a/examples/vector_indices/SimpleIndexDemo.ipynb +++ b/examples/vector_indices/SimpleIndexDemo.ipynb @@ -5,7 +5,7 @@ "id": "9c48213d-6e6a-4c10-838a-2a7c710c3a05", "metadata": {}, "source": [ - "# Simple Index Demo" + "# Simple Index Demo - Basic" ] }, { @@ -266,7 +266,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.0" } }, "nbformat": 4, -- GitLab