From 0be681f3ca01137823e3263a777700ffea48942f Mon Sep 17 00:00:00 2001 From: Shubhadeep Das <149712532+shubhadeepd@users.noreply.github.com> Date: Wed, 21 Aug 2024 00:11:37 +0530 Subject: [PATCH] Upstream changes for v0.8.0 release (#161) Signed-off-by: Shubhadeep Das --- .dockerignore | 2 +- .gitattributes | 2 +- .github/workflows/docs-build.yaml | 153 -- .github/workflows/docs-preview-pr.yaml | 117 -- .../workflows/docs-remove-stale-reviews.yaml | 11 - .gitignore | 17 +- .pre-commit-config.yaml | 4 + CHANGELOG.md | 56 +- .../common => RAG}/__init__.py | 0 .../llm/__init__.py => RAG/examples/README.md | 0 .../examples}/__init__.py | 0 .../advanced_rag/multi_turn_rag/README.md | 85 + .../advanced_rag/multi_turn_rag/chains.py | 366 ++++ .../multi_turn_rag/docker-compose.yaml | 82 +- .../advanced_rag/multi_turn_rag/prompt.yaml | 22 + .../advanced_rag/multimodal_rag/README.md | 78 + .../advanced_rag}/multimodal_rag/__init__.py | 0 .../advanced_rag}/multimodal_rag/chains.py | 111 +- .../multimodal_rag/docker-compose.yaml | 51 +- .../multimodal_rag/llm}/__init__.py | 0 .../advanced_rag}/multimodal_rag/llm/llm.py | 32 +- .../multimodal_rag/llm/llm_client.py | 40 +- .../advanced_rag/multimodal_rag/prompt.yaml | 11 + .../multimodal_rag/requirements.txt | 0 .../multimodal_rag/retriever}/__init__.py | 0 .../multimodal_rag/retriever/embedder.py | 18 +- .../multimodal_rag/retriever/retriever.py | 12 +- .../multimodal_rag/retriever/vector.py | 60 +- .../vectorstore/custom_img_parser.py | 60 + .../vectorstore/custom_pdf_parser.py | 305 ++-- .../vectorstore/custom_powerpoint_parser.py | 43 +- .../vectorstore/vectorstore_updater.py | 21 +- .../query_decomposition_rag/README.md | 87 + .../query_decomposition_rag/__init__.py | 0 .../query_decomposition_rag/chains.py | 172 +- .../docker-compose.yaml | 40 +- .../query_decomposition_rag/prompt.yaml | 45 + .../structured_data_rag/README.md | 94 + .../structured_data_rag/__init__.py | 0 .../structured_data_rag/chains.py | 61 +- .../structured_data_rag/csv_utils.py | 13 +- .../structured_data_rag/data}/PdM_errors.csv | 0 .../data}/PdM_failures.csv | 0 .../data}/PdM_machines.csv | 0 .../structured_data_rag/docker-compose.yaml | 32 +- .../structured_data_rag/prompt.yaml | 4 + .../structured_data_rag/requirements.txt | 0 RAG/examples/basic_rag/langchain/README.md | 74 + .../examples/basic_rag/langchain}/chains.py | 164 +- .../basic_rag/langchain/docker-compose.yaml | 97 + RAG/examples/basic_rag/langchain/prompt.yaml | 9 + RAG/examples/basic_rag/llamaindex/README.md | 76 + .../basic_rag/llamaindex}/__init__.py | 2 +- .../examples/basic_rag/llamaindex}/chains.py | 164 +- .../basic_rag/llamaindex/docker-compose.yaml | 99 ++ RAG/examples/basic_rag/llamaindex/prompt.yaml | 10 + RAG/examples/local_deploy/.env | 9 + RAG/examples/local_deploy/README.md | 110 ++ .../local_deploy/docker-compose-nim-ms.yaml | 86 + .../docker-compose-vectordb.yaml | 17 +- RAG/notebooks/README.md | 54 + .../llm => RAG/notebooks}/__init__.py | 0 ...tools_leveraging_NVIDIA_AI_endpoints.ipynb | 88 +- .../Chat_with_nvidia_financial_reports.ipynb | 77 +- ...raph_HandlingAgent_IntermediateSteps.ipynb | 59 +- ...tool_call_HumanInTheLoop_MultiAgents.ipynb | 772 ++++++++ .../config/config.yml | 11 + .../config/flows.co | 20 + ...g_nemo_guardrails_with_LangChain_RAG.ipynb | 324 ++++ .../RAG_Langchain_with_Local_NIM.ipynb | 74 +- ...s_with_Langchain_NVIDIA_AI_Endpoints.ipynb | 54 +- .../config/config.yml | 11 + .../config/flows.co | 20 + .../guardrails-nim-architecture.png | Bin 0 -> 159382 bytes .../using_nims_with_guardrails.ipynb | 434 +++++ .../config/config.yml | 11 + .../config/flows.co | 20 + .../guardrails-nim-architecture.png | Bin 0 -> 159382 bytes .../using_nims_with_guardrails.ipynb | 434 +++++ .../agentic_rag_with_nemo_retriever_nim.ipynb | 22 +- .../notebooks/langchain/data}/Sweden.txt | 0 .../data/imgs/HumanInTheLoopLangGraph.png | Bin 0 -> 262293 bytes ...me_flags_fix_media_device_access_error.png | Bin .../data}/imgs/data_connection_langchain.jpeg | Bin .../data/imgs/finish_social_post.png | Bin 0 -> 662277 bytes .../langchain/data}/imgs/grace_answer.png | Bin .../data}/imgs/grace_answer_with_riva.png | Bin .../langchain/data}/imgs/grace_noanswer.png | Bin .../data}/imgs/grace_noanswer_with_riva.png | Bin .../data}/imgs/inference_runtime.png | Bin .../langchain/data}/imgs/llama_hub.png | Bin .../data}/imgs/media_device_access_error.png | Bin .../langchain/data}/imgs/nvidianews.png | Bin .../langchain/data}/imgs/preprocessing.png | Bin .../langchain/data}/imgs/vector_stores.jpeg | Bin .../langchain/data}/imgs/visual_reasoning.png | Bin .../langchain/langchain_basic_RAG.ipynb | 519 ++++++ RAG/notebooks/llamaindex/data/Sweden.txt | 400 +++++ .../llamaindex/llamaindex_basic_RAG.ipynb | 438 +++++ .../custom_dataset/inputs.jsonl | 0 .../custom_dataset/judge_prompts.jsonl | 0 .../custom_dataset/question.jsonl | 0 .../reference_answer/references.jsonl | 0 .../evaluator_notebook.ipynb | 0 .../src/chain_server}/Dockerfile | 51 +- .../RAG_Chain_Server_API_Client.ipynb | 0 .../src/chain_server}/__init__.py | 2 +- RAG/src/chain_server/base.py | 68 + .../src/chain_server}/configuration.py | 140 +- .../src/chain_server}/configuration_wizard.py | 60 +- RAG/src/chain_server/requirements.txt | 31 + RAG/src/chain_server/server.py | 491 ++++++ .../src/chain_server}/tracing.py | 59 +- RAG/src/chain_server/utils.py | 711 ++++++++ .../src}/pandasai/llms/__init__.py | 0 .../src}/pandasai/llms/nv_aiplay.py | 7 +- RAG/src/rag_playground/Dockerfile | 39 + .../src/rag_playground/default}/__init__.py | 4 +- .../src/rag_playground/default}/__main__.py | 39 +- .../src/rag_playground/default}/api.py | 13 +- .../default}/assets/__init__.py | 0 .../default/assets/kaizen-theme.css | 13 + .../default}/assets/kaizen-theme.json | 0 .../rag_playground/default}/chat_client.py | 133 +- .../rag_playground/default}/configuration.py | 12 +- .../default}/configuration_wizard.py | 60 +- .../rag_playground/default}/pages/__init__.py | 0 .../rag_playground/default/pages/converse.py | 119 ++ .../src/rag_playground/default}/pages/kb.py | 37 +- .../rag_playground/default}/static/404.html | 0 .../WuNGAl0x4o1D5HqLxhHMt/_buildManifest.js | 0 .../WuNGAl0x4o1D5HqLxhHMt/_ssgManifest.js | 0 .../static/chunks/78-a36dca5d49fafb86.js | 0 .../chunks/framework-7a7e500878b44665.js | 0 .../static/chunks/main-92011a1a7f336a6f.js | 0 .../chunks/pages/_app-f21c0780e30f5eb6.js | 0 .../chunks/pages/_app-f55c3b932a623280.js | 0 .../chunks/pages/_error-54de1933a164a1ff.js | 0 .../chunks/pages/converse-39686323b565eff0.js | 0 .../chunks/pages/converse-61880f01babd873a.js | 0 .../chunks/pages/index-1a1d31dae38463f7.js | 0 .../chunks/pages/index-6a3f286eb0986c10.js | 0 .../chunks/pages/kb-cf0d102293dc0a74.js | 0 .../chunks/pages/tuning-0b7bb1111c2d2a56.js | 0 .../chunks/polyfills-78c92fac7aa8fdd8.js | 0 .../static/chunks/webpack-5146130448d8adf7.js | 0 .../_next/static/css/7636246223312442.css | 0 .../_next/static/css/98b512633409f7e1.css | 0 .../s7oUSppGTRWsY8BXJmxYB/_buildManifest.js | 0 .../s7oUSppGTRWsY8BXJmxYB/_ssgManifest.js | 0 .../default}/static/converse.html | 0 .../default}/static/favicon.ico | Bin .../rag_playground/default}/static/index.html | 0 .../rag_playground/default}/static/kb.html | 0 .../rag_playground/default}/static/next.svg | 0 .../rag_playground/default}/static/vercel.svg | 0 .../src/rag_playground/default}/tracing.py | 21 +- .../src/rag_playground}/requirements.txt | 0 RAG/src/rag_playground/speech/__init__.py | 92 + RAG/src/rag_playground/speech/__main__.py | 97 + RAG/src/rag_playground/speech/api.py | 65 + .../src/rag_playground/speech}/asr_utils.py | 29 +- .../rag_playground/speech/assets/__init__.py | 31 +- .../speech}/assets/kaizen-theme.css | 0 .../speech}/assets/kaizen-theme.json | 0 RAG/src/rag_playground/speech/chat_client.py | 177 ++ .../rag_playground/speech/configuration.py | 38 + .../speech/configuration_wizard.py | 377 ++++ .../rag_playground/speech/pages/__init__.py | 19 + .../rag_playground/speech}/pages/converse.py | 122 +- RAG/src/rag_playground/speech/pages/kb.py | 115 ++ RAG/src/rag_playground/speech/static/404.html | 1 + .../WuNGAl0x4o1D5HqLxhHMt/_buildManifest.js | 1 + .../WuNGAl0x4o1D5HqLxhHMt}/_ssgManifest.js | 0 .../static/chunks/78-a36dca5d49fafb86.js | 1 + .../chunks/framework-7a7e500878b44665.js | 33 + .../static/chunks/main-92011a1a7f336a6f.js | 1 + .../chunks/pages/_app-f21c0780e30f5eb6.js | 5 + .../chunks/pages/_app-f55c3b932a623280.js | 5 + .../chunks/pages/_error-54de1933a164a1ff.js | 1 + .../chunks/pages/converse-39686323b565eff0.js | 1 + .../chunks/pages/converse-61880f01babd873a.js | 1 + .../chunks/pages/index-1a1d31dae38463f7.js | 1 + .../chunks/pages/index-6a3f286eb0986c10.js | 1 + .../chunks/pages/kb-cf0d102293dc0a74.js | 1 + .../chunks/pages/tuning-0b7bb1111c2d2a56.js | 1 + .../chunks/polyfills-78c92fac7aa8fdd8.js | 1 + .../static/chunks/webpack-5146130448d8adf7.js | 1 + .../_next/static/css/7636246223312442.css | 0 .../_next/static/css/98b512633409f7e1.css | 1 + .../s7oUSppGTRWsY8BXJmxYB/_buildManifest.js | 1 + .../s7oUSppGTRWsY8BXJmxYB/_ssgManifest.js | 1 + .../speech/static/converse.html | 1 + .../rag_playground/speech}/static/favicon.ico | Bin .../rag_playground/speech/static/index.html | 1 + RAG/src/rag_playground/speech/static/kb.html | 1 + .../rag_playground/speech}/static/next.svg | 0 .../rag_playground/speech}/static/vercel.svg | 0 RAG/src/rag_playground/speech/tracing.py | 83 + .../src/rag_playground/speech}/tts_utils.py | 44 +- RAG/tools/README.md | 10 + .../examples => RAG/tools}/__init__.py | 2 +- RAG/tools/evaluation/.gitattributes | 1 + {tools => RAG/tools}/evaluation/Dockerfile | 2 +- RAG/tools/evaluation/README.md | 142 ++ .../tools/evaluation/compose.env | 0 RAG/tools/evaluation/dataset.zip | 3 + .../tools/evaluation/docker-compose.yaml | 8 +- .../01_synthetic_data_generation.ipynb | 48 +- ...2_filling_RAG_outputs_for_Evaluation.ipynb | 55 +- .../evaluation/notebooks}/03_eval_ragas.ipynb | 24 +- .../04_Human_Like_RAG_Evaluation.ipynb | 35 +- RAG/tools/evaluation/notebooks/README.md | 49 + .../evaluation/notebooks}/imgs/ragas.png | Bin .../imgs/synthetic_data_pipeline.png | Bin .../evaluation/notebooks}/qa_generation.json | 0 .../evaluation/notebooks}/requirements.txt | 0 .../evaluation/rag_evaluator/evaluator.py | 66 +- .../rag_evaluator/llm_answer_generator.py | 33 +- .../tools}/evaluation/rag_evaluator/main.py | 30 +- .../evaluation/rag_evaluator/requirements.txt | 2 +- .../tools}/evaluation/results/qna.json | 0 .../data_generator.py | 28 +- .../synthetic_data_generator/main.py | 24 +- .../synthetic_data_generator/requirements.txt | 0 .../tools/observability/README.md | 218 +-- .../tools/observability}/__init__.py | 2 +- RAG/tools/observability/compose.env | 4 + .../tools/observability}/configs/jaeger.yaml | 0 .../configs/otel-collector-config.yaml | 54 + .../tools/observability/docker-compose.yaml | 2 +- .../observability/langchain/__init__.py | 2 +- .../langchain/opentelemetry_callback.py | 146 +- .../observability/llamaindex/__init__.py | 14 + .../llamaindex/opentelemetry_callback.py | 82 +- README.md | 153 +- .../LICENSE-Apache-2.0.txt | 177 -- RetrievalAugmentedGeneration/LICENSE.md | 14 - .../examples/multi_turn_rag/chains.py | 281 --- .../5_mins_rag_no_gpu/main.py | 0 .../5_mins_rag_no_gpu/requirements.txt | 0 {experimental => community}/README.md | 25 +- .../event-driven-rag-cve-analysis/Dockerfile | 0 .../event-driven-rag-cve-analysis/README.md | 3 +- .../cyber_dev_day/__init__.py | 0 .../cyber_dev_day/checklist_node.py | 0 .../cyber_dev_day/config.py | 0 .../cyber_dev_day/embeddings.py | 0 .../cyber_dev_day/faiss_vdb_service.py | 0 .../langchain_llm_client_wrapper.py | 0 .../cyber_dev_day/llm_service.py | 0 .../cyber_dev_day/nim_llm_service.py | 0 .../cyber_dev_day/openai_chat_service.py | 0 .../cyber_dev_day/pipeline.py | 0 .../cyber_dev_day/pipeline_utils.py | 0 .../cyber_dev_day/tools.py | 0 .../data/morpheus_24.03-runtime_sbom.csv | 0 .../event-driven-rag-cve-analysis/default.env | 0 .../docker-compose.yml | 0 .../entrypoint.sh | 0 .../nginx/.gitignore | 0 .../nginx/nginx.conf | 0 .../nginx/template-variables.conf | 0 .../notebooks/cyber-dev-day.ipynb | 262 +-- .../images/multiple_cve_parallel.jpg | Bin .../notebooks/images/multiple_cve_serial.jpg | Bin .../notebooks/images/side_by_side.png | Bin .../notebooks/images/single_cve_parallel.jpg | Bin .../notebooks/images/single_cve_serial.jpg | Bin .../requirements.yaml | 0 .../fm-asr-streaming-rag/README.md | 0 .../chain-server/Dockerfile | 0 .../chain-server/accumulator.py | 0 .../chain-server/chains.py | 0 .../chain-server/common.py | 0 .../chain-server/database.py | 0 .../chain-server/prompts.py | 0 .../chain-server/requirements.txt | 0 .../chain-server/retriever.py | 0 .../chain-server/server.py | 0 .../chain-server/utils.py | 0 .../fm-asr-streaming-rag/deploy/compose.env | 0 .../deploy/docker-compose-file-replay.yaml | 0 .../deploy/docker-compose-fm-asr.yaml | 0 .../docker-compose-milvus-standalone.yaml | 0 .../deploy/docker-compose-nemo-retriever.yaml | 0 .../deploy/docker-compose-nim-build.yaml | 0 .../deploy/docker-compose-nim-llm.yaml | 0 .../deploy/scripts/nim-model-build.sh | 0 .../deploy/scripts/run.sh | 0 .../deploy/scripts/stop.sh | 0 .../docs/imgs/architecture-cloud.jpg | Bin .../docs/imgs/architecture-retriever.jpg | Bin .../docs/imgs/chatbot.jpg | Bin .../docs/imgs/high-level-overview.jpg | Bin .../docs/imgs/high-level-replay-overview.jpg | Bin .../docs/imgs/intent-retrieval.jpg | Bin .../docs/imgs/intent-tree.jpg | Bin .../docs/samples/sample_fm_radio.grc | 0 .../docs/samples/sample_riva_config.sh | 0 .../file-replay/Dockerfile | 0 .../file-replay/requirements.txt | 0 .../file-replay/wav_replay.py | 0 .../fm-asr-streaming-rag/frontend/Dockerfile | 0 .../frontend/frontend/__init__.py | 0 .../frontend/frontend/__main__.py | 0 .../frontend/frontend/api.py | 0 .../frontend/frontend/assets/__init__.py | 0 .../frontend/frontend/assets/kaizen-theme.css | 0 .../frontend/assets/kaizen-theme.json | 336 ++++ .../frontend/frontend/chat_client.py | 0 .../frontend/frontend/configuration.py | 0 .../frontend/frontend/configuration_wizard.py | 0 .../frontend/frontend/pages/__init__.py | 0 .../frontend/frontend/pages/converse.py | 0 .../frontend/frontend/pages/kb.py | 0 .../frontend/frontend/pages/stats.py | 0 .../frontend/frontend/pages/waveform.py | 0 .../frontend/frontend/static/404.html | 0 .../ZuyLfTn0WWGPn0wKTmN0V/_buildManifest.js | 0 .../ZuyLfTn0WWGPn0wKTmN0V/_ssgManifest.js | 1 + .../static/chunks/78-bc18c16297940613.js | 0 .../chunks/framework-0c7baedefba6b077.js | 0 .../static/chunks/main-7af7d5359a6145de.js | 0 .../chunks/pages/_app-7f0002c80738113a.js | 0 .../chunks/pages/_error-ee5b5fb91d29d86f.js | 0 .../chunks/pages/converse-bd575ea9251886b9.js | 0 .../chunks/pages/index-bd877b96e2342d55.js | 0 .../chunks/pages/kb-8e8e5f97dcec4a53.js | 0 .../chunks/pages/stats-c181bdd959e91e0f.js | 0 .../chunks/pages/waveform-0d7fcdd3766fcbdb.js | 0 .../chunks/polyfills-c67a75d1b6f99dc8.js | 0 .../static/chunks/webpack-e53a5203105d5dd8.js | 0 .../_next/static/css/7636246223312442.css | 1 + .../frontend/frontend/static/converse.html | 0 .../frontend/frontend/static/favicon.ico | Bin 0 -> 25931 bytes .../frontend/frontend/static/index.html | 0 .../frontend/frontend/static/kb.html | 0 .../frontend/frontend/static/next.svg | 1 + .../frontend/frontend/static/stats.html | 0 .../frontend/frontend/static/vercel.svg | 1 + .../frontend/frontend/static/waveform.html | 0 .../frontend/requirements.txt | 0 .../nemo-retriever/config/milvus-config.yaml | 0 .../config/otel-collector-config.yaml | 0 .../nv-rerank-qa-mistral-4b-A6000.yaml | 0 .../nemo-retriever/models/keep | 0 .../fm-asr-streaming-rag/nim/Dockerfile | 0 .../nim/configs/mistral-7b.yaml | 0 .../fm-asr-streaming-rag/nim/playbook.sh | 0 .../sdr-holoscan/Dockerfile | 0 .../fm-asr-streaming-rag/sdr-holoscan/app.py | 0 .../sdr-holoscan/common.py | 0 .../sdr-holoscan/operators.py | 0 .../sdr-holoscan/params.yml | 0 .../sdr-holoscan/requirements.txt | 0 .../sdr-holoscan/riva_asr.py | 0 community/knowledge_graph_rag/.env.example | 2 + .../knowledge_graph_rag/README.md | 26 +- .../backend/routers/chat.py | 108 ++ .../backend/routers/evaluation.py | 303 ++++ .../backend/routers/ui_backend.py | 122 ++ .../backend/routers/visualization.py | 23 + .../knowledge_graph_rag/backend/server.py | 34 + .../backend}/utils/download_papers.py | 0 .../backend}/utils/lc_graph.py | 58 +- .../backend}/utils/preprocessor.py | 0 .../backend}/vectorstore/search.py | 0 .../frontend/pages/chat.py | 80 + .../frontend/pages/evaluation.py | 247 +++ .../frontend}/pages/visualization.py | 3 +- community/knowledge_graph_rag/frontend/ui.py | 103 ++ .../knowledge_graph_rag/requirements.txt | 3 +- .../knowledge_graph_rag/viz.png | Bin .../llm-prompt-design-helper/.gitattributes | 0 .../llm-prompt-design-helper/Dockerfile | 0 .../llm-prompt-design-helper/README.md | 0 .../api_request_backends/api_request.py | 0 .../api_request_backends/chatnv_client.py | 0 .../api_request_backends/openai_client.py | 0 .../llm-prompt-design-helper/build_image.sh | 0 .../llm-prompt-design-helper/chat_ui.py | 0 .../llm-prompt-design-helper/chat_ui_utils.py | 0 .../llm-prompt-design-helper/config.yaml | 0 .../llm-prompt-design-helper/data/bot.webp | Bin .../data/llm-prompt-designer-demo.gif | 0 .../data/local-database-settings.jpeg | Bin .../data/self-host-database-settings.jpeg | Bin .../data/simple_ui.jpeg | Bin .../data/simple_ui_db.jpeg | Bin .../llm-prompt-design-helper/data/user.webp | Bin .../llm-prompt-design-helper/requirements.txt | 0 .../llm-prompt-design-helper/run_container.sh | 0 .../llm-prompt-design-helper/test.py | 4 +- .../vector_store/faiss_vector_store.py | 0 .../multimodal_assistant/.gitignore | 0 .../Multimodal_Assistant.py | 23 +- .../multimodal_assistant/README.md | 4 +- .../bot_config/multimodal.config | 0 .../multimodal_assistant/bot_config/utils.py | 0 .../guardrails}/__init__.py | 0 .../guardrails/fact_check.py | 4 +- .../multimodal_assistant/llm}/__init__.py | 0 .../multimodal_assistant/llm/llm.py | 0 .../multimodal_assistant}/llm/llm_client.py | 2 +- .../pages/1_Knowledge_Base.py | 0 .../multimodal_assistant/requirements.txt | 3 +- .../retriever}/__init__.py | 0 .../retriever/embedder.py | 0 .../retriever/retriever.py | 0 .../multimodal_assistant/retriever/vector.py | 0 .../utils/api_key_check.py | 0 .../multimodal_assistant/utils/feedback.py | 0 .../multimodal_assistant/utils/memory.py | 0 .../vectorstore/custom_pdf_parser.py | 10 +- .../vectorstore/custom_powerpoint_parser.py | 0 .../uploaded_docs/NVIDIA In Brief 1-Pager.pdf | Bin .../vectorstore/vectorstore_updater.py | 0 .../Multimodal_Assistant.py | 14 +- .../oran-chatbot-multimodal/README.md | 18 +- .../bot_config/multimodal_oran.config | 0 .../bot_config/oran.config | 0 .../bot_config/utils.py | 0 .../oran-chatbot-multimodal/config.yaml | 12 +- .../oran-chatbot-multimodal/embedEtcd.yaml | 0 .../evals/01_synthetic_data_generation.ipynb | 0 ...2_filling_RAG_outputs_for_Evaluation.ipynb | 0 .../evals/03_eval_ragas.ipynb | 0 .../04_Human_Like_RAG_Evaluation-AIP.ipynb | 0 .../evals/05_complexquery_advancedRAG.ipynb | 0 .../oran-chatbot-multimodal/evals/end.jpg | Bin .../evals/eval_syn_QA_Nvolve.json | 0 .../oran-chatbot-multimodal/evals/gen.jpg | Bin .../evals/metrics_df.pkl | Bin .../evals/requirements.txt | 0 .../oran-chatbot-multimodal/evals/ret.jpg | Bin .../evals/syn_data_oran.json | 0 .../guardrails}/__init__.py | 0 .../guardrails/fact_check.py | 0 .../oran-chatbot-multimodal/llm}/__init__.py | 0 .../oran-chatbot-multimodal/llm/llm.py | 10 +- .../llm/llm_client.py | 0 .../oran-chatbot-multimodal/oran_diagram.png | Bin .../pages/1_Knowledge_Base.py | 2 +- .../pages/2_Evaluation_Metrics.py | 31 +- .../oran-chatbot-multimodal/requirements.txt | 2 +- .../retriever/__init__.py | 0 .../retriever/embedder.py | 7 +- .../retriever/retriever.py | 7 +- .../retriever/vector.py | 0 .../standalone_embed.sh | 0 .../synthetic_data_openai.json | 0 .../utils/api_key_check.py | 0 .../oran-chatbot-multimodal/utils/feedback.py | 0 .../oran-chatbot-multimodal/utils/memory.py | 0 .../vectorstore/custom_pdf_parser.py | 0 .../vectorstore/custom_powerpoint_parser.py | 0 .../vectorstore/embedder.py | 0 .../vectorstore/vectorstore_updater.py | 11 +- .../rag-developer-chatbot/Dockerfile.notebook | 0 .../rag-developer-chatbot/README.md | 6 +- .../rag-developer-chatbot/compose.env | 0 .../docker-compose-dev-rag.yaml | 0 .../notebooks/diagram.png | Bin .../notebooks/rapids_notebook.ipynb | 0 .../notebooks/requirements.txt | 0 .../streaming_ingest_rag/.env | 0 .../streaming_ingest_rag/.gitignore | 0 .../streaming_ingest_rag/README.md | 0 .../streaming_ingest_rag/docker-compose.yml | 34 +- .../docker/Dockerfile.morpheus | 0 .../docker/Dockerfile.producer | 4 +- .../streaming_ingest_rag/docker/build_all.sh | 0 .../streaming_ingest_rag/docker/build_attu.sh | 0 .../docker/build_morpheus.sh | 0 .../docker/conda/environments/conda_env.yaml | 0 .../extras/all-MiniLM-L6-v2_config.pbtxt | 0 .../vdb_upload/__init__.py | 0 .../vdb_upload/export_model.py | 0 .../streaming_ingest_rag/vdb_upload/helper.py | 0 .../vdb_upload/kafka_config.yaml | 0 .../vdb_upload/langchain.py | 0 .../vdb_upload/module/__init__.py | 0 .../module/content_extractor_module.py | 0 .../vdb_upload/module/file_source_pipe.py | 0 .../vdb_upload/module/kafka_source_module.py | 0 .../vdb_upload/module/kafka_source_pipe.py | 0 .../vdb_upload/module/raw_chunker_module.py | 0 .../vdb_upload/module/rss_source_pipe.py | 0 .../vdb_upload/module/schema_transform.py | 0 .../module/vdb_resource_tagging_module.py | 0 .../vdb_upload/module/web_scraper_module.py | 0 .../vdb_upload/pipeline.py | 0 .../streaming_ingest_rag/vdb_upload/run.py | 0 .../vdb_upload/schemas/__init__.py | 0 .../schemas/file_source_pipe_schema.py | 0 .../schemas/kafka_source_pipe_schema.py | 0 .../vdb_upload/schemas/kafka_source_schema.py | 0 .../vdb_upload/schemas/raw_chunker_schema.py | 0 .../schemas/rss_source_pipe_schema.py | 0 .../schemas/schema_transform_schema.py | 0 .../vdb_upload/vdb_config.yaml | 0 .../vdb_upload/vdb_utils.py | 0 .../producer/src/README.md | 0 .../producer/src/consumer.py | 0 .../producer/src/data/url_sample.jsonl | 0 .../producer/src/generate_dataset.py | 0 .../producer/src/producer.py | 0 .../utils/produce_messages.sh | 0 ...hat_hf_num_questions_300_BeIR_nfcorpus.csv | 0 .../retriever_customization.ipynb | 0 .../setup.sh | 0 .../synthetic_data_generation_nemo.ipynb | 0 deploy/compose/compose.env | 75 - .../configs/otel-collector-config.yaml | 17 - deploy/compose/docker-compose-evaluation.yaml | 22 - deploy/compose/docker-compose-nim-ms.yaml | 164 -- deploy/compose/download_model.sh | 30 - .../compose/rag-app-multimodal-chatbot.yaml | 66 - docs/Dockerfile | 23 - docs/README.md | 57 +- docs/api-catalog.md | 282 --- docs/architecture.md | 33 +- docs/boilerplate-api-catalog.md | 207 --- docs/chain-server.md | 98 +- docs/change-model.md | 82 + docs/common-prerequisites.md | 68 + docs/conf.py | 115 -- docs/configuration.md | 150 +- docs/documents-api-catalog.md | 152 -- docs/evaluation.md | 245 --- docs/frontend.md | 34 +- .../NVIDIA-Logo-H-ForScreen-ForDarkBG.jpg | Bin 0 -> 34280 bytes docs/images/ai-foundations-topology.png | Bin 26444 -> 0 bytes ...catalog-promo-web-banner-laptop-300@2x.jpg | Bin 0 -> 139508 bytes docs/images/basic_rag_langchain_arch.png | Bin 0 -> 478416 bytes docs/images/basic_rag_llamaindex_arch.png | Bin 0 -> 478855 bytes docs/images/catalog-and-vector-db.png | Bin 31121 -> 0 bytes docs/images/evaluation-topology.png | Bin 26572 -> 0 bytes docs/images/hf/Slide1.JPG | Bin 87536 -> 0 bytes docs/images/hf/Slide10.JPG | Bin 79054 -> 0 bytes docs/images/hf/Slide11.JPG | Bin 49832 -> 0 bytes docs/images/hf/Slide12.JPG | Bin 37311 -> 0 bytes docs/images/hf/Slide13.JPG | Bin 39497 -> 0 bytes docs/images/hf/Slide14.JPG | Bin 109891 -> 0 bytes docs/images/hf/Slide15.JPG | Bin 15027 -> 0 bytes docs/images/hf/Slide2.JPG | Bin 122757 -> 0 bytes docs/images/hf/Slide3.JPG | Bin 138028 -> 0 bytes docs/images/hf/Slide4.JPG | Bin 118758 -> 0 bytes docs/images/hf/Slide5.JPG | Bin 49692 -> 0 bytes docs/images/hf/Slide6.JPG | Bin 124868 -> 0 bytes docs/images/hf/Slide7.JPG | Bin 80341 -> 0 bytes docs/images/hf/Slide8.JPG | Bin 69000 -> 0 bytes docs/images/hf/Slide9.JPG | Bin 91604 -> 0 bytes docs/images/hf/download.png | Bin 39482 -> 0 bytes docs/images/llama-2-70b-api.png | Bin 173126 -> 0 bytes docs/images/llama-2-70b-card.png | Bin 54440 -> 0 bytes docs/images/llama-2-generate-key.png | Bin 106207 -> 0 bytes .../images/llama3-8b-instruct-get-api-key.png | Bin 139767 -> 0 bytes docs/images/llama3-8b-instruct-model-card.png | Bin 162039 -> 0 bytes docs/images/mixtral-8x7b-instruct.png | Bin 64261 -> 0 bytes docs/images/multimodal_rag_arch.png | Bin 0 -> 529383 bytes docs/images/multiturn_rag_arch.png | Bin 0 -> 496961 bytes docs/images/nim-llms-topology.png | Bin 35943 -> 0 bytes .../nvidia-logo-horiz-rgb-blk-for-screen.png | Bin 0 -> 48928 bytes docs/images/query_decomposition_rag_arch.png | Bin 0 -> 527977 bytes ...simple-rag-api-catalog-boilerplate-llm.png | Bin 44840 -> 0 bytes ...simple-rag-api-catalog-boilerplate-rag.png | Bin 45863 -> 0 bytes docs/images/structured_data_rag_arch.png | Bin 0 -> 489546 bytes docs/index.md | 163 -- docs/ingest-api-catalog.md | 111 -- docs/jupyter-server.md | 123 -- docs/llm-api-catalog.md | 89 - docs/llm-params.md | 69 + docs/media/custom.css | 9 - docs/media/favicon.ico | Bin 25214 -> 0 bytes docs/media/nvidia-logo-white.png | Bin 5522 -> 0 bytes docs/media/omni-style.css | 1567 ----------------- docs/media/version.js | 200 --- docs/multi-turn.md | 199 --- docs/multimodal-data.md | 226 --- docs/multiturn.md | 59 + docs/nim-llms.md | 305 ---- docs/project.json | 1 - docs/prompt-customization.md | 121 ++ docs/query-decomposition.md | 198 --- docs/rag-api-catalog.md | 97 - docs/requirements.txt | 11 - docs/riva-asr-tts.md | 92 + .../code/api-catalog/boilerplate/chains.py | 37 - .../boilerplate/simple-rag-api-catalog.yaml | 60 - .../code/api-catalog/documents/chains.py | 124 -- .../code/api-catalog/ingest/chains.py | 73 - .../code/api-catalog/llm/chains.py | 147 -- .../code/api-catalog/rag/chains.py | 185 -- .../code/local/ingest/chains.py | 67 - .../boilerplate/document-search.json | 1 - .../api-catalog/boilerplate/ingest-docs.json | 1 - .../api-catalog/boilerplate/llm-chain.json | 4 - .../api-catalog/boilerplate/rag-chain.json | 4 - .../documents/delete-documents.json | 1 - .../documents/document-search.json | 9 - .../api-catalog/documents/get-documents.json | 1 - .../api-catalog/documents/ice-cream.json | 1 - .../api-catalog/documents/ingest-docs.json | 1 - .../api-catalog/ingest/chain-server.log | 21 - .../output/api-catalog/llm/response.json | 18 - .../output/api-catalog/rag/response.json | 16 - .../output/api-catalog/search/response.json | 24 - .../output/local/ingest/chain-server.log | 26 - docs/simple-example/requirements.txt | 22 - docs/simple-examples.md | 99 -- docs/structured-data.md | 189 -- docs/support-matrix.md | 72 +- docs/swagger-requirements.txt | 8 - docs/templates/layout.html | 58 - docs/text-splitter.md | 79 + docs/using-sample-web-application.md | 38 +- docs/vector-database.md | 380 +++- docs/versions.json | 11 - examples/README.md | 70 - .../02.5_langchain_simple_AzureML.ipynb | 370 ---- experimental/AzureML/README.md | 41 - .../AzureML/images/azureml-github.gif | Bin 1540321 -> 0 bytes .../AzureML/images/connection-info.png | Bin 140864 -> 0 bytes experimental/AzureML/trt_llm_azureml.py | 362 ---- experimental/knowledge_graph_rag/app.py | 138 -- .../knowledge_graph_rag/pages/chat.py | 105 -- .../knowledge_graph_rag/pages/evaluation.py | 265 --- {models => finetuning}/Codegemma/README.md | 0 {models => finetuning}/Codegemma/lora.ipynb | 0 {models => finetuning}/Gemma/README.md | 0 {models => finetuning}/Gemma/lora.ipynb | 0 {models => finetuning}/Gemma/sft.ipynb | 0 {models => finetuning}/NeMo/README.md | 0 {models => finetuning}/NeMo/slm/README.md | 0 .../NeMo/slm/megatron_gpt_eval_server.ipynb | 0 .../NeMo/slm/slm_pretraining_sft.ipynb | 0 {models => finetuning}/README.md | 0 .../StarCoder2/inference.ipynb | 0 {models => finetuning}/StarCoder2/lora.ipynb | 0 .../medical-device-training-assistant/.env | 9 + .../.gitignore | 4 + .../README.md | 134 ++ .../app_chain/chains.py | 369 ++++ .../docker-compose-nim-ms.yaml | 86 + .../docker-compose-vectordb.yaml | 115 ++ .../docker-compose.yaml | 64 +- .../evaluation/Dockerfile | 14 + .../evaluation/README.md | 129 ++ .../evaluation/compose.env | 9 + .../evaluation/docker-compose.yaml | 23 + ...uery_rag_with_gt_questions_and_evaluate.py | 256 +++ .../evaluation/requirements.txt | 6 + .../images/add_file.png | Bin 0 -> 77951 bytes .../images/doc_ingestion.png | Bin 0 -> 41855 bytes .../images/example_query.png | Bin 0 -> 216465 bytes .../images/retrieval_chain.png | Bin 0 -> 61558 bytes .../prompt.yaml | 22 + .../src/chain_server/Dockerfile | 46 + .../RAG_Chain_Server_API_Client.ipynb | 210 +++ .../src/chain_server/__init__.py | 14 + .../src/chain_server/base.py | 68 + .../src/chain_server/configuration.py | 204 +++ .../src/chain_server/configuration_wizard.py | 377 ++++ .../src/chain_server}/requirements.txt | 2 +- .../src/chain_server}/server.py | 328 ++-- .../src/chain_server/tracing.py | 102 ++ .../src/chain_server}/utils.py | 419 ++++- .../src/rag_playground}/Dockerfile | 12 +- .../src/rag_playground/requirements.txt | 12 + .../src/rag_playground/speech/__init__.py | 92 + .../src/rag_playground/speech/__main__.py | 97 + .../src/rag_playground/speech/api.py | 65 + .../src/rag_playground/speech/asr_utils.py | 170 ++ .../rag_playground/speech/assets/__init__.py | 38 + .../speech/assets/kaizen-theme.css | 28 + .../speech/assets/kaizen-theme.json | 336 ++++ .../src/rag_playground/speech/chat_client.py | 177 ++ .../rag_playground/speech/configuration.py | 38 + .../speech/configuration_wizard.py | 377 ++++ .../rag_playground/speech/pages/__init__.py | 19 + .../rag_playground/speech/pages/converse.py | 227 +++ .../src/rag_playground/speech/pages/kb.py | 115 ++ .../src/rag_playground/speech/static/404.html | 1 + .../WuNGAl0x4o1D5HqLxhHMt/_buildManifest.js | 1 + .../WuNGAl0x4o1D5HqLxhHMt/_ssgManifest.js | 1 + .../static/chunks/78-a36dca5d49fafb86.js | 1 + .../chunks/framework-7a7e500878b44665.js | 33 + .../static/chunks/main-92011a1a7f336a6f.js | 1 + .../chunks/pages/_app-f21c0780e30f5eb6.js | 5 + .../chunks/pages/_app-f55c3b932a623280.js | 5 + .../chunks/pages/_error-54de1933a164a1ff.js | 1 + .../chunks/pages/converse-39686323b565eff0.js | 1 + .../chunks/pages/converse-61880f01babd873a.js | 1 + .../chunks/pages/index-1a1d31dae38463f7.js | 1 + .../chunks/pages/index-6a3f286eb0986c10.js | 1 + .../chunks/pages/kb-cf0d102293dc0a74.js | 1 + .../chunks/pages/tuning-0b7bb1111c2d2a56.js | 1 + .../chunks/polyfills-78c92fac7aa8fdd8.js | 1 + .../static/chunks/webpack-5146130448d8adf7.js | 1 + .../_next/static/css/7636246223312442.css | 1 + .../_next/static/css/98b512633409f7e1.css | 1 + .../s7oUSppGTRWsY8BXJmxYB/_buildManifest.js | 1 + .../s7oUSppGTRWsY8BXJmxYB/_ssgManifest.js | 1 + .../speech/static/converse.html | 1 + .../rag_playground/speech/static/favicon.ico | Bin 0 -> 25931 bytes .../rag_playground/speech/static/index.html | 1 + .../src/rag_playground/speech/static/kb.html | 1 + .../src/rag_playground/speech/static/next.svg | 1 + .../rag_playground/speech/static/vercel.svg | 1 + .../src/rag_playground/speech/tracing.py | 83 + .../src/rag_playground/speech/tts_utils.py | 135 ++ ..._Option(1)_NVIDIA_AI_endpoint_simple.ipynb | 334 ---- ...stic_RAG_with_langchain_local_HF_LLM.ipynb | 440 ----- ..._llama_index_with_NVIDIA_AI_endpoint.ipynb | 237 --- ...ion(2)_llama_index_with_HF_local_LLM.ipynb | 391 ---- notebooks/Dockerfile.gpu_notebook | 30 - notebooks/Dockerfile.notebooks | 27 - notebooks/dataset.zip | 3 - notebooks/imgs/agentic_rag.png | Bin 710497 -> 0 bytes notebooks/requirements.txt | 17 - notebooks/toy_data/Titanic_film.txt | 203 --- tools/evaluation/Dockerfile.eval | 28 - tools/evaluation/README.md | 250 --- tools/observability/llamaindex/__init__.py | 14 - 726 files changed, 17151 insertions(+), 12796 deletions(-) delete mode 100644 .github/workflows/docs-build.yaml delete mode 100644 .github/workflows/docs-preview-pr.yaml delete mode 100644 .github/workflows/docs-remove-stale-reviews.yaml rename {RetrievalAugmentedGeneration/common => RAG}/__init__.py (100%) rename RetrievalAugmentedGeneration/examples/multimodal_rag/llm/__init__.py => RAG/examples/README.md (100%) rename {RetrievalAugmentedGeneration/examples/developer_rag => RAG/examples}/__init__.py (100%) create mode 100644 RAG/examples/advanced_rag/multi_turn_rag/README.md create mode 100644 RAG/examples/advanced_rag/multi_turn_rag/chains.py rename deploy/compose/rag-app-text-chatbot.yaml => RAG/examples/advanced_rag/multi_turn_rag/docker-compose.yaml (58%) create mode 100644 RAG/examples/advanced_rag/multi_turn_rag/prompt.yaml create mode 100644 RAG/examples/advanced_rag/multimodal_rag/README.md rename {RetrievalAugmentedGeneration/examples => RAG/examples/advanced_rag}/multimodal_rag/__init__.py (100%) rename {RetrievalAugmentedGeneration/examples => RAG/examples/advanced_rag}/multimodal_rag/chains.py (58%) rename deploy/compose/rag-app-multiturn-chatbot.yaml => RAG/examples/advanced_rag/multimodal_rag/docker-compose.yaml (65%) rename {RetrievalAugmentedGeneration/examples/multimodal_rag/retriever => RAG/examples/advanced_rag/multimodal_rag/llm}/__init__.py (100%) rename {RetrievalAugmentedGeneration/examples => RAG/examples/advanced_rag}/multimodal_rag/llm/llm.py (80%) rename {RetrievalAugmentedGeneration/examples => RAG/examples/advanced_rag}/multimodal_rag/llm/llm_client.py (63%) create mode 100644 RAG/examples/advanced_rag/multimodal_rag/prompt.yaml rename {RetrievalAugmentedGeneration/examples => RAG/examples/advanced_rag}/multimodal_rag/requirements.txt (100%) rename {experimental/multimodal_assistant/guardrails => RAG/examples/advanced_rag/multimodal_rag/retriever}/__init__.py (100%) rename {RetrievalAugmentedGeneration/examples => RAG/examples/advanced_rag}/multimodal_rag/retriever/embedder.py (92%) rename {RetrievalAugmentedGeneration/examples => RAG/examples/advanced_rag}/multimodal_rag/retriever/retriever.py (80%) rename {RetrievalAugmentedGeneration/examples => RAG/examples/advanced_rag}/multimodal_rag/retriever/vector.py (81%) create mode 100644 RAG/examples/advanced_rag/multimodal_rag/vectorstore/custom_img_parser.py rename {RetrievalAugmentedGeneration/examples => RAG/examples/advanced_rag}/multimodal_rag/vectorstore/custom_pdf_parser.py (52%) rename {RetrievalAugmentedGeneration/examples => RAG/examples/advanced_rag}/multimodal_rag/vectorstore/custom_powerpoint_parser.py (82%) rename {RetrievalAugmentedGeneration/examples => RAG/examples/advanced_rag}/multimodal_rag/vectorstore/vectorstore_updater.py (84%) create mode 100644 RAG/examples/advanced_rag/query_decomposition_rag/README.md rename {RetrievalAugmentedGeneration/examples => RAG/examples/advanced_rag}/query_decomposition_rag/__init__.py (100%) rename {RetrievalAugmentedGeneration/examples => RAG/examples/advanced_rag}/query_decomposition_rag/chains.py (72%) rename deploy/compose/rag-app-query-decomposition-agent.yaml => RAG/examples/advanced_rag/query_decomposition_rag/docker-compose.yaml (63%) create mode 100644 RAG/examples/advanced_rag/query_decomposition_rag/prompt.yaml create mode 100644 RAG/examples/advanced_rag/structured_data_rag/README.md rename {RetrievalAugmentedGeneration/examples => RAG/examples/advanced_rag}/structured_data_rag/__init__.py (100%) rename {RetrievalAugmentedGeneration/examples => RAG/examples/advanced_rag}/structured_data_rag/chains.py (82%) rename {RetrievalAugmentedGeneration/examples => RAG/examples/advanced_rag}/structured_data_rag/csv_utils.py (94%) rename {RetrievalAugmentedGeneration/examples/structured_data_rag => RAG/examples/advanced_rag/structured_data_rag/data}/PdM_errors.csv (100%) rename {RetrievalAugmentedGeneration/examples/structured_data_rag => RAG/examples/advanced_rag/structured_data_rag/data}/PdM_failures.csv (100%) rename {RetrievalAugmentedGeneration/examples/structured_data_rag => RAG/examples/advanced_rag/structured_data_rag/data}/PdM_machines.csv (100%) rename deploy/compose/rag-app-structured-data-chatbot.yaml => RAG/examples/advanced_rag/structured_data_rag/docker-compose.yaml (74%) rename RetrievalAugmentedGeneration/examples/structured_data_rag/csv_prompt_config.yaml => RAG/examples/advanced_rag/structured_data_rag/prompt.yaml (88%) rename {RetrievalAugmentedGeneration/examples => RAG/examples/advanced_rag}/structured_data_rag/requirements.txt (100%) create mode 100644 RAG/examples/basic_rag/langchain/README.md rename {RetrievalAugmentedGeneration/examples/nvidia_api_catalog => RAG/examples/basic_rag/langchain}/chains.py (53%) create mode 100644 RAG/examples/basic_rag/langchain/docker-compose.yaml create mode 100644 RAG/examples/basic_rag/langchain/prompt.yaml create mode 100644 RAG/examples/basic_rag/llamaindex/README.md rename {RetrievalAugmentedGeneration => RAG/examples/basic_rag/llamaindex}/__init__.py (95%) rename {RetrievalAugmentedGeneration/examples/developer_rag => RAG/examples/basic_rag/llamaindex}/chains.py (54%) create mode 100644 RAG/examples/basic_rag/llamaindex/docker-compose.yaml create mode 100644 RAG/examples/basic_rag/llamaindex/prompt.yaml create mode 100644 RAG/examples/local_deploy/.env create mode 100644 RAG/examples/local_deploy/README.md create mode 100644 RAG/examples/local_deploy/docker-compose-nim-ms.yaml rename {deploy/compose => RAG/examples/local_deploy}/docker-compose-vectordb.yaml (88%) create mode 100644 RAG/notebooks/README.md rename {experimental/multimodal_assistant/llm => RAG/notebooks}/__init__.py (100%) rename notebooks/04_Agent_use_tools_leveraging_NVIDIA_AI_endpoints.ipynb => RAG/notebooks/langchain/Agent_use_tools_leveraging_NVIDIA_AI_endpoints.ipynb (86%) rename notebooks/07_Chat_with_nvidia_financial_reports.ipynb => RAG/notebooks/langchain/Chat_with_nvidia_financial_reports.ipynb (84%) rename notebooks/06_LangGraph_HandlingAgent_IntermediateSteps.ipynb => RAG/notebooks/langchain/LangGraph_HandlingAgent_IntermediateSteps.ipynb (89%) create mode 100644 RAG/notebooks/langchain/NIM_tool_call_HumanInTheLoop_MultiAgents.ipynb create mode 100644 RAG/notebooks/langchain/NeMo_Guardrails_with_LangChain_RAG/config/config.yml create mode 100644 RAG/notebooks/langchain/NeMo_Guardrails_with_LangChain_RAG/config/flows.co create mode 100644 RAG/notebooks/langchain/NeMo_Guardrails_with_LangChain_RAG/using_nemo_guardrails_with_LangChain_RAG.ipynb rename notebooks/08_RAG_Langchain_with_Local_NIM.ipynb => RAG/notebooks/langchain/RAG_Langchain_with_Local_NIM.ipynb (82%) rename notebooks/05_RAG_for_HTML_docs_with_Langchain_NVIDIA_AI_Endpoints.ipynb => RAG/notebooks/langchain/RAG_for_HTML_docs_with_Langchain_NVIDIA_AI_Endpoints.ipynb (91%) create mode 100644 RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/Using_NVIDIA_NIMs_with_NeMo_Guardrails/config/config.yml create mode 100644 RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/Using_NVIDIA_NIMs_with_NeMo_Guardrails/config/flows.co create mode 100644 RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/Using_NVIDIA_NIMs_with_NeMo_Guardrails/guardrails-nim-architecture.png create mode 100644 RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/Using_NVIDIA_NIMs_with_NeMo_Guardrails/using_nims_with_guardrails.ipynb create mode 100644 RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/config/config.yml create mode 100644 RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/config/flows.co create mode 100644 RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/guardrails-nim-architecture.png create mode 100644 RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/using_nims_with_guardrails.ipynb rename notebooks/agentic_rag_with_nemo_retriever_nims.ipynb => RAG/notebooks/langchain/agentic_rag_with_nemo_retriever_nim.ipynb (93%) rename {notebooks/toy_data => RAG/notebooks/langchain/data}/Sweden.txt (100%) create mode 100644 RAG/notebooks/langchain/data/imgs/HumanInTheLoopLangGraph.png rename {notebooks => RAG/notebooks/langchain/data}/imgs/chrome_flags_fix_media_device_access_error.png (100%) rename {notebooks => RAG/notebooks/langchain/data}/imgs/data_connection_langchain.jpeg (100%) create mode 100644 RAG/notebooks/langchain/data/imgs/finish_social_post.png rename {notebooks => RAG/notebooks/langchain/data}/imgs/grace_answer.png (100%) rename {notebooks => RAG/notebooks/langchain/data}/imgs/grace_answer_with_riva.png (100%) rename {notebooks => RAG/notebooks/langchain/data}/imgs/grace_noanswer.png (100%) rename {notebooks => RAG/notebooks/langchain/data}/imgs/grace_noanswer_with_riva.png (100%) rename {notebooks => RAG/notebooks/langchain/data}/imgs/inference_runtime.png (100%) rename {notebooks => RAG/notebooks/langchain/data}/imgs/llama_hub.png (100%) rename {notebooks => RAG/notebooks/langchain/data}/imgs/media_device_access_error.png (100%) rename {notebooks => RAG/notebooks/langchain/data}/imgs/nvidianews.png (100%) rename {notebooks => RAG/notebooks/langchain/data}/imgs/preprocessing.png (100%) rename {notebooks => RAG/notebooks/langchain/data}/imgs/vector_stores.jpeg (100%) rename {notebooks => RAG/notebooks/langchain/data}/imgs/visual_reasoning.png (100%) create mode 100644 RAG/notebooks/langchain/langchain_basic_RAG.ipynb create mode 100644 RAG/notebooks/llamaindex/data/Sweden.txt create mode 100644 RAG/notebooks/llamaindex/llamaindex_basic_RAG.ipynb rename {notebooks => RAG/notebooks/nemo}/Nemo Evaluator Llama 3.1 Workbook/custom_dataset/inputs.jsonl (100%) rename {notebooks => RAG/notebooks/nemo}/Nemo Evaluator Llama 3.1 Workbook/custom_dataset/judge_prompts.jsonl (100%) rename {notebooks => RAG/notebooks/nemo}/Nemo Evaluator Llama 3.1 Workbook/custom_dataset/question.jsonl (100%) rename {notebooks => RAG/notebooks/nemo}/Nemo Evaluator Llama 3.1 Workbook/custom_dataset/reference_answer/references.jsonl (100%) rename {notebooks => RAG/notebooks/nemo}/Nemo Evaluator Llama 3.1 Workbook/evaluator_notebook.ipynb (100%) rename {RetrievalAugmentedGeneration => RAG/src/chain_server}/Dockerfile (52%) rename notebooks/01_dataloader.ipynb => RAG/src/chain_server/RAG_Chain_Server_API_Client.ipynb (100%) rename {tools/observability => RAG/src/chain_server}/__init__.py (95%) create mode 100644 RAG/src/chain_server/base.py rename {RetrievalAugmentedGeneration/common => RAG/src/chain_server}/configuration.py (57%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/chain_server}/configuration_wizard.py (89%) create mode 100644 RAG/src/chain_server/requirements.txt create mode 100644 RAG/src/chain_server/server.py rename {RetrievalAugmentedGeneration/common => RAG/src/chain_server}/tracing.py (74%) create mode 100644 RAG/src/chain_server/utils.py rename {integrations => RAG/src}/pandasai/llms/__init__.py (100%) rename {integrations => RAG/src}/pandasai/llms/nv_aiplay.py (98%) create mode 100644 RAG/src/rag_playground/Dockerfile rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/__init__.py (96%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/__main__.py (74%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/api.py (88%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/assets/__init__.py (100%) create mode 100644 RAG/src/rag_playground/default/assets/kaizen-theme.css rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/assets/kaizen-theme.json (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/chat_client.py (53%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/configuration.py (76%) rename {RetrievalAugmentedGeneration/common => RAG/src/rag_playground/default}/configuration_wizard.py (89%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/pages/__init__.py (100%) create mode 100644 RAG/src/rag_playground/default/pages/converse.py rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/pages/kb.py (81%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/404.html (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/_next/static/WuNGAl0x4o1D5HqLxhHMt/_buildManifest.js (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/_next/static/WuNGAl0x4o1D5HqLxhHMt/_ssgManifest.js (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/_next/static/chunks/78-a36dca5d49fafb86.js (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/_next/static/chunks/framework-7a7e500878b44665.js (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/_next/static/chunks/main-92011a1a7f336a6f.js (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/_next/static/chunks/pages/_app-f21c0780e30f5eb6.js (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/_next/static/chunks/pages/_app-f55c3b932a623280.js (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/_next/static/chunks/pages/_error-54de1933a164a1ff.js (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/_next/static/chunks/pages/converse-39686323b565eff0.js (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/_next/static/chunks/pages/converse-61880f01babd873a.js (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/_next/static/chunks/pages/index-1a1d31dae38463f7.js (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/_next/static/chunks/pages/index-6a3f286eb0986c10.js (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/_next/static/chunks/pages/kb-cf0d102293dc0a74.js (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/_next/static/chunks/pages/tuning-0b7bb1111c2d2a56.js (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/_next/static/chunks/webpack-5146130448d8adf7.js (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/_next/static/css/7636246223312442.css (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/_next/static/css/98b512633409f7e1.css (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/_next/static/s7oUSppGTRWsY8BXJmxYB/_buildManifest.js (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/_next/static/s7oUSppGTRWsY8BXJmxYB/_ssgManifest.js (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/converse.html (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/favicon.ico (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/index.html (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/kb.html (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/next.svg (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/static/vercel.svg (100%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/default}/tracing.py (93%) rename {RetrievalAugmentedGeneration/frontend => RAG/src/rag_playground}/requirements.txt (100%) create mode 100644 RAG/src/rag_playground/speech/__init__.py create mode 100644 RAG/src/rag_playground/speech/__main__.py create mode 100644 RAG/src/rag_playground/speech/api.py rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/speech}/asr_utils.py (86%) rename RetrievalAugmentedGeneration/common/base.py => RAG/src/rag_playground/speech/assets/__init__.py (50%) rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/speech}/assets/kaizen-theme.css (100%) rename {experimental/fm-asr-streaming-rag/frontend/frontend => RAG/src/rag_playground/speech}/assets/kaizen-theme.json (100%) create mode 100644 RAG/src/rag_playground/speech/chat_client.py create mode 100644 RAG/src/rag_playground/speech/configuration.py create mode 100644 RAG/src/rag_playground/speech/configuration_wizard.py create mode 100644 RAG/src/rag_playground/speech/pages/__init__.py rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/speech}/pages/converse.py (69%) create mode 100644 RAG/src/rag_playground/speech/pages/kb.py create mode 100644 RAG/src/rag_playground/speech/static/404.html create mode 100644 RAG/src/rag_playground/speech/static/_next/static/WuNGAl0x4o1D5HqLxhHMt/_buildManifest.js rename {experimental/fm-asr-streaming-rag/frontend/frontend/static/_next/static/ZuyLfTn0WWGPn0wKTmN0V => RAG/src/rag_playground/speech/static/_next/static/WuNGAl0x4o1D5HqLxhHMt}/_ssgManifest.js (100%) create mode 100644 RAG/src/rag_playground/speech/static/_next/static/chunks/78-a36dca5d49fafb86.js create mode 100644 RAG/src/rag_playground/speech/static/_next/static/chunks/framework-7a7e500878b44665.js create mode 100644 RAG/src/rag_playground/speech/static/_next/static/chunks/main-92011a1a7f336a6f.js create mode 100644 RAG/src/rag_playground/speech/static/_next/static/chunks/pages/_app-f21c0780e30f5eb6.js create mode 100644 RAG/src/rag_playground/speech/static/_next/static/chunks/pages/_app-f55c3b932a623280.js create mode 100644 RAG/src/rag_playground/speech/static/_next/static/chunks/pages/_error-54de1933a164a1ff.js create mode 100644 RAG/src/rag_playground/speech/static/_next/static/chunks/pages/converse-39686323b565eff0.js create mode 100644 RAG/src/rag_playground/speech/static/_next/static/chunks/pages/converse-61880f01babd873a.js create mode 100644 RAG/src/rag_playground/speech/static/_next/static/chunks/pages/index-1a1d31dae38463f7.js create mode 100644 RAG/src/rag_playground/speech/static/_next/static/chunks/pages/index-6a3f286eb0986c10.js create mode 100644 RAG/src/rag_playground/speech/static/_next/static/chunks/pages/kb-cf0d102293dc0a74.js create mode 100644 RAG/src/rag_playground/speech/static/_next/static/chunks/pages/tuning-0b7bb1111c2d2a56.js create mode 100644 RAG/src/rag_playground/speech/static/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js create mode 100644 RAG/src/rag_playground/speech/static/_next/static/chunks/webpack-5146130448d8adf7.js rename {experimental/fm-asr-streaming-rag/frontend/frontend => RAG/src/rag_playground/speech}/static/_next/static/css/7636246223312442.css (100%) create mode 100644 RAG/src/rag_playground/speech/static/_next/static/css/98b512633409f7e1.css create mode 100644 RAG/src/rag_playground/speech/static/_next/static/s7oUSppGTRWsY8BXJmxYB/_buildManifest.js create mode 100644 RAG/src/rag_playground/speech/static/_next/static/s7oUSppGTRWsY8BXJmxYB/_ssgManifest.js create mode 100644 RAG/src/rag_playground/speech/static/converse.html rename {experimental/fm-asr-streaming-rag/frontend/frontend => RAG/src/rag_playground/speech}/static/favicon.ico (100%) create mode 100644 RAG/src/rag_playground/speech/static/index.html create mode 100644 RAG/src/rag_playground/speech/static/kb.html rename {experimental/fm-asr-streaming-rag/frontend/frontend => RAG/src/rag_playground/speech}/static/next.svg (100%) rename {experimental/fm-asr-streaming-rag/frontend/frontend => RAG/src/rag_playground/speech}/static/vercel.svg (100%) create mode 100644 RAG/src/rag_playground/speech/tracing.py rename {RetrievalAugmentedGeneration/frontend/frontend => RAG/src/rag_playground/speech}/tts_utils.py (77%) create mode 100644 RAG/tools/README.md rename {RetrievalAugmentedGeneration/examples => RAG/tools}/__init__.py (95%) create mode 100644 RAG/tools/evaluation/.gitattributes rename {tools => RAG/tools}/evaluation/Dockerfile (86%) create mode 100644 RAG/tools/evaluation/README.md rename deploy/compose/eval-app-compose.env => RAG/tools/evaluation/compose.env (100%) create mode 100644 RAG/tools/evaluation/dataset.zip rename deploy/compose/docker-compose-evaluation-application.yaml => RAG/tools/evaluation/docker-compose.yaml (88%) rename {tools/evaluation => RAG/tools/evaluation/notebooks}/01_synthetic_data_generation.ipynb (80%) rename {tools/evaluation => RAG/tools/evaluation/notebooks}/02_filling_RAG_outputs_for_Evaluation.ipynb (81%) rename {tools/evaluation => RAG/tools/evaluation/notebooks}/03_eval_ragas.ipynb (90%) rename tools/evaluation/04_Human_Like_RAG_Evaluation-AIP.ipynb => RAG/tools/evaluation/notebooks/04_Human_Like_RAG_Evaluation.ipynb (92%) create mode 100644 RAG/tools/evaluation/notebooks/README.md rename {tools/evaluation => RAG/tools/evaluation/notebooks}/imgs/ragas.png (100%) rename {tools/evaluation => RAG/tools/evaluation/notebooks}/imgs/synthetic_data_pipeline.png (100%) rename {tools/evaluation => RAG/tools/evaluation/notebooks}/qa_generation.json (100%) rename {tools/evaluation => RAG/tools/evaluation/notebooks}/requirements.txt (100%) rename {tools => RAG/tools}/evaluation/rag_evaluator/evaluator.py (89%) rename {tools => RAG/tools}/evaluation/rag_evaluator/llm_answer_generator.py (87%) rename {tools => RAG/tools}/evaluation/rag_evaluator/main.py (80%) rename {tools => RAG/tools}/evaluation/rag_evaluator/requirements.txt (74%) rename {tools => RAG/tools}/evaluation/results/qna.json (100%) rename {tools => RAG/tools}/evaluation/synthetic_data_generator/data_generator.py (83%) rename {tools => RAG/tools}/evaluation/synthetic_data_generator/main.py (71%) rename {tools => RAG/tools}/evaluation/synthetic_data_generator/requirements.txt (100%) rename docs/observability.md => RAG/tools/observability/README.md (57%) rename {tools => RAG/tools/observability}/__init__.py (95%) create mode 100644 RAG/tools/observability/compose.env rename {deploy/compose => RAG/tools/observability}/configs/jaeger.yaml (100%) create mode 100644 RAG/tools/observability/configs/otel-collector-config.yaml rename deploy/compose/docker-compose-observability.yaml => RAG/tools/observability/docker-compose.yaml (94%) rename {tools => RAG/tools}/observability/langchain/__init__.py (95%) rename {tools => RAG/tools}/observability/langchain/opentelemetry_callback.py (88%) create mode 100644 RAG/tools/observability/llamaindex/__init__.py rename {tools => RAG/tools}/observability/llamaindex/opentelemetry_callback.py (79%) delete mode 100644 RetrievalAugmentedGeneration/LICENSE-Apache-2.0.txt delete mode 100644 RetrievalAugmentedGeneration/LICENSE.md delete mode 100644 RetrievalAugmentedGeneration/examples/multi_turn_rag/chains.py rename {examples => community}/5_mins_rag_no_gpu/main.py (100%) rename {examples => community}/5_mins_rag_no_gpu/requirements.txt (100%) rename {experimental => community}/README.md (85%) rename {experimental => community}/event-driven-rag-cve-analysis/Dockerfile (100%) rename {experimental => community}/event-driven-rag-cve-analysis/README.md (97%) rename {experimental => community}/event-driven-rag-cve-analysis/cyber_dev_day/__init__.py (100%) rename {experimental => community}/event-driven-rag-cve-analysis/cyber_dev_day/checklist_node.py (100%) rename {experimental => community}/event-driven-rag-cve-analysis/cyber_dev_day/config.py (100%) rename {experimental => community}/event-driven-rag-cve-analysis/cyber_dev_day/embeddings.py (100%) rename {experimental => community}/event-driven-rag-cve-analysis/cyber_dev_day/faiss_vdb_service.py (100%) rename {experimental => community}/event-driven-rag-cve-analysis/cyber_dev_day/langchain_llm_client_wrapper.py (100%) rename {experimental => community}/event-driven-rag-cve-analysis/cyber_dev_day/llm_service.py (100%) rename {experimental => community}/event-driven-rag-cve-analysis/cyber_dev_day/nim_llm_service.py (100%) rename {experimental => community}/event-driven-rag-cve-analysis/cyber_dev_day/openai_chat_service.py (100%) rename {experimental => community}/event-driven-rag-cve-analysis/cyber_dev_day/pipeline.py (100%) rename {experimental => community}/event-driven-rag-cve-analysis/cyber_dev_day/pipeline_utils.py (100%) rename {experimental => community}/event-driven-rag-cve-analysis/cyber_dev_day/tools.py (100%) rename {experimental => community}/event-driven-rag-cve-analysis/data/morpheus_24.03-runtime_sbom.csv (100%) rename {experimental => community}/event-driven-rag-cve-analysis/default.env (100%) rename {experimental => community}/event-driven-rag-cve-analysis/docker-compose.yml (100%) rename {experimental => community}/event-driven-rag-cve-analysis/entrypoint.sh (100%) rename {experimental => community}/event-driven-rag-cve-analysis/nginx/.gitignore (100%) rename {experimental => community}/event-driven-rag-cve-analysis/nginx/nginx.conf (100%) rename {experimental => community}/event-driven-rag-cve-analysis/nginx/template-variables.conf (100%) rename {experimental => community}/event-driven-rag-cve-analysis/notebooks/cyber-dev-day.ipynb (97%) rename {experimental => community}/event-driven-rag-cve-analysis/notebooks/images/multiple_cve_parallel.jpg (100%) rename {experimental => community}/event-driven-rag-cve-analysis/notebooks/images/multiple_cve_serial.jpg (100%) rename {experimental => community}/event-driven-rag-cve-analysis/notebooks/images/side_by_side.png (100%) rename {experimental => community}/event-driven-rag-cve-analysis/notebooks/images/single_cve_parallel.jpg (100%) rename {experimental => community}/event-driven-rag-cve-analysis/notebooks/images/single_cve_serial.jpg (100%) rename {experimental => community}/event-driven-rag-cve-analysis/requirements.yaml (100%) rename {experimental => community}/fm-asr-streaming-rag/README.md (100%) rename {experimental => community}/fm-asr-streaming-rag/chain-server/Dockerfile (100%) rename {experimental => community}/fm-asr-streaming-rag/chain-server/accumulator.py (100%) rename {experimental => community}/fm-asr-streaming-rag/chain-server/chains.py (100%) rename {experimental => community}/fm-asr-streaming-rag/chain-server/common.py (100%) rename {experimental => community}/fm-asr-streaming-rag/chain-server/database.py (100%) rename {experimental => community}/fm-asr-streaming-rag/chain-server/prompts.py (100%) rename {experimental => community}/fm-asr-streaming-rag/chain-server/requirements.txt (100%) rename {experimental => community}/fm-asr-streaming-rag/chain-server/retriever.py (100%) rename {experimental => community}/fm-asr-streaming-rag/chain-server/server.py (100%) rename {experimental => community}/fm-asr-streaming-rag/chain-server/utils.py (100%) rename {experimental => community}/fm-asr-streaming-rag/deploy/compose.env (100%) rename {experimental => community}/fm-asr-streaming-rag/deploy/docker-compose-file-replay.yaml (100%) rename {experimental => community}/fm-asr-streaming-rag/deploy/docker-compose-fm-asr.yaml (100%) rename {experimental => community}/fm-asr-streaming-rag/deploy/docker-compose-milvus-standalone.yaml (100%) rename {experimental => community}/fm-asr-streaming-rag/deploy/docker-compose-nemo-retriever.yaml (100%) rename {experimental => community}/fm-asr-streaming-rag/deploy/docker-compose-nim-build.yaml (100%) rename {experimental => community}/fm-asr-streaming-rag/deploy/docker-compose-nim-llm.yaml (100%) rename {experimental => community}/fm-asr-streaming-rag/deploy/scripts/nim-model-build.sh (100%) rename {experimental => community}/fm-asr-streaming-rag/deploy/scripts/run.sh (100%) rename {experimental => community}/fm-asr-streaming-rag/deploy/scripts/stop.sh (100%) rename {experimental => community}/fm-asr-streaming-rag/docs/imgs/architecture-cloud.jpg (100%) rename {experimental => community}/fm-asr-streaming-rag/docs/imgs/architecture-retriever.jpg (100%) rename {experimental => community}/fm-asr-streaming-rag/docs/imgs/chatbot.jpg (100%) rename {experimental => community}/fm-asr-streaming-rag/docs/imgs/high-level-overview.jpg (100%) rename {experimental => community}/fm-asr-streaming-rag/docs/imgs/high-level-replay-overview.jpg (100%) rename {experimental => community}/fm-asr-streaming-rag/docs/imgs/intent-retrieval.jpg (100%) rename {experimental => community}/fm-asr-streaming-rag/docs/imgs/intent-tree.jpg (100%) rename {experimental => community}/fm-asr-streaming-rag/docs/samples/sample_fm_radio.grc (100%) rename {experimental => community}/fm-asr-streaming-rag/docs/samples/sample_riva_config.sh (100%) rename {experimental => community}/fm-asr-streaming-rag/file-replay/Dockerfile (100%) rename {experimental => community}/fm-asr-streaming-rag/file-replay/requirements.txt (100%) rename {experimental => community}/fm-asr-streaming-rag/file-replay/wav_replay.py (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/Dockerfile (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/__init__.py (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/__main__.py (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/api.py (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/assets/__init__.py (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/assets/kaizen-theme.css (100%) create mode 100644 community/fm-asr-streaming-rag/frontend/frontend/assets/kaizen-theme.json rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/chat_client.py (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/configuration.py (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/configuration_wizard.py (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/pages/__init__.py (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/pages/converse.py (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/pages/kb.py (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/pages/stats.py (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/pages/waveform.py (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/static/404.html (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/static/_next/static/ZuyLfTn0WWGPn0wKTmN0V/_buildManifest.js (100%) create mode 100644 community/fm-asr-streaming-rag/frontend/frontend/static/_next/static/ZuyLfTn0WWGPn0wKTmN0V/_ssgManifest.js rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/static/_next/static/chunks/78-bc18c16297940613.js (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/static/_next/static/chunks/framework-0c7baedefba6b077.js (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/static/_next/static/chunks/main-7af7d5359a6145de.js (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/static/_next/static/chunks/pages/_app-7f0002c80738113a.js (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/static/_next/static/chunks/pages/_error-ee5b5fb91d29d86f.js (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/static/_next/static/chunks/pages/converse-bd575ea9251886b9.js (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/static/_next/static/chunks/pages/index-bd877b96e2342d55.js (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/static/_next/static/chunks/pages/kb-8e8e5f97dcec4a53.js (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/static/_next/static/chunks/pages/stats-c181bdd959e91e0f.js (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/static/_next/static/chunks/pages/waveform-0d7fcdd3766fcbdb.js (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/static/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/static/_next/static/chunks/webpack-e53a5203105d5dd8.js (100%) create mode 100644 community/fm-asr-streaming-rag/frontend/frontend/static/_next/static/css/7636246223312442.css rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/static/converse.html (100%) create mode 100644 community/fm-asr-streaming-rag/frontend/frontend/static/favicon.ico rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/static/index.html (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/static/kb.html (100%) create mode 100644 community/fm-asr-streaming-rag/frontend/frontend/static/next.svg rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/static/stats.html (100%) create mode 100644 community/fm-asr-streaming-rag/frontend/frontend/static/vercel.svg rename {experimental => community}/fm-asr-streaming-rag/frontend/frontend/static/waveform.html (100%) rename {experimental => community}/fm-asr-streaming-rag/frontend/requirements.txt (100%) rename {experimental => community}/fm-asr-streaming-rag/nemo-retriever/config/milvus-config.yaml (100%) rename {experimental => community}/fm-asr-streaming-rag/nemo-retriever/config/otel-collector-config.yaml (100%) rename {experimental => community}/fm-asr-streaming-rag/nemo-retriever/model_configs/nv-rerank-qa-mistral-4b-A6000.yaml (100%) rename {experimental => community}/fm-asr-streaming-rag/nemo-retriever/models/keep (100%) rename {experimental => community}/fm-asr-streaming-rag/nim/Dockerfile (100%) rename {experimental => community}/fm-asr-streaming-rag/nim/configs/mistral-7b.yaml (100%) rename {experimental => community}/fm-asr-streaming-rag/nim/playbook.sh (100%) rename {experimental => community}/fm-asr-streaming-rag/sdr-holoscan/Dockerfile (100%) rename {experimental => community}/fm-asr-streaming-rag/sdr-holoscan/app.py (100%) rename {experimental => community}/fm-asr-streaming-rag/sdr-holoscan/common.py (100%) rename {experimental => community}/fm-asr-streaming-rag/sdr-holoscan/operators.py (100%) rename {experimental => community}/fm-asr-streaming-rag/sdr-holoscan/params.yml (100%) rename {experimental => community}/fm-asr-streaming-rag/sdr-holoscan/requirements.txt (100%) rename {experimental => community}/fm-asr-streaming-rag/sdr-holoscan/riva_asr.py (100%) create mode 100644 community/knowledge_graph_rag/.env.example rename {experimental => community}/knowledge_graph_rag/README.md (93%) create mode 100644 community/knowledge_graph_rag/backend/routers/chat.py create mode 100644 community/knowledge_graph_rag/backend/routers/evaluation.py create mode 100644 community/knowledge_graph_rag/backend/routers/ui_backend.py create mode 100644 community/knowledge_graph_rag/backend/routers/visualization.py create mode 100644 community/knowledge_graph_rag/backend/server.py rename {experimental/knowledge_graph_rag => community/knowledge_graph_rag/backend}/utils/download_papers.py (100%) rename {experimental/knowledge_graph_rag => community/knowledge_graph_rag/backend}/utils/lc_graph.py (72%) rename {experimental/knowledge_graph_rag => community/knowledge_graph_rag/backend}/utils/preprocessor.py (100%) rename {experimental/knowledge_graph_rag => community/knowledge_graph_rag/backend}/vectorstore/search.py (100%) create mode 100644 community/knowledge_graph_rag/frontend/pages/chat.py create mode 100644 community/knowledge_graph_rag/frontend/pages/evaluation.py rename {experimental/knowledge_graph_rag => community/knowledge_graph_rag/frontend}/pages/visualization.py (96%) create mode 100644 community/knowledge_graph_rag/frontend/ui.py rename {experimental => community}/knowledge_graph_rag/requirements.txt (86%) rename {experimental => community}/knowledge_graph_rag/viz.png (100%) rename {experimental => community}/llm-prompt-design-helper/.gitattributes (100%) rename {experimental => community}/llm-prompt-design-helper/Dockerfile (100%) rename {experimental => community}/llm-prompt-design-helper/README.md (100%) rename {experimental => community}/llm-prompt-design-helper/api_request_backends/api_request.py (100%) rename {experimental => community}/llm-prompt-design-helper/api_request_backends/chatnv_client.py (100%) rename {experimental => community}/llm-prompt-design-helper/api_request_backends/openai_client.py (100%) rename {experimental => community}/llm-prompt-design-helper/build_image.sh (100%) rename {experimental => community}/llm-prompt-design-helper/chat_ui.py (100%) rename {experimental => community}/llm-prompt-design-helper/chat_ui_utils.py (100%) rename {experimental => community}/llm-prompt-design-helper/config.yaml (100%) rename {experimental => community}/llm-prompt-design-helper/data/bot.webp (100%) rename {experimental => community}/llm-prompt-design-helper/data/llm-prompt-designer-demo.gif (100%) rename {experimental => community}/llm-prompt-design-helper/data/local-database-settings.jpeg (100%) rename {experimental => community}/llm-prompt-design-helper/data/self-host-database-settings.jpeg (100%) rename {experimental => community}/llm-prompt-design-helper/data/simple_ui.jpeg (100%) rename {experimental => community}/llm-prompt-design-helper/data/simple_ui_db.jpeg (100%) rename {experimental => community}/llm-prompt-design-helper/data/user.webp (100%) rename {experimental => community}/llm-prompt-design-helper/requirements.txt (100%) rename {experimental => community}/llm-prompt-design-helper/run_container.sh (100%) rename {experimental => community}/llm-prompt-design-helper/test.py (90%) rename {experimental => community}/llm-prompt-design-helper/vector_store/faiss_vector_store.py (100%) rename {experimental => community}/multimodal_assistant/.gitignore (100%) rename {experimental => community}/multimodal_assistant/Multimodal_Assistant.py (98%) rename {experimental => community}/multimodal_assistant/README.md (97%) rename {experimental => community}/multimodal_assistant/bot_config/multimodal.config (100%) rename {experimental => community}/multimodal_assistant/bot_config/utils.py (100%) rename {experimental/multimodal_assistant/retriever => community/multimodal_assistant/guardrails}/__init__.py (100%) rename {experimental => community}/multimodal_assistant/guardrails/fact_check.py (97%) rename {experimental/oran-chatbot-multimodal/guardrails => community/multimodal_assistant/llm}/__init__.py (100%) rename {experimental => community}/multimodal_assistant/llm/llm.py (100%) rename {experimental/oran-chatbot-multimodal => community/multimodal_assistant}/llm/llm_client.py (94%) rename {experimental => community}/multimodal_assistant/pages/1_Knowledge_Base.py (100%) rename {experimental => community}/multimodal_assistant/requirements.txt (88%) rename {experimental/oran-chatbot-multimodal/llm => community/multimodal_assistant/retriever}/__init__.py (100%) rename {experimental => community}/multimodal_assistant/retriever/embedder.py (100%) rename {experimental => community}/multimodal_assistant/retriever/retriever.py (100%) rename {experimental => community}/multimodal_assistant/retriever/vector.py (100%) rename {experimental => community}/multimodal_assistant/utils/api_key_check.py (100%) rename {experimental => community}/multimodal_assistant/utils/feedback.py (100%) rename {experimental => community}/multimodal_assistant/utils/memory.py (100%) rename {experimental/oran-chatbot-multimodal => community/multimodal_assistant}/vectorstore/custom_pdf_parser.py (98%) rename {experimental => community}/multimodal_assistant/vectorstore/custom_powerpoint_parser.py (100%) rename {experimental => community}/multimodal_assistant/vectorstore/multimodal/uploaded_docs/NVIDIA In Brief 1-Pager.pdf (100%) rename {experimental => community}/multimodal_assistant/vectorstore/vectorstore_updater.py (100%) rename {experimental => community}/oran-chatbot-multimodal/Multimodal_Assistant.py (98%) rename {experimental => community}/oran-chatbot-multimodal/README.md (94%) rename {experimental => community}/oran-chatbot-multimodal/bot_config/multimodal_oran.config (100%) rename {experimental => community}/oran-chatbot-multimodal/bot_config/oran.config (100%) rename {experimental => community}/oran-chatbot-multimodal/bot_config/utils.py (100%) rename {experimental => community}/oran-chatbot-multimodal/config.yaml (52%) rename {experimental => community}/oran-chatbot-multimodal/embedEtcd.yaml (100%) rename {experimental => community}/oran-chatbot-multimodal/evals/01_synthetic_data_generation.ipynb (100%) rename {experimental => community}/oran-chatbot-multimodal/evals/02_filling_RAG_outputs_for_Evaluation.ipynb (100%) rename {experimental => community}/oran-chatbot-multimodal/evals/03_eval_ragas.ipynb (100%) rename {experimental => community}/oran-chatbot-multimodal/evals/04_Human_Like_RAG_Evaluation-AIP.ipynb (100%) rename {experimental => community}/oran-chatbot-multimodal/evals/05_complexquery_advancedRAG.ipynb (100%) rename {experimental => community}/oran-chatbot-multimodal/evals/end.jpg (100%) rename {experimental => community}/oran-chatbot-multimodal/evals/eval_syn_QA_Nvolve.json (100%) rename {experimental => community}/oran-chatbot-multimodal/evals/gen.jpg (100%) rename {experimental => community}/oran-chatbot-multimodal/evals/metrics_df.pkl (100%) rename {experimental => community}/oran-chatbot-multimodal/evals/requirements.txt (100%) rename {experimental => community}/oran-chatbot-multimodal/evals/ret.jpg (100%) rename {experimental => community}/oran-chatbot-multimodal/evals/syn_data_oran.json (100%) rename {experimental/oran-chatbot-multimodal/retriever => community/oran-chatbot-multimodal/guardrails}/__init__.py (100%) rename {experimental => community}/oran-chatbot-multimodal/guardrails/fact_check.py (100%) rename {integrations => community/oran-chatbot-multimodal/llm}/__init__.py (100%) rename {experimental => community}/oran-chatbot-multimodal/llm/llm.py (89%) rename {experimental/multimodal_assistant => community/oran-chatbot-multimodal}/llm/llm_client.py (100%) rename {experimental => community}/oran-chatbot-multimodal/oran_diagram.png (100%) rename {experimental => community}/oran-chatbot-multimodal/pages/1_Knowledge_Base.py (99%) rename {experimental => community}/oran-chatbot-multimodal/pages/2_Evaluation_Metrics.py (94%) rename {experimental => community}/oran-chatbot-multimodal/requirements.txt (94%) create mode 100644 community/oran-chatbot-multimodal/retriever/__init__.py rename {experimental => community}/oran-chatbot-multimodal/retriever/embedder.py (90%) rename {experimental => community}/oran-chatbot-multimodal/retriever/retriever.py (94%) rename {experimental => community}/oran-chatbot-multimodal/retriever/vector.py (100%) rename {experimental => community}/oran-chatbot-multimodal/standalone_embed.sh (100%) rename {experimental => community}/oran-chatbot-multimodal/synthetic_data_openai.json (100%) rename {experimental => community}/oran-chatbot-multimodal/utils/api_key_check.py (100%) rename {experimental => community}/oran-chatbot-multimodal/utils/feedback.py (100%) rename {experimental => community}/oran-chatbot-multimodal/utils/memory.py (100%) rename {experimental/multimodal_assistant => community/oran-chatbot-multimodal}/vectorstore/custom_pdf_parser.py (100%) rename {experimental => community}/oran-chatbot-multimodal/vectorstore/custom_powerpoint_parser.py (100%) rename {experimental => community}/oran-chatbot-multimodal/vectorstore/embedder.py (100%) rename {experimental => community}/oran-chatbot-multimodal/vectorstore/vectorstore_updater.py (96%) rename {experimental => community}/rag-developer-chatbot/Dockerfile.notebook (100%) rename {experimental => community}/rag-developer-chatbot/README.md (87%) rename {experimental => community}/rag-developer-chatbot/compose.env (100%) rename {experimental => community}/rag-developer-chatbot/docker-compose-dev-rag.yaml (100%) rename {experimental => community}/rag-developer-chatbot/notebooks/diagram.png (100%) rename {experimental => community}/rag-developer-chatbot/notebooks/rapids_notebook.ipynb (100%) rename {experimental => community}/rag-developer-chatbot/notebooks/requirements.txt (100%) rename {experimental => community}/streaming_ingest_rag/.env (100%) rename {experimental => community}/streaming_ingest_rag/.gitignore (100%) rename {experimental => community}/streaming_ingest_rag/README.md (100%) rename {experimental => community}/streaming_ingest_rag/docker-compose.yml (93%) rename {experimental => community}/streaming_ingest_rag/docker/Dockerfile.morpheus (100%) rename {experimental => community}/streaming_ingest_rag/docker/Dockerfile.producer (90%) rename {experimental => community}/streaming_ingest_rag/docker/build_all.sh (100%) rename {experimental => community}/streaming_ingest_rag/docker/build_attu.sh (100%) rename {experimental => community}/streaming_ingest_rag/docker/build_morpheus.sh (100%) rename {experimental => community}/streaming_ingest_rag/docker/conda/environments/conda_env.yaml (100%) rename {experimental => community}/streaming_ingest_rag/docker/extras/all-MiniLM-L6-v2_config.pbtxt (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/__init__.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/export_model.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/helper.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/kafka_config.yaml (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/langchain.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/module/__init__.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/module/content_extractor_module.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/module/file_source_pipe.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/module/kafka_source_module.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/module/kafka_source_pipe.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/module/raw_chunker_module.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/module/rss_source_pipe.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/module/schema_transform.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/module/vdb_resource_tagging_module.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/module/web_scraper_module.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/pipeline.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/run.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/schemas/__init__.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/schemas/file_source_pipe_schema.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/schemas/kafka_source_pipe_schema.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/schemas/kafka_source_schema.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/schemas/raw_chunker_schema.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/schemas/rss_source_pipe_schema.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/schemas/schema_transform_schema.py (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/vdb_config.yaml (100%) rename {experimental => community}/streaming_ingest_rag/morpheus_examples/streaming_ingest_rag/vdb_upload/vdb_utils.py (100%) rename {experimental => community}/streaming_ingest_rag/producer/src/README.md (100%) rename {experimental => community}/streaming_ingest_rag/producer/src/consumer.py (100%) rename {experimental => community}/streaming_ingest_rag/producer/src/data/url_sample.jsonl (100%) rename {experimental => community}/streaming_ingest_rag/producer/src/generate_dataset.py (100%) rename {experimental => community}/streaming_ingest_rag/producer/src/producer.py (100%) rename {experimental => community}/streaming_ingest_rag/utils/produce_messages.sh (100%) rename {experimental => community}/synthetic-data-retriever-customization/files/data/qa_pairs_meta_llama_Llama_2_13b_chat_hf_num_questions_300_BeIR_nfcorpus.csv (100%) rename {experimental => community}/synthetic-data-retriever-customization/retriever_customization.ipynb (100%) rename {experimental => community}/synthetic-data-retriever-customization/setup.sh (100%) rename {experimental => community}/synthetic-data-retriever-customization/synthetic_data_generation_nemo.ipynb (100%) delete mode 100644 deploy/compose/compose.env delete mode 100644 deploy/compose/configs/otel-collector-config.yaml delete mode 100644 deploy/compose/docker-compose-evaluation.yaml delete mode 100644 deploy/compose/docker-compose-nim-ms.yaml delete mode 100644 deploy/compose/download_model.sh delete mode 100644 deploy/compose/rag-app-multimodal-chatbot.yaml delete mode 100644 docs/Dockerfile delete mode 100644 docs/api-catalog.md delete mode 100644 docs/boilerplate-api-catalog.md create mode 100644 docs/change-model.md create mode 100644 docs/common-prerequisites.md delete mode 100644 docs/conf.py delete mode 100644 docs/documents-api-catalog.md delete mode 100644 docs/evaluation.md create mode 100644 docs/images/NVIDIA-Logo-H-ForScreen-ForDarkBG.jpg delete mode 100644 docs/images/ai-foundations-topology.png create mode 100644 docs/images/apps-catalog-promo-web-banner-laptop-300@2x.jpg create mode 100644 docs/images/basic_rag_langchain_arch.png create mode 100644 docs/images/basic_rag_llamaindex_arch.png delete mode 100644 docs/images/catalog-and-vector-db.png delete mode 100644 docs/images/evaluation-topology.png delete mode 100644 docs/images/hf/Slide1.JPG delete mode 100644 docs/images/hf/Slide10.JPG delete mode 100644 docs/images/hf/Slide11.JPG delete mode 100644 docs/images/hf/Slide12.JPG delete mode 100644 docs/images/hf/Slide13.JPG delete mode 100644 docs/images/hf/Slide14.JPG delete mode 100644 docs/images/hf/Slide15.JPG delete mode 100644 docs/images/hf/Slide2.JPG delete mode 100644 docs/images/hf/Slide3.JPG delete mode 100644 docs/images/hf/Slide4.JPG delete mode 100644 docs/images/hf/Slide5.JPG delete mode 100644 docs/images/hf/Slide6.JPG delete mode 100644 docs/images/hf/Slide7.JPG delete mode 100644 docs/images/hf/Slide8.JPG delete mode 100644 docs/images/hf/Slide9.JPG delete mode 100644 docs/images/hf/download.png delete mode 100644 docs/images/llama-2-70b-api.png delete mode 100644 docs/images/llama-2-70b-card.png delete mode 100644 docs/images/llama-2-generate-key.png delete mode 100644 docs/images/llama3-8b-instruct-get-api-key.png delete mode 100644 docs/images/llama3-8b-instruct-model-card.png delete mode 100644 docs/images/mixtral-8x7b-instruct.png create mode 100644 docs/images/multimodal_rag_arch.png create mode 100644 docs/images/multiturn_rag_arch.png delete mode 100644 docs/images/nim-llms-topology.png create mode 100644 docs/images/nvidia-logo-horiz-rgb-blk-for-screen.png create mode 100644 docs/images/query_decomposition_rag_arch.png delete mode 100644 docs/images/simple-rag-api-catalog-boilerplate-llm.png delete mode 100644 docs/images/simple-rag-api-catalog-boilerplate-rag.png create mode 100644 docs/images/structured_data_rag_arch.png delete mode 100644 docs/index.md delete mode 100644 docs/ingest-api-catalog.md delete mode 100644 docs/jupyter-server.md delete mode 100644 docs/llm-api-catalog.md create mode 100644 docs/llm-params.md delete mode 100644 docs/media/custom.css delete mode 100644 docs/media/favicon.ico delete mode 100644 docs/media/nvidia-logo-white.png delete mode 100644 docs/media/omni-style.css delete mode 100644 docs/media/version.js delete mode 100644 docs/multi-turn.md delete mode 100644 docs/multimodal-data.md create mode 100644 docs/multiturn.md delete mode 100644 docs/nim-llms.md delete mode 100644 docs/project.json create mode 100644 docs/prompt-customization.md delete mode 100644 docs/query-decomposition.md delete mode 100644 docs/rag-api-catalog.md delete mode 100644 docs/requirements.txt create mode 100644 docs/riva-asr-tts.md delete mode 100644 docs/simple-example/code/api-catalog/boilerplate/chains.py delete mode 100644 docs/simple-example/code/api-catalog/boilerplate/simple-rag-api-catalog.yaml delete mode 100644 docs/simple-example/code/api-catalog/documents/chains.py delete mode 100644 docs/simple-example/code/api-catalog/ingest/chains.py delete mode 100644 docs/simple-example/code/api-catalog/llm/chains.py delete mode 100644 docs/simple-example/code/api-catalog/rag/chains.py delete mode 100644 docs/simple-example/code/local/ingest/chains.py delete mode 100644 docs/simple-example/output/api-catalog/boilerplate/document-search.json delete mode 100644 docs/simple-example/output/api-catalog/boilerplate/ingest-docs.json delete mode 100644 docs/simple-example/output/api-catalog/boilerplate/llm-chain.json delete mode 100644 docs/simple-example/output/api-catalog/boilerplate/rag-chain.json delete mode 100644 docs/simple-example/output/api-catalog/documents/delete-documents.json delete mode 100644 docs/simple-example/output/api-catalog/documents/document-search.json delete mode 100644 docs/simple-example/output/api-catalog/documents/get-documents.json delete mode 100644 docs/simple-example/output/api-catalog/documents/ice-cream.json delete mode 100644 docs/simple-example/output/api-catalog/documents/ingest-docs.json delete mode 100644 docs/simple-example/output/api-catalog/ingest/chain-server.log delete mode 100644 docs/simple-example/output/api-catalog/llm/response.json delete mode 100644 docs/simple-example/output/api-catalog/rag/response.json delete mode 100644 docs/simple-example/output/api-catalog/search/response.json delete mode 100644 docs/simple-example/output/local/ingest/chain-server.log delete mode 100644 docs/simple-example/requirements.txt delete mode 100644 docs/simple-examples.md delete mode 100644 docs/structured-data.md delete mode 100644 docs/swagger-requirements.txt delete mode 100644 docs/templates/layout.html create mode 100644 docs/text-splitter.md delete mode 100644 docs/versions.json delete mode 100644 examples/README.md delete mode 100644 experimental/AzureML/02.5_langchain_simple_AzureML.ipynb delete mode 100644 experimental/AzureML/README.md delete mode 100644 experimental/AzureML/images/azureml-github.gif delete mode 100644 experimental/AzureML/images/connection-info.png delete mode 100644 experimental/AzureML/trt_llm_azureml.py delete mode 100644 experimental/knowledge_graph_rag/app.py delete mode 100644 experimental/knowledge_graph_rag/pages/chat.py delete mode 100644 experimental/knowledge_graph_rag/pages/evaluation.py rename {models => finetuning}/Codegemma/README.md (100%) rename {models => finetuning}/Codegemma/lora.ipynb (100%) rename {models => finetuning}/Gemma/README.md (100%) rename {models => finetuning}/Gemma/lora.ipynb (100%) rename {models => finetuning}/Gemma/sft.ipynb (100%) rename {models => finetuning}/NeMo/README.md (100%) rename {models => finetuning}/NeMo/slm/README.md (100%) rename {models => finetuning}/NeMo/slm/megatron_gpt_eval_server.ipynb (100%) rename {models => finetuning}/NeMo/slm/slm_pretraining_sft.ipynb (100%) rename {models => finetuning}/README.md (100%) rename {models => finetuning}/StarCoder2/inference.ipynb (100%) rename {models => finetuning}/StarCoder2/lora.ipynb (100%) create mode 100644 industries/healthcare/medical-device-training-assistant/.env create mode 100644 industries/healthcare/medical-device-training-assistant/.gitignore create mode 100644 industries/healthcare/medical-device-training-assistant/README.md create mode 100644 industries/healthcare/medical-device-training-assistant/app_chain/chains.py create mode 100644 industries/healthcare/medical-device-training-assistant/docker-compose-nim-ms.yaml create mode 100644 industries/healthcare/medical-device-training-assistant/docker-compose-vectordb.yaml rename deploy/compose/rag-app-api-catalog-text-chatbot.yaml => industries/healthcare/medical-device-training-assistant/docker-compose.yaml (55%) create mode 100644 industries/healthcare/medical-device-training-assistant/evaluation/Dockerfile create mode 100644 industries/healthcare/medical-device-training-assistant/evaluation/README.md create mode 100644 industries/healthcare/medical-device-training-assistant/evaluation/compose.env create mode 100644 industries/healthcare/medical-device-training-assistant/evaluation/docker-compose.yaml create mode 100644 industries/healthcare/medical-device-training-assistant/evaluation/query_rag_with_gt_questions_and_evaluate.py create mode 100644 industries/healthcare/medical-device-training-assistant/evaluation/requirements.txt create mode 100644 industries/healthcare/medical-device-training-assistant/images/add_file.png create mode 100644 industries/healthcare/medical-device-training-assistant/images/doc_ingestion.png create mode 100644 industries/healthcare/medical-device-training-assistant/images/example_query.png create mode 100644 industries/healthcare/medical-device-training-assistant/images/retrieval_chain.png create mode 100644 industries/healthcare/medical-device-training-assistant/prompt.yaml create mode 100644 industries/healthcare/medical-device-training-assistant/src/chain_server/Dockerfile create mode 100644 industries/healthcare/medical-device-training-assistant/src/chain_server/RAG_Chain_Server_API_Client.ipynb create mode 100644 industries/healthcare/medical-device-training-assistant/src/chain_server/__init__.py create mode 100644 industries/healthcare/medical-device-training-assistant/src/chain_server/base.py create mode 100644 industries/healthcare/medical-device-training-assistant/src/chain_server/configuration.py create mode 100644 industries/healthcare/medical-device-training-assistant/src/chain_server/configuration_wizard.py rename {RetrievalAugmentedGeneration => industries/healthcare/medical-device-training-assistant/src/chain_server}/requirements.txt (95%) rename {RetrievalAugmentedGeneration/common => industries/healthcare/medical-device-training-assistant/src/chain_server}/server.py (64%) create mode 100644 industries/healthcare/medical-device-training-assistant/src/chain_server/tracing.py rename {RetrievalAugmentedGeneration/common => industries/healthcare/medical-device-training-assistant/src/chain_server}/utils.py (53%) rename {RetrievalAugmentedGeneration/frontend => industries/healthcare/medical-device-training-assistant/src/rag_playground}/Dockerfile (82%) create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/requirements.txt create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/__init__.py create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/__main__.py create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/api.py create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/asr_utils.py create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/assets/__init__.py create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/assets/kaizen-theme.css create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/assets/kaizen-theme.json create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/chat_client.py create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/configuration.py create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/configuration_wizard.py create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/pages/__init__.py create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/pages/converse.py create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/pages/kb.py create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/404.html create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/_next/static/WuNGAl0x4o1D5HqLxhHMt/_buildManifest.js create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/_next/static/WuNGAl0x4o1D5HqLxhHMt/_ssgManifest.js create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/_next/static/chunks/78-a36dca5d49fafb86.js create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/_next/static/chunks/framework-7a7e500878b44665.js create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/_next/static/chunks/main-92011a1a7f336a6f.js create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/_next/static/chunks/pages/_app-f21c0780e30f5eb6.js create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/_next/static/chunks/pages/_app-f55c3b932a623280.js create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/_next/static/chunks/pages/_error-54de1933a164a1ff.js create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/_next/static/chunks/pages/converse-39686323b565eff0.js create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/_next/static/chunks/pages/converse-61880f01babd873a.js create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/_next/static/chunks/pages/index-1a1d31dae38463f7.js create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/_next/static/chunks/pages/index-6a3f286eb0986c10.js create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/_next/static/chunks/pages/kb-cf0d102293dc0a74.js create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/_next/static/chunks/pages/tuning-0b7bb1111c2d2a56.js create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/_next/static/chunks/webpack-5146130448d8adf7.js create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/_next/static/css/7636246223312442.css create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/_next/static/css/98b512633409f7e1.css create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/_next/static/s7oUSppGTRWsY8BXJmxYB/_buildManifest.js create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/_next/static/s7oUSppGTRWsY8BXJmxYB/_ssgManifest.js create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/converse.html create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/favicon.ico create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/index.html create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/kb.html create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/next.svg create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/static/vercel.svg create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/tracing.py create mode 100644 industries/healthcare/medical-device-training-assistant/src/rag_playground/speech/tts_utils.py delete mode 100644 notebooks/02_Option(1)_NVIDIA_AI_endpoint_simple.ipynb delete mode 100755 notebooks/02_Option(2)_minimalistic_RAG_with_langchain_local_HF_LLM.ipynb delete mode 100644 notebooks/03_Option(1)_llama_index_with_NVIDIA_AI_endpoint.ipynb delete mode 100755 notebooks/03_Option(2)_llama_index_with_HF_local_LLM.ipynb delete mode 100644 notebooks/Dockerfile.gpu_notebook delete mode 100644 notebooks/Dockerfile.notebooks delete mode 100644 notebooks/dataset.zip delete mode 100644 notebooks/imgs/agentic_rag.png delete mode 100644 notebooks/requirements.txt delete mode 100644 notebooks/toy_data/Titanic_film.txt delete mode 100644 tools/evaluation/Dockerfile.eval delete mode 100644 tools/evaluation/README.md delete mode 100644 tools/observability/llamaindex/__init__.py diff --git a/.dockerignore b/.dockerignore index b4d50964..91540e39 100644 --- a/.dockerignore +++ b/.dockerignore @@ -5,7 +5,7 @@ .gitmodules # Ignore temperory volumes -deploy/compose/volumes +RAG/examples/**/volumes # creating a docker image .dockerignore diff --git a/.gitattributes b/.gitattributes index c8a8d73b..82f8bfb0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1 @@ -notebooks/dataset.zip filter=lfs diff=lfs merge=lfs -text +notebooks/dataset.zip filter=lfs diff=lfs merge=lfs -text \ No newline at end of file diff --git a/.github/workflows/docs-build.yaml b/.github/workflows/docs-build.yaml deleted file mode 100644 index c0abe122..00000000 --- a/.github/workflows/docs-build.yaml +++ /dev/null @@ -1,153 +0,0 @@ -name: docs-build - -on: - pull_request: - branches: [ main, release-* ] - types: [ opened, synchronize ] - - push: - branches: [ main ] - tags: - - v* - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -defaults: - run: - shell: bash - -jobs: - build-docs: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Build image - run: | - docker build --pull --tag docs-builder:latest --file docs/Dockerfile . - - name: Build docs - run: | - docker run -v $(pwd):/work -w /work docs-builder:latest sphinx-build -b html -d /tmp docs docs/_build/output - - name: Delete unnecessary files - run: | - sudo rm -rf docs/_build/jupyter_execute - sudo rm -rf docs/_build/.buildinfo - - name: Upload HTML - uses: actions/upload-artifact@v4 - with: - name: html-build-artifact - path: docs/_build/ - if-no-files-found: error - retention-days: 1 - - name: Store PR information - if: ${{ github.event_name == 'pull_request' }} - run: | - mkdir ./pr - echo ${{ github.event.number }} > ./pr/pr.txt - echo ${{ github.event.pull_request.merged }} > ./pr/merged.txt - echo ${{ github.event.action }} > ./pr/action.txt - - name: Upload PR information - if: ${{ github.event_name == 'pull_request' }} - uses: actions/upload-artifact@v4 - with: - name: pr - path: pr/ - - store-html: - needs: [ build-docs ] - if: ${{ github.event_name == 'push' }} - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - ref: "gh-pages" - - name: Initialize Git configuration - run: | - git config user.name docs-build - git config user.email do-not-send@github.com - - name: Download artifacts - uses: actions/download-artifact@v4 - with: - name: html-build-artifact - - name: Copy HTML directories - run: | - ls -asl - - name: Store bleeding edge docs from main - if: ${{ github.ref == 'refs/heads/main' }} - run: | - mkdir main || true - rsync -av --progress --delete output/ main/ - git add main - - name: Store docs for a release tag - if: ${{ startsWith(github.ref, 'refs/tags/v') }} - env: - LATEST: ${{ contains(github.event.head_commit.message, '/not-latest') && 'not-true' || 'true' }} - run: | - printenv LATEST - if [[ "${GITHUB_REF}" =~ "-rc" ]]; then - echo "Not saving documents for release candidates." - exit 0 - fi - if [[ "${GITHUB_REF}" =~ v([0-9]+\.[0-9]+\.[0-9]+) ]]; then - TAG="${BASH_REMATCH[1]}" - mkdir "${TAG}" || true - rsync -av --progress --delete output/ "${TAG}/" - git add "${TAG}/" - if [[ "${LATEST}" == 'true' ]]; then - mkdir latest || true - rsync -av --progress --delete output/ latest/ - cp output/versions.json . - git add latest - git add versions.json - fi - fi - - name: Check or create dot-no-jekyll file - run: | - if [ -f ".nojekyll" ]; then - echo "The dot-no-jekyll file already exists." - exit 0 - fi - touch .nojekyll - git add .nojekyll - - name: Check or create redirect page - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - resp=$(grep 'http-equiv="refresh"' index.html 2>/dev/null) || true - if [ -n "${resp}" ]; then - echo "The redirect file already exists." - exit 0 - fi - # If any of these commands fail, fail the build. - html_url=$(gh api "repos/${GITHUB_REPOSITORY}/pages" --jq ".html_url") - # Beware ugly quotation mark avoidance in the foll lines. - echo '' > index.html - echo '' >> index.html - echo ' ' >> index.html - echo ' Redirect to documentation' >> index.html - echo ' ' >> index.html - echo ' ' >> index.html - echo ' ' >> index.html - echo ' ' >> index.html - echo ' ' >> index.html - echo ' ' >> index.html - echo '

Please follow the link to the ' >> index.html - echo 'latest documentation.

' >> index.html - echo ' ' >> index.html - echo '' >> index.html - git add index.html - - name: Commit changes to the GitHub Pages branch - run: | - git status - if git commit -m 'Pushing changes to GitHub Pages.'; then - git push -f - else - echo "Nothing changed." - fi diff --git a/.github/workflows/docs-preview-pr.yaml b/.github/workflows/docs-preview-pr.yaml deleted file mode 100644 index 362db16e..00000000 --- a/.github/workflows/docs-preview-pr.yaml +++ /dev/null @@ -1,117 +0,0 @@ -name: docs-preview-pr - -on: - workflow_run: - workflows: [docs-build] - types: [completed] - -env: - WF_ID: ${{ github.event.workflow_run.id }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - -jobs: - # Always determine if GitHub Pages are configured for this repo. - get-gh-pages-url: - if: - github.event.workflow_run.event == 'pull_request' && - github.event.workflow_run.conclusion == 'success' - runs-on: ubuntu-latest - outputs: - url: ${{ steps.api-resp.outputs.html_url || '' }} - branch: ${{ steps.api-resp.outputs.branch || '' }} - steps: - - name: Check for GitHub Pages - id: api-resp - run: | - has_pages=$(gh api "repos/${GITHUB_REPOSITORY}" -q '.has_pages') - if [ "true" != "${has_pages}" ]; then - echo "GitHub pages is not active for the repository. Quitting." - return - fi - - url=$(gh api "repos/${GITHUB_REPOSITORY}/pages" -q '.html_url') - branch=$(gh api "repos/${GITHUB_REPOSITORY}/pages" -q '.source.branch') - - echo "html_url=${url}" >> $GITHUB_OUTPUT - echo "branch=${branch}" >> $GITHUB_OUTPUT - - # Identify the dir for the HTML. - store-html: - runs-on: ubuntu-latest - needs: [get-gh-pages-url] - if: needs.get-gh-pages-url.outputs.url != '' - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ needs.get-gh-pages-url.outputs.branch }} - - name: Initialize Git configuration - run: | - git config user.name docs-preview - git config user.email do-not-send-@github.com - - name: Download artifacts - run: | - gh run view "${WF_ID}" - gh run download "${WF_ID}" - PR=$(cat ./pr/pr.txt) - MERGED=$(cat ./pr/merged.txt) - ACTION=$(cat ./pr/action.txt) - echo "PR_NO=${PR}" >> $GITHUB_ENV - echo "MERGE_STATUS=${MERGED}" >> $GITHUB_ENV - echo "PR_ACTION=${ACTION}" >> $GITHUB_ENV - echo "REVIEW_DIR=review/" >> $GITHUB_ENV - echo "PR_REVIEW_DIR=review/pr-${PR}" >> $GITHUB_ENV - - # Remove the pr artifact directory so that it does not - # appear in listings or confuse git with untracked files. - rm -rf ./pr - - # Permutations: - # - PR was updated, PR_ACTION is !closed, need to delete review directory and update it. - # - PR was closed (regardless of merge), PR_ACTION is closed, need to delete review directory. - - # If this PR is still open, store HTML in a review directory. - - name: Handle HTML review directory for open PRs and updates to PRs - if: env.MERGE_STATUS == 'false' && env.PR_ACTION != 'closed' - run: | - rm -rf "${{ env.PR_REVIEW_DIR }}" 2>/dev/null || true - if [ ! -d "${{ env.REVIEW_DIR }}" ]; then - mkdir "${{ env.REVIEW_DIR }}" - fi - mv ./html-build-artifact/latest/ "${{ env.PR_REVIEW_DIR }}" - git add "${{ env.PR_REVIEW_DIR }}" - # If the PR was closed, merged or not, delete review directory. - - name: Delete HTML review directory for closed PRs - if: env.PR_ACTION == 'closed' - run: | - if [ -d ./html-build-artifact/ ]; then - rm -rf ./html-build-artifact/ 2>/dev/null - fi - if [ -d "${{ env.PR_REVIEW_DIR }}" ]; then - git rm -rf "${{ env.PR_REVIEW_DIR }}" - fi - - name: Commit changes to the GitHub Pages branch - run: | - git status - if git commit -m 'Pushing changes to GitHub Pages.'; then - git push -f - else - echo "Nothing changed." - fi - - name: Check for existing documentation review comment - run: | - result=$(gh pr view ${{ env.PR_NO }} --json comments -q 'any(.comments[].body; contains("Documentation preview"))') - echo "COMMENT_EXISTS=${result}" >> $GITHUB_ENV - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Add HTML review URL comment to a newly opened PR - if: env.MERGE_STATUS == 'false' && env.COMMENT_EXISTS == 'false' - env: - URL: ${{ needs.get-gh-pages-url.outputs.url }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - shell: bash - run: | - echo -e "## Documentation preview" > body - echo -e "" >> body - echo -e "<${{ env.URL }}${{ env.PR_REVIEW_DIR }}>" >> body - cat body - gh pr comment ${{ env.PR_NO }} --body-file body diff --git a/.github/workflows/docs-remove-stale-reviews.yaml b/.github/workflows/docs-remove-stale-reviews.yaml deleted file mode 100644 index 8b758c37..00000000 --- a/.github/workflows/docs-remove-stale-reviews.yaml +++ /dev/null @@ -1,11 +0,0 @@ -name: docs-remove-stale-reviews - -on: - schedule: - # 42 minutes after 0:00 UTC on Sundays - - cron: "42 0 * * 0" - workflow_dispatch: - -jobs: - remove: - uses: nvidia-merlin/.github/.github/workflows/docs-remove-stale-reviews-common.yaml@main diff --git a/.gitignore b/.gitignore index 7094b42f..9d14994c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,14 +3,10 @@ **__pycache__** # Helm Exclusions -**/charts/*.tgz - -# project temp files -deploy/*.log -deploy/*.txt +**/helm-charts/*.tgz # Docker Compose exclusions -volumes/ +RAG/examples/**/volumes uploaded_files/ # Visual Studio Code @@ -26,5 +22,10 @@ docs/experimental docs/tools # Developing examples -RetrievalAugmentedGeneration/examples/simple_rag_api_catalog/ -deploy/compose/simple-rag-api-catalog.yaml +RAG/examples/simple_rag_api_catalog/ +RAG/examples/simple-rag-api-catalog.yaml + +# Notebook checkpoints +RAG/notebooks/langchain/.ipynb_checkpoints +RAG/notebooks/langchain/data/nv_embedding +RAG/notebooks/langchain/data/save_embedding \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ab5a3e8b..11fada31 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,11 +13,15 @@ repos: rev: 19.10b0 hooks: - id: black + files: ^RAG/ args: ["--skip-string-normalization", "--line-length=119"] additional_dependencies: ['click==8.0.4'] - repo: https://github.com/pycqa/isort rev: 5.12.0 hooks: - id: isort + files: ^RAG/ name: isort (python) args: ["--multi-line=3", "--trailing-comma", "--force-grid-wrap=0", "--use-parenthese", "--line-width=119", "--ws"] + + diff --git a/CHANGELOG.md b/CHANGELOG.md index 6112a884..810186d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,60 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.8.0] - 2024-08-19 + +This release completely refactors the directory structure of the repository for a more seamless and intuitive developer journey. It also adds support to deploy latest accelerated embedding and reranking models across the cloud, data center, and workstation using [NVIDIA NeMo Retriever NIM microservices](https://docs.nvidia.com/nim/index.html#nemo-retriever). + +### Added +- [End-to-end RAG examples](./RAG/examples/) enhancements + - [Single-command deployment](./README.md#try-it-now) for all the examples using Docker Compose. + - All end to end RAG examples are now more encapsulated with documentation, code and deployment assets residing in dedicated example specific directory. + - Segregated examples into [basic and advanced RAG](./RAG/examples/) with dedicated READMEs. + - Added reranker model support to [multi-turn RAG example](./RAG/examples/advanced_rag/multi_turn_rag/). + - Added [dedicated prompt configuration file for every example](./docs/prompt-customization.md). + - Removed Python dev packages from containers to enhance security. + - Updated to latest version of [langchain-nvidia-ai-endpoints](https://python.langchain.com/v0.2/docs/integrations/providers/nvidia/). +- [Speech support using RAG Playground]((./docs/riva-asr-tts.md)) + - Added support to access [RIVA speech models from NVIDIA API Catalog](https://build.nvidia.com/explore/speech). + - Speech support in RAG Playground is opt-in. +- Documentation enhancements + - Added more comprehensive [how-to guides](./README.md#how-to-guides) for end to end RAG examples. + - Added [example specific architecture diagrams](./RAG/examples/basic_rag/langchain/) in each example directory. +- Added a new industry specific [top level directory](./industries/) + - Added [health care domain specific Medical Device Training Assistant RAG](./industries/healthcare/medical-device-training-assistant/). +- Added notebooks showcasing new usecases + - [Basic langchain based RAG pipeline](./RAG/notebooks/langchain/langchain_basic_RAG.ipynb) using latest NVIDIA API Catalog connectors. + - [Basic llamaindex based RAG pipeline](./RAG/notebooks/llamaindex/llamaindex_basic_RAG.ipynb) using latest NVIDIA API Catalog connectors. + - [NeMo Guardrails with basic langchain RAG](./RAG/notebooks/langchain/NeMo_Guardrails_with_LangChain_RAG/). + - [NVIDIA NIM microservices using NeMo Guardrails based RAG](./RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/). + - [Using NeMo Evaluator using Llama 3.1 8B Instruct](./RAG/notebooks/nemo/Nemo%20Evaluator%20Llama%203.1%20Workbook/). + - [Agentic RAG pipeline with Nemo Retriever and NIM for LLMs](./RAG/notebooks/langchain/agentic_rag_with_nemo_retriever_nim.ipynb). +- Added new `community` (before `experimental`) example + - Create a simple web interface to interact with different [selectable NIM endpoints](./community/llm-prompt-design-helper/). The provided interface of this project supports designing a system prompt to call the LLM. + +### Changed +- Major restructuring and reorganisation of the assets within the repository + - Top level `experimental` directory has been renamed as `community`. + - Top level `RetrievalAugmentedGeneration` directory has been renamed as just `RAG`. + - The Docker Compose files inside top level `deploy` directory has been migrated to example-specific directories under `RAG/examples`. The vector database and on-prem NIM microservices deployment files are under `RAG/examples/local_deploy`. + - Top level `models` has been renamed to `finetuning`. + - Top level `notebooks` directory has been moved to under `RAG/notebooks` and has been organised framework wise. + - Top level `tools` directory has been migrated to `RAG/tools`. + - Top level `integrations` directory has been moved into `RAG/src`. + - `RetreivalAugmentedGeneration/common` is now residing under `RAG/src/chain_server`. + - `RetreivalAugmentedGeneration/frontend` is now residing under `RAG/src/rag_playground/default`. + - `5 mins RAG No GPU` example under top level `examples` directory, is now under `community`. + +### Deprecated + - Github pages based documentation is now replaced with markdown based documentation. + - Top level `examples` directory has been removed. + - Following notebooks were removed + - [02_Option(1)_NVIDIA_AI_endpoint_simple.ipynb](https://github.com/NVIDIA/GenerativeAIExamples/blob/v0.7.0/notebooks/02_Option(1)_NVIDIA_AI_endpoint_simple.ipynb) + - [notebooks/02_Option(2)_minimalistic_RAG_with_langchain_local_HF_LLM.ipynb](https://github.com/NVIDIA/GenerativeAIExamples/blob/v0.7.0/notebooks/02_Option(2)_minimalistic_RAG_with_langchain_local_HF_LLM.ipynb) + - [notebooks/03_Option(1)_llama_index_with_NVIDIA_AI_endpoint.ipynb](https://github.com/NVIDIA/GenerativeAIExamples/blob/v0.7.0/notebooks/03_Option(1)_llama_index_with_NVIDIA_AI_endpoint.ipynb) + - [notebooks/03_Option(2)_llama_index_with_HF_local_LLM.ipynb](https://github.com/NVIDIA/GenerativeAIExamples/blob/v0.7.0/notebooks/03_Option(2)_llama_index_with_HF_local_LLM.ipynb) + + ## [0.7.0] - 2024-06-18 This release switches all examples to use cloud hosted GPU accelerated LLM and embedding models from [Nvidia API Catalog](https://build.nvidia.com) as default. It also deprecates support to deploy on-prem models using NeMo Inference Framework Container and adds support to deploy accelerated generative AI models across the cloud, data center, and workstation using [latest Nvidia NIM-LLM](https://docs.nvidia.com/nim/large-language-models/latest/introduction.html). @@ -17,7 +71,7 @@ This release switches all examples to use cloud hosted GPU accelerated LLM and e - Improved accuracy of image parsing by using [tesseract-ocr](https://pypi.org/project/tesseract-ocr/) - Added a [new notebook showcasing RAG usecase using accelerated NIM based on-prem deployed models](./notebooks/08_RAG_Langchain_with_Local_NIM.ipynb) - Added a [new experimental example](./experimental/rag-developer-chatbot/) showcasing how to create a developer-focused RAG chatbot using RAPIDS cuDF source code and API documentation. -- Added a [new experimental example](./experimental/event-driven-rag-cve-analysis/) demonstrating how NVIDIA Morpheus, NIMs, and RAG pipelines can be integrated to create LLM-based agent pipelines. +- Added a [new experimental example](./experimental/event-driven-rag-cve-analysis/) demonstrating how NVIDIA Morpheus, NIM microservices, and RAG pipelines can be integrated to create LLM-based agent pipelines. ### Changed - All examples now use llama3 models from [Nvidia API Catalog](https://build.nvidia.com/search?term=llama3) as default. Summary of updated examples and the model it uses is available [here](https://nvidia.github.io/GenerativeAIExamples/latest/index.html#developer-rag-examples). diff --git a/RetrievalAugmentedGeneration/common/__init__.py b/RAG/__init__.py similarity index 100% rename from RetrievalAugmentedGeneration/common/__init__.py rename to RAG/__init__.py diff --git a/RetrievalAugmentedGeneration/examples/multimodal_rag/llm/__init__.py b/RAG/examples/README.md similarity index 100% rename from RetrievalAugmentedGeneration/examples/multimodal_rag/llm/__init__.py rename to RAG/examples/README.md diff --git a/RetrievalAugmentedGeneration/examples/developer_rag/__init__.py b/RAG/examples/__init__.py similarity index 100% rename from RetrievalAugmentedGeneration/examples/developer_rag/__init__.py rename to RAG/examples/__init__.py diff --git a/RAG/examples/advanced_rag/multi_turn_rag/README.md b/RAG/examples/advanced_rag/multi_turn_rag/README.md new file mode 100644 index 00000000..59d9dbc8 --- /dev/null +++ b/RAG/examples/advanced_rag/multi_turn_rag/README.md @@ -0,0 +1,85 @@ + + +# Multi-Turn RAG Example + +## Example Features + +This example showcases multi-turn conversational AI in a RAG pipeline. +The chain server stores the conversation history and knowledge base in a vector database and retrieves them at runtime to understand contextual queries. + +The example supports ingestion of PDF and text files. +The documents are ingested in a dedicated document vector store, multi_turn_rag. +The prompt for the example is tuned to act as a document chat bot. +To maintain the conversation history, the chain server stores the previously asked query and the model's generated answer as a text entry in a different and dedicated vector store for conversation history, conv_store. +Both of these vector stores are part of a LangChain [LCEL](https://python.langchain.com/docs/expression_language/) chain as LangChain Retrievers. +When the chain is invoked with a query, the query passes through both the retrievers. +The retriever retrieves context from the document vector store and the closest-matching conversation history from conversation history vector store. The document chunks retrieved from the document vector store are then passed through a reranker model to determine the most relevant top_k context. The context is then passed onto the LLM prompt for response generation. +Afterward, the chunks are added into the LLM prompt as part of the chain. + +| Model | Embedding | Ranking (Optional) | Framework | Vector Database | File Types | +| ----------------------- | ----------------------- | -------------------------------- | --------- | --------------- | ------------ | +| meta/llama3-8b-instruct | nvidia/nv-embedqa-e5-v5 | nvidia/nv-rerankqa-mistral-4b-v3 | LangChain | Milvus | TXT, PDF, MD | + +![Diagram](../../../../docs/images/multiturn_rag_arch.png) + +## Prerequisites + +Complete the [common prerequisites](../../../../docs/common-prerequisites.md). + +## Build and Start the Containers + +1. Export your NVIDIA API key as an environment variable: + + ```text + export NVIDIA_API_KEY="nvapi-<...>" + ``` + +1. Start the containers: + + ```console + cd RAG/examples/advanced_rag/multi_turn_rag/ + docker compose up -d --build + ``` + + *Example Output* + + ```output + ✔ Network nvidia-rag Created + ✔ Container milvus-etcd Running + ✔ Container milvus-minio Running + ✔ Container milvus-standalone Running + ✔ Container chain-server Started + ✔ Container rag-playground Started + ``` + +1. Confirm the containers are running: + + ```console + docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}" + ``` + + *Example Output* + + ```output + CONTAINER ID NAMES STATUS + dd4fc3da6c9c rag-playground Up About a minute + ac1f039a1db8 chain-server Up About a minute + cd0a57ee20e0 milvus-standalone Up 2 hours + a36370e7ed75 milvus-minio Up 2 hours (healthy) + a796a4e59b68 milvus-etcd Up 2 hours (healthy) + ``` + +1. Open a web browser and access to use the RAG Playground. + + Refer to [Using the Sample Web Application](../../../../docs/using-sample-web-application.md) + for information about uploading documents and using the web interface. + +## Next Steps + +- [Vector Database Customizations](../../../../docs/vector-database.md) +- Stop the containers by running `docker compose down`. +- Use the [RAG Application: Multi Turn Agent](https://registry.ngc.nvidia.com/orgs/ohlfw0olaadg/teams/ea-participants/helm-charts/rag-app-multiturn-chatbot) + Helm Chart to deploy this example in Kubernetes. diff --git a/RAG/examples/advanced_rag/multi_turn_rag/chains.py b/RAG/examples/advanced_rag/multi_turn_rag/chains.py new file mode 100644 index 00000000..dd466496 --- /dev/null +++ b/RAG/examples/advanced_rag/multi_turn_rag/chains.py @@ -0,0 +1,366 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""RAG example showcasing multi-turn conversation.""" +import logging +import os +from operator import itemgetter +from typing import Any, Dict, Generator, List + +from langchain.text_splitter import RecursiveCharacterTextSplitter +from langchain_community.document_loaders import UnstructuredFileLoader +from langchain_core.output_parsers.string import StrOutputParser +from langchain_core.prompts.chat import ChatPromptTemplate +from langchain_core.prompts.prompt import PromptTemplate +from langchain_core.runnables.passthrough import RunnableAssign + +from RAG.src.chain_server.base import BaseExample +from RAG.src.chain_server.tracing import langchain_instrumentation_class_wrapper + +# pylint: disable=no-name-in-module, disable=import-error +from RAG.src.chain_server.utils import ( + create_vectorstore_langchain, + del_docs_vectorstore_langchain, + get_config, + get_docs_vectorstore_langchain, + get_embedding_model, + get_llm, + get_prompts, + get_ranking_model, + get_text_splitter, + get_vectorstore, +) + +document_embedder = get_embedding_model() +text_splitter = None +settings = get_config() +ranker = get_ranking_model() +logger = logging.getLogger(__name__) + +prompts = get_prompts() + +try: + docstore = create_vectorstore_langchain(document_embedder=document_embedder) +except Exception as e: + docstore = None + logger.info(f"Unable to connect to vector store during initialization: {e}") + + +@langchain_instrumentation_class_wrapper +class MultiTurnChatbot(BaseExample): + def save_memory_and_get_output(self, d, vstore): + """Accepts 'input'/'output' dictionary and saves to convstore""" + vstore.add_texts( + [f"User previously responded with {d.get('input')}", f"Agent previously responded with {d.get('output')}",] + ) + return d.get("output") + + def ingest_docs(self, filepath: str, filename: str): + """Ingest documents to the VectorDB.""" + if not filename.endswith((".txt", ".pdf", ".md")): + raise ValueError(f"{filename} is not a valid Text, PDF or Markdown file") + try: + # Load raw documents from the directory + _path = filepath + raw_documents = UnstructuredFileLoader(_path).load() + + if raw_documents: + global text_splitter + if not text_splitter: + text_splitter = get_text_splitter() + + documents = text_splitter.split_documents(raw_documents) + ds = get_vectorstore(docstore, document_embedder) + ds.add_documents(documents) + else: + logger.warning("No documents available to process!") + except Exception as e: + logger.error(f"Failed to ingest document due to exception {e}") + raise ValueError("Failed to upload document. Please upload an unstructured text document.") + + def llm_chain(self, query: str, chat_history: List["Message"], **kwargs) -> Generator[str, None, None]: + """Execute a simple LLM chain using the components defined above.""" + + logger.info("Using llm to generate response directly without knowledge base.") + # WAR: Disable chat history (UI consistency). + chat_history = [] + conversation_history = [(msg.role, msg.content) for msg in chat_history] + system_message = [("system", prompts.get("chat_template", ""))] + user_message = [("user", "{query_str}")] + + # TODO: Enable this block once conversation history is enabled for llm chain + # Checking if conversation_history is not None and not empty + # prompt_template = ChatPromptTemplate.from_messages( + # system_message + conversation_history + user_message + # ) if conversation_history else ChatPromptTemplate.from_messages( + # system_message + user_message + # ) + prompt_template = ChatPromptTemplate.from_messages(system_message + user_message) + + llm = get_llm(**kwargs) + chain = prompt_template | llm | StrOutputParser() + + logger.info(f"Prompt used for response generation: {prompt_template.format(query_str=query)}") + return chain.stream({"query_str": query}, config={"callbacks": [self.cb_handler]}) + + def rag_chain(self, query: str, chat_history: List["Message"], **kwargs) -> Generator[str, None, None]: + """Execute a Retrieval Augmented Generation chain using the components defined above.""" + + logger.info("Using rag to generate response from document") + + # chat_prompt = ChatPromptTemplate.from_messages( + # [ + # ("system", settings.prompts.multi_turn_rag_template), + # ("user", "{input}"), + # ] + # ) + + # This is a workaround Prompt Template + chat_prompt = ChatPromptTemplate.from_messages( + [("user", prompts.get("multi_turn_rag_template") + "User Query: {input}"),] + ) + + llm = get_llm(**kwargs) + stream_chain = chat_prompt | llm | StrOutputParser() + + convstore = create_vectorstore_langchain(document_embedder, collection_name="conv_store") + + resp_str = "" + # TODO Integrate chat_history + try: + ds = get_vectorstore(docstore, document_embedder) + if ds: + + # Get 40 results from vector databases and compress them to 4 (top_k) using a ranker + top_k = 40 if ranker else settings.retriever.top_k + + try: + logger.info( + f"Getting retrieved top k values: {top_k} with confidence threshold: {settings.retriever.score_threshold}" + ) + + context_chain = RunnableAssign( + { + "context": itemgetter("input") + | ds.as_retriever( + search_type="similarity_score_threshold", + search_kwargs={"score_threshold": settings.retriever.score_threshold, "k": top_k}, + ) + } + ) + + history_chain = RunnableAssign( + { + "history": itemgetter("input") + | convstore.as_retriever( + search_type="similarity_score_threshold", + search_kwargs={"score_threshold": settings.retriever.score_threshold, "k": top_k}, + ) + } + ) + if ranker: + logger.info( + f"Narrowing the collection from {top_k} results and further narrowing it to {settings.retriever.top_k} with the reranker." + ) + context_reranker = RunnableAssign( + { + "context": lambda input: ranker.compress_documents( + query=input['input'], documents=input['context'] + ) + } + ) + history_reranker = RunnableAssign( + { + "history": lambda input: ranker.compress_documents( + query=input['input'], documents=input['history'] + ) + } + ) + + retrieval_chain = context_chain | context_reranker | history_chain | history_reranker + else: + retrieval_chain = context_chain | history_chain + # Handling Retrieval failure + docs = retrieval_chain.invoke({"input": query}, config={"callbacks": [self.cb_handler]}) + if not docs: + logger.warning("Retrieval failed to get any relevant context") + return iter( + [ + "No response generated from LLM, make sure your query is relavent to the ingested document." + ] + ) + + logger.debug(f"Retrieved docs are: {docs}") + + chain = retrieval_chain | stream_chain + + for chunk in chain.stream({"input": query}, config={"callbacks": [self.cb_handler]}): + yield chunk + resp_str += chunk + + self.save_memory_and_get_output({"input": query, "output": resp_str}, convstore) + + return chain.stream(query, config={"callbacks": [self.cb_handler]}) + + except NotImplementedError: + # TODO: Optimize it, currently error is raised during stream + # check if there is better way to handle this similarity case + logger.info(f"Skipping similarity score as it's not supported by retriever") + # Some retriever like milvus don't have similarity score threshold implemented + context_chain = RunnableAssign( + {"context": itemgetter("input") | ds.as_retriever(search_kwargs={"k": top_k})} + ) + + history_chain = RunnableAssign( + {"history": itemgetter("input") | convstore.as_retriever(search_kwargs={"k": top_k})} + ) + if ranker: + logger.info( + f"Narrowing the collection from {top_k} results and further narrowing it to {settings.retriever.top_k} with the reranker." + ) + context_reranker = RunnableAssign( + { + "context": lambda input: ranker.compress_documents( + query=input['input'], documents=input['context'] + ) + } + ) + history_reranker = RunnableAssign( + { + "history": lambda input: ranker.compress_documents( + query=input['input'], documents=input['history'] + ) + } + ) + + retrieval_chain = context_chain | context_reranker | history_chain | history_reranker + else: + retrieval_chain = context_chain | history_chain + + # Handling Retrieval failure + docs = retrieval_chain.invoke({"input": query}, config={"callbacks": [self.cb_handler]}) + if not docs: + logger.warning("Retrieval failed to get any relevant context") + return iter( + [ + "No response generated from LLM, make sure your query is relavent to the ingested document." + ] + ) + + logger.debug(f"Retrieved documents are: {docs}") + chain = retrieval_chain | stream_chain + for chunk in chain.stream({"input": query}, config={"callbacks": [self.cb_handler]}): + yield chunk + resp_str += chunk + + self.save_memory_and_get_output({"input": query, "output": resp_str}, convstore) + + return chain.stream(query, config={"callbacks": [self.cb_handler]}) + + except Exception as e: + logger.warning(f"Failed to generate response due to exception {e}") + logger.warning("No response generated from LLM, make sure you've ingested document.") + return iter( + ["No response generated from LLM, make sure you have ingested document from the Knowledge Base Tab."] + ) + + def document_search(self, content: str, num_docs: int) -> List[Dict[str, Any]]: + """Search for the most relevant documents for the given search parameters.""" + + try: + ds = get_vectorstore(docstore, document_embedder) + if ds != None: + # Get 40 results from vector databases and compress them to 4 (top_k) using a ranker + top_k = 40 if ranker else settings.retriever.top_k + + try: + context_chain = RunnableAssign( + { + "context": itemgetter("input") + | ds.as_retriever( + search_type="similarity_score_threshold", + search_kwargs={"score_threshold": settings.retriever.score_threshold, "k": top_k}, + ) + } + ) + if ranker: + logger.info( + f"Narrowing the collection from {top_k} results and further narrowing it to {settings.retriever.top_k} with the reranker." + ) + context_reranker = RunnableAssign( + { + "context": lambda input: ranker.compress_documents( + query=input['input'], documents=input['context'] + ) + } + ) + retriever = context_chain | context_reranker + else: + retriever = context_chain + docs = retriever.invoke({"input": content}, config={"callbacks": [self.cb_handler]}) + except NotImplementedError: + # Some retriever like milvus don't have similarity score threshold implemented + context_chain = RunnableAssign( + {"context": itemgetter("input") | ds.as_retriever(search_kwargs={"k": top_k})} + ) + if ranker: + logger.info( + f"Narrowing the collection from {top_k} results and further narrowing it to {settings.retriever.top_k} with the reranker." + ) + context_reranker = RunnableAssign( + { + "context": lambda input: ranker.compress_documents( + query=input['input'], documents=input['context'] + ) + } + ) + retriever = context_chain | context_reranker + else: + retriever = context_chain + docs = retriever.invoke({"input": content}, config={"callbacks": [self.cb_handler]}) + + result = [] + for doc in docs.get("context"): + result.append( + { + "source": os.path.basename(doc.metadata.get("source", "")), + "content": doc.page_content, + "score": doc.metadata.get("relevance_score", 0), + } + ) + return result + return [] + except Exception as e: + logger.error(f"Error from /documentSearch endpoint. Error details: {e}") + return [] + + def get_documents(self) -> List[str]: + """Retrieves filenames stored in the vector store.""" + try: + ds = get_vectorstore(docstore, document_embedder) + if ds: + return get_docs_vectorstore_langchain(ds) + except Exception as e: + logger.error(f"Vectorstore not initialized. Error details: {e}") + return [] + + def delete_documents(self, filenames: List[str]): + """Delete documents from the vector index.""" + try: + ds = get_vectorstore(docstore, document_embedder) + if ds: + return del_docs_vectorstore_langchain(ds, filenames) + except Exception as e: + logger.error(f"Vectorstore not initialized. Error details: {e}") diff --git a/deploy/compose/rag-app-text-chatbot.yaml b/RAG/examples/advanced_rag/multi_turn_rag/docker-compose.yaml similarity index 58% rename from deploy/compose/rag-app-text-chatbot.yaml rename to RAG/examples/advanced_rag/multi_turn_rag/docker-compose.yaml index 1342367e..b5e9c43a 100644 --- a/deploy/compose/rag-app-text-chatbot.yaml +++ b/RAG/examples/advanced_rag/multi_turn_rag/docker-compose.yaml @@ -1,73 +1,71 @@ -services: - jupyter-server: - container_name: notebook-server - image: notebook-server:${TAG:-latest} - build: - context: ../../ - dockerfile: ./notebooks/Dockerfile.notebooks # replace GPU enabled Dockerfile ./notebooks/Dockerfile.gpu_notebook - ports: - - "8888:8888" - expose: - - "8888" - deploy: - resources: - reservations: - devices: - - driver: nvidia - count: 1 - capabilities: [gpu] +include: + - path: + - ../../local_deploy/docker-compose-vectordb.yaml + - ../../local_deploy/docker-compose-nim-ms.yaml +services: chain-server: container_name: chain-server image: chain-server:${TAG:-latest} build: - context: ../../ - dockerfile: ./RetrievalAugmentedGeneration/Dockerfile + context: ../../../../ + dockerfile: RAG/src/chain_server/Dockerfile args: - EXAMPLE_NAME: developer_rag + EXAMPLE_PATH: 'advanced_rag/multi_turn_rag' + volumes: + - ./prompt.yaml:/prompt.yaml command: --port 8081 --host 0.0.0.0 environment: + EXAMPLE_PATH: 'advanced_rag/multi_turn_rag' APP_VECTORSTORE_URL: "http://milvus:19530" APP_VECTORSTORE_NAME: "milvus" - APP_EMBEDDINGS_MODELNAME: ${APP_EMBEDDINGS_MODELNAME:-snowflake/arctic-embed-l} + APP_LLM_MODELNAME: ${APP_LLM_MODELNAME:-"meta/llama3-8b-instruct"} + APP_LLM_MODELENGINE: nvidia-ai-endpoints + APP_LLM_SERVERURL: ${APP_LLM_SERVERURL:-""} + APP_EMBEDDINGS_MODELNAME: ${APP_EMBEDDINGS_MODELNAME:-nvidia/nv-embedqa-e5-v5} APP_EMBEDDINGS_MODELENGINE: ${APP_EMBEDDINGS_MODELENGINE:-nvidia-ai-endpoints} APP_EMBEDDINGS_SERVERURL: ${APP_EMBEDDINGS_SERVERURL:-""} - APP_LLM_SERVERURL: ${APP_LLM_SERVERURL:-""} - APP_LLM_MODELNAME: ${APP_LLM_MODELNAME:-"meta/llama3-8b-instruct"} - APP_LLM_MODELENGINE: ${APP_LLM_MODELENGINE:-nvidia-ai-endpoints} + APP_TEXTSPLITTER_MODELNAME: Snowflake/snowflake-arctic-embed-l + APP_TEXTSPLITTER_CHUNKSIZE: 506 + APP_TEXTSPLITTER_CHUNKOVERLAP: 200 + APP_RANKING_MODELNAME: ${APP_RANKING_MODELNAME:-"nvidia/nv-rerankqa-mistral-4b-v3"} # Leave it blank to avoid using ranking + APP_RANKING_MODELENGINE: ${APP_RANKING_MODELENGINE:-nvidia-ai-endpoints} + APP_RANKING_SERVERURL: ${APP_RANKING_SERVERURL:-""} NVIDIA_API_KEY: ${NVIDIA_API_KEY} + APP_RETRIEVER_TOPK: 4 + APP_RETRIEVER_SCORETHRESHOLD: 0.25 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-password} POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_DB: ${POSTGRES_DB:-api} - COLLECTION_NAME: ${COLLECTION_NAME:-developer_rag} - APP_RETRIEVER_TOPK: 4 - APP_RETRIEVER_SCORETHRESHOLD: 0.25 + COLLECTION_NAME: ${COLLECTION_NAME:-multi_turn_rag} OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4317 OTEL_EXPORTER_OTLP_PROTOCOL: grpc ENABLE_TRACING: false - APP_TEXTSPLITTER_MODELNAME: Snowflake/snowflake-arctic-embed-l - APP_TEXTSPLITTER_CHUNKSIZE: 506 - APP_TEXTSPLITTER_CHUNKOVERLAP: 200 LOGLEVEL: ${LOGLEVEL:-INFO} ports: - "8081:8081" expose: - "8081" shm_size: 5gb - deploy: - resources: - reservations: - devices: - - driver: nvidia - count: 1 - capabilities: [gpu] + depends_on: + nemollm-embedding: + condition: service_healthy + required: false + nemollm-inference: + condition: service_healthy + required: false + ranking-ms: + condition: service_healthy + required: false rag-playground: container_name: rag-playground image: rag-playground:${TAG:-latest} build: - context: ../.././RetrievalAugmentedGeneration/frontend/ + context: ../../../../RAG/src/rag_playground/ dockerfile: Dockerfile + args: + PLAYGROUND_MODE: ${PLAYGROUND_MODE:-default} command: --port 8090 environment: APP_SERVERURL: http://chain-server @@ -76,16 +74,12 @@ services: OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4317 OTEL_EXPORTER_OTLP_PROTOCOL: grpc ENABLE_TRACING: false - RIVA_API_URI: ${RIVA_API_URI:-} - RIVA_API_KEY: ${RIVA_API_KEY:-} - RIVA_FUNCTION_ID: ${RIVA_FUNCTION_ID:-} - TTS_SAMPLE_RATE: ${TTS_SAMPLE_RATE:-48000} ports: - "8090:8090" expose: - "8090" depends_on: - - chain-server + - chain-server networks: default: diff --git a/RAG/examples/advanced_rag/multi_turn_rag/prompt.yaml b/RAG/examples/advanced_rag/multi_turn_rag/prompt.yaml new file mode 100644 index 00000000..5e63a644 --- /dev/null +++ b/RAG/examples/advanced_rag/multi_turn_rag/prompt.yaml @@ -0,0 +1,22 @@ +chat_template: | + You are a helpful, respectful and honest assistant. + Always answer as helpfully as possible, while being safe. + Please ensure that your responses are positive in nature. + +rag_template: | + [INST] <> + Use the following context to answer the user's question. If you don't know the answer, + just say that you don't know, don't try to make up an answer. + <> + [INST] Context: {context_str} Question: {query_str} Only return the helpful + answer below and nothing else. Helpful answer:[/INST] + +multi_turn_rag_template: | + You are a document chatbot. Help the user as they ask questions about documents. + User message just asked: {input}\n\n + For this, we have retrieved the following potentially-useful info: + Conversation History Retrieved: + {history}\n\n + Document Retrieved: + {context}\n\n + Answer only from retrieved data. Make your response conversational. diff --git a/RAG/examples/advanced_rag/multimodal_rag/README.md b/RAG/examples/advanced_rag/multimodal_rag/README.md new file mode 100644 index 00000000..fa8573ef --- /dev/null +++ b/RAG/examples/advanced_rag/multimodal_rag/README.md @@ -0,0 +1,78 @@ + + +# Multimodal RAG Example + +## Example Features + +This example demonstrates how work with multimodal data. +It showcases multimodal parsing of documents - images, tables, text through multimodal LLM APIs residing in Nvidia API Catalog. The example generates image descriptions using VLMs as shown in the diagram below. +The example works with PDF, PPTX, and PNG files. +The chain server extracts information from the files such as graphs and plots, as well as text and tables. + +| Model | Embedding | Framework | Vector Database | File Types | +| ----------------------- | ------------------------ | --------- | --------------- | -------------- | +| meta/llama3-8b-instruct for response generation, google/Deplot for graph to text convertion and Neva-22B for image to text convertion | nvidia/nv-embedqa-e5-v5 | LangChain | Milvus | PDF, PPTX, PNG | + +![Diagram](../../../../docs/images/multimodal_rag_arch.png) + +## Prerequisites + +Complete the [common prerequisites](../../../../docs/common-prerequisites.md). + +## Build and Start the Containers + +1. Export your NVIDIA API key as an environment variable: + + ```text + export NVIDIA_API_KEY="nvapi-<...>" + ``` + +1. Start the containers: + + ```console + cd RAG/examples/advanced_rag/multimodal_rag/ + docker compose up -d --build + ``` + + *Example Output* + + ```output + ✔ Network nvidia-rag Created + ✔ Container rag-playground Started + ✔ Container milvus-minio Started + ✔ Container chain-server Started + ✔ Container milvus-etcd Started + ✔ Container milvus-standalone Started + ``` + +1. Confirm the containers are running: + + ```console + docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}" + ``` + + *Example Output* + + ```output + CONTAINER ID NAMES STATUS + 39a8524829da rag-playground Up 2 minutes + bfbd0193dbd2 chain-server Up 2 minutes + ec02ff3cc58b milvus-standalone Up 3 minutes + 6969cf5b4342 milvus-minio Up 3 minutes (healthy) + 57a068d62fbb milvus-etcd Up 3 minutes (healthy) + ``` + +1. Open a web browser and access to use the RAG Playground. + + Refer to [Using the Sample Web Application](../../../../docs/using-sample-web-application.md) + for information about uploading documents and using the web interface. + +## Next Steps + +- [Vector Database Customizations](../../../../docs/vector-database.md) +- Stop the containers by running `docker compose down`. +- Use the [RAG Application: Multimodal Chatbot](https://registry.ngc.nvidia.com/orgs/ohlfw0olaadg/teams/ea-participants/helm-charts/rag-app-multimodal-chatbot) + Helm chart to deploy this example in Kubernetes. \ No newline at end of file diff --git a/RetrievalAugmentedGeneration/examples/multimodal_rag/__init__.py b/RAG/examples/advanced_rag/multimodal_rag/__init__.py similarity index 100% rename from RetrievalAugmentedGeneration/examples/multimodal_rag/__init__.py rename to RAG/examples/advanced_rag/multimodal_rag/__init__.py diff --git a/RetrievalAugmentedGeneration/examples/multimodal_rag/chains.py b/RAG/examples/advanced_rag/multimodal_rag/chains.py similarity index 58% rename from RetrievalAugmentedGeneration/examples/multimodal_rag/chains.py rename to RAG/examples/advanced_rag/multimodal_rag/chains.py index bcd68698..f135f0ad 100644 --- a/RetrievalAugmentedGeneration/examples/multimodal_rag/chains.py +++ b/RAG/examples/advanced_rag/multimodal_rag/chains.py @@ -15,32 +15,35 @@ import logging import os -from typing import Generator, List, Dict, Any from functools import lru_cache from traceback import print_exc +from typing import Any, Dict, Generator, List + from langchain_community.document_loaders import UnstructuredFileLoader -from RetrievalAugmentedGeneration.common.utils import utils_cache +from RAG.src.chain_server.utils import utils_cache logger = logging.getLogger(__name__) -from RetrievalAugmentedGeneration.common.base import BaseExample -from RetrievalAugmentedGeneration.example.llm.llm_client import LLMClient -from RetrievalAugmentedGeneration.example.vectorstore.vectorstore_updater import update_vectorstore -from RetrievalAugmentedGeneration.common.utils import ( - get_config, +from RAG.examples.advanced_rag.multimodal_rag.llm.llm_client import LLMClient +from RAG.examples.advanced_rag.multimodal_rag.vectorstore.vectorstore_updater import update_vectorstore +from RAG.src.chain_server.base import BaseExample +from RAG.src.chain_server.tracing import langchain_instrumentation_class_wrapper +from RAG.src.chain_server.utils import ( create_vectorstore_langchain, + del_docs_vectorstore_langchain, + get_config, + get_docs_vectorstore_langchain, get_embedding_model, + get_prompts, get_text_splitter, - get_docs_vectorstore_langchain, - del_docs_vectorstore_langchain, - get_vectorstore + get_vectorstore, ) -from RetrievalAugmentedGeneration.common.tracing import langchain_instrumentation_class_wrapper document_embedder = get_embedding_model() text_splitter = None settings = get_config() +prompts = get_prompts() sources = [] RESPONSE_PARAPHRASING_MODEL = settings.llm.model_name @@ -50,42 +53,42 @@ docstore = None logger.info(f"Unable to connect to vector store during initialization: {e}") + @utils_cache @lru_cache() def get_llm(model_name, cb_handler, is_response_generator=False, **kwargs): - return LLMClient(model_name=model_name, is_response_generator=is_response_generator, cb_handler=cb_handler, **kwargs) + return LLMClient( + model_name=model_name, is_response_generator=is_response_generator, cb_handler=cb_handler, **kwargs + ) @langchain_instrumentation_class_wrapper class MultimodalRAG(BaseExample): - def ingest_docs(self, filepath: str, filename: str): """Ingest documents to the VectorDB.""" - if not filename.endswith((".pdf",".pptx")): - raise ValueError(f"{filename} is not a valid PDF/PPTX file. Only PDF/PPTX files are supported for multimodal rag. The PDF/PPTX files can contain multimodal data.") + if not filename.endswith((".pdf", ".pptx", ".png")): + raise ValueError( + f"{filename} is not a valid PDF/PPTX/PNG file. Only PDF/PPTX/PNG files are supported for multimodal rag. The PDF/PPTX/PNG files can contain multimodal data." + ) try: _path = filepath ds = get_vectorstore(docstore, document_embedder) - update_vectorstore(_path,ds,document_embedder,os.getenv('COLLECTION_NAME', "vector_db")) + update_vectorstore(_path, ds, document_embedder, os.getenv('COLLECTION_NAME', "vector_db")) except Exception as e: logger.error(f"Failed to ingest document due to exception {e}") - raise ValueError( - "Failed to upload document. Please upload an unstructured text document." - ) - + raise ValueError("Failed to upload document. Please upload an unstructured text document.") - def llm_chain( - self, query: str, chat_history: List["Message"], **kwargs - ) -> Generator[str, None, None]: + def llm_chain(self, query: str, chat_history: List["Message"], **kwargs) -> Generator[str, None, None]: """Execute a simple LLM chain using the components defined above.""" # TODO integrate chat_history logger.info("Using llm to generate response directly without knowledge base.") - response = get_llm(model_name=RESPONSE_PARAPHRASING_MODEL, cb_handler=self.cb_handler, is_response_generator=True, **kwargs).chat_with_prompt(settings.prompts.chat_template, query) + response = get_llm( + model_name=RESPONSE_PARAPHRASING_MODEL, cb_handler=self.cb_handler, is_response_generator=True, **kwargs + ).chat_with_prompt(prompts.get("chat_template", ""), query) return response - def rag_chain(self, query: str, chat_history: List["Message"], **kwargs) -> Generator[str, None, None]: """Execute a Retrieval Augmented Generation chain using the components defined above.""" @@ -95,41 +98,63 @@ def rag_chain(self, query: str, chat_history: List["Message"], **kwargs) -> Gene ds = get_vectorstore(docstore, document_embedder) if ds: try: - logger.info(f"Getting retrieved top k values: {settings.retriever.top_k} with confidence threshold: {settings.retriever.score_threshold}") - retriever = ds.as_retriever(search_type="similarity_score_threshold",search_kwargs={"score_threshold": settings.retriever.score_threshold,"k": settings.retriever.top_k}) - docs = retriever.invoke(input=query, config={"callbacks":[self.cb_handler]}) + logger.info( + f"Getting retrieved top k values: {settings.retriever.top_k} with confidence threshold: {settings.retriever.score_threshold}" + ) + retriever = ds.as_retriever( + search_type="similarity_score_threshold", + search_kwargs={ + "score_threshold": settings.retriever.score_threshold, + "k": settings.retriever.top_k, + }, + ) + docs = retriever.invoke(input=query, config={"callbacks": [self.cb_handler]}) if not docs: logger.warning("Retrieval failed to get any relevant context") - return iter(["No response generated from LLM, make sure your query is relavent to the ingested document."]) + return iter( + [ + "No response generated from LLM, make sure your query is relavent to the ingested document." + ] + ) augmented_prompt = "Relevant documents:" + docs + "\n\n[[QUESTION]]\n\n" + query - system_prompt = settings.prompts.rag_template + system_prompt = prompts.get("rag_template", "") logger.info(f"Formulated prompt for RAG chain: {system_prompt}\n{augmented_prompt}") - response = get_llm(model_name=RESPONSE_PARAPHRASING_MODEL, cb_handler=self.cb_handler, is_response_generator=True, **kwargs).chat_with_prompt(settings.prompts.rag_template, augmented_prompt) + response = get_llm( + model_name=RESPONSE_PARAPHRASING_MODEL, + cb_handler=self.cb_handler, + is_response_generator=True, + **kwargs, + ).chat_with_prompt(prompts.get("rag_template", ""), augmented_prompt) return response except Exception as e: logger.info(f"Skipping similarity score as it's not supported by retriever") retriever = ds.as_retriever() - docs = retriever.invoke(input=query, config={"callbacks":[self.cb_handler]}) + docs = retriever.invoke(input=query, config={"callbacks": [self.cb_handler]}) if not docs: logger.warning("Retrieval failed to get any relevant context") - return iter(["No response generated from LLM, make sure your query is relavent to the ingested document."]) - docs=[doc.page_content for doc in docs] + return iter( + [ + "No response generated from LLM, make sure your query is relavent to the ingested document." + ] + ) + docs = [doc.page_content for doc in docs] docs = " ".join(docs) augmented_prompt = "Relevant documents:" + docs + "\n\n[[QUESTION]]\n\n" + query - system_prompt = settings.prompts.rag_template + system_prompt = prompts.get("rag_template", "") logger.info(f"Formulated prompt for RAG chain: {system_prompt}\n{augmented_prompt}") - response = get_llm(model_name=RESPONSE_PARAPHRASING_MODEL, cb_handler=self.cb_handler, is_response_generator=True, **kwargs).chat_with_prompt(settings.prompts.rag_template, augmented_prompt) + response = get_llm( + model_name=RESPONSE_PARAPHRASING_MODEL, + cb_handler=self.cb_handler, + is_response_generator=True, + **kwargs, + ).chat_with_prompt(prompts.get("rag_template", ""), augmented_prompt) return response except Exception as e: logger.warning(f"Failed to generate response due to exception {e}") - logger.warning( - "No response generated from LLM, make sure you've ingested document." - ) + logger.warning("No response generated from LLM, make sure you've ingested document.") return iter( - [ - "No response generated from LLM, make sure you have ingested document from the Knowledge Base Tab." - ] + ["No response generated from LLM, make sure you have ingested document from the Knowledge Base Tab."] ) def document_search(self, content: str, num_docs: int) -> List[Dict[str, Any]]: @@ -138,7 +163,7 @@ def document_search(self, content: str, num_docs: int) -> List[Dict[str, Any]]: try: ds = get_vectorstore(docstore, document_embedder) retriever = ds.as_retriever() - sources = retriever.invoke(input=content, limit=settings.retriever.top_k, config={"callbacks":[self.cb_handler]}) + sources = retriever.invoke(input=content, limit=num_docs, config={"callbacks": [self.cb_handler]}) output = [] for every_chunk in sources: entry = {"source": every_chunk.metadata['filename'], "content": every_chunk.page_content} diff --git a/deploy/compose/rag-app-multiturn-chatbot.yaml b/RAG/examples/advanced_rag/multimodal_rag/docker-compose.yaml similarity index 65% rename from deploy/compose/rag-app-multiturn-chatbot.yaml rename to RAG/examples/advanced_rag/multimodal_rag/docker-compose.yaml index c8251e87..948f2652 100644 --- a/deploy/compose/rag-app-multiturn-chatbot.yaml +++ b/RAG/examples/advanced_rag/multimodal_rag/docker-compose.yaml @@ -1,32 +1,37 @@ +include: + - path: + - ../../local_deploy/docker-compose-vectordb.yaml + - ../../local_deploy/docker-compose-nim-ms.yaml + services: chain-server: container_name: chain-server image: chain-server:${TAG:-latest} build: - context: ../../ - dockerfile: ./RetrievalAugmentedGeneration/Dockerfile + context: ../../../../ + dockerfile: RAG/src/chain_server/Dockerfile args: - EXAMPLE_NAME: multi_turn_rag + EXAMPLE_PATH: 'advanced_rag/multimodal_rag' + volumes: + - ./prompt.yaml:/prompt.yaml command: --port 8081 --host 0.0.0.0 environment: - APP_VECTORSTORE_URL: "http://milvus:19530" - APP_VECTORSTORE_NAME: "milvus" + EXAMPLE_PATH: 'advanced_rag/multimodal_rag' APP_LLM_MODELNAME: ${APP_LLM_MODELNAME:-"meta/llama3-8b-instruct"} APP_LLM_MODELENGINE: nvidia-ai-endpoints APP_LLM_SERVERURL: ${APP_LLM_SERVERURL:-""} - APP_EMBEDDINGS_MODELNAME: ${APP_EMBEDDINGS_MODELNAME:-snowflake/arctic-embed-l} + APP_EMBEDDINGS_MODELNAME: ${APP_EMBEDDINGS_MODELNAME:-nvidia/nv-embedqa-e5-v5} APP_EMBEDDINGS_MODELENGINE: ${APP_EMBEDDINGS_MODELENGINE:-nvidia-ai-endpoints} APP_EMBEDDINGS_SERVERURL: ${APP_EMBEDDINGS_SERVERURL:-""} APP_TEXTSPLITTER_MODELNAME: Snowflake/snowflake-arctic-embed-l - APP_TEXTSPLITTER_CHUNKSIZE: 506 + APP_TEXTSPLITTER_CHUNKSIZE: 510 APP_TEXTSPLITTER_CHUNKOVERLAP: 200 NVIDIA_API_KEY: ${NVIDIA_API_KEY} APP_RETRIEVER_TOPK: 4 APP_RETRIEVER_SCORETHRESHOLD: 0.25 - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-password} - POSTGRES_USER: ${POSTGRES_USER:-postgres} - POSTGRES_DB: ${POSTGRES_DB:-api} - COLLECTION_NAME: ${COLLECTION_NAME:-multi_turn_rag} + APP_VECTORSTORE_URL: "http://milvus:19530" + APP_VECTORSTORE_NAME: "milvus" + COLLECTION_NAME: ${COLLECTION_NAME:-multimodal_rag} OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4317 OTEL_EXPORTER_OTLP_PROTOCOL: grpc ENABLE_TRACING: false @@ -36,29 +41,27 @@ services: expose: - "8081" shm_size: 5gb - deploy: - resources: - reservations: - devices: - - driver: nvidia - count: 1 - capabilities: [gpu] + depends_on: + nemollm-embedding: + condition: service_healthy + required: false + nemollm-inference: + condition: service_healthy + required: false rag-playground: container_name: rag-playground image: rag-playground:${TAG:-latest} build: - context: ../.././RetrievalAugmentedGeneration/frontend/ + context: ../../../../RAG/src/rag_playground/ dockerfile: Dockerfile + args: + PLAYGROUND_MODE: ${PLAYGROUND_MODE:-default} command: --port 8090 environment: APP_SERVERURL: http://chain-server APP_SERVERPORT: 8081 APP_MODELNAME: ${APP_LLM_MODELNAME:-"meta/llama3-8b-instruct"} - RIVA_API_URI: ${RIVA_API_URI:-} - RIVA_API_KEY: ${RIVA_API_KEY:-} - RIVA_FUNCTION_ID: ${RIVA_FUNCTION_ID:-} - TTS_SAMPLE_RATE: ${TTS_SAMPLE_RATE:-48000} OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4317 OTEL_EXPORTER_OTLP_PROTOCOL: grpc ENABLE_TRACING: false @@ -67,7 +70,7 @@ services: expose: - "8090" depends_on: - - chain-server + - chain-server networks: default: diff --git a/RetrievalAugmentedGeneration/examples/multimodal_rag/retriever/__init__.py b/RAG/examples/advanced_rag/multimodal_rag/llm/__init__.py similarity index 100% rename from RetrievalAugmentedGeneration/examples/multimodal_rag/retriever/__init__.py rename to RAG/examples/advanced_rag/multimodal_rag/llm/__init__.py diff --git a/RetrievalAugmentedGeneration/examples/multimodal_rag/llm/llm.py b/RAG/examples/advanced_rag/multimodal_rag/llm/llm.py similarity index 80% rename from RetrievalAugmentedGeneration/examples/multimodal_rag/llm/llm.py rename to RAG/examples/advanced_rag/multimodal_rag/llm/llm.py index 629a170c..49fb1301 100644 --- a/RetrievalAugmentedGeneration/examples/multimodal_rag/llm/llm.py +++ b/RAG/examples/advanced_rag/multimodal_rag/llm/llm.py @@ -13,14 +13,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -import requests import json + +import requests import torch -from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline from langchain_community.llms import HuggingFacePipeline from langchain_nvidia_ai_endpoints import ChatNVIDIA +from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline -from RetrievalAugmentedGeneration.common.utils import get_llm, get_config +from RAG.src.chain_server.utils import get_config, get_llm class NvidiaLLM: @@ -31,29 +32,29 @@ def __init__(self, model_name, is_response_generator: bool = False, **kwargs): if is_response_generator: self.llm = get_llm(**kwargs) else: - self.llm = ChatNVIDIA(model=model_name, - temperature = kwargs.get('temperature', None), - top_p = kwargs.get('top_p', None), - max_tokens = kwargs.get('max_tokens', None)) + self.llm = ChatNVIDIA( + model=model_name, + temperature=kwargs.get('temperature', None), + top_p=kwargs.get('top_p', None), + max_tokens=kwargs.get('max_tokens', None), + ) + class LocalLLM: def __init__(self, model_path, **kwargs): tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained( - model_path, - torch_dtype=torch.float16, - trust_remote_code=True, - device_map="auto" - ) + model_path, torch_dtype=torch.float16, trust_remote_code=True, device_map="auto" + ) pipe = pipeline( "text-generation", model=model, tokenizer=tokenizer, - max_length=kwargs.get('max_tokens',1024), + max_length=kwargs.get('max_tokens', 1024), temperature=kwargs.get('temperature', 0.6), top_p=kwargs.get('top_p', 0.3), - repetition_penalty=1.0 + repetition_penalty=1.0, ) self.llm = HuggingFacePipeline(pipeline=pipe) @@ -75,9 +76,9 @@ def create_llm(model_name, model_type="NVIDIA", is_response_generator=False, **k if __name__ == "__main__": llm = create_llm("gpt2", "LOCAL") + from langchain import LLMChain from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate - from langchain import LLMChain system_prompt = "" prompt = "who are you" @@ -88,4 +89,3 @@ def create_llm(model_name, model_type="NVIDIA", is_response_generator=False, **k for chunk in response: print(chunk) - diff --git a/RetrievalAugmentedGeneration/examples/multimodal_rag/llm/llm_client.py b/RAG/examples/advanced_rag/multimodal_rag/llm/llm_client.py similarity index 63% rename from RetrievalAugmentedGeneration/examples/multimodal_rag/llm/llm_client.py rename to RAG/examples/advanced_rag/multimodal_rag/llm/llm_client.py index 14997d0f..276e2569 100644 --- a/RetrievalAugmentedGeneration/examples/multimodal_rag/llm/llm_client.py +++ b/RAG/examples/advanced_rag/multimodal_rag/llm/llm_client.py @@ -14,16 +14,27 @@ # limitations under the License. import logging + logger = logging.getLogger(__name__) -from RetrievalAugmentedGeneration.example.llm.llm import create_llm +from langchain.callbacks.base import BaseCallbackHandler +from langchain_core.messages import HumanMessage from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate -from langchain_core.messages import HumanMessage -from langchain.callbacks.base import BaseCallbackHandler + +from RAG.examples.advanced_rag.multimodal_rag.llm.llm import create_llm +from RAG.src.chain_server.utils import get_prompts + class LLMClient: - def __init__(self, model_name="mixtral_8x7b", model_type="NVIDIA", is_response_generator=False, cb_handler=BaseCallbackHandler, **kwargs): + def __init__( + self, + model_name="mixtral_8x7b", + model_type="NVIDIA", + is_response_generator=False, + cb_handler=BaseCallbackHandler, + **kwargs, + ): self.llm = create_llm(model_name, model_type, is_response_generator, **kwargs) self.cb_handler = cb_handler @@ -35,9 +46,22 @@ def chat_with_prompt(self, system_prompt, prompt): return response def multimodal_invoke(self, b64_string, steer=False, creativity=0, quality=9, complexity=0, verbosity=8): - message = HumanMessage(content=[{"type": "text", "text": "Describe this image in detail:"}, - {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64_string}"},}]) + message = HumanMessage( + content=[ + {"type": "text", "text": get_prompts().get("describe_image_prompt", "")}, + {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64_string}"},}, + ] + ) if steer: - return self.llm.invoke([message], labels={"creativity": creativity, "quality": quality, "complexity": complexity, "verbosity": verbosity}, callbacks=[self.cb_handler]) + return self.llm.invoke( + [message], + labels={ + "creativity": creativity, + "quality": quality, + "complexity": complexity, + "verbosity": verbosity, + }, + callbacks=[self.cb_handler], + ) else: - return self.llm.invoke([message]) \ No newline at end of file + return self.llm.invoke([message]) diff --git a/RAG/examples/advanced_rag/multimodal_rag/prompt.yaml b/RAG/examples/advanced_rag/multimodal_rag/prompt.yaml new file mode 100644 index 00000000..aa63fa28 --- /dev/null +++ b/RAG/examples/advanced_rag/multimodal_rag/prompt.yaml @@ -0,0 +1,11 @@ +chat_template: | + You are a helpful and friendly multimodal intelligent AI assistant named Multimodal Chatbot Assistant. + Always answer as helpfully as possible, while being safe. + Please ensure that your responses are positive in nature. + +rag_template: "You are a helpful and friendly multimodal intelligent AI assistant named Multimodal Chatbot Assistant. You are an expert in the content of the document provided and can provide information using both text and images. The user may also provide an image input, and you will use the image description to retrieve similar images, tables and text. The context given below will provide some technical or financial documentation and whitepapers to help you answer the question. Based on this context, answer the question truthfully. If the question is not related to this, please refrain from answering. Most importantly, if the context provided does not include information about the question from the user, reply saying that you don't know. Do not utilize any information that is not provided in the documents below. All documents will be preceded by tags, for example [[DOCUMENT 1]], [[DOCUMENT 2]], and so on. You can reference them in your reply but without the brackets, so just say document 1 or 2. The question will be preceded by a [[QUESTION]] tag. Be succinct, clear, and helpful. Remember to describe everything in detail by using the knowledge provided, or reply that you don't know the answer. Do not fabricate any responses. Note that you have the ability to reference images, tables, and other multimodal elements when necessary. You can also refer to the image provided by the user, if any." + +describe_image_prompt: | + Describe this image in detail: + +deplot_summarization_prompt: Your responsibility is to explain charts. You are an expert in describing the responses of linearized tables into plain English text for LLMs to use. \ No newline at end of file diff --git a/RetrievalAugmentedGeneration/examples/multimodal_rag/requirements.txt b/RAG/examples/advanced_rag/multimodal_rag/requirements.txt similarity index 100% rename from RetrievalAugmentedGeneration/examples/multimodal_rag/requirements.txt rename to RAG/examples/advanced_rag/multimodal_rag/requirements.txt diff --git a/experimental/multimodal_assistant/guardrails/__init__.py b/RAG/examples/advanced_rag/multimodal_rag/retriever/__init__.py similarity index 100% rename from experimental/multimodal_assistant/guardrails/__init__.py rename to RAG/examples/advanced_rag/multimodal_rag/retriever/__init__.py diff --git a/RetrievalAugmentedGeneration/examples/multimodal_rag/retriever/embedder.py b/RAG/examples/advanced_rag/multimodal_rag/retriever/embedder.py similarity index 92% rename from RetrievalAugmentedGeneration/examples/multimodal_rag/retriever/embedder.py rename to RAG/examples/advanced_rag/multimodal_rag/retriever/embedder.py index 183448ad..27590a3a 100644 --- a/RetrievalAugmentedGeneration/examples/multimodal_rag/retriever/embedder.py +++ b/RAG/examples/advanced_rag/multimodal_rag/retriever/embedder.py @@ -14,16 +14,15 @@ # limitations under the License. from abc import ABC, abstractmethod -from pydantic import BaseModel from typing import Any, Optional from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings +from pydantic import BaseModel -from RetrievalAugmentedGeneration.common.utils import get_embedding_model - -class Embedder(ABC, BaseModel): +from RAG.src.chain_server.utils import get_embedding_model +class Embedder(ABC, BaseModel): @abstractmethod def embed_query(self, text): ... @@ -37,20 +36,19 @@ def get_embedding_size(self): sample_embedding = self.embedder.embed_query(sample_text) return len(sample_embedding) + class NVIDIAEmbedders(Embedder): - name : str - type : str - embedder : Optional[Any] = None + name: str + type: str + embedder: Optional[Any] = None def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.embedder = get_embedding_model() - def embed_query(self, text): return self.embedder.embed_query(text) - def embed_documents(self, documents, batch_size=10): output = [] batch_documents = [] @@ -62,4 +60,4 @@ def embed_documents(self, documents, batch_size=10): else: if len(batch_documents) > 0: output.extend(self.embedder.embed_documents(batch_documents)) - return output \ No newline at end of file + return output diff --git a/RetrievalAugmentedGeneration/examples/multimodal_rag/retriever/retriever.py b/RAG/examples/advanced_rag/multimodal_rag/retriever/retriever.py similarity index 80% rename from RetrievalAugmentedGeneration/examples/multimodal_rag/retriever/retriever.py rename to RAG/examples/advanced_rag/multimodal_rag/retriever/retriever.py index 804014bd..7cdabac5 100644 --- a/RetrievalAugmentedGeneration/examples/multimodal_rag/retriever/retriever.py +++ b/RAG/examples/advanced_rag/multimodal_rag/retriever/retriever.py @@ -14,14 +14,15 @@ # limitations under the License. from pydantic import BaseModel -from RetrievalAugmentedGeneration.example.retriever.embedder import Embedder -from RetrievalAugmentedGeneration.example.retriever.vector import VectorClient +from RAG.examples.advanced_rag.multimodal_rag.retriever.embedder import Embedder +from RAG.examples.advanced_rag.multimodal_rag.retriever.vector import VectorClient + class Retriever(BaseModel): - embedder : Embedder - vector_client : VectorClient - search_limit : int = 4 + embedder: Embedder + vector_client: VectorClient + search_limit: int = 4 def get_relevant_docs(self, text, limit=None): if limit is None: @@ -29,4 +30,3 @@ def get_relevant_docs(self, text, limit=None): query_vector = self.embedder.embed_query(text) concatdocs, sources = self.vector_client.search([query_vector], limit) return concatdocs, sources - diff --git a/RetrievalAugmentedGeneration/examples/multimodal_rag/retriever/vector.py b/RAG/examples/advanced_rag/multimodal_rag/retriever/vector.py similarity index 81% rename from RetrievalAugmentedGeneration/examples/multimodal_rag/retriever/vector.py rename to RAG/examples/advanced_rag/multimodal_rag/retriever/vector.py index a8af767e..15a402ee 100644 --- a/RetrievalAugmentedGeneration/examples/multimodal_rag/retriever/vector.py +++ b/RAG/examples/advanced_rag/multimodal_rag/retriever/vector.py @@ -13,17 +13,19 @@ # See the License for the specific language governing permissions and # limitations under the License. +import uuid from abc import ABC, abstractmethod from typing import Any -import uuid + from pydantic import BaseModel -from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType, utility +from pymilvus import Collection, CollectionSchema, DataType, FieldSchema, connections, utility + class VectorClient(ABC, BaseModel): - hostname : str - port : str - collection_name : str + hostname: str + port: str + collection_name: str @abstractmethod def connect(self): @@ -43,19 +45,21 @@ def update(self): class MilvusVectorClient(VectorClient): - hostname : str = "milvus" - port : str = "19530" - metric_type : str = "L2" - index_type : str = "GPU_IVF_FLAT" - nlist : int = 100 - index_field_name : str = "embedding" - nprobe : int = 5 - vector_db : Any = None + hostname: str = "milvus" + port: str = "19530" + metric_type: str = "L2" + index_type: str = "GPU_IVF_FLAT" + nlist: int = 100 + index_field_name: str = "embedding" + nprobe: int = 5 + vector_db: Any = None embedding_size: int = 1024 def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.vector_db = self.connect(self.collection_name, self.hostname, self.port, embedding_size=self.embedding_size) + self.vector_db = self.connect( + self.collection_name, self.hostname, self.port, embedding_size=self.embedding_size + ) self._create_index(self.metric_type, self.index_type, self.index_field_name, self.nlist) self.vector_db.load() @@ -64,7 +68,7 @@ def _create_index(self, metric_type, index_type, field_name, nlist=100): index_params = { "metric_type": metric_type, # or "IP" depending on your requirement "index_type": index_type, # You can choose other types like IVF_PQ based on your need - "params": {"nlist": nlist} # Adjust the nlist parameter as per your requirements + "params": {"nlist": nlist}, # Adjust the nlist parameter as per your requirements } self.vector_db.create_index(field_name=field_name, index_params=index_params) @@ -82,17 +86,14 @@ def disconnect(self, alias="default"): connections.disconnect(alias) def search(self, query_vectors, limit=5): - search_params = { - "metric_type": self.metric_type, - "params": {"nprobe": self.nprobe} - } + search_params = {"metric_type": self.metric_type, "params": {"nprobe": self.nprobe}} search_results = self.vector_db.search( data=query_vectors, anns_field=self.index_field_name, # Replace with your vector field name param=search_params, output_fields=["content", "metadata"], - limit=limit + limit=limit, ) concatdocs = "" sources = {} @@ -116,19 +117,14 @@ def __del__(self): self.disconnect() def update(self, documents, embeddings, collection_name): - # Processing each document + # Processing each document insert_data = [] for i, doc in enumerate(documents): # If 'doc' has unique identifier or create one for the document doc_id = doc.id if hasattr(doc, 'id') else str(uuid.uuid4()) # Prepare data for insertion - example = { - "id": doc_id, - "content": doc.page_content, - "embedding": embeddings[i], - "metadata": doc.metadata - } + example = {"id": doc_id, "content": doc.page_content, "embedding": embeddings[i], "metadata": doc.metadata} insert_data.append(example) self.vector_db.insert(insert_data) @@ -137,9 +133,11 @@ def get_schema(self, embedding_size): # Define the primary key field along with other fields fields = [ FieldSchema(name="id", dtype=DataType.VARCHAR, max_length=100, is_primary=True), # Primary key field - FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=10000), # Text field with up to 10000 characters + FieldSchema( + name="content", dtype=DataType.VARCHAR, max_length=10000 + ), # Text field with up to 10000 characters FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=embedding_size), - FieldSchema(name="metadata", dtype=DataType.JSON) + FieldSchema(name="metadata", dtype=DataType.JSON), ] schema = CollectionSchema(fields, "Collection for storing document embeddings and metadata") @@ -155,7 +153,7 @@ def list_filenames(self): List all filenames in the collection. """ # Assuming 'filename' is a field in the metadata - + expr = "metadata['filename'] != ''" # Expression to match all entities with a non-empty filename entities = self.vector_db.query(expr, output_fields=["metadata"]) filenames = list(set([entity['metadata']['filename'] for entity in entities])) @@ -169,4 +167,4 @@ def delete_by_filename(self, filename): expr = f"metadata['filename'] == '{filename}'" self.vector_db.delete(expr) # Load the collection to make the deletion take effect - self.vector_db.load() + self.vector_db.load() diff --git a/RAG/examples/advanced_rag/multimodal_rag/vectorstore/custom_img_parser.py b/RAG/examples/advanced_rag/multimodal_rag/vectorstore/custom_img_parser.py new file mode 100644 index 00000000..592c4865 --- /dev/null +++ b/RAG/examples/advanced_rag/multimodal_rag/vectorstore/custom_img_parser.py @@ -0,0 +1,60 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os + +import cv2 +import pytesseract +from langchain.docstore.document import Document + +from RAG.examples.advanced_rag.multimodal_rag.vectorstore.custom_pdf_parser import ( + is_graph, + process_graph, + process_image, +) + + +def get_ocr_text(image_path, frame_num): + img = cv2.imread(image_path) + ocr_text = pytesseract.image_to_string(img) + return ocr_text + + +def process_img_file(img_path): + # convert to png file -> can check if this is needed + # if 1 img -> send to NeVa and get caption + OCR needs to be performed -> save img doc in processed data + # if giphy or gif image -> get all frames and save caption+OCR for each frame. + processed_data = [] + ocr_text = get_ocr_text(img_path, 1) + image_description = "" + if is_graph(img_path): + image_description = process_graph(img_path) + else: + image_description = process_image(img_path) + caption = image_description + f"This image contains text: {ocr_text}" + image_metadata = { + "x1": 0, + "y1": 0, + "x2": 0, + "x3": 0, + "source": f"{os.path.basename(img_path)}", + "image": img_path, + "caption": caption, + "type": "image", + "page_num": 1, + } + processed_data.append(Document(page_content=caption, metadata=image_metadata)) + + return processed_data diff --git a/RetrievalAugmentedGeneration/examples/multimodal_rag/vectorstore/custom_pdf_parser.py b/RAG/examples/advanced_rag/multimodal_rag/vectorstore/custom_pdf_parser.py similarity index 52% rename from RetrievalAugmentedGeneration/examples/multimodal_rag/vectorstore/custom_pdf_parser.py rename to RAG/examples/advanced_rag/multimodal_rag/vectorstore/custom_pdf_parser.py index cec1b40f..4d10ba77 100644 --- a/RetrievalAugmentedGeneration/examples/multimodal_rag/vectorstore/custom_pdf_parser.py +++ b/RAG/examples/advanced_rag/multimodal_rag/vectorstore/custom_pdf_parser.py @@ -13,18 +13,21 @@ # See the License for the specific language governing permissions and # limitations under the License. -from pdfplumber import open as pdf_open -import pandas as pd +import base64 import os -from langchain.docstore.document import Document -from RetrievalAugmentedGeneration.example.llm.llm_client import LLMClient -from RetrievalAugmentedGeneration.common.utils import get_config -from PIL import Image from io import BytesIO -import base64 + import cv2 +import pandas as pd import pytesseract -from RetrievalAugmentedGeneration.common.tracing import langchain_instrumentation_method_wrapper +from langchain.docstore.document import Document +from pdfplumber import open as pdf_open +from PIL import Image + +from RAG.examples.advanced_rag.multimodal_rag.llm.llm_client import LLMClient +from RAG.src.chain_server.tracing import langchain_instrumentation_method_wrapper +from RAG.src.chain_server.utils import get_config, get_prompts + def get_b64_image(image_path): image = Image.open(image_path).convert("RGB") @@ -33,42 +36,48 @@ def get_b64_image(image_path): b64_string = base64.b64encode(buffered.getvalue()).decode("utf-8") return b64_string -def is_bbox_overlapping(bbox1, bbox2): - return (bbox1[0]bbox2[0] and bbox1[1]>bbox2[3] and bbox1[3]bbox2[0] and bbox1[1]>bbox2[3] and bbox1[3] bbox2[0] and bbox1[1] > bbox2[3] and bbox1[3] < bbox2[1] -@langchain_instrumentation_method_wrapper -def is_graph(cb_handler, image_path): - # Placeholder function for graph detection logic - # Implement graph detection algorithm here - neva = LLMClient("ai-neva-22b", cb_handler=cb_handler) - b64_string = get_b64_image(image_path) - res = neva.multimodal_invoke(b64_string, creativity = 0, quality = 9, complexity = 0, verbosity = 9).content + +def is_graph(image_path): + res = process_image(image_path) if "graph" in res or "plot" in res or "chart" in res: return True else: return False + +@langchain_instrumentation_method_wrapper +def process_image(cb_handler, image_path): + neva = LLMClient("ai-neva-22b", cb_handler=cb_handler) + b64_string = get_b64_image(image_path) + res = neva.multimodal_invoke(b64_string, creativity=0, quality=9, complexity=0, verbosity=9).content + print(res) + return res + + @langchain_instrumentation_method_wrapper def process_graph(cb_handler, image_path): - # Placeholder function for graph processing logic - # Implement graph processing algorithm here # Call DePlot through the API - deplot = LLMClient("ai-google-deplot") + deplot = LLMClient("google/deplot") b64_string = get_b64_image(image_path) res = deplot.multimodal_invoke(b64_string) deplot_description = res.content # Accessing the model name environment variable settings = get_config() mixtral = LLMClient(model_name=settings.llm.model_name, is_response_generator=True, cb_handler=cb_handler) - response = mixtral.chat_with_prompt(system_prompt="Your responsibility is to explain charts. You are an expert in describing the responses of linearized tables into plain English text for LLMs to use.", - prompt="Explain the following linearized table. " + deplot_description) + response = mixtral.chat_with_prompt( + system_prompt=get_prompts().get("deplot_summarization_prompt", ""), + prompt="Explain the following linearized table. " + deplot_description, + ) full_response = "" for chunk in response: full_response += chunk return full_response + + def stringify_table(table_text): ans = "" for i in range(len(table_text)): @@ -76,27 +85,31 @@ def stringify_table(table_text): ans += table_text[i][j] + "," ans += "\n" return ans + + def text_to_table(table_text): columns = [] rows = [] try: for i in range(len(table_text)): columns.append(table_text[i][0]) - for i in range(1,len(table_text[0])): - row=[] + for i in range(1, len(table_text[0])): + row = [] for j in range(len(columns)): row.append(table_text[j][i]) rows.append(row) except Exception as e: print(f"Exception occured while converting extracted table text to Dataframe object : {e}") - return pd.DataFrame(rows,columns=columns) - - + return pd.DataFrame(rows, columns=columns) + + def extract_text_around_item(text_blocks, bbox, page_height, threshold_percentage=0.1): before_text, after_text = "", "" vertical_threshold_distance = page_height * threshold_percentage - horizontal_threshold_distance = (bbox[2]-bbox[0]) * threshold_percentage # Assuming similar threshold for horizontal distance + horizontal_threshold_distance = ( + bbox[2] - bbox[0] + ) * threshold_percentage # Assuming similar threshold for horizontal distance for block in text_blocks: vertical_distance = min(abs(block['y1'] - bbox[1]), abs(block['y0'] - bbox[3])) @@ -112,13 +125,14 @@ def extract_text_around_item(text_blocks, bbox, page_height, threshold_percentag return before_text, after_text + def process_text_blocks(text_blocks): char_count_threshold = 500 # Threshold for the number of characters in a group current_group = [] grouped_blocks = [] current_char_count = 0 for block in text_blocks: - if block['object_type'] in ('char','str'): # Check if the block is of text type + if block['object_type'] in ('char', 'str'): # Check if the block is of text type block_text = block['text'] block_char_count = len(block_text) @@ -139,84 +153,99 @@ def process_text_blocks(text_blocks): return grouped_blocks + def parse_via_ocr(filename, page, pagenum): ocr_docs = [] ocr_image = page.to_image(resolution=109) imgrefpath = os.path.join("/tmp-data", "multimodal/ocr_references") if not os.path.exists(imgrefpath): os.makedirs(imgrefpath) - image_path = os.path.join(imgrefpath, f"page{pagenum}.png") + image_path = os.path.join(imgrefpath, f"file{os.path.basename(filename).split('.')[0]}-page{pagenum}.png") ocr_image.save(image_path) img = cv2.imread(image_path) ocr_text = pytesseract.image_to_string(img) ocr_metadata = { - "x1":0, - "y1":0, - "x2":0, - "x3":0, - "source": f"{os.path.basename(filename)}", - "image": image_path, - "caption": ocr_text, - "type": "image", - "page_num": pagenum - } + "x1": 0, + "y1": 0, + "x2": 0, + "x3": 0, + "source": f"{os.path.basename(filename)}", + "image": image_path, + "caption": ocr_text, + "type": "image", + "page_num": pagenum, + } ocr_docs.append(Document(page_content="This is a page with text: " + ocr_text, metadata=ocr_metadata)) return ocr_docs + def parse_all_tables(filename, page, pagenum, text_blocks, ongoing_tables): table_docs = [] table_bboxes = [] ctr = 1 - try: - tables = page.find_tables(table_settings={"horizontal_strategy":"lines_strict", "vertical_strategy":"lines_strict"}) + try: + tables = page.find_tables( + table_settings={"horizontal_strategy": "lines_strict", "vertical_strategy": "lines_strict"} + ) except Exception as e: print(f"Error during table extraction: {e}") return table_docs, table_bboxes, ongoing_tables if tables: for table_num, table in enumerate(tables, start=1): - try: - tablerefdir = os.path.join("/tmp-data", "vectorstore/table_references") - if not os.path.exists(tablerefdir): - os.makedirs(tablerefdir) - df_xlsx_path = os.path.join(tablerefdir, f"table{table_num}-page{pagenum}.xlsx") - page_crop=page.crop(table.bbox) - if len(page_crop.extract_tables())>0: - table_df_text = page_crop.extract_tables()[0] - table_df = text_to_table(table_df_text) - table_df.to_excel(df_xlsx_path) - # Find text around the table - table_bbox = table.bbox - before_text, after_text = extract_text_around_item(text_blocks, table_bbox, page.height) - # Save table image - table_img_path = os.path.join(tablerefdir, f"table{table_num}-page{pagenum}.jpg") - img = page_crop.to_image(resolution=109) - img.save(table_img_path) - description = process_graph(table_img_path) - ctr +=1 - caption = before_text.replace("\n", " ") + description + after_text.replace("\n", " ") - if before_text == "" and after_text == "": - caption = " ".join(table_df.columns) - table_data_text = stringify_table(table_df_text) - table_metadata = { - "x1":0, - "y1":0, - "x2":0, - "x3":0, - "source": f"{os.path.basename(filename)}", - "dataframe": df_xlsx_path, - "image": table_img_path, - "caption": caption, - "type": "table", - "page_num": pagenum + 1 - } - all_cols = ", ".join(list(table_df.columns.values)) - doc = Document(page_content="This is a table with the caption: " + caption + f"\nThe columns are {all_cols} and the table data is {table_data_text}", metadata=table_metadata) - table_docs.append(doc) - except: - print(f"Skipping Table {table_num} due to Exception {e}") + try: + tablerefdir = os.path.join("/tmp-data", "vectorstore/table_references") + if not os.path.exists(tablerefdir): + os.makedirs(tablerefdir) + df_xlsx_path = os.path.join( + tablerefdir, f"file{os.path.basename(filename).split('.')[0]}-table{table_num}-page{pagenum}.xlsx" + ) + page_crop = page.crop(table.bbox) + if len(page_crop.extract_tables()) > 0: + table_df_text = page_crop.extract_tables()[0] + table_df = text_to_table(table_df_text) + table_df.to_excel(df_xlsx_path) + # Find text around the table + table_bbox = table.bbox + before_text, after_text = extract_text_around_item(text_blocks, table_bbox, page.height) + # Save table image + table_img_path = os.path.join( + tablerefdir, + f"file{os.path.basename(filename).split('.')[0]}-table{table_num}-page{pagenum}.jpg", + ) + img = page_crop.to_image(resolution=109) + img.save(table_img_path) + description = process_graph(table_img_path) + ctr += 1 + caption = before_text.replace("\n", " ") + description + after_text.replace("\n", " ") + if before_text == "" and after_text == "": + caption = " ".join(table_df.columns) + table_data_text = stringify_table(table_df_text) + table_metadata = { + "x1": 0, + "y1": 0, + "x2": 0, + "x3": 0, + "source": f"{os.path.basename(filename)}", + "dataframe": df_xlsx_path, + "image": table_img_path, + "caption": caption, + "type": "table", + "page_num": pagenum + 1, + } + all_cols = ", ".join(list(table_df.columns.values)) + doc = Document( + page_content="This is a table with the caption: " + + caption + + f"\nThe columns are {all_cols} and the table data is {table_data_text}", + metadata=table_metadata, + ) + table_docs.append(doc) + except: + print(f"Skipping Table {table_num} due to Exception {e}") return table_docs, table_bboxes, ongoing_tables + def parse_all_images(filename, page, pagenum, text_blocks): image_docs = [] image_list = page.images @@ -227,49 +256,59 @@ def parse_all_images(filename, page, pagenum, text_blocks): # xref = image_info['xref'] # if xref == 0: # continue # Skip inline images or undetectable images - image_bbox = (image['x0'],image['y0'], image['x1'],image['y1']) - # Check if the image size is at least 5% of the page size in any dimension - if image["width"] < page.width / 20 or image["height"] < page.height / 20: - continue # Skip very small images - - # Extract and save the image - page_crop = page.crop(image_bbox,strict=False) - image_data = page_crop.to_image() - imgrefpath = os.path.join("/tmp-data", "multimodal/image_references") - if not os.path.exists(imgrefpath): - os.makedirs(imgrefpath) - image_path = os.path.join(imgrefpath, f"image{image_num}-page{pagenum}.png") - image_data.save(image_path) - # Find text around the image - before_text, after_text = extract_text_around_item(text_blocks, image_bbox, page.height) - # skip images without a caption, they are likely just some logo or graphics - if before_text == "" and after_text == "": - continue - - # Process the image if it's a graph - image_description = " " - if is_graph(image_path): - image_description = process_graph(image_path) - - # Combine the texts to form a caption + # image_bbox = (image['x0'], image['y0'], image['x1'], image['y1']) + image_bbox = (image['x0'], page.cropbox[3] - image['y1'], image['x1'], page.cropbox[3] - image['y0']) + # Check if the image size is at least 5% of the page size in any dimension + if image["width"] < page.width / 20 or image["height"] < page.height / 20: + continue # Skip very small images + + # Extract and save the image + page_crop = page.crop(image_bbox, strict=False) + image_data = page_crop.to_image(resolution=109) + imgrefpath = os.path.join("/tmp-data", "multimodal/image_references") + if not os.path.exists(imgrefpath): + os.makedirs(imgrefpath) + image_path = os.path.join( + imgrefpath, f"file{os.path.basename(filename).split('.')[0]}-image{image_num}-page{pagenum}.png" + ) + image_data.save(image_path) + # Find text around the image + before_text, after_text = extract_text_around_item(text_blocks, image_bbox, page.height) + + # Process the image if it's a graph + image_description = " " + if is_graph(image_path): + image_description = process_graph(image_path) + + caption = "" + # Combine the texts to form a caption + if before_text == "" and after_text == "": + caption = image_description + else: caption = before_text.replace("\n", " ") + image_description + after_text.replace("\n", " ") - image_metadata = { - "x1":0, - "y1":0, - "x2":0, - "x3":0, - "source": f"{os.path.basename(filename)}", - "image": image_path, - "caption": caption, - "type": "image", - "page_num": pagenum - } + if caption == " ": + continue - image_docs.append(Document(page_content="This is an image with the caption: " + caption, metadata=image_metadata)) + image_metadata = { + "x1": 0, + "y1": 0, + "x2": 0, + "x3": 0, + "source": f"{os.path.basename(filename)}", + "image": image_path, + "caption": caption, + "type": "image", + "page_num": pagenum, + } + + image_docs.append( + Document(page_content="This is an image with the caption: " + caption, metadata=image_metadata) + ) return image_docs + def get_pdf_documents(filepath): all_pdf_documents = [] ongoing_tables = {} @@ -288,16 +327,18 @@ def get_pdf_documents(filepath): footer_threshold = page_height * 0.9 # Crop out page to remove footers and headers - page_crop = page.crop([0,header_threshold,page.width,footer_threshold]) + page_crop = page.crop([0, header_threshold, page.width, footer_threshold]) text_blocks = [obj for obj in page_crop.chars if obj['object_type'] == 'char'] grouped_text_blocks = process_text_blocks(text_blocks) - if len(grouped_text_blocks)==0: + if len(grouped_text_blocks) == 0: # Perform OCR on PDF pages ocr_docs = parse_via_ocr(filepath, page_crop, page_num) - page_docs.extend(ocr_docs) + page_docs.extend(ocr_docs) # Extract tables and their bounding boxes - table_docs, table_bboxes, ongoing_tables = parse_all_tables(filepath, page, page_num, text_blocks, ongoing_tables) + table_docs, table_bboxes, ongoing_tables = parse_all_tables( + filepath, page, page_num, text_blocks, ongoing_tables + ) page_docs.extend(table_docs) # Extract and process images @@ -307,12 +348,20 @@ def get_pdf_documents(filepath): # Process text blocks text_block_ctr = 0 for heading_block, content in grouped_text_blocks: - text_block_ctr +=1 - heading_bbox = (heading_block['x0'],heading_block['y0'],heading_block['x1'],heading_block['y1']) + text_block_ctr += 1 + heading_bbox = (heading_block['x0'], heading_block['y0'], heading_block['x1'], heading_block['y1']) # Check if the heading or its content overlaps with table or image bounding boxes - if not any(is_bbox_overlapping(heading_bbox,table_bbox) for table_bbox in table_bboxes): + if not any(is_bbox_overlapping(heading_bbox, table_bbox) for table_bbox in table_bboxes): bbox = {"x1": heading_bbox[0], "y1": heading_bbox[1], "x2": heading_bbox[2], "x3": heading_bbox[3]} - text_doc = Document(page_content=f"{heading_block['text']}\n{content}", metadata={**bbox, "type": "text", "page_num": page_num, "source": f"{os.path.basename(filepath)}"}) + text_doc = Document( + page_content=f"{heading_block['text']}\n{content}", + metadata={ + **bbox, + "type": "text", + "page_num": page_num, + "source": f"{os.path.basename(filepath)}", + }, + ) page_docs.append(text_doc) all_pdf_documents.append(page_docs) except Exception as e: diff --git a/RetrievalAugmentedGeneration/examples/multimodal_rag/vectorstore/custom_powerpoint_parser.py b/RAG/examples/advanced_rag/multimodal_rag/vectorstore/custom_powerpoint_parser.py similarity index 82% rename from RetrievalAugmentedGeneration/examples/multimodal_rag/vectorstore/custom_powerpoint_parser.py rename to RAG/examples/advanced_rag/multimodal_rag/vectorstore/custom_powerpoint_parser.py index 791a7d5d..0f26190d 100644 --- a/RetrievalAugmentedGeneration/examples/multimodal_rag/vectorstore/custom_powerpoint_parser.py +++ b/RAG/examples/advanced_rag/multimodal_rag/vectorstore/custom_powerpoint_parser.py @@ -15,10 +15,12 @@ import os import subprocess -from pptx import Presentation -from pdfplumber import open as pdf_open + from langchain.docstore.document import Document -from RetrievalAugmentedGeneration.example.vectorstore.custom_pdf_parser import is_graph, process_graph +from pdfplumber import open as pdf_open +from pptx import Presentation + +from RAG.examples.advanced_rag.multimodal_rag.vectorstore.custom_pdf_parser import is_graph, process_graph def convert_ppt_to_pdf(ppt_path): @@ -80,7 +82,11 @@ def extract_text_and_notes_from_ppt(ppt_path): def process_ppt_file(ppt_path): """Process a PowerPoint file.""" - pdf_path = os.path.join(os.getcwd(), "multimodal/ppt_references", os.path.basename(ppt_path).replace('.pptx', '.pdf').replace('.ppt', '.pdf')) + pdf_path = os.path.join( + os.getcwd(), + "multimodal/ppt_references", + os.path.basename(ppt_path).replace('.pptx', '.pdf').replace('.ppt', '.pdf'), + ) convert_ppt_to_pdf(ppt_path) images_data = convert_pdf_to_images(pdf_path) slide_texts = extract_text_and_notes_from_ppt(ppt_path) @@ -96,16 +102,21 @@ def process_ppt_file(ppt_path): image_description = process_graph(image_path) caption = slide_text + image_description + notes image_metadata = { - "x1":0, - "y1":0, - "x2":0, - "x3":0, - "source": f"{os.path.basename(ppt_path)}", - "image": image_path, - "caption": caption, - "type": "image", - "page_num": page_num + "x1": 0, + "y1": 0, + "x2": 0, + "x3": 0, + "source": f"{os.path.basename(ppt_path)}", + "image": image_path, + "caption": caption, + "type": "image", + "page_num": page_num, } - processed_data.append(Document(page_content = "This is a slide with the text: " + slide_text + image_description, metadata = image_metadata)) - - return processed_data \ No newline at end of file + processed_data.append( + Document( + page_content="This is a slide with the text: " + slide_text + image_description, + metadata=image_metadata, + ) + ) + + return processed_data diff --git a/RetrievalAugmentedGeneration/examples/multimodal_rag/vectorstore/vectorstore_updater.py b/RAG/examples/advanced_rag/multimodal_rag/vectorstore/vectorstore_updater.py similarity index 84% rename from RetrievalAugmentedGeneration/examples/multimodal_rag/vectorstore/vectorstore_updater.py rename to RAG/examples/advanced_rag/multimodal_rag/vectorstore/vectorstore_updater.py index 9e833db4..6d0181df 100644 --- a/RetrievalAugmentedGeneration/examples/multimodal_rag/vectorstore/vectorstore_updater.py +++ b/RAG/examples/advanced_rag/multimodal_rag/vectorstore/vectorstore_updater.py @@ -15,15 +15,19 @@ import logging import os + from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.document_loaders import UnstructuredFileLoader -from RetrievalAugmentedGeneration.example.vectorstore.custom_powerpoint_parser import process_ppt_file -from RetrievalAugmentedGeneration.example.vectorstore.custom_pdf_parser import get_pdf_documents + +from RAG.examples.advanced_rag.multimodal_rag.vectorstore.custom_img_parser import process_img_file +from RAG.examples.advanced_rag.multimodal_rag.vectorstore.custom_pdf_parser import get_pdf_documents +from RAG.examples.advanced_rag.multimodal_rag.vectorstore.custom_powerpoint_parser import process_ppt_file logger = logging.getLogger(__name__) CUSTOM_PROCESSING = True + def load_documents(file): """Load documents from the specified folder.""" raw_documents = [] @@ -38,6 +42,9 @@ def load_documents(file): elif file.endswith("ppt") or file.endswith("pptx"): pptx_docs = process_ppt_file(file) raw_documents.extend(pptx_docs) + elif file.endswith("png"): + img_docs = process_img_file(file) + raw_documents.extend(img_docs) else: # Load unstructured files and add them individually loader = UnstructuredFileLoader(file) @@ -50,10 +57,10 @@ def split_text(documents): """Split text documents into chunks.""" text_splitter = RecursiveCharacterTextSplitter( # Set a really small chunk size, just to show. - chunk_size = 1000, - chunk_overlap = 100, - length_function = len, - is_separator_regex = False, + chunk_size=1000, + chunk_overlap=100, + length_function=len, + is_separator_regex=False, ) split_docs = text_splitter.split_documents(documents) return split_docs @@ -75,7 +82,7 @@ def update_vectorstore(file_path, vector_client, embedder, config_name): # Adding file name to the metadata for document in documents: document.metadata["filename"] = os.path.basename(file_path) - + logger.info("[Step 3/4] Inserting documents into the vector store...") # Batch insert into Milvus collection vector_client.add_documents(documents) diff --git a/RAG/examples/advanced_rag/query_decomposition_rag/README.md b/RAG/examples/advanced_rag/query_decomposition_rag/README.md new file mode 100644 index 00000000..0a29073a --- /dev/null +++ b/RAG/examples/advanced_rag/query_decomposition_rag/README.md @@ -0,0 +1,87 @@ + + +# Query Decomposition RAG + +## Example Features + +This example deploys a recursive query decomposition example for chat Q&A. + +Query decomposition can perform RAG when the agent needs to access information from several different documents +(also referred to as _chunks_) or to perform some computation on the answers. +This example uses a custom LangChain agent that recursively breaks down the questions into subquestions. +The agent then attempts to answer the subquestions. + +The agent has access to two tools: + +- search: to perform standard RAG on a subquestion. +- math: to pose a math question to the LLM. + +The agent continues to break down the question into subquestions until it has the answers that it needs to form the final answer. + +| Model | Embedding | Framework | Vector Database | File Types | +| ------------------------ | ------------------------ | --------- | --------------- | ------------ | +| meta/llama3-70b-instruct | nvidia/nv-embedqa-e5-v5 | LangChain | Milvus | TXT, PDF, MD | + +![Diagram](../../../../docs/images/query_decomposition_rag_arch.png) + +## Prerequisites + +Complete the [common prerequisites](../../../../docs/common-prerequisites.md). + +## Build and Start the Containers + +1. Export your NVIDIA API key as an environment variable: + + ```text + export NVIDIA_API_KEY="nvapi-<...>" + ``` + +1. Start the containers: + + ```console + cd RAG/examples/advanced_rag/query_decomposition_rag/ + docker compose up -d --build + ``` + + *Example Output* + + ```output + ✔ Network nvidia-rag Created + ✔ Container rag-playground Started + ✔ Container milvus-minio Started + ✔ Container chain-server Started + ✔ Container milvus-etcd Started + ✔ Container milvus-standalone Started + ``` + +1. Confirm the containers are running: + + ```console + docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}" + ``` + + *Example Output* + + ```output + CONTAINER ID NAMES STATUS + 39a8524829da rag-playground Up 2 minutes + bfbd0193dbd2 chain-server Up 2 minutes + ec02ff3cc58b milvus-standalone Up 3 minutes + 6969cf5b4342 milvus-minio Up 3 minutes (healthy) + 57a068d62fbb milvus-etcd Up 3 minutes (healthy) + ``` + +1. Open a web browser and access to use the RAG Playground. + + Refer to [Using the Sample Web Application](../../../../docs/using-sample-web-application.md) + for information about uploading documents and using the web interface. + +## Next Steps + +- [Vector Database Customizations](../../../../docs/vector-database.md) +- Stop the containers by running `docker compose down`. +- Use the [RAG Application: Query Decomposition Agent](https://registry.ngc.nvidia.com/orgs/ohlfw0olaadg/teams/ea-participants/helm-charts/rag-app-query-decomposition-agent) + Helm chart to deploy this example in Kubernetes. diff --git a/RetrievalAugmentedGeneration/examples/query_decomposition_rag/__init__.py b/RAG/examples/advanced_rag/query_decomposition_rag/__init__.py similarity index 100% rename from RetrievalAugmentedGeneration/examples/query_decomposition_rag/__init__.py rename to RAG/examples/advanced_rag/query_decomposition_rag/__init__.py diff --git a/RetrievalAugmentedGeneration/examples/query_decomposition_rag/chains.py b/RAG/examples/advanced_rag/query_decomposition_rag/chains.py similarity index 72% rename from RetrievalAugmentedGeneration/examples/query_decomposition_rag/chains.py rename to RAG/examples/advanced_rag/query_decomposition_rag/chains.py index 1a5b9a08..05e74c65 100644 --- a/RetrievalAugmentedGeneration/examples/query_decomposition_rag/chains.py +++ b/RAG/examples/advanced_rag/query_decomposition_rag/chains.py @@ -20,44 +20,45 @@ Search tool is a RAG pipeline, whereas the math tool uses an LLM call to perform mathematical calculations. """ -from langchain_community.vectorstores.faiss import FAISS -from langchain_community.document_loaders import UnstructuredFileLoader -from langchain.text_splitter import CharacterTextSplitter -from langchain_core.prompts.chat import ChatPromptTemplate -from langchain_core.output_parsers.string import StrOutputParser -from langchain.chains.llm import LLMChain -from langchain_core.prompts.chat import BaseChatPromptTemplate -from langchain_core.messages.human import HumanMessage -from langchain.agents.agent import LLMSingleActionAgent, AgentOutputParser, AgentExecutor -from langchain.tools import Tool -from langchain.schema.agent import AgentFinish, AgentAction -from typing import List, Union, Dict, Any -import json -import jinja2 -import os import base64 +import json import logging -from typing import Generator, List -from RetrievalAugmentedGeneration.common.tracing import langchain_instrumentation_class_wrapper +import os +from typing import Any, Dict, Generator, List, Union -from RetrievalAugmentedGeneration.common.utils import ( +import jinja2 +from langchain.agents.agent import AgentExecutor, AgentOutputParser, LLMSingleActionAgent +from langchain.chains.llm import LLMChain +from langchain.schema.agent import AgentAction, AgentFinish +from langchain.text_splitter import CharacterTextSplitter +from langchain.tools import Tool +from langchain_community.document_loaders import UnstructuredFileLoader +from langchain_community.vectorstores.faiss import FAISS +from langchain_core.messages.human import HumanMessage +from langchain_core.output_parsers.string import StrOutputParser +from langchain_core.prompts.chat import BaseChatPromptTemplate, ChatPromptTemplate + +from RAG.src.chain_server.base import BaseExample +from RAG.src.chain_server.tracing import langchain_instrumentation_class_wrapper +from RAG.src.chain_server.utils import ( + create_vectorstore_langchain, + del_docs_vectorstore_langchain, get_config, - get_llm, - set_service_context, - get_embedding_model, get_doc_retriever, - create_vectorstore_langchain, get_docs_vectorstore_langchain, - del_docs_vectorstore_langchain, - get_vectorstore + get_embedding_model, + get_llm, + get_prompts, + get_vectorstore, + set_service_context, ) -from RetrievalAugmentedGeneration.common.base import BaseExample logger = logging.getLogger(__name__) vector_store_path = "vectorstore.pkl" document_embedder = get_embedding_model() settings = get_config() +prompts = get_prompts() try: vectorstore = create_vectorstore_langchain(document_embedder=document_embedder) @@ -67,6 +68,7 @@ ##### Helper methods and tools ##### + class Ledger: # Stores the state of the recursive decomposition def __init__(self): self.question_trace = [] @@ -87,47 +89,10 @@ def fetch_context(ledger: Ledger) -> str: return context -template = """Your task is to answer questions. If you cannot answer the question, you can request use for a tool and break the question into specific sub questions. Fill with Nil where no action is required. You should only return a JSON containing the tool and the generated sub questions. Consider the contextual information and only ask for information that you do not already have. Do not return any other explanations or text. The output should be a simple JSON structure! You are given two tools: -- Search -- Math -Search tool quickly finds and retrieves relevant answers from a given context, providing accurate and precise information to meet search needs. -Math tool performs essential operations, including multiplication, addition, subtraction, division, and greater than or less than comparisons, providing accurate results with ease. Utilize math tool when asked to find sum, difference of values. -Do not pass sub questions to any tool if they already have an answer in the Contextual Information. -If you have all the information needed to answer the question, mark the Tool_Request as Nil. -Contextual Information: -{{ context }} +template = prompts.get("tool_selector_prompt", "") -Question: -{{ question }} - -{"Tool_Request": "", "Generated Sub Questions": []} -""" - -math_tool_prompt = """Your task is to identify 2 variables and an operation from given questions. If you cannot answer the question, you can simply return "Not Possible". You should only return a JSON containing the `IsPossible`, `variable1`, `variable2`, and `operation`. Do not return any other explanations or text. The output should be a simple JSON structure! - You are given two options for `IsPossible`: -- Possible -- Not Possible - `variable1` and `variable2` should be real floating point numbers. - You are given four options for `operation symbols`: -- '+' (addition) -- '-' (subtraction) -- '*' (multiplication) -- '/' (division) -- '=' (equal to) -- '>' (greater than) -- '<' (less than) -- '>=' (greater than or equal to) -- '<=' (less than or equal to) - Only return the symbols for the specified operations and nothing else. -Contextual Information: -{{ context }} - -Question: -{{ question }} - -{"IsPossible": "", "variable1": [], "variable2": [], "operation": []} -""" +math_tool_prompt = prompts.get("math_tool_prompt", "") class CustomPromptTemplate(BaseChatPromptTemplate): @@ -168,10 +133,7 @@ def parse(self, llm_output: str) -> Union[AgentAction, AgentFinish]: or self.ledger.trace > 3 or local_state["Generated Sub Questions"][0] in self.ledger.question_trace ): - return AgentFinish( - return_values={"output": "success"}, - log=llm_output, - ) + return AgentFinish(return_values={"output": "success"}, log=llm_output,) if local_state["Tool_Request"] == "Search": self.ledger.trace += 1 @@ -184,11 +146,12 @@ def parse(self, llm_output: str) -> Union[AgentAction, AgentFinish]: ) raise ValueError(f"Invalid Tool name: {local_state['Tool_Request']}") + @langchain_instrumentation_class_wrapper class QueryDecompositionChatbot(BaseExample): def ingest_docs(self, filepath: str, filename: str): """Ingest documents to the VectorDB.""" - if not filename.endswith((".txt",".pdf",".md")): + if not filename.endswith((".txt", ".pdf", ".md")): raise ValueError(f"{filename} is not a valid Text, PDF or Markdown file") try: # Load raw documents from the directory @@ -196,7 +159,9 @@ def ingest_docs(self, filepath: str, filename: str): raw_documents = UnstructuredFileLoader(_path).load() if raw_documents: - text_splitter = CharacterTextSplitter(chunk_size=settings.text_splitter.chunk_size, chunk_overlap=settings.text_splitter.chunk_overlap) + text_splitter = CharacterTextSplitter( + chunk_size=settings.text_splitter.chunk_size, chunk_overlap=settings.text_splitter.chunk_overlap + ) documents = text_splitter.split_documents(raw_documents) vs = get_vectorstore(vectorstore, document_embedder) vs.add_documents(documents) @@ -207,32 +172,27 @@ def ingest_docs(self, filepath: str, filename: str): logger.error(f"Failed to ingest document due to exception {e}") raise ValueError("Failed to upload document. Please upload an unstructured text document.") - - def llm_chain( - self, query: str, chat_history: List["Message"], **kwargs - ) -> Generator[str, None, None]: + def llm_chain(self, query: str, chat_history: List["Message"], **kwargs) -> Generator[str, None, None]: """Execute a simple LLM chain using the components defined above.""" logger.info("Using llm to generate response directly without knowledge base.") # WAR: Disable chat history (UI consistency). chat_history = [] - system_message = [("system", settings.prompts.chat_template)] + system_message = [("system", prompts.get("chat_template", ""))] conversation_history = [(msg.role, msg.content) for msg in chat_history] user_input = [("user", "{input}")] # Checking if conversation_history is not None and not empty - prompt_template = ChatPromptTemplate.from_messages( - system_message + conversation_history + user_input - ) if conversation_history else ChatPromptTemplate.from_messages( - system_message + user_input + prompt_template = ( + ChatPromptTemplate.from_messages(system_message + conversation_history + user_input) + if conversation_history + else ChatPromptTemplate.from_messages(system_message + user_input) ) llm = get_llm(**kwargs) chain = prompt_template | llm | StrOutputParser() - augmented_user_input = ( - "\n\nQuestion: " + query + "\n" - ) + augmented_user_input = "\n\nQuestion: " + query + "\n" logger.info(f"Prompt used for response generation: {prompt_template.format(input=augmented_user_input)}") - return chain.stream({"input": augmented_user_input}, config={"callbacks":[self.cb_handler]}) + return chain.stream({"input": augmented_user_input}, config={"callbacks": [self.cb_handler]}) def rag_chain(self, query: str, chat_history: List["Message"], **kwargs) -> Generator[str, None, None]: """Execute a Retrieval Augmented Generation chain using the components defined above.""" @@ -243,24 +203,21 @@ def rag_chain(self, query: str, chat_history: List["Message"], **kwargs) -> Gene final_context = self.run_agent(query, **kwargs) if not final_context: logger.warning("Retrieval failed to get any relevant context") - return iter(["No response generated from LLM, make sure your query is relavent to the ingested document."]) + return iter( + ["No response generated from LLM, make sure your query is relavent to the ingested document."] + ) logger.info(f"Final Answer from agent: {final_context}") # TODO Add chat_history - final_prompt_template = ChatPromptTemplate.from_messages( - [ - ("human", final_context) - ] - ) + final_prompt_template = ChatPromptTemplate.from_messages([("human", final_context)]) llm = get_llm(**kwargs) chain = final_prompt_template | llm | StrOutputParser() logger.info(f"Prompt used for final response generation: {final_prompt_template}") - return chain.stream({}, config={"callbacks":[self.cb_handler]}) + return chain.stream({}, config={"callbacks": [self.cb_handler]}) except ValueError as e: logger.warning(f"Failed to get response because {e}") return iter(["I can't find an answer for that."]) - def create_agent(self, **kwargs) -> AgentExecutor: """ Creates the tools, chain, output parser and agent used to fetch the full context. @@ -270,8 +227,16 @@ def create_agent(self, **kwargs) -> AgentExecutor: self.kwargs = kwargs tools = [ - Tool(name="Search", func=self.search, description="The Search Tool is a powerful querying system that quickly finds and retrieves relevant answers from a given context, providing accurate and precise information to meet your search needs."), - Tool(name="Math", func=self.math, description="The Math Tool is a versatile calculator that performs essential mathematical operations, including multiplication, addition, subtraction, division, and greater than or less than comparisons, providing accurate results with ease."), + Tool( + name="Search", + func=self.search, + description="The Search Tool is a powerful querying system that quickly finds and retrieves relevant answers from a given context, providing accurate and precise information to meet your search needs.", + ), + Tool( + name="Math", + func=self.math, + description="The Math Tool is a versatile calculator that performs essential mathematical operations, including multiplication, addition, subtraction, division, and greater than or less than comparisons, providing accurate results with ease.", + ), ] tool_names = [tool.name for tool in tools] @@ -284,17 +249,18 @@ def create_agent(self, **kwargs) -> AgentExecutor: llm_chain=llm_chain, output_parser=output_parser, stop=["\n\n"], allowed_tools=tool_names ) - agent_executor = AgentExecutor.from_agent_and_tools(agent=recursive_decomposition_agent, tools=tools, verbose=True, callbacks=[self.cb_handler]) + agent_executor = AgentExecutor.from_agent_and_tools( + agent=recursive_decomposition_agent, tools=tools, verbose=True, callbacks=[self.cb_handler] + ) return agent_executor - def run_agent(self, question: str, **kwargs): """ Run question on the agent """ agent_executor = self.create_agent(**kwargs) - agent_executor.invoke({"question": question}, config={"callbacks":[self.cb_handler]}) + agent_executor.invoke({"question": question}, config={"callbacks": [self.cb_handler]}) ##### LLM call to get final answer ###### @@ -324,7 +290,6 @@ def retriever(self, query: str) -> List[str]: logger.debug(result) return [hit.page_content for hit in result] - def extract_answer(self, chunks: List[str], question: str) -> str: """ Find the answer to the query from the retrieved chunks @@ -339,7 +304,6 @@ def extract_answer(self, chunks: List[str], question: str) -> str: answer = llm([HumanMessage(content=prompt)]) return answer.content - def search(self, sub_questions: List[str]): """ Search for the answer for each subquestion and add them to the ledger. @@ -353,7 +317,6 @@ def search(self, sub_questions: List[str]): self.ledger.question_trace.append(sub_question) self.ledger.answer_trace.append(sub_answer) - def math(self, sub_questions: List[str]): """ Places an LLM call to answer mathematical subquestions which do not require search @@ -365,8 +328,8 @@ def math(self, sub_questions: List[str]): llm = get_llm(**self.kwargs) sub_answer = llm([HumanMessage(content=prompt)]) sub_answer = json.loads(sub_answer.content) - final_sub_answer= str(sub_answer['variable1'])+sub_answer['operation']+str(sub_answer['variable2']) - final_sub_answer=final_sub_answer+'='+str(eval(final_sub_answer)) + final_sub_answer = str(sub_answer['variable1']) + sub_answer['operation'] + str(sub_answer['variable2']) + final_sub_answer = final_sub_answer + '=' + str(eval(final_sub_answer)) except: prompt = "Solve this mathematical question:\nQuestion: " + sub_questions[0] prompt += f"Context:\n{fetch_context(self.ledger)}\n" @@ -377,7 +340,6 @@ def math(self, sub_questions: List[str]): sub_answer = llm([HumanMessage(content=prompt)]) final_sub_answer = sub_answer.content - self.ledger.question_trace.append(sub_questions[0]) self.ledger.answer_trace.append(final_sub_answer) @@ -398,10 +360,7 @@ def document_search(self, content: str, num_docs: int) -> List[Dict[str, Any]]: result = [] for doc in docs: result.append( - { - "source": os.path.basename(doc.metadata.get('source', '')), - "content": doc.page_content - } + {"source": os.path.basename(doc.metadata.get('source', '')), "content": doc.page_content} ) return result return [] @@ -419,7 +378,6 @@ def get_documents(self) -> List[str]: logger.error(f"Vectorstore not initialized. Error details: {e}") return [] - def delete_documents(self, filenames: List[str]): """Delete documents from the vector index.""" try: diff --git a/deploy/compose/rag-app-query-decomposition-agent.yaml b/RAG/examples/advanced_rag/query_decomposition_rag/docker-compose.yaml similarity index 63% rename from deploy/compose/rag-app-query-decomposition-agent.yaml rename to RAG/examples/advanced_rag/query_decomposition_rag/docker-compose.yaml index 9bb8448b..aff87171 100644 --- a/deploy/compose/rag-app-query-decomposition-agent.yaml +++ b/RAG/examples/advanced_rag/query_decomposition_rag/docker-compose.yaml @@ -1,28 +1,34 @@ +include: + - path: + - ../../local_deploy/docker-compose-vectordb.yaml + - ../../local_deploy/docker-compose-nim-ms.yaml + services: chain-server: container_name: chain-server image: chain-server:${TAG:-latest} build: - context: ../../ - dockerfile: ./RetrievalAugmentedGeneration/Dockerfile + context: ../../../../ + dockerfile: RAG/src/chain_server/Dockerfile args: - EXAMPLE_NAME: query_decomposition_rag + EXAMPLE_PATH: 'advanced_rag/query_decomposition_rag' + volumes: + - ./prompt.yaml:/prompt.yaml command: --port 8081 --host 0.0.0.0 environment: + EXAMPLE_PATH: 'advanced_rag/query_decomposition_rag' APP_VECTORSTORE_URL: "http://milvus:19530" APP_VECTORSTORE_NAME: "milvus" APP_LLM_MODELNAME: ${APP_LLM_MODELNAME:-"meta/llama3-70b-instruct"} APP_LLM_MODELENGINE: nvidia-ai-endpoints APP_LLM_SERVERURL: ${APP_LLM_SERVERURL:-""} - APP_EMBEDDINGS_MODELNAME: ${APP_EMBEDDINGS_MODELNAME:-snowflake/arctic-embed-l} + APP_EMBEDDINGS_MODELNAME: ${APP_EMBEDDINGS_MODELNAME:-nvidia/nv-embedqa-e5-v5} APP_EMBEDDINGS_MODELENGINE: ${APP_EMBEDDINGS_MODELENGINE:-nvidia-ai-endpoints} APP_EMBEDDINGS_SERVERURL: ${APP_EMBEDDINGS_SERVERURL:-""} APP_TEXTSPLITTER_MODELNAME: Snowflake/snowflake-arctic-embed-l APP_TEXTSPLITTER_CHUNKSIZE: 506 APP_TEXTSPLITTER_CHUNKOVERLAP: 200 NVIDIA_API_KEY: ${NVIDIA_API_KEY} - APP_PROMPTS_CHATTEMPLATE: "You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe. Please ensure that your responses are positive in nature." - APP_PROMPTS_RAGTEMPLATE: "You are a helpful AI assistant named Envie. You will reply to questions only based on the context that you are provided. If something is out of context, you will refrain from replying and politely decline to respond to the user." POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-password} POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_DB: ${POSTGRES_DB:-api} @@ -38,29 +44,27 @@ services: expose: - "8081" shm_size: 5gb - deploy: - resources: - reservations: - devices: - - driver: nvidia - count: 1 - capabilities: [gpu] + depends_on: + nemollm-embedding: + condition: service_healthy + required: false + nemollm-inference: + condition: service_healthy + required: false rag-playground: container_name: rag-playground image: rag-playground:${TAG:-latest} build: - context: ../.././RetrievalAugmentedGeneration/frontend/ + context: ../../../../RAG/src/rag_playground/ dockerfile: Dockerfile + args: + PLAYGROUND_MODE: ${PLAYGROUND_MODE:-default} command: --port 8090 environment: APP_SERVERURL: http://chain-server APP_SERVERPORT: 8081 APP_MODELNAME: ${APP_LLM_MODELNAME:-"meta/llama3-70b-instruct"} - RIVA_API_URI: ${RIVA_API_URI:-} - RIVA_API_KEY: ${RIVA_API_KEY:-} - RIVA_FUNCTION_ID: ${RIVA_FUNCTION_ID:-} - TTS_SAMPLE_RATE: ${TTS_SAMPLE_RATE:-48000} OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4317 OTEL_EXPORTER_OTLP_PROTOCOL: grpc ENABLE_TRACING: false diff --git a/RAG/examples/advanced_rag/query_decomposition_rag/prompt.yaml b/RAG/examples/advanced_rag/query_decomposition_rag/prompt.yaml new file mode 100644 index 00000000..cc38c8af --- /dev/null +++ b/RAG/examples/advanced_rag/query_decomposition_rag/prompt.yaml @@ -0,0 +1,45 @@ +chat_template: "You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe. Please ensure that your responses are positive in nature." + +rag_template: "You are a helpful AI assistant named Envie. You will reply to questions only based on the context that you are provided. If something is out of context, you will refrain from replying and politely decline to respond to the user." + +tool_selector_prompt: | + Your task is to answer questions. If you cannot answer the question, you can request use for a tool and break the question into specific sub questions. Fill with Nil where no action is required. You should only return a JSON containing the tool and the generated sub questions. Consider the contextual information and only ask for information that you do not already have. Do not return any other explanations or text. The output should be a simple JSON structure! You are given two tools: + - Search + - Math + Search tool quickly finds and retrieves relevant answers from a given context, providing accurate and precise information to meet search needs. + Math tool performs essential operations, including multiplication, addition, subtraction, division, and greater than or less than comparisons, providing accurate results with ease. Utilize math tool when asked to find sum, difference of values. + Do not pass sub questions to any tool if they already have an answer in the Contextual Information. + If you have all the information needed to answer the question, mark the Tool_Request as Nil. + + Contextual Information: + {{ context }} + + Question: + {{ question }} + + {"Tool_Request": "", "Generated Sub Questions": []} + +math_tool_prompt: | + Your task is to identify 2 variables and an operation from given questions. If you cannot answer the question, you can simply return "Not Possible". You should only return a JSON containing the `IsPossible`, `variable1`, `variable2`, and `operation`. Do not return any other explanations or text. The output should be a simple JSON structure! + You are given two options for `IsPossible`: + - Possible + - Not Possible + `variable1` and `variable2` should be real floating point numbers. + You are given four options for `operation symbols`: + - '+' (addition) + - '-' (subtraction) + - '*' (multiplication) + - '/' (division) + - '=' (equal to) + - '>' (greater than) + - '<' (less than) + - '>=' (greater than or equal to) + - '<=' (less than or equal to) + Only return the symbols for the specified operations and nothing else. + Contextual Information: + {{ context }} + + Question: + {{ question }} + + {"IsPossible": "", "variable1": [], "variable2": [], "operation": []} \ No newline at end of file diff --git a/RAG/examples/advanced_rag/structured_data_rag/README.md b/RAG/examples/advanced_rag/structured_data_rag/README.md new file mode 100644 index 00000000..dbbfba70 --- /dev/null +++ b/RAG/examples/advanced_rag/structured_data_rag/README.md @@ -0,0 +1,94 @@ + + +# Structured Data RAG + +## Example Features + +This example demonstrates how to use RAG with structured CSV data. + +This example uses models from the NVIDIA API Catalog. +This approach does not require embedding models or vector database solutions. +Instead, the example uses [PandasAI](https://docs.pandas-ai.com/en/latest/) to manage the workflow. + +For ingestion, the query server loads the structured data from a CSV file into a Pandas dataframe. +The query server can ingest multiple CSV files, provided the files have identical columns. +Ingestion of CSV files with differing columns is not supported and results in an exception. + +The core functionality uses a PandasAI agent to extract information from the dataframe. +This agent combines the query with the structure of the dataframe into an LLM prompt. +The LLM then generates Python code to extract the required information from the dataframe. +Subsequently, this generated code is executed on the dataframe and yields an output dataframe. + +To demonstrate the example, sample CSV files are available. +These are part of the structured data example Helm chart and represent a subset of the [Microsoft Azure Predictive Maintenance](https://www.kaggle.com/datasets/arnabbiswas1/microsoft-azure-predictive-maintenance) from Kaggle. +The CSV data retrieval prompt is specifically tuned for three CSV files from this dataset: `PdM_machines.csv`, `PdM_errors.csv`, and `PdM_failures.csv`. +The CSV files to use are specified in the `docker-compose.yaml` file by updating the environment variable `CSV_NAME`. +The default value is `PdM_machines`, but can be changed to `PdM_errors` or `PdM_failures`. + +| Model | Embedding | Framework | Vector Database | File Types | +| ------------------------ | ------------------------ | --------- | --------------- | ---------- | +| meta/llama3-70b-instruct | None | Custom | None | CSV | + +![Diagram](../../../../docs/images/structured_data_rag_arch.png) + +## Prerequisites + +Complete the [common prerequisites](../../../../docs/common-prerequisites.md). + +## Build and Start the Containers + +1. Export your NVIDIA API key as an environment variable: + + ```text + export NVIDIA_API_KEY="nvapi-<...>" + ``` + +1. Start the containers: + + ```console + cd RAG/examples/advanced_rag/structured_data_rag/ + docker compose up -d --build + ``` + + *Example Output* + + ```output + ✔ Network nvidia-rag Created + ✔ Container rag-playground Started + ✔ Container milvus-minio Started + ✔ Container chain-server Started + ✔ Container milvus-etcd Started + ✔ Container milvus-standalone Started + ``` + +1. Confirm the containers are running: + + ```console + docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}" + ``` + + *Example Output* + + ```output + CONTAINER ID NAMES STATUS + 39a8524829da rag-playground Up 2 minutes + bfbd0193dbd2 chain-server Up 2 minutes + ec02ff3cc58b milvus-standalone Up 3 minutes + 6969cf5b4342 milvus-minio Up 3 minutes (healthy) + 57a068d62fbb milvus-etcd Up 3 minutes (healthy) + ``` + +1. Open a web browser and access to use the RAG Playground. + + Refer to [Using the Sample Web Application](../../../../docs/using-sample-web-application.md) + for information about uploading documents and using the web interface. + +## Next Steps + +- [Vector Database Customizations](../../../../docs/vector-database.md) +- Stop the containers by running `docker compose down`. +- Use the [RAG Application: Structured Data Agent](https://registry.ngc.nvidia.com/orgs/ohlfw0olaadg/teams/ea-participants/helm-charts/rag-app-structured-data-chatbot) + Helm chart to deploy this example in Kubernetes. diff --git a/RetrievalAugmentedGeneration/examples/structured_data_rag/__init__.py b/RAG/examples/advanced_rag/structured_data_rag/__init__.py similarity index 100% rename from RetrievalAugmentedGeneration/examples/structured_data_rag/__init__.py rename to RAG/examples/advanced_rag/structured_data_rag/__init__.py diff --git a/RetrievalAugmentedGeneration/examples/structured_data_rag/chains.py b/RAG/examples/advanced_rag/structured_data_rag/chains.py similarity index 82% rename from RetrievalAugmentedGeneration/examples/structured_data_rag/chains.py rename to RAG/examples/advanced_rag/structured_data_rag/chains.py index d322bbcc..93004b40 100644 --- a/RetrievalAugmentedGeneration/examples/structured_data_rag/chains.py +++ b/RAG/examples/advanced_rag/structured_data_rag/chains.py @@ -16,6 +16,7 @@ """LLM Chains for executing Retrival Augmented Generation.""" import logging import os +import pathlib from typing import Generator, List import pandas as pd @@ -29,23 +30,23 @@ from pandasai import Agent as PandasAI_Agent from pandasai.responses.response_parser import ResponseParser -from integrations.pandasai.llms.nv_aiplay import NVIDIA as PandasAI_NVIDIA -from RetrievalAugmentedGeneration.common.base import BaseExample -from RetrievalAugmentedGeneration.common.utils import get_config, get_llm - # pylint: disable=no-name-in-module, disable=import-error -from RetrievalAugmentedGeneration.example.csv_utils import ( +from RAG.examples.advanced_rag.structured_data_rag.csv_utils import ( extract_df_desc, get_prompt_params, + is_result_valid, parse_prompt_config, - is_result_valid ) +from RAG.src.chain_server.base import BaseExample +from RAG.src.chain_server.utils import get_config, get_llm, get_prompts +from RAG.src.pandasai.llms.nv_aiplay import NVIDIA as PandasAI_NVIDIA logger = logging.getLogger(__name__) settings = get_config() INGESTED_CSV_FILES_LIST = "ingested_csv_files.txt" + class PandasDataFrame(ResponseParser): """Returns Pandas Dataframe instead of SmartDataFrame""" @@ -59,7 +60,6 @@ def format_dataframe(self, result): class CSVChatbot(BaseExample): """RAG example showcasing CSV parsing using Pandas AI Agent""" - def compare_csv_columns(self, ref_csv_file, current_csv_file): """Compares columns of two CSV files""" @@ -127,29 +127,27 @@ def ingest_docs(self, filepath: str, filename: str): f.write(filepath + "\n") else: raise ValueError( - f"Columns of the file {filepath} do not match the reference columns of {ref_csv_path} file." - ) + f"Columns of the file {filepath} do not match the reference columns of {ref_csv_path} file." + ) logger.info("Document %s ingested successfully", filename) - def llm_chain( - self, query: str, chat_history: List["Message"], **kwargs - ) -> Generator[str, None, None]: + def llm_chain(self, query: str, chat_history: List["Message"], **kwargs) -> Generator[str, None, None]: """Execute a simple LLM chain using the components defined above.""" logger.info("Using llm to generate response directly without knowledge base.") # WAR: Disable chat history (UI consistency). chat_history = [] - system_message = [("system", get_config().prompts.chat_template)] + system_message = [("system", get_prompts().get("prompts").get("chat_template"))] conversation_history = [(msg.role, msg.content) for msg in chat_history] user_input = [("user", "{input}")] # Checking if conversation_history is not None and not empty - prompt = ChatPromptTemplate.from_messages( - system_message + conversation_history + user_input - ) if conversation_history else ChatPromptTemplate.from_messages( - system_message + user_input + prompt = ( + ChatPromptTemplate.from_messages(system_message + conversation_history + user_input) + if conversation_history + else ChatPromptTemplate.from_messages(system_message + user_input) ) logger.info(f"Using prompt for response generation: {prompt.format(input=query)}") @@ -171,35 +169,23 @@ def rag_chain(self, query: str, chat_history: List["Message"], **kwargs) -> Gene df = df.fillna(0) df_desc = extract_df_desc(df) - prompt_config = parse_prompt_config( - "RetrievalAugmentedGeneration/example/csv_prompt_config.yaml" - ) + prompt_config = get_prompts().get("prompts") logger.info(prompt_config.get("csv_prompts", [])) - data_retrieval_prompt_params = get_prompt_params( - prompt_config.get("csv_prompts", []) - ) + data_retrieval_prompt_params = get_prompt_params(prompt_config.get("csv_prompts", [])) llm_data_retrieval = PandasAI_NVIDIA(temperature=0.2, model=settings.llm.model_name_pandas_ai) - config_data_retrieval = { - "llm": llm_data_retrieval, - "response_parser": PandasDataFrame, - "max_retries": 6 - } - agent_data_retrieval = PandasAI_Agent( - [df], config=config_data_retrieval, memory_size=20 - ) + config_data_retrieval = {"llm": llm_data_retrieval, "response_parser": PandasDataFrame, "max_retries": 6} + agent_data_retrieval = PandasAI_Agent([df], config=config_data_retrieval, memory_size=20) data_retrieval_prompt = ChatPromptTemplate( messages=[ - SystemMessagePromptTemplate.from_template( - prompt_config.get("csv_data_retrieval_template", []) - ), + SystemMessagePromptTemplate.from_template(prompt_config.get("csv_data_retrieval_template", [])), HumanMessagePromptTemplate.from_template("{query}"), ], input_variables=["description", "instructions", "data_frame", "query"], ) conversation_history = [(msg.role, msg.content) for msg in chat_history] - conversation_history_messages = ChatPromptTemplate.from_messages(conversation_history).messages + conversation_history_messages = ChatPromptTemplate.from_messages(conversation_history).messages # Insert conversation_history between data_retrieval_prompt's SystemMessage & HumanMessage (query) if conversation_history_messages: data_retrieval_prompt.messages[1:1] = conversation_history_messages @@ -219,8 +205,7 @@ def rag_chain(self, query: str, chat_history: List["Message"], **kwargs) -> Gene result_df = str(result_df) response_prompt_template = PromptTemplate( - template=prompt_config.get("csv_response_template", []), - input_variables=["query", "data"], + template=prompt_config.get("csv_response_template", []), input_variables=["query", "data"], ) response_prompt = response_prompt_template.format(query=query, data=result_df) @@ -241,4 +226,4 @@ def get_documents(self) -> List[str]: def delete_documents(self, filenames: List[str]): """Delete documents from the vector index.""" logger.error("delete_documents not implemented") - return True \ No newline at end of file + return True diff --git a/RetrievalAugmentedGeneration/examples/structured_data_rag/csv_utils.py b/RAG/examples/advanced_rag/structured_data_rag/csv_utils.py similarity index 94% rename from RetrievalAugmentedGeneration/examples/structured_data_rag/csv_utils.py rename to RAG/examples/advanced_rag/structured_data_rag/csv_utils.py index 3d3590f7..50229e4b 100644 --- a/RetrievalAugmentedGeneration/examples/structured_data_rag/csv_utils.py +++ b/RAG/examples/advanced_rag/structured_data_rag/csv_utils.py @@ -15,11 +15,11 @@ """ Module to provide utility functions for CSV RAG example""" -import os import json -import pandas as pd +import os from typing import Dict, List +import pandas as pd import yaml @@ -52,10 +52,8 @@ def parse_prompt_config(config_path: str) -> Dict: # Check if the expected key 'prompts' is in the data if "prompts" not in data or not isinstance(data["prompts"], dict): - raise ValueError( - "Invalid YAML structure. Expected a 'prompts' key with a list of dictionaries." - ) - + raise ValueError("Invalid YAML structure. Expected a 'prompts' key with a list of dictionaries.") + env_prompts = None if "CSV_PROMPTS" in os.environ: try: @@ -99,8 +97,9 @@ def get_prompt_params(prompt_list: List) -> Dict[str, str]: return {} + def is_result_valid(result): """ Check for validity of resultant data frame""" if isinstance(result, pd.DataFrame): return not result.empty - return bool(result) \ No newline at end of file + return bool(result) diff --git a/RetrievalAugmentedGeneration/examples/structured_data_rag/PdM_errors.csv b/RAG/examples/advanced_rag/structured_data_rag/data/PdM_errors.csv similarity index 100% rename from RetrievalAugmentedGeneration/examples/structured_data_rag/PdM_errors.csv rename to RAG/examples/advanced_rag/structured_data_rag/data/PdM_errors.csv diff --git a/RetrievalAugmentedGeneration/examples/structured_data_rag/PdM_failures.csv b/RAG/examples/advanced_rag/structured_data_rag/data/PdM_failures.csv similarity index 100% rename from RetrievalAugmentedGeneration/examples/structured_data_rag/PdM_failures.csv rename to RAG/examples/advanced_rag/structured_data_rag/data/PdM_failures.csv diff --git a/RetrievalAugmentedGeneration/examples/structured_data_rag/PdM_machines.csv b/RAG/examples/advanced_rag/structured_data_rag/data/PdM_machines.csv similarity index 100% rename from RetrievalAugmentedGeneration/examples/structured_data_rag/PdM_machines.csv rename to RAG/examples/advanced_rag/structured_data_rag/data/PdM_machines.csv diff --git a/deploy/compose/rag-app-structured-data-chatbot.yaml b/RAG/examples/advanced_rag/structured_data_rag/docker-compose.yaml similarity index 74% rename from deploy/compose/rag-app-structured-data-chatbot.yaml rename to RAG/examples/advanced_rag/structured_data_rag/docker-compose.yaml index c8723d89..e8ae62cb 100644 --- a/deploy/compose/rag-app-structured-data-chatbot.yaml +++ b/RAG/examples/advanced_rag/structured_data_rag/docker-compose.yaml @@ -1,14 +1,21 @@ +include: + - path: + - ../../local_deploy/docker-compose-nim-ms.yaml + services: chain-server: container_name: chain-server image: chain-server:${TAG:-latest} build: - context: ../../ - dockerfile: ./RetrievalAugmentedGeneration/Dockerfile + context: ../../../../ + dockerfile: RAG/src/chain_server/Dockerfile args: - EXAMPLE_NAME: structured_data_rag + EXAMPLE_PATH: 'advanced_rag/structured_data_rag' + volumes: + - ./prompt.yaml:/prompt.yaml command: --port 8081 --host 0.0.0.0 environment: + EXAMPLE_PATH: 'advanced_rag/structured_data_rag' APP_LLM_MODELNAME: ${APP_LLM_MODELNAME:-meta/llama3-70b-instruct} APP_LLM_MODELENGINE: nvidia-ai-endpoints APP_LLM_SERVERURL: ${APP_LLM_SERVERURL:-""} @@ -24,29 +31,24 @@ services: expose: - "8081" shm_size: 5gb - deploy: - resources: - reservations: - devices: - - driver: nvidia - count: 1 - capabilities: [gpu] + depends_on: + nemollm-inference: + condition: service_healthy + required: false rag-playground: container_name: rag-playground image: rag-playground:${TAG:-latest} build: - context: ../.././RetrievalAugmentedGeneration/frontend/ + context: ../../../../RAG/src/rag_playground/ dockerfile: Dockerfile + args: + PLAYGROUND_MODE: ${PLAYGROUND_MODE:-default} command: --port 8090 environment: APP_SERVERURL: http://chain-server APP_SERVERPORT: 8081 APP_MODELNAME: ${APP_LLM_MODELNAME:-meta/llama3-70b-instruct} - RIVA_API_URI: ${RIVA_API_URI:-} - RIVA_API_KEY: ${RIVA_API_KEY:-} - RIVA_FUNCTION_ID: ${RIVA_FUNCTION_ID:-} - TTS_SAMPLE_RATE: ${TTS_SAMPLE_RATE:-48000} ports: - "8090:8090" expose: diff --git a/RetrievalAugmentedGeneration/examples/structured_data_rag/csv_prompt_config.yaml b/RAG/examples/advanced_rag/structured_data_rag/prompt.yaml similarity index 88% rename from RetrievalAugmentedGeneration/examples/structured_data_rag/csv_prompt_config.yaml rename to RAG/examples/advanced_rag/structured_data_rag/prompt.yaml index 8178a9e2..a01430d5 100644 --- a/RetrievalAugmentedGeneration/examples/structured_data_rag/csv_prompt_config.yaml +++ b/RAG/examples/advanced_rag/structured_data_rag/prompt.yaml @@ -1,5 +1,9 @@ prompts: + chat_template: You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe. Please ensure that your responses are positive in nature. + + rag_template: You are a helpful AI assistant named Envie. You will reply to questions only based on the context that you are provided. If something is out of context, you will refrain from replying and politely decline to respond to the user. + csv_data_retrieval_template: | You are an expert data retrieval agent who writes functional python code and utilzes Pandas library in python for data retrieval. diff --git a/RetrievalAugmentedGeneration/examples/structured_data_rag/requirements.txt b/RAG/examples/advanced_rag/structured_data_rag/requirements.txt similarity index 100% rename from RetrievalAugmentedGeneration/examples/structured_data_rag/requirements.txt rename to RAG/examples/advanced_rag/structured_data_rag/requirements.txt diff --git a/RAG/examples/basic_rag/langchain/README.md b/RAG/examples/basic_rag/langchain/README.md new file mode 100644 index 00000000..d4e9dd2a --- /dev/null +++ b/RAG/examples/basic_rag/langchain/README.md @@ -0,0 +1,74 @@ + + +# Basic RAG Using LangChain + +## Example Features + +This example deploys a basic RAG pipeline for chat Q&A and serves inferencing from an NVIDIA API Catalog endpoint. +You do not need a GPU on your machine to run this example. + +| Model | Embedding | Framework | Vector Database | File Types | +| ------------------------ | ------------------------ | --------- | --------------- | ------------ | +| meta/llama3-70b-instruct | nvidia/nv-embedqa-e5-v5 | LangChain | Milvus | TXT, PDF, MD | + +![Diagram](../../../../docs/images/basic_rag_langchain_arch.png) + +## Prerequisites + +Complete the [common prerequisites](../../../../docs/common-prerequisites.md). + +## Build and Start the Containers + +1. Export your NVIDIA API key as an environment variable: + + ```text + export NVIDIA_API_KEY="nvapi-<...>" + ``` + +1. Start the containers: + + ```console + cd RAG/examples/basic_rag/langchain/ + docker compose up -d --build + ``` + + *Example Output* + + ```output + ✔ Network nvidia-rag Created + ✔ Container rag-playground Started + ✔ Container milvus-minio Started + ✔ Container chain-server Started + ✔ Container milvus-etcd Started + ✔ Container milvus-standalone Started + ``` + +1. Confirm the containers are running: + + ```console + docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}" + ``` + + *Example Output* + + ```output + CONTAINER ID NAMES STATUS + 39a8524829da rag-playground Up 2 minutes + bfbd0193dbd2 chain-server Up 2 minutes + ec02ff3cc58b milvus-standalone Up 3 minutes + 6969cf5b4342 milvus-minio Up 3 minutes (healthy) + 57a068d62fbb milvus-etcd Up 3 minutes (healthy) + ``` + +1. Open a web browser and access to use the RAG Playground. + + Refer to [Using the Sample Web Application](../../../../docs/using-sample-web-application.md) + for information about uploading documents and using the web interface. + +## Next Steps + +- [Vector Database Customizations](../../../../docs/vector-database.md) +- Stop the containers by running `docker compose down`. diff --git a/RetrievalAugmentedGeneration/examples/nvidia_api_catalog/chains.py b/RAG/examples/basic_rag/langchain/chains.py similarity index 53% rename from RetrievalAugmentedGeneration/examples/nvidia_api_catalog/chains.py rename to RAG/examples/basic_rag/langchain/chains.py index 82f33017..b144d445 100644 --- a/RetrievalAugmentedGeneration/examples/nvidia_api_catalog/chains.py +++ b/RAG/examples/basic_rag/langchain/chains.py @@ -15,24 +15,32 @@ import logging import os -from functools import lru_cache -from typing import Generator, List, Dict, Any +from typing import Any, Dict, Generator, List from langchain_community.document_loaders import UnstructuredFileLoader -from langchain.text_splitter import CharacterTextSplitter -from langchain_community.vectorstores.faiss import FAISS from langchain_core.output_parsers.string import StrOutputParser from langchain_core.prompts.chat import ChatPromptTemplate -from langchain_nvidia_ai_endpoints import ChatNVIDIA, NVIDIAEmbeddings -from RetrievalAugmentedGeneration.common.base import BaseExample -from RetrievalAugmentedGeneration.common.utils import get_config, get_llm, get_embedding_model, create_vectorstore_langchain, get_docs_vectorstore_langchain, del_docs_vectorstore_langchain, get_text_splitter, get_vectorstore -from RetrievalAugmentedGeneration.common.tracing import langchain_instrumentation_class_wrapper + +from RAG.src.chain_server.base import BaseExample +from RAG.src.chain_server.tracing import langchain_instrumentation_class_wrapper +from RAG.src.chain_server.utils import ( + create_vectorstore_langchain, + del_docs_vectorstore_langchain, + get_config, + get_docs_vectorstore_langchain, + get_embedding_model, + get_llm, + get_prompts, + get_text_splitter, + get_vectorstore, +) logger = logging.getLogger(__name__) vector_store_path = "vectorstore.pkl" document_embedder = get_embedding_model() text_splitter = None settings = get_config() +prompts = get_prompts() try: vectorstore = create_vectorstore_langchain(document_embedder=document_embedder) @@ -40,11 +48,21 @@ vectorstore = None logger.info(f"Unable to connect to vector store during initialization: {e}") + @langchain_instrumentation_class_wrapper class NvidiaAPICatalog(BaseExample): - def ingest_docs(self, filepath: str, filename: str): - """Ingest documents to the VectorDB.""" - if not filename.endswith((".txt",".pdf",".md")): + def ingest_docs(self, filepath: str, filename: str) -> None: + """Ingests documents to the VectorDB. + It's called when the POST endpoint of `/documents` API is invoked. + + Args: + filepath (str): The path to the document file. + filename (str): The name of the document file. + + Raises: + ValueError: If there's an error during document ingestion or the file format is not supported. + """ + if not filename.endswith((".txt", ".pdf", ".md")): raise ValueError(f"{filename} is not a valid Text, PDF or Markdown file") try: # Load raw documents from the directory @@ -53,11 +71,15 @@ def ingest_docs(self, filepath: str, filename: str): if raw_documents: global text_splitter + # Get text splitter instance, it is selected based on environment variable APP_TEXTSPLITTER_MODELNAME + # tokenizer dimension of text splitter should be same as embedding model if not text_splitter: text_splitter = get_text_splitter() + # split documents based on configuration provided documents = text_splitter.split_documents(raw_documents) vs = get_vectorstore(vectorstore, document_embedder) + # ingest documents into vectorstore vs.add_documents(documents) else: logger.warning("No documents available to process!") @@ -65,61 +87,79 @@ def ingest_docs(self, filepath: str, filename: str): logger.error(f"Failed to ingest document due to exception {e}") raise ValueError("Failed to upload document. Please upload an unstructured text document.") - def llm_chain( - self, query: str, chat_history: List["Message"], **kwargs - ) -> Generator[str, None, None]: - """Execute a simple LLM chain using the components defined above.""" + def llm_chain(self, query: str, chat_history: List["Message"], **kwargs) -> Generator[str, None, None]: + """Execute a simple LLM chain using the components defined above. + It's called when the `/generate` API is invoked with `use_knowledge_base` set to `False`. + + Args: + query (str): Query to be answered by llm. + chat_history (List[Message]): Conversation history between user and chain. + """ logger.info("Using llm to generate response directly without knowledge base.") # WAR: Disable chat history (UI consistency). chat_history = [] - system_message = [("system", settings.prompts.chat_template)] + system_message = [("system", prompts.get("chat_template", ""))] conversation_history = [(msg.role, msg.content) for msg in chat_history] user_input = [("user", "{input}")] # Checking if conversation_history is not None and not empty - prompt_template = ChatPromptTemplate.from_messages( - system_message + conversation_history + user_input - ) if conversation_history else ChatPromptTemplate.from_messages( - system_message + user_input + prompt_template = ( + ChatPromptTemplate.from_messages(system_message + conversation_history + user_input) + if conversation_history + else ChatPromptTemplate.from_messages(system_message + user_input) ) llm = get_llm(**kwargs) + # Simple langchain chain to generate response based on user's query chain = prompt_template | llm | StrOutputParser() - augmented_user_input = ( - "\n\nQuestion: " + query + "\n" - ) + augmented_user_input = "\n\nQuestion: " + query + "\n" logger.info(f"Prompt used for response generation: {prompt_template.format(input=augmented_user_input)}") - return chain.stream({"input": augmented_user_input}, config={"callbacks":[self.cb_handler]}) + return chain.stream({"input": augmented_user_input}, config={"callbacks": [self.cb_handler]}) def rag_chain(self, query: str, chat_history: List["Message"], **kwargs) -> Generator[str, None, None]: - """Execute a Retrieval Augmented Generation chain using the components defined above.""" + """Execute a Retrieval Augmented Generation chain using the components defined above. + It's called when the `/generate` API is invoked with `use_knowledge_base` set to `True`. + + Args: + query (str): Query to be answered by llm. + chat_history (List[Message]): Conversation history between user and chain. + """ logger.info("Using rag to generate response from document") # WAR: Disable chat history (UI consistency). chat_history = [] - system_message = [("system", settings.prompts.rag_template)] + system_message = [("system", prompts.get("rag_template", ""))] conversation_history = [(msg.role, msg.content) for msg in chat_history] user_input = [("user", "{input}")] # Checking if conversation_history is not None and not empty - prompt_template = ChatPromptTemplate.from_messages( - system_message + conversation_history + user_input - ) if conversation_history else ChatPromptTemplate.from_messages( - system_message + user_input + prompt_template = ( + ChatPromptTemplate.from_messages(system_message + conversation_history + user_input) + if conversation_history + else ChatPromptTemplate.from_messages(system_message + user_input) ) llm = get_llm(**kwargs) + # Create a simple chain with conversation history and context chain = prompt_template | llm | StrOutputParser() try: vs = get_vectorstore(vectorstore, document_embedder) if vs != None: try: - logger.info(f"Getting retrieved top k values: {settings.retriever.top_k} with confidence threshold: {settings.retriever.score_threshold}") - retriever = vs.as_retriever(search_type="similarity_score_threshold", search_kwargs={"score_threshold": settings.retriever.score_threshold, "k": settings.retriever.top_k}) + logger.info( + f"Getting retrieved top k values: {settings.retriever.top_k} with confidence threshold: {settings.retriever.score_threshold}" + ) + retriever = vs.as_retriever( + search_type="similarity_score_threshold", + search_kwargs={ + "score_threshold": settings.retriever.score_threshold, + "k": settings.retriever.top_k, + }, + ) docs = retriever.get_relevant_documents(query, callbacks=[self.cb_handler]) except NotImplementedError: # Some retriever like milvus don't have similarity score threshold implemented @@ -129,37 +169,45 @@ def rag_chain(self, query: str, chat_history: List["Message"], **kwargs) -> Gene logger.debug(f"Retrieved documents are: {docs}") if not docs: logger.warning("Retrieval failed to get any relevant context") - return iter(["No response generated from LLM, make sure your query is relavent to the ingested document."]) + return iter( + ["No response generated from LLM, make sure your query is relavent to the ingested document."] + ) context = "" for doc in docs: context += doc.page_content + "\n\n" - augmented_user_input = ( - "Context: " + context + "\n\nQuestion: " + query + "\n" - ) + # Create input with context and user query to be ingested in prompt to retrieve contextal response from llm + augmented_user_input = "Context: " + context + "\n\nQuestion: " + query + "\n" - logger.info(f"Prompt used for response generation: {prompt_template.format(input=augmented_user_input)}") - return chain.stream({"input": augmented_user_input}, config={"callbacks":[self.cb_handler]}) + logger.info( + f"Prompt used for response generation: {prompt_template.format(input=augmented_user_input)}" + ) + return chain.stream({"input": augmented_user_input}, config={"callbacks": [self.cb_handler]}) except Exception as e: logger.warning(f"Failed to generate response due to exception {e}") - logger.warning( - "No response generated from LLM, make sure you've ingested document." - ) + logger.warning("No response generated from LLM, make sure you've ingested document.") return iter( - [ - "No response generated from LLM, make sure you have ingested document from the Knowledge Base Tab." - ] + ["No response generated from LLM, make sure you have ingested document from the Knowledge Base Tab."] ) def document_search(self, content: str, num_docs: int) -> List[Dict[str, Any]]: - """Search for the most relevant documents for the given search parameters.""" + """Search for the most relevant documents for the given search parameters. + It's called when the `/search` API is invoked. + + Args: + content (str): Query to be searched from vectorstore. + num_docs (int): Number of similar docs to be retrieved from vectorstore. + """ try: vs = get_vectorstore(vectorstore, document_embedder) if vs != None: try: - retriever = vs.as_retriever(search_type="similarity_score_threshold", search_kwargs={"score_threshold": settings.retriever.score_threshold, "k": settings.retriever.top_k}) + retriever = vs.as_retriever( + search_type="similarity_score_threshold", + search_kwargs={"score_threshold": settings.retriever.score_threshold, "k": num_docs}, + ) docs = retriever.get_relevant_documents(content, callbacks=[self.cb_handler]) except NotImplementedError: # Some retriever like milvus don't have similarity score threshold implemented @@ -169,10 +217,7 @@ def document_search(self, content: str, num_docs: int) -> List[Dict[str, Any]]: result = [] for doc in docs: result.append( - { - "source": os.path.basename(doc.metadata.get('source', '')), - "content": doc.page_content - } + {"source": os.path.basename(doc.metadata.get('source', '')), "content": doc.page_content} ) return result return [] @@ -180,7 +225,12 @@ def document_search(self, content: str, num_docs: int) -> List[Dict[str, Any]]: logger.error(f"Error from POST /search endpoint. Error details: {e}") def get_documents(self) -> List[str]: - """Retrieves filenames stored in the vector store.""" + """Retrieves filenames stored in the vector store. + It's called when the GET endpoint of `/documents` API is invoked. + + Returns: + List[str]: List of filenames ingested in vectorstore. + """ try: vs = get_vectorstore(vectorstore, document_embedder) if vs: @@ -189,12 +239,18 @@ def get_documents(self) -> List[str]: logger.error(f"Vectorstore not initialized. Error details: {e}") return [] + def delete_documents(self, filenames: List[str]) -> bool: + """Delete documents from the vector index. + It's called when the DELETE endpoint of `/documents` API is invoked. - def delete_documents(self, filenames: List[str]): - """Delete documents from the vector index.""" + Args: + filenames (List[str]): List of filenames to be deleted from vectorstore. + """ try: + # Get vectorstore instance vs = get_vectorstore(vectorstore, document_embedder) if vs: return del_docs_vectorstore_langchain(vs, filenames) except Exception as e: - logger.error(f"Vectorstore not initialized. Error details: {e}") \ No newline at end of file + logger.error(f"Vectorstore not initialized. Error details: {e}") + return False diff --git a/RAG/examples/basic_rag/langchain/docker-compose.yaml b/RAG/examples/basic_rag/langchain/docker-compose.yaml new file mode 100644 index 00000000..33483c56 --- /dev/null +++ b/RAG/examples/basic_rag/langchain/docker-compose.yaml @@ -0,0 +1,97 @@ +include: + - path: + - ../../local_deploy/docker-compose-vectordb.yaml + - ../../local_deploy/docker-compose-nim-ms.yaml + +services: + chain-server: + container_name: chain-server + image: chain-server:${TAG:-latest} + build: + # Set context to repo's root directory + context: ../../../../ + dockerfile: RAG/src/chain_server/Dockerfile + args: + # Build args, used to copy relevant directory inside the container relative to GenerativeAIExamples/RAG/examples + EXAMPLE_PATH: 'basic_rag/langchain' + volumes: + - ./prompt.yaml:/prompt.yaml + # start the server on port 8081 + command: --port 8081 --host 0.0.0.0 + environment: + # Path to example directory relative to GenerativeAIExamples/RAG/examples + EXAMPLE_PATH: 'basic_rag/langchain' + # URL on which vectorstore is hosted + APP_VECTORSTORE_URL: "http://milvus:19530" + # Type of vectordb used to store embedding supported type milvus, pgvector + APP_VECTORSTORE_NAME: "milvus" + # url on which llm model is hosted. If "", Nvidia hosted API is used + APP_LLM_MODELNAME: ${APP_LLM_MODELNAME:-"meta/llama3-70b-instruct"} + # embedding model engine used for inference, supported type nvidia-ai-endpoints, huggingface + APP_LLM_MODELENGINE: nvidia-ai-endpoints + APP_LLM_SERVERURL: ${APP_LLM_SERVERURL:-""} + APP_EMBEDDINGS_MODELNAME: ${APP_EMBEDDINGS_MODELNAME:-nvidia/nv-embedqa-e5-v5} + # embedding model engine used for inference, supported type nvidia-ai-endpoints + APP_EMBEDDINGS_MODELENGINE: ${APP_EMBEDDINGS_MODELENGINE:-nvidia-ai-endpoints} + # url on which embedding model is hosted. If "", Nvidia hosted API is used + APP_EMBEDDINGS_SERVERURL: ${APP_EMBEDDINGS_SERVERURL:-""} + # text splitter model name, it's fetched from huggingface + APP_TEXTSPLITTER_MODELNAME: Snowflake/snowflake-arctic-embed-l + APP_TEXTSPLITTER_CHUNKSIZE: 506 + APP_TEXTSPLITTER_CHUNKOVERLAP: 200 + NVIDIA_API_KEY: ${NVIDIA_API_KEY} + # vectorstore collection name to store embeddings + COLLECTION_NAME: ${COLLECTION_NAME:-nvidia_api_catalog} + APP_RETRIEVER_TOPK: 4 + APP_RETRIEVER_SCORETHRESHOLD: 0.25 + # observability server url + OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4317 + OTEL_EXPORTER_OTLP_PROTOCOL: grpc + # enable observability in chain server + ENABLE_TRACING: false + # Log level for server, supported level NOTSET, DEBUG, INFO, WARN, ERROR, CRITICAL + LOGLEVEL: ${LOGLEVEL:-INFO} + ports: + - "8081:8081" + expose: + - "8081" + shm_size: 5gb + depends_on: + nemollm-embedding: + condition: service_healthy + required: false + nemollm-inference: + condition: service_healthy + required: false + + rag-playground: + container_name: rag-playground + image: rag-playground:${TAG:-latest} + build: + # Set context to repo's root directory + context: ../../../../RAG/src/rag_playground/ + dockerfile: Dockerfile + args: + # select UI type, supported model default, speech + PLAYGROUND_MODE: ${PLAYGROUND_MODE:-default} + command: --port 8090 + environment: + # URL or chain server container + APP_SERVERURL: http://chain-server + APP_SERVERPORT: 8081 + # model name displayed on UI + APP_MODELNAME: ${APP_LLM_MODELNAME:-"meta/llama3-70b-instruct"} + OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4317 + OTEL_EXPORTER_OTLP_PROTOCOL: grpc + # enable observability in rag playground + ENABLE_TRACING: false + ports: + - "8090:8090" + expose: + - "8090" + depends_on: + - chain-server + +networks: + default: + name: nvidia-rag diff --git a/RAG/examples/basic_rag/langchain/prompt.yaml b/RAG/examples/basic_rag/langchain/prompt.yaml new file mode 100644 index 00000000..ebbaa8d9 --- /dev/null +++ b/RAG/examples/basic_rag/langchain/prompt.yaml @@ -0,0 +1,9 @@ +chat_template: | + You are a helpful, respectful and honest assistant. + Always answer as helpfully as possible, while being safe. + Please ensure that your responses are positive in nature. + +rag_template: | + You are a helpful AI assistant named Envie. + You will reply to questions only based on the context that you are provided. + If something is out of context, you will refrain from replying and politely decline to respond to the user. \ No newline at end of file diff --git a/RAG/examples/basic_rag/llamaindex/README.md b/RAG/examples/basic_rag/llamaindex/README.md new file mode 100644 index 00000000..627feff5 --- /dev/null +++ b/RAG/examples/basic_rag/llamaindex/README.md @@ -0,0 +1,76 @@ + + +# Basic RAG Using LlamaIndex + +## Example Features + +This example deploys a basic RAG pipeline for chat Q&A and serves inferencing from an NVIDIA API Catalog endpoint. +You do not need a GPU on your machine to run this example. + +| Model | Embedding | Framework | Vector Database | File Types | +| ----------------------- | ------------------------ | ---------- | --------------- | ------------------------------------ | +| meta/llama3-8b-instruct | nvidia/nv-embedqa-e5-v5 | LlamaIndex | Milvus | HTML, TXT, PDF, MD, DOCX, PPTX, XLSX | + +![Diagram](../../../../docs/images/basic_rag_llamaindex_arch.png) + +## Prerequisites + +Complete the [common prerequisites](../../../../docs/common-prerequisites.md). + +## Build and Start the Containers + +1. Export your NVIDIA API key as an environment variable: + + ```text + export NVIDIA_API_KEY="nvapi-<...>" + ``` + +1. Start the containers: + + ```console + cd RAG/examples/basic_rag/llamaindex/ + docker compose up -d --build + ``` + + *Example Output* + + ```output + ✔ Network nvidia-rag Created + ✔ Container rag-playground Started + ✔ Container milvus-minio Started + ✔ Container chain-server Started + ✔ Container milvus-etcd Started + ✔ Container milvus-standalone Started + ``` + +1. Confirm the containers are running: + + ```console + docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}" + ``` + + *Example Output* + + ```output + CONTAINER ID NAMES STATUS + 39a8524829da rag-playground Up 2 minutes + bfbd0193dbd2 chain-server Up 2 minutes + ec02ff3cc58b milvus-standalone Up 3 minutes + 6969cf5b4342 milvus-minio Up 3 minutes (healthy) + 57a068d62fbb milvus-etcd Up 3 minutes (healthy) + ``` + +1. Open a web browser and access to use the RAG Playground. + + Refer to [Using the Sample Web Application](../../../../docs/using-sample-web-application.md) + for information about uploading documents and using the web interface. + +## Next Steps + +- [Vector Database Customizations](../../../../docs/vector-database.md) +- Stop the containers by running `docker compose down`. +- Use the [RAG Application: Text QA Chatbot](https://registry.ngc.nvidia.com/orgs/ohlfw0olaadg/teams/ea-participants/helm-charts/rag-app-text-chatbot) + Helm chart to deploy this example in Kubernetes. diff --git a/RetrievalAugmentedGeneration/__init__.py b/RAG/examples/basic_rag/llamaindex/__init__.py similarity index 95% rename from RetrievalAugmentedGeneration/__init__.py rename to RAG/examples/basic_rag/llamaindex/__init__.py index e42268fe..9ba9d431 100644 --- a/RetrievalAugmentedGeneration/__init__.py +++ b/RAG/examples/basic_rag/llamaindex/__init__.py @@ -11,4 +11,4 @@ # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and -# limitations under the License. \ No newline at end of file +# limitations under the License. diff --git a/RetrievalAugmentedGeneration/examples/developer_rag/chains.py b/RAG/examples/basic_rag/llamaindex/chains.py similarity index 54% rename from RetrievalAugmentedGeneration/examples/developer_rag/chains.py rename to RAG/examples/basic_rag/llamaindex/chains.py index 65b4c6c2..3b61774b 100644 --- a/RetrievalAugmentedGeneration/examples/developer_rag/chains.py +++ b/RAG/examples/basic_rag/llamaindex/chains.py @@ -14,50 +14,41 @@ # limitations under the License. """LLM Chains for executing Retrival Augmented Generation.""" -import os import logging -import nltk +import os from pathlib import Path -from typing import Generator, List, Dict, Any - -from llama_index.core.prompts.base import Prompt -from llama_index.core.readers import download_loader -from llama_index.core.query_engine import RetrieverQueryEngine -from llama_index.core.base.response.schema import StreamingResponse -from llama_index.core.node_parser import LangchainNodeParser -from llama_index.llms.langchain import LangChainLLM -from llama_index.embeddings.langchain import LangchainEmbedding -from RetrievalAugmentedGeneration.common.tracing import llama_index_cb_handler -from llama_index.core import Settings -from llama_index.core.callbacks import CallbackManager +from typing import Any, Dict, Generator, List from langchain_core.output_parsers.string import StrOutputParser from langchain_core.prompts.chat import ChatPromptTemplate +from llama_index.core import Settings +from llama_index.core.base.response.schema import StreamingResponse +from llama_index.core.callbacks import CallbackManager +from llama_index.core.node_parser import LangchainNodeParser +from llama_index.core.prompts.base import Prompt +from llama_index.core.query_engine import RetrieverQueryEngine +from llama_index.readers.file import PDFReader, UnstructuredReader -from RetrievalAugmentedGeneration.common.utils import ( +from RAG.src.chain_server.base import BaseExample +from RAG.src.chain_server.tracing import langchain_instrumentation_class_wrapper, llama_index_cb_handler +from RAG.src.chain_server.utils import ( LimitRetrievedNodesLength, + del_docs_vectorstore_llamaindex, get_config, get_doc_retriever, + get_docs_vectorstore_llamaindex, + get_embedding_model, get_llm, + get_prompts, get_text_splitter, get_vector_index, set_service_context, - get_embedding_model, - get_docs_vectorstore_llamaindex, - del_docs_vectorstore_llamaindex, -) -from RetrievalAugmentedGeneration.common.base import BaseExample -from RetrievalAugmentedGeneration.common.tracing import ( - langchain_instrumentation_class_wrapper, ) -# nltk downloader -# nltk.download("averaged_perceptron_tagger") - # prestage the embedding model _ = get_embedding_model() set_service_context() - +prompts = get_prompts() logger = logging.getLogger(__name__) text_splitter = None @@ -65,109 +56,131 @@ @langchain_instrumentation_class_wrapper class QAChatbot(BaseExample): + def ingest_docs(self, filepath: str, filename: str) -> None: + """Ingests documents to the VectorDB. + It's called when the POST endpoint of `/documents` API is invoked. - def ingest_docs(self, filepath: str, filename: str): - """Ingest documents to the VectorDB.""" + Args: + filepath (str): The path to the document file. + filename (str): The name of the document file. + + Raises: + ValueError: If there's an error during document ingestion or the file format is not supported. + """ try: + # Set callback manager for observability Settings.callback_manager = CallbackManager([llama_index_cb_handler]) logger.info(f"Ingesting {filename} in vectorDB") _, ext = os.path.splitext(filename) + # Load data based on file extension if ext.lower() == ".pdf": - PDFReader = download_loader("PDFReader") loader = PDFReader() documents = loader.load_data(file=Path(filepath)) - else: - unstruct_reader = download_loader("UnstructuredReader") - loader = unstruct_reader() + loader = UnstructuredReader() documents = loader.load_data(file=Path(filepath), split_documents=False) - filename = filename[:-4] - + # Add filename as metadata to each document for document in documents: document.metadata = {"filename": filename, "common_field": "all"} + # do not generate embedding for filename and page_label document.excluded_embed_metadata_keys = ["filename", "page_label"] + # Get vectorstore instance, vectorstore is selected based on environment variable APP_VECTORSTORE_NAME defaults to milvus index = get_vector_index() global text_splitter + # Get text splitter instance, text splitter is selected based on environment variable APP_TEXTSPLITTER_MODELNAME + # tokenizer dimension of text splitter should be same as embedding model if not text_splitter: text_splitter = get_text_splitter() + + # Create nodes using existing text splitter node_parser = LangchainNodeParser(text_splitter) nodes = node_parser.get_nodes_from_documents(documents) + + # Ingest document in vectorstore index.insert_nodes(nodes) logger.info(f"Document {filename} ingested successfully") except Exception as e: logger.error(f"Failed to ingest document due to exception {e}") - raise ValueError( - "Failed to upload document. Please upload an unstructured text document." - ) - - def get_documents(self): - """Retrieves filenames stored in the vector store.""" + raise ValueError("Failed to upload document. Please upload an unstructured text document.") + + def get_documents(self) -> List[str]: + """Retrieves filenames stored in the vector store. + It's called when the GET endpoint of `/documents` API is invoked. + + Returns: + List[str]: List of filenames ingested in vectorstore. + """ return get_docs_vectorstore_llamaindex() - def delete_documents(self, filenames: List[str]): - """Delete documents from the vector index.""" + def delete_documents(self, filenames: List[str]) -> bool: + """Delete documents from the vector index. + It's called when the DELETE endpoint of `/documents` API is invoked. + + Args: + filenames (List[str]): List of filenames to be deleted from vectorstore. + """ return del_docs_vectorstore_llamaindex(filenames) - def llm_chain( - self, query: str, chat_history: List["Message"], **kwargs - ) -> Generator[str, None, None]: - """Execute a simple LLM chain using the components defined above.""" + def llm_chain(self, query: str, chat_history: List["Message"], **kwargs) -> Generator[str, None, None]: + """Execute a simple LLM chain using the components defined above. + It's called when the `/generate` API is invoked with `use_knowledge_base` set to `False`. + + Args: + query (str): Query to be answered by llm. + chat_history (List[Message]): Conversation history between user and chain. + """ logger.info("Using llm to generate response directly without knowledge base.") set_service_context(**kwargs) # TODO Include chat_history - prompt = get_config().prompts.chat_template + prompt = prompts.get("chat_template", "") logger.info(f"Prompt used for response generation: {prompt}") system_message = [("system", prompt)] user_input = [("user", "{query_str}")] - prompt_template = ChatPromptTemplate.from_messages( - system_message + user_input - ) + prompt_template = ChatPromptTemplate.from_messages(system_message + user_input) llm = get_llm(**kwargs) + # Simple langchain chain to generate response based on user's query chain = prompt_template | llm | StrOutputParser() - return chain.stream( - {"query_str": query}, - config={"callbacks": [self.cb_handler]}, - ) + return chain.stream({"query_str": query}, config={"callbacks": [self.cb_handler]},) + + def rag_chain(self, query: str, chat_history: List["Message"], **kwargs) -> Generator[str, None, None]: + """Execute a Retrieval Augmented Generation chain using the components defined above. + It's called when the `/generate` API is invoked with `use_knowledge_base` set to `True`. - def rag_chain( - self, query: str, chat_history: List["Message"], **kwargs - ) -> Generator[str, None, None]: - """Execute a Retrieval Augmented Generation chain using the components defined above.""" + Args: + query (str): Query to be answered by llm. + chat_history (List[Message]): Conversation history between user and chain. + """ logger.info("Using rag to generate response from document") + # update llm model, embedding model and callback for llamaindex context set_service_context(**kwargs) retriever = get_doc_retriever(num_nodes=get_config().retriever.top_k) - qa_template = Prompt(get_config().prompts.rag_template) + qa_template = Prompt(prompts.get("rag_template", "")) logger.info(f"Prompt template used for response generation: {qa_template}") # Handling Retrieval failure nodes = retriever.retrieve(query) + # If no document is retrieved from docstore, send fallback response if not nodes: logger.warning("Retrieval failed to get any relevant context") - return iter( - [ - "No response generated from LLM, make sure your query is relavent to the ingested document." - ] - ) + return iter(["No response generated from LLM, make sure your query is relavent to the ingested document."]) # TODO Include chat_history + # create llamaindex query_engine object to generate response query_engine = RetrieverQueryEngine.from_args( - retriever, - text_qa_template=qa_template, - node_postprocessors=[LimitRetrievedNodesLength()], - streaming=True, + retriever, text_qa_template=qa_template, node_postprocessors=[LimitRetrievedNodesLength()], streaming=True, ) response = query_engine.query(query) @@ -175,16 +188,21 @@ def rag_chain( if isinstance(response, StreamingResponse): return response.response_gen - logger.warning( - "No response generated from LLM, make sure you've ingested document." - ) + logger.warning("No response generated from LLM, make sure you've ingested document.") return StreamingResponse(iter(["No response generated from LLM, make sure you have ingested document from the Knowledge Base Tab."])).response_gen # type: ignore def document_search(self, content: str, num_docs: int) -> List[Dict[str, Any]]: - """Search for the most relevant documents for the given search parameters.""" + """Search for the most relevant documents for the given search parameters. + It's called when the `/search` API is invoked. + + Args: + content (str): Query to be searched from vectorstore. + num_docs (int): Number of similar docs to be retrieved from vectorstore. + """ try: - retriever = get_doc_retriever(num_nodes=get_config().retriever.top_k) + # Get retriever instance + retriever = get_doc_retriever(num_nodes=num_docs) nodes = retriever.retrieve(content) output = [] for node in nodes: diff --git a/RAG/examples/basic_rag/llamaindex/docker-compose.yaml b/RAG/examples/basic_rag/llamaindex/docker-compose.yaml new file mode 100644 index 00000000..520f7037 --- /dev/null +++ b/RAG/examples/basic_rag/llamaindex/docker-compose.yaml @@ -0,0 +1,99 @@ +include: + - path: + - ../../local_deploy/docker-compose-vectordb.yaml + - ../../local_deploy/docker-compose-nim-ms.yaml + +services: + chain-server: + container_name: chain-server + image: chain-server:${TAG:-latest} + build: + # Set context to repo's root directory + context: ../../../../ + dockerfile: RAG/src/chain_server/Dockerfile + args: + # Build args, used to copy relevant directory inside the container relative to GenerativeAIExamples/RAG/examples + EXAMPLE_PATH: 'basic_rag/llamaindex' + volumes: + - ./prompt.yaml:/prompt.yaml + # start the server on port 8081 + command: --port 8081 --host 0.0.0.0 + environment: + # Path to example directory relative to GenerativeAIExamples/RAG/examples + EXAMPLE_PATH: 'basic_rag/llamaindex' + # URL on which vectorstore is hosted + APP_VECTORSTORE_URL: "http://milvus:19530" + # Type of vectordb used to store embedding supported type milvus, pgvector + APP_VECTORSTORE_NAME: "milvus" + APP_EMBEDDINGS_MODELNAME: ${APP_EMBEDDINGS_MODELNAME:-nvidia/nv-embedqa-e5-v5} + # embedding model engine used for inference, supported type nvidia-ai-endpoints, huggingface + APP_EMBEDDINGS_MODELENGINE: ${APP_EMBEDDINGS_MODELENGINE:-nvidia-ai-endpoints} + # url on which embedding model is hosted. If "", Nvidia hosted API is used + APP_EMBEDDINGS_SERVERURL: ${APP_EMBEDDINGS_SERVERURL:-""} + # url on which llm model is hosted. If "", Nvidia hosted API is used + APP_LLM_SERVERURL: ${APP_LLM_SERVERURL:-""} + APP_LLM_MODELNAME: ${APP_LLM_MODELNAME:-"meta/llama3-8b-instruct"} + # embedding model engine used for inference, supported type nvidia-ai-endpoints + APP_LLM_MODELENGINE: ${APP_LLM_MODELENGINE:-nvidia-ai-endpoints} + NVIDIA_API_KEY: ${NVIDIA_API_KEY} + # vectorstore collection name to store embeddings + COLLECTION_NAME: ${COLLECTION_NAME:-developer_rag} + APP_RETRIEVER_TOPK: 4 + APP_RETRIEVER_SCORETHRESHOLD: 0.25 + # observability server url + OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4317 + OTEL_EXPORTER_OTLP_PROTOCOL: grpc + # enable observability in chain server + ENABLE_TRACING: false + # text splitter model name, it's fetched from huggingface + APP_TEXTSPLITTER_MODELNAME: Snowflake/snowflake-arctic-embed-l + APP_TEXTSPLITTER_CHUNKSIZE: 506 + APP_TEXTSPLITTER_CHUNKOVERLAP: 200 + # Log level for server, supported level NOTSET, DEBUG, INFO, WARN, ERROR, CRITICAL + LOGLEVEL: ${LOGLEVEL:-INFO} + ports: + - "8081:8081" + expose: + - "8081" + shm_size: 5gb + depends_on: + nemollm-embedding: + condition: service_healthy + required: false + nemollm-inference: + condition: service_healthy + required: false + + + rag-playground: + container_name: rag-playground + image: rag-playground:${TAG:-latest} + build: + # Set context to repo's root directory + context: ../../../../RAG/src/rag_playground/ + dockerfile: Dockerfile + args: + # select UI type, supported model default, speech + PLAYGROUND_MODE: ${PLAYGROUND_MODE:-default} + command: --port 8090 + environment: + # URL or chain server container + APP_SERVERURL: http://chain-server + APP_SERVERPORT: 8081 + # model name displayed on UI + APP_MODELNAME: ${APP_LLM_MODELNAME:-"meta/llama3-8b-instruct"} + # observability server url + OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4317 + OTEL_EXPORTER_OTLP_PROTOCOL: grpc + # enable observability in rag playground + ENABLE_TRACING: false + ports: + - "8090:8090" + expose: + - "8090" + depends_on: + - chain-server + +networks: + default: + name: nvidia-rag diff --git a/RAG/examples/basic_rag/llamaindex/prompt.yaml b/RAG/examples/basic_rag/llamaindex/prompt.yaml new file mode 100644 index 00000000..4bf764a0 --- /dev/null +++ b/RAG/examples/basic_rag/llamaindex/prompt.yaml @@ -0,0 +1,10 @@ +chat_template: | + You are a helpful, respectful and honest assistant. + Always answer as helpfully as possible, while being safe. + Please ensure that your responses are positive in nature. + +rag_template: | + Use the following context to answer the user's question. If you don't know the answer, + just say that you don't know, don't try to make up an answer. + Context: {context_str} Question: {query_str} Only return the helpful + answer below and nothing else. Helpful answer: \ No newline at end of file diff --git a/RAG/examples/local_deploy/.env b/RAG/examples/local_deploy/.env new file mode 100644 index 00000000..3aff5614 --- /dev/null +++ b/RAG/examples/local_deploy/.env @@ -0,0 +1,9 @@ +# Set this when using on-prem models +NGC_API_KEY=${NGC_API_KEY} + +# Path where models will be stored and cached for NIM's +# NOTE: This should be an absolute path and not relative path +MODEL_DIRECTORY=${PWD} + +# Default value of user id if not provided explicitly +USERID=1000 \ No newline at end of file diff --git a/RAG/examples/local_deploy/README.md b/RAG/examples/local_deploy/README.md new file mode 100644 index 00000000..216da91d --- /dev/null +++ b/RAG/examples/local_deploy/README.md @@ -0,0 +1,110 @@ + + +# On Premises Deployment Using NVIDIA NIM microservices with GPUs + +You can adapt any example to use on premises machines and NVIDIA NIM microservices. +By performing the additional prerequisites that are required to get access to the containers and use GPUs with Docker, +you can use local machines with GPUs and local microservices instead of NVIDIA API Catalog endpoints. + +## Prerequisites + +- You have an active subscription to an NVIDIA AI Enterprise product or you are an [NVIDIA Developer Program](https://developer.nvidia.com/developer-program) member. + +- Complete the [common prerequisites](../../../docs/common-prerequisites.md). + + Ensure that you configure the host with the NVIDIA Container Toolkit. + +- A host with at least two NVIDIA A100, H100, or L40S GPUs. + + You need at least one GPU for the inference container and one GPU for the embedding container. + By default, Milvus requires one GPU as well. + +- You have an NGC API key. + Refer to [Generating NGC API Keys](https://docs.nvidia.com/ngc/gpu-cloud/ngc-user-guide/index.html#generating-api-key) + in the _NVIDIA NGC User Guide_ for more information. + +## Start the Containers + +1. Export NGC related environment variables: + + ```text + export NGC_API_KEY="M2..." + ``` + +1. Create a directory to cache the models and export the path to the cache as an environment variable: + + ```console + mkdir -p ~/.cache/model-cache + export MODEL_DIRECTORY=~/.cache/model-cache + ``` + +1. Export the connection information for the inference and embedding services: + + ```console + export APP_LLM_SERVERURL="nemollm-inference:8000" + export APP_EMBEDDINGS_SERVERURL="nemollm-embedding:8000" + ``` + +1. Start the example-specific containers. + + Replace the path in the following `cd` command with the path to the example that you want to run. + + ```console + cd RAG/examples/basic_rag/langchain + USERID=$(id -u) docker compose --profile local-nim --profile milvus up -d --build + ``` + + *Example Output* + + ```output + ✔ Container milvus-minio Running + ✔ Container chain-server Running + ✔ Container nemo-retriever-embedding-microservice Started + ✔ Container milvus-etcd Running + ✔ Container nemollm-inference-microservice Started + ✔ Container rag-playground Started + ✔ Container milvus-standalone Started + ``` + +1. Optional: Deploy Reranking service if needed by your example. This is required currently for only the [Multi-Turn Rag Example](../advanced_rag/multi_turn_rag/). + ```console + export APP_RANKING_SERVERURL="ranking-ms:8000" + cd RAG/examples/local_deploy + USERID=$(id -u) docker compose -f docker-compose-nim-ms.yaml up -d ranking-ms + ``` + +2. Open a web browser and access to use the RAG Playground. + + Refer to [Using the Sample Web Application](../../../docs/using-sample-web-application.md) + for information about uploading documents and using the web interface. + +## Tips for GPU Use + +When you start the microservices in the `local_deploy` directory, you can specify the GPUs use by setting the following environment variables before you run `docker compose up`. + +INFERENCE_GPU_COUNT: + Specify the number of GPUs to use with the NVIDIA NIM for LLMs container. + +EMBEDDING_MS_GPU_ID: + Specify the GPU IDs to use with the NVIDIA NeMo Retriever Text Embedding NIM container. + +RANKING_MS_GPU_ID: + Specify the GPU IDs to use with the NVIDIA NeMo Retriever Text Reranking NIM container. + +VECTORSTORE_GPU_DEVICE_ID: + Specify the GPU IDs to use with Milvus. + +## Related Information + +- [*NVIDIA NIM for LLMs*](https://docs.nvidia.com/nim/large-language-models/latest/index.html) + +The preceding document frequently demonstrates using the curl command to interact with the microservices. +You can determine the IP address for each container by running `docker network inspect nvidia-rag | jq '.[].Containers[] | {Name, IPv4Address}'`. + +## Next Steps + +- [Vector Database Customizations](../../../docs/vector-database.md) +- Stop the containers by running `docker compose --profile local-nim down`. diff --git a/RAG/examples/local_deploy/docker-compose-nim-ms.yaml b/RAG/examples/local_deploy/docker-compose-nim-ms.yaml new file mode 100644 index 00000000..eb44f8ac --- /dev/null +++ b/RAG/examples/local_deploy/docker-compose-nim-ms.yaml @@ -0,0 +1,86 @@ +services: + nemollm-inference: + container_name: nemollm-inference-microservice + image: nvcr.io/nim/meta/llama3-8b-instruct:1.0.0 + volumes: + - ${MODEL_DIRECTORY}:/opt/nim/.cache + user: "${USERID}" + ports: + - "8000:8000" + expose: + - "8000" + environment: + NGC_API_KEY: ${NGC_API_KEY} + shm_size: 20gb + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: ${INFERENCE_GPU_COUNT:-all} + # device_ids: ['${LLM_MS_GPU_ID:-0}'] + capabilities: [gpu] + healthcheck: + test: ["CMD", "python3", "-c", "import requests; requests.get('http://localhost:8000/v1/health/ready')"] + interval: 10s + timeout: 20s + retries: 100 + profiles: ["local-nim", "nemo-retriever"] + + nemollm-embedding: + container_name: nemo-retriever-embedding-microservice + image: nvcr.io/nim/nvidia/nv-embedqa-e5-v5:1.0.0 + volumes: + - ${MODEL_DIRECTORY}:/opt/nim/.cache + ports: + - "9080:8000" + expose: + - "8000" + environment: + NGC_API_KEY: ${NGC_API_KEY} + user: "${USERID}" + shm_size: 16GB + deploy: + resources: + reservations: + devices: + - driver: nvidia + device_ids: ['${EMBEDDING_MS_GPU_ID:-0}'] + capabilities: [gpu] + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8000/v1/health/ready"] + interval: 30s + timeout: 20s + retries: 3 + start_period: 10m + profiles: ["local-nim", "nemo-retriever"] + + ranking-ms: + container_name: nemo-retriever-ranking-microservice + image: nvcr.io/nim/nvidia/nv-rerankqa-mistral-4b-v3:1.0.0 + volumes: + - ${MODEL_DIRECTORY}:/opt/nim/.cache + ports: + - "1976:8000" + expose: + - "8000" + environment: + NGC_API_KEY: ${NGC_API_KEY} + user: "${USERID}" + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8000/health"] + interval: 10s + timeout: 20s + retries: 100 + deploy: + resources: + reservations: + devices: + - driver: nvidia + device_ids: ['${RANKING_MS_GPU_ID:-0}'] + capabilities: [gpu] + profiles: ["nemo-retriever"] + +networks: + default: + name: nvidia-rag diff --git a/deploy/compose/docker-compose-vectordb.yaml b/RAG/examples/local_deploy/docker-compose-vectordb.yaml similarity index 88% rename from deploy/compose/docker-compose-vectordb.yaml rename to RAG/examples/local_deploy/docker-compose-vectordb.yaml index 98c625ab..cd76bc98 100644 --- a/deploy/compose/docker-compose-vectordb.yaml +++ b/RAG/examples/local_deploy/docker-compose-vectordb.yaml @@ -12,7 +12,7 @@ services: - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-password} - POSTGRES_USER=${POSTGRES_USER:-postgres} - POSTGRES_DB=${POSTGRES_DB:-api} - profiles: ["llm-embedding"] + profiles: ["pgvector"] etcd: @@ -31,7 +31,7 @@ services: interval: 30s timeout: 20s retries: 3 - profiles: ["llm-embedding", "nemo-retriever"] + profiles: ["nemo-retriever", "milvus", ""] minio: container_name: milvus-minio @@ -50,11 +50,11 @@ services: interval: 30s timeout: 20s retries: 3 - profiles: ["llm-embedding", "nemo-retriever"] + profiles: ["nemo-retriever", "milvus", ""] milvus: container_name: milvus-standalone - image: milvusdb/milvus:v2.4.4-gpu + image: milvusdb/milvus:v2.4.5 command: ["milvus", "run", "standalone"] environment: ETCD_ENDPOINTS: etcd:2379 @@ -74,14 +74,7 @@ services: depends_on: - "etcd" - "minio" - deploy: - resources: - reservations: - devices: - - driver: nvidia - capabilities: ["gpu"] - device_ids: ['${VECTORSTORE_GPU_DEVICE_ID:-0}'] - profiles: ["llm-embedding", "nemo-retriever"] + profiles: ["nemo-retriever", "milvus", ""] elasticsearch: image: "docker.elastic.co/elasticsearch/elasticsearch:8.12.0" diff --git a/RAG/notebooks/README.md b/RAG/notebooks/README.md new file mode 100644 index 00000000..b1aa52e1 --- /dev/null +++ b/RAG/notebooks/README.md @@ -0,0 +1,54 @@ + + +# Running RAG Example Notebooks + + +* [About the Notebooks](#about-the-notebooks) +* [Prerequisites](#prerequisites) +* [Running the Notebooks](#running-the-notebooks) + + + +## About the Notebooks + +The notebooks show how to use the `langchain-nvidia-ai-endpoints` and `llama-index-embeddings-nvidia` Python packages. +These packages provide the basics for developing a RAG application and performing inference either from NVIDIA API Catalog endpoints or a local deployment of NVIDIA microservices. + +## Prerequisites + +- You have Python 3 installed. +- Complete the [common prerequisites](../../docs/common-prerequisites.md). + +## Running the Notebooks + +1. Export your NVIDIA API key as an environment variable: + + ```text + export NVIDIA_API_KEY="nvapi-<...>" + ``` + +1. Create a virtual environment: + + ```console + python3 -m venv .venv + source .venv/bin/activate + ``` + +1. Install JupyterLab in the virtual environment: + + ```console + pip3 install jupyterlab + ``` + +1. Start the JupyterLab server: + + ```console + jupyter lab --allow-root --ip=0.0.0.0 --NotebookApp.token='' --port=8889 + ``` + +1. Open a web browser and access . + + Browse to the `RAG/notebooks` directory to open an execute the cells of the notebooks. diff --git a/experimental/multimodal_assistant/llm/__init__.py b/RAG/notebooks/__init__.py similarity index 100% rename from experimental/multimodal_assistant/llm/__init__.py rename to RAG/notebooks/__init__.py diff --git a/notebooks/04_Agent_use_tools_leveraging_NVIDIA_AI_endpoints.ipynb b/RAG/notebooks/langchain/Agent_use_tools_leveraging_NVIDIA_AI_endpoints.ipynb similarity index 86% rename from notebooks/04_Agent_use_tools_leveraging_NVIDIA_AI_endpoints.ipynb rename to RAG/notebooks/langchain/Agent_use_tools_leveraging_NVIDIA_AI_endpoints.ipynb index b38f28dd..32f9fd38 100644 --- a/notebooks/04_Agent_use_tools_leveraging_NVIDIA_AI_endpoints.ipynb +++ b/RAG/notebooks/langchain/Agent_use_tools_leveraging_NVIDIA_AI_endpoints.ipynb @@ -5,25 +5,15 @@ "id": "481943fc", "metadata": {}, "source": [ - "# Multimodal Models from NVIDIA AI Catelog and AI Catalog with LangChain Agent \n", - "\n", + "# Multimodal Models from NVIDIA AI Catalog and LangChain Agent \n", "\n", "## Prerequisites\n", "\n", - "To run this notebook, you need the following:\n", - "\n", - "1. Performed the [setup](https://python.langchain.com/docs/integrations/text_embedding/nvidia_ai_endpoints#setup) and generated an API key.\n", - "\n", - "2. Installed Python dependencies from [requirements.txt](https://github.com/NVIDIA/GenerativeAIExamples/blob/main/notebooks/requirements.txt).\n", - "\n", - "3. Installed additional packages for this notebook: \n", - "\n", - " pip install gradio matplotlib scikit-image\n", - "\n", + "To run this notebook, you need to [follow the steps from here](https://python.langchain.com/docs/integrations/text_embedding/nvidia_ai_endpoints#setup) and generate an API key from [NVIDIA API Catalog](https://build.nvidia.com/).\n", "\n", "This notebook covers the following custom plug-in components:\n", "\n", - "- LLM using **ai-mixtral-8x7b-instruct**\n", + "- LLM using **mixtral-8x7b-instruct**\n", " \n", "- A NVIDIA AI Catalog **Deplot** as one of the tool\n", "\n", @@ -33,7 +23,7 @@ "\n", "At the end of the day, as below illustrated, we would like to have a UI which allow user to upload image of their choice and have the agent choose tools to do visual reasoning. \n", "\n", - "![interactive UI](./imgs/visual_reasoning.png) \n", + "![interactive UI](./data/imgs/visual_reasoning.png) \n", "Note: As one can see, since we are using NVIDIA AI Catalog as an API, there is no further requirement in the prerequisites about GPUs as compute hardware\n" ] }, @@ -44,9 +34,9 @@ "metadata": {}, "outputs": [], "source": [ - "# uncomment the below to install additional python packages.\n", - "#!pip install unstructured\n", - "#!pip install matplotlib scikit-image\n", + "# Install python packages.\n", + "!pip install langchain==0.2.5\n", + "!pip install langchain-nvidia-ai-endpoints==0.1.2\n", "!pip install gradio==3.48.0" ] }, @@ -71,12 +61,12 @@ "\n", "# del os.environ['NVIDIA_API_KEY'] ## delete key and reset\n", "if os.environ.get(\"NVIDIA_API_KEY\", \"\").startswith(\"nvapi-\"):\n", + " nvapi_key = os.environ.get(\"NVIDIA_API_KEY\", \"\")\n", " print(\"Valid NVIDIA_API_KEY already in environment. Delete to reset\")\n", "else:\n", " nvapi_key = getpass.getpass(\"NVAPI Key (starts with nvapi-): \")\n", " assert nvapi_key.startswith(\"nvapi-\"), f\"{nvapi_key[:5]}... is not a valid key\"\n", - " os.environ[\"NVIDIA_API_KEY\"] = nvapi_key\n", - "global nvapi_key" + " os.environ[\"NVIDIA_API_KEY\"] = nvapi_key" ] }, { @@ -84,7 +74,7 @@ "id": "de94bb16", "metadata": {}, "source": [ - "### Step 2 - wrap the Fuyu API call into a function and verify by supplying an image to get a respond" + "### Step 2 - Wrap the Fuyu API call into a function and verify by supplying an image to get a respond" ] }, { @@ -94,8 +84,6 @@ "metadata": {}, "outputs": [], "source": [ - "import openai, httpx, sys\n", - "\n", "import base64, io\n", "from PIL import Image\n", "import requests, json\n", @@ -128,11 +116,11 @@ "def fuyu(prompt,img_path):\n", " invoke_url = \"https://ai.api.nvidia.com/v1/vlm/adept/fuyu-8b\"\n", " stream = True\n", - " \n", - " \n", + "\n", + "\n", " image_b64=img2base64_string(img_path)\n", - " \n", - " \n", + "\n", + "\n", " assert len(image_b64) < 200_000, \\\n", " \"To upload larger images, use the assets API (see docs)\"\n", "\n", @@ -140,7 +128,7 @@ " \"Authorization\": f\"Bearer {nvapi_key}\",\n", " \"Accept\": \"text/event-stream\" if stream else \"application/json\"\n", " }\n", - " \n", + "\n", " payload = {\n", " \"messages\": [\n", " {\n", @@ -154,9 +142,9 @@ " \"seed\": 0,\n", " \"stream\": stream\n", " }\n", - " \n", + "\n", " response = requests.post(invoke_url, headers=headers, json=payload)\n", - " \n", + "\n", " if stream:\n", " output=[]\n", " for line in response.iter_lines():\n", @@ -173,7 +161,7 @@ "id": "b637395f", "metadata": {}, "source": [ - "fetch a test image of a pair of white sneakers and verify the function works" + "Fetch a test image of a pair of white sneakers and verify the function works" ] }, { @@ -183,7 +171,7 @@ "metadata": {}, "outputs": [], "source": [ - "!wget \"https://docs.google.com/uc?export=download&id=12ZpBBFkYu-jzz1iz356U5kMikn4uN9ww\" -O ./toy_data/jordan.png" + "!wget \"https://docs.google.com/uc?export=download&id=12ZpBBFkYu-jzz1iz356U5kMikn4uN9ww\" -O ./data/imgs/jordan.png" ] }, { @@ -193,7 +181,7 @@ "metadata": {}, "outputs": [], "source": [ - "img_path=\"./toy_data/jordan.png\"\n", + "img_path=\"./data/imgs/jordan.png\"\n", "prompt=\"describe the image\"\n", "out=fuyu(prompt,img_path)\n", "out" @@ -216,24 +204,7 @@ "source": [ "# test run and see that you can genreate a respond successfully\n", "from langchain_nvidia_ai_endpoints import ChatNVIDIA\n", - "llm = ChatNVIDIA(model=\"ai-mixtral-8x7b-instruct\", nvidia_api_key=nvapi_key, max_tokens=1024)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "288e14ae", - "metadata": {}, - "outputs": [], - "source": [ - "#Set up Prerequisites for Image Captioning App User Interface\n", - "import os\n", - "import io\n", - "import IPython.display\n", - "from PIL import Image\n", - "import base64\n", - "import requests\n", - "import gradio as gr\n" + "llm = ChatNVIDIA(model=\"mistralai/mixtral-8x7b-instruct-v0.1\", nvidia_api_key=nvapi_key, max_tokens=1024)\n" ] }, { @@ -241,7 +212,7 @@ "id": "e8fffc74", "metadata": {}, "source": [ - "### Step 4- wrap Deplot and Fuyu as tools for later usage" + "### Step 4- Wrap Deplot and Fuyu as tools for later usage" ] }, { @@ -252,24 +223,15 @@ "outputs": [], "source": [ "#Set up Prerequisites for Image Captioning App User Interface\n", - "import os\n", "import io\n", - "import IPython.display\n", "from PIL import Image\n", "import base64\n", "import requests\n", - "import gradio as gr\n", - "\n", "from langchain.tools import BaseTool\n", - "from transformers import BlipProcessor, BlipForConditionalGeneration, DetrImageProcessor, DetrForObjectDetection\n", "from PIL import Image\n", - "import torch\n", - "#\n", - "import os\n", - "from tempfile import NamedTemporaryFile\n", "from langchain.agents import initialize_agent\n", "from langchain.chains.conversation.memory import ConversationBufferWindowMemory\n", - " \n", + "\n", "def fetch_outputs(output):\n", " collect_streaming_outputs=[]\n", " for o in output:\n", @@ -399,7 +361,7 @@ "id": "467237c3", "metadata": {}, "source": [ - "### Step 5 - initaite the agent with tools we previously defined " + "### Step 5 - Initiate the agent with tools we previously defined " ] }, { @@ -446,7 +408,7 @@ "metadata": {}, "outputs": [], "source": [ - "img_path=\"./toy_data/jordan.png\"\n", + "img_path=\"./data/imgs/jordan.png\"\n", "response = agent.invoke({\"input\":f' this is the image path: {img_path}'})\n", "print(response['output'])\n" ] diff --git a/notebooks/07_Chat_with_nvidia_financial_reports.ipynb b/RAG/notebooks/langchain/Chat_with_nvidia_financial_reports.ipynb similarity index 84% rename from notebooks/07_Chat_with_nvidia_financial_reports.ipynb rename to RAG/notebooks/langchain/Chat_with_nvidia_financial_reports.ipynb index 9ad5c16a..480dc74d 100644 --- a/notebooks/07_Chat_with_nvidia_financial_reports.ipynb +++ b/RAG/notebooks/langchain/Chat_with_nvidia_financial_reports.ipynb @@ -5,9 +5,9 @@ "id": "4ff7339a", "metadata": {}, "source": [ - "# Notebook: Chatting with NVIDIA Financial Reports\n", + "# Chatting with NVIDIA Financial Reports\n", "\n", - " In this notebook, we are going to use milvus as vectorstore, the **mixtral_8x7b as LLM** and **ai-embed-qa-4 embedding** provided by [NVIDIA_AI_Endpoint](https://python.langchain.com/docs/integrations/text_embedding/nvidia_ai_endpoints) as LLM and embedding model, and build a simply RAG example for chatting with NVIDIA Financial Reports.\n", + " In this notebook, we are going to use milvus as vectorstore, the **mixtral_8x7b as LLM** and **NV-Embed-QA embedding** provided by [NVIDIA_AI_Endpoint](https://python.langchain.com/docs/integrations/text_embedding/nvidia_ai_endpoints) as LLM and embedding model, and build a simply RAG example for chatting with NVIDIA Financial Reports.\n", "\n", "\n", "NVIDIA financial reports are available pubicly in nvidianews. \n", @@ -16,7 +16,50 @@ "\n", "https://nvidianews.nvidia.com/news/nvidia-announces-financial-results-for-first-quarter-fiscal-2024\n", "\n", - "\"drawing\"" + "\"drawing\"" + ] + }, + { + "cell_type": "markdown", + "id": "49b2bf03", + "metadata": {}, + "source": [ + "Before starting with the notebook let's install the required python packages." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "25407f7e", + "metadata": {}, + "outputs": [], + "source": [ + "# Install required python packages.\n", + "!pip install langchain==0.2.10\n", + "!pip install langchain-community==0.2.9\n", + "!pip install langchain-nvidia-ai-endpoints==0.1.2\n", + "!pip install markdownify==0.12.1\n", + "!pip install pymilvus==2.3.1\n", + "!pip install sentence-transformers==3.0.1" + ] + }, + { + "cell_type": "markdown", + "id": "3471907b", + "metadata": {}, + "source": [ + "You will also need to run milvus vector database. This repository houses a docker compose file using which you can deploy milvus. Execute the below command from the root of the GenerativeAIExamples repository to start the Milvus containers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "44f16047", + "metadata": {}, + "outputs": [], + "source": [ + "# Execute this on your terminal from the root of your repository\n", + "# docker compose -f RAG/examples/local_deploy/docker-compose-vectordb.yaml up -d" ] }, { @@ -63,12 +106,8 @@ "source": [ "# test run and see that you can genreate a respond successfully\n", "from langchain_nvidia_ai_endpoints import ChatNVIDIA,NVIDIAEmbeddings\n", - "llm = ChatNVIDIA(model=\"ai-mixtral-8x7b-instruct\", nvidia_api_key=nvapi_key, max_tokens=1024)\n", - "from langchain.vectorstores import Milvus\n", - "import torch\n", - "import time\n", - "embedder_document = NVIDIAEmbeddings(model=\"ai-embed-qa-4\", model_type=\"passage\")\n", - "embedder_query = NVIDIAEmbeddings(model=\"ai-embed-qa-4\", model_type=\"query\")" + "llm = ChatNVIDIA(model=\"mistralai/mixtral-8x7b-instruct-v0.1\", max_tokens=1024)\n", + "embedder_document = NVIDIAEmbeddings(model=\"NV-Embed-QA\", truncate=\"END\")" ] }, { @@ -129,6 +168,7 @@ "# extract the url, title, text content, and tables in the html\n", "from bs4 import BeautifulSoup\n", "import markdownify\n", + "\n", "def extract_url_title_time(soup):\n", " url = \"\"\n", " title = \"\"\n", @@ -260,17 +300,14 @@ "outputs": [], "source": [ "COLLECTION_NAME = \"NVIDIA_Finance\"\n", - "from langchain.vectorstores import Milvus\n", - "vectorstore = Milvus(\n", - " embedding_function=embedder_document,\n", + "from langchain_community.vectorstores import Milvus\n", + "vectorstore = Milvus.from_documents(\n", + " documents,\n", + " embedder_document,\n", " collection_name=COLLECTION_NAME,\n", - " connection_args={\n", - " \"host\": \"milvus\",\n", - " \"port\": \"19530\"},\n", - " drop_old = True,\n", - " auto_id = True\n", - " )\n", - "vectorstore.add_documents(documents)\n", + " connection_args={\"uri\": 'http://milvus:19530'}, # replace this with the ip of the workstation where milvus is running\n", + " drop_old=True,\n", + ")\n", "docs = vectorstore.similarity_search(\"what are 2024 Q3 revenues? \")" ] }, @@ -360,7 +397,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.7" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/notebooks/06_LangGraph_HandlingAgent_IntermediateSteps.ipynb b/RAG/notebooks/langchain/LangGraph_HandlingAgent_IntermediateSteps.ipynb similarity index 89% rename from notebooks/06_LangGraph_HandlingAgent_IntermediateSteps.ipynb rename to RAG/notebooks/langchain/LangGraph_HandlingAgent_IntermediateSteps.ipynb index 8a85c771..e1f18b27 100644 --- a/notebooks/06_LangGraph_HandlingAgent_IntermediateSteps.ipynb +++ b/RAG/notebooks/langchain/LangGraph_HandlingAgent_IntermediateSteps.ipynb @@ -13,9 +13,9 @@ "We demonstrate how to handle the logic of the intermediate steps from the agent leveraging different provided tools within langGraph.\n", "\n", "\n", - "- We will be leveraging LLM [ai-mixtral-8x7b-instruct from NVIDIA API Catalog](https://build.nvidia.com/mistralai/mixtral-8x7b-instruct).\n", + "- We will be leveraging LLM [mixtral-8x7b-instruct-v0.1 from NVIDIA API Catalog](https://build.nvidia.com/mistralai/mixtral-8x7b-instruct).\n", "\n", - "- Simple Faiss Retriever as one of the tools with the [ai-embed-qa-4 from NVIDIA API Catalog](https://build.nvidia.com/nvidia/embed-qa-4).\n", + "- Simple Faiss Retriever as one of the tools with the [NV-Embed-QA from NVIDIA API Catalog](https://build.nvidia.com/nvidia/embed-qa-4).\n", "\n", "- Wikipedia (the pip installable package) as one of the tools.\n", "\n", @@ -24,13 +24,7 @@ "\n", "## Prerequisites \n", "\n", - "To run this notebook, you need the following:\n", - "\n", - "1. Already completed the [setup](https://python.langchain.com/docs/integrations/text_embedding/nvidia_ai_endpoints#setup) and generated an API key.\n", - "2. Installed necesary Python dependencies in [requirements.txt](https://github.com/NVIDIA/GenerativeAIExamples/blob/main/notebooks/requirements.txt) \n", - "\n", - "Change `faiss-gpu` to `faiss-cpu` in the `requirements.txt` file if you do not have access to a GPU.\n", - "\n" + "To run this notebook, you need to complete the [setup](https://python.langchain.com/docs/integrations/text_embedding/nvidia_ai_endpoints#setup) and generate an API key." ] }, { @@ -40,7 +34,7 @@ "source": [ "## Install additional Python packages \n", "\n", - "Install the additional packages that required for this example, assuming that installed all the python packages from the [requirements.txt](https://github.com/NVIDIA/GenerativeAIExamples/blob/main/notebooks/requirements.txt) file." + "Install the additional packages that required for this example" ] }, { @@ -51,11 +45,12 @@ "outputs": [], "source": [ "!pip install --upgrade pip\n", - "!pip install wikipedia==1.4.0\n", + "!pip install langchain==0.2.5\n", + "!pip install langchain-nvidia-ai-endpoints==0.1.2\n", "!pip install langchain-community==0.2.2\n", - "!pip install langchain==0.2.2\n", "!pip install langgraph==0.0.62\n", - "!pip install faiss-gpu==1.7.2" + "!pip install faiss-gpu==1.7.2\n", + "!pip install wikipedia==1.4.0" ] }, { @@ -119,7 +114,7 @@ "from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings\n", "\n", "llm = ChatNVIDIA(model=\"mistralai/mixtral-8x7b-instruct-v0.1\", nvidia_api_key=nvapi_key, max_tokens=2048)\n", - "embedder = NVIDIAEmbeddings(model=\"NV-Embed-QA\")\n" + "embedder = NVIDIAEmbeddings(model=\"NV-Embed-QA\", truncate=\"END\")\n" ] }, { @@ -129,7 +124,7 @@ "source": [ "## Step 3 - Retriever from FAISS vector store\n", "\n", - "We need to process a toy example, here we use `Sweden.txt` from the `toy_data` folder." + "We need to process a toy example, here we use `Sweden.txt` from the `data` folder." ] }, { @@ -139,24 +134,14 @@ "metadata": {}, "outputs": [], "source": [ - "import os\n", - "from tqdm import tqdm\n", - "from pathlib import Path\n", - "import faiss\n", - "from operator import itemgetter\n", "from langchain.vectorstores import FAISS\n", - "from langchain_core.output_parsers import StrOutputParser\n", - "from langchain_core.prompts import ChatPromptTemplate\n", - "from langchain_core.runnables import RunnablePassthrough\n", "from langchain.text_splitter import CharacterTextSplitter\n", - "from langchain_nvidia_ai_endpoints import ChatNVIDIA\n", - "import faiss\n", "\n", "# We need to process the text data and prepare them.\n", "p = \"Sweden.txt\"\n", "data = []\n", "sources = []\n", - "path2file = \"./toy_data/\" + p\n", + "path2file = \"./data/\" + p\n", "with open(path2file, encoding=\"utf-8\") as f:\n", " lines = f.readlines()\n", " for line in lines:\n", @@ -177,7 +162,7 @@ "\n", "# you only need to do this once, in the future, when re-run this notebook, skip to below and load the vector store from disk\n", "store = FAISS.from_texts(docs, embedder , metadatas=metadatas)\n", - "store.save_local('/workspace/save_embedding/sv')\n" + "store.save_local('./data/save_embedding/sv')\n" ] }, { @@ -188,7 +173,7 @@ "outputs": [], "source": [ "## If you previously preprocessed and saved the vector store to disk, then reload it here\n", - "faissDB = FAISS.load_local(\"/workspace/save_embedding/sv\", embedder, allow_dangerous_deserialization=True)\n", + "faissDB = FAISS.load_local(\"./data/save_embedding/sv\", embedder, allow_dangerous_deserialization=True)\n", "retriever = faissDB.as_retriever()" ] }, @@ -323,13 +308,8 @@ "metadata": {}, "outputs": [], "source": [ - "import os\n", - "from langchain.agents import AgentExecutor\n", - "from langchain.agents import initialize_agent\n", - "from langchain.prompts import MessagesPlaceholder\n", "from langchain.memory import ConversationBufferMemory\n", - "from langchain.agents import AgentType, Agent, ConversationalAgent\n", - "from langchain_core.prompts import ChatPromptTemplate, PromptTemplate\n", + "from langchain_core.prompts import PromptTemplate\n", "\n", "## set up memory\n", "memory = ConversationBufferMemory(memory_key=\"chat_history\", input_key='input', output_key=\"output\")\n", @@ -410,16 +390,9 @@ "metadata": {}, "outputs": [], "source": [ - "from typing import Any, Optional, Sequence\n", - "\n", - "from langchain_core._api import deprecated\n", - "from langchain_core.callbacks import BaseCallbackManager\n", - "from langchain_core.language_models import BaseLanguageModel\n", - "from langchain_core.tools import BaseTool\n", - "\n", "from langchain.agents.agent import AgentExecutor\n", "from langchain.agents.agent_types import AgentType\n", - "from langchain.agents.loading import AGENT_TO_CLASS, load_agent\n", + "from langchain.agents.loading import AGENT_TO_CLASS\n", "\n", "agent_cls = AGENT_TO_CLASS[AgentType.CONVERSATIONAL_REACT_DESCRIPTION]\n", "agent_kwargs = {}\n", @@ -462,7 +435,7 @@ "metadata": {}, "outputs": [], "source": [ - "from typing import TypedDict, Annotated, List, Union\n", + "from typing import TypedDict, Annotated, Union\n", "from langchain_core.agents import AgentAction, AgentFinish\n", "from langchain_core.messages import BaseMessage\n", "import operator\n", diff --git a/RAG/notebooks/langchain/NIM_tool_call_HumanInTheLoop_MultiAgents.ipynb b/RAG/notebooks/langchain/NIM_tool_call_HumanInTheLoop_MultiAgents.ipynb new file mode 100644 index 00000000..64922ed5 --- /dev/null +++ b/RAG/notebooks/langchain/NIM_tool_call_HumanInTheLoop_MultiAgents.ipynb @@ -0,0 +1,772 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2ba963de-02e7-44c5-ada0-b74bb092064e", + "metadata": {}, + "source": [ + "\n", + "# Incorporating human-in-the-loop in agentic logic via LangGraph \n", + "\n", + "## Prerequisites\n", + "\n", + "To run this notebook, you need to [follow the steps from here](https://python.langchain.com/docs/integrations/text_embedding/nvidia_ai_endpoints#setup) and generate an API key from [NVIDIA API Catalog](https://build.nvidia.com/).\n", + "\n", + "Please ensure you have the following dependencies installed :\n", + "\n", + "- langchain\n", + "- jupyterlab==4.0.8\n", + "- langchain-core\n", + "- langchain-nvidia-ai-endpoints==0.2.0\n", + "- markdown\n", + "- colorama\n", + "\n", + "you will also need to install the following -\n", + "\n", + "\n", + "\n", + "This notebook will walk you though how to incoporate **human-in-the-loop** into a **multi-agents** pipeline in a minimalistic examples.\n", + "\n", + "The cognitive agentic architecture will look like the below :\n", + "\n", + "![agent architecture](./data/imgs/HumanInTheLoopLangGraph.png) \n", + "\n", + "\n", + "We will first construct the 2 agents in the middle : \n", + "\n", + "- Using **meta/llama-3.1-405b-instruct** to construct the 2 agents, each will be created with [LCEL expression ](https://python.langchain.com/v0.1/docs/expression_language/)\n", + "\n", + "- then we will give each agent one tool to use to achieve the task\n", + "\n", + "The task at hand is creating promotion assets with text and image for social medial promotion.\n", + "We are aiming for something similar to the below ...\n", + "\n", + "\n", + "![agent architecture](./data/imgs/finish_social_post.png)\n", + "\n", + "\n", + "Just like in real world, a human in charge of the task will delegate tasks to specalist writer to writ the promotion text and assign a digital artist for the artworks.\n", + "\n", + "In this scenario, we will let human assign an agent ( either **ContentCreator** or **DigitalArtist** ) just like the flow depicted above. \n", + " \n", + "\n", + "\n", + "Note: As one can see, since we are using NVIDIA AI Catalog as an API, there is no further requirement in the prerequisites about GPUs as compute hardware\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cd38971e-d3c4-4adc-9986-c1d5f3ccabd3", + "metadata": {}, + "outputs": [], + "source": [ + "## install a few python packages we will need\n", + "#!pip install colorama markdown langgraph" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c7285dbc-31ce-4a95-aee9-901e472c5073", + "metadata": {}, + "outputs": [], + "source": [ + "import getpass\n", + "import os\n", + "\n", + "import getpass\n", + "import os\n", + "\n", + "## API Key can be found by going to NVIDIA NGC -> AI Foundation Models -> (some model) -> Get API Code or similar.\n", + "## 10K free queries to any endpoint (which is a lot actually).\n", + "\n", + "# del os.environ['NVIDIA_API_KEY'] ## delete key and reset\n", + "if os.environ.get(\"NVIDIA_API_KEY\", \"\").startswith(\"nvapi-\"):\n", + " print(\"Valid NVIDIA_API_KEY already in environment. Delete to reset\")\n", + "else:\n", + " global nvapi_key\n", + " nvapi_key = getpass.getpass(\"NVAPI Key (starts with nvapi-): \")\n", + " assert nvapi_key.startswith(\"nvapi-\"), f\"{nvapi_key[:5]}... is not a valid key\"\n", + " os.environ[\"NVIDIA_API_KEY\"] = nvapi_key\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "a190d598-f2bc-4662-aad2-a69edd247c3b", + "metadata": {}, + "source": [ + "## We will prepare the 2 agents , each is made out of [LCEL expression ](https://python.langchain.com/v0.1/docs/expression_language/)\n", + "\n", + "For simplicity , each agent will be given one tool to use.\n", + "\n", + "- a **content_creator** agent which will create promotion message per input **_product_desc_**\n", + "- an **digital_artist** agent what is able to create visually appealing image from the promotion title\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "166362e6-f511-4c3f-9c52-50df49452ce1", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## Step 1 : construct **content_creator** agent \n", + "\n", + "in order to construct the **content_creator** agent we need the following :\n", + "\n", + "- system prompt which anchor the task for the agent\n", + "\n", + "- provide a seeded product desc \n", + "\n", + "- a powerful LLM [llama3.1-405b from NVIDIA NIM](https://build.nvidia.com/meta/llama-3_1-405b-instruct) \n", + "\n", + "- using **with_structured_output** for formatting\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7c20c3e5-b620-4bb6-996b-b402958bef53", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# test run and see that you can genreate a respond successfully \n", + "from langchain_nvidia_ai_endpoints import ChatNVIDIA\n", + "from langchain import prompts, chat_models, hub\n", + "from langchain_core.output_parsers import StrOutputParser\n", + "from langchain_core.prompts import ChatPromptTemplate, PromptTemplate\n", + "from langchain_core.pydantic_v1 import BaseModel, Field, validator\n", + "from typing import Optional, List\n", + "\n", + "## construct the system prompt \n", + "prompt_template = \"\"\"\n", + "### [INST]\n", + "\n", + "You are an expert social media content creator.\n", + "Your task is to create a different promotion message with the following \n", + "Product Description :\n", + "------\n", + "{product_desc}\n", + "------\n", + "\n", + "The output promotion message MUST use the following format :\n", + "\n", + "'''\n", + "Title: a powerful, short message that dipict what this product is about \n", + "Message: be creative for the promotion message, but make it short and ready for social media feeds.\n", + "Tags: the hash tag human will nomally use in social media\n", + "'''\n", + "\n", + "Begin!\n", + "\n", + "[/INST]\n", + " \"\"\"\n", + "prompt = PromptTemplate(\n", + "input_variables=['produce_desc'],\n", + "template=prompt_template,\n", + ")\n", + "\n", + "\n", + "\n", + "## provide the product_desc\n", + "product_desc=\"Explore the latest community-built AI models with an API optimized and accelerated by NVIDIA, then deploy anywhere with NVIDIA NIM™ inference microservices.\"\n", + "\n", + "## structural output using LMFE \n", + "class StructureOutput(BaseModel): \n", + " Title: str = Field(description=\"Title of the promotion message\")\n", + " Message : str = Field(description=\"The actual promption message\")\n", + " Tags: List[str] = Field(description=\"Hash tags for social media, usually starts with #\")\n", + "\n", + "llm_with_output_structure=ChatNVIDIA(model=\"meta/llama-3.1-405b-instruct\").with_structured_output(StructureOutput) \n", + "\n", + "## construct the content_creator agent\n", + "content_creator = ( prompt | llm_with_output_structure )\n", + "out=content_creator.invoke({\"product_desc\":product_desc})\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fc1416b3-02d8-4d1a-8362-aa9d6bb1e5aa", + "metadata": {}, + "outputs": [], + "source": [ + "out.Title\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f28a508c-81ec-4f20-9cc2-d762d3d5e3e6", + "metadata": {}, + "outputs": [], + "source": [ + "out.Message" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6208b390-cf0a-44a8-8cc5-ef517e7ef1b7", + "metadata": {}, + "outputs": [], + "source": [ + "out.Tags" + ] + }, + { + "cell_type": "markdown", + "id": "3db74d3c-f6bd-43dd-8f14-9d2f4e35e7f5", + "metadata": {}, + "source": [ + "## Step 2 : we will now create **digital_artist** agent \n", + "\n", + "We will equip the **digital_artist** with the following :\n", + "\n", + "- a text-to-image model [stableXL-turbo from NVIDIA NIM ](https://build.nvidia.com/explore/visual-design?snippet_tab=Python#sdxl-turbo)\n", + "- wrap this tool into llm with llm.bind_tools\n", + "- construct our **digital_artist** agent with LCEL expression" + ] + }, + { + "cell_type": "markdown", + "id": "22bc0564-11e4-4ae9-b952-969cfa624865", + "metadata": {}, + "source": [ + "## a text-to-image model [stableXL-turbo from NVIDIA NIM ](https://build.nvidia.com/explore/visual-design?snippet_tab=Python#sdxl-turbo)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6ca69380-937e-46d2-b4a0-37fd2899045f", + "metadata": {}, + "outputs": [], + "source": [ + "# test run and see that you can genreate a respond successfully \n", + "from langchain_nvidia_ai_endpoints import ChatNVIDIA\n", + "from langchain import prompts, chat_models, hub\n", + "from langchain_core.output_parsers import StrOutputParser\n", + "from langchain_core.prompts import ChatPromptTemplate, PromptTemplate\n", + "\n", + "def llm_rewrite_to_image_prompts(user_query):\n", + " prompt = prompts.ChatPromptTemplate.from_messages(\n", + " [\n", + " (\n", + " \"system\",\n", + " \"Summarize the following user query into a very short, one-sentence theme for image generation, MUST follow this format : A iconic, futuristic image of , no text, no amputation, no face, bright, vibrant\",\n", + " ),\n", + " (\"user\", \"{input}\"),\n", + " ]\n", + " )\n", + " model = ChatNVIDIA(model=\"mistralai/mixtral-8x7b-instruct-v0.1\")\n", + " chain = ( prompt | model | StrOutputParser() )\n", + " out= chain.invoke({\"input\":user_query})\n", + " #print(type(out))\n", + " return out\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "599ebaf2-4c79-4cf4-a7c9-53971c9238e2", + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "import base64, io\n", + "from PIL import Image\n", + "import requests, json\n", + "def generate_image(prompt :str) -> str :\n", + " \"\"\"\n", + " generate image from text\n", + " Args:\n", + " prompt: input text\n", + " \"\"\"\n", + " ## re-writing the input promotion title in to appropriate image_gen prompt \n", + " gen_prompt=llm_rewrite_to_image_prompts(prompt)\n", + " print(\"start generating image with llm re-write prompt:\", gen_prompt)\n", + " invoke_url = \"https://ai.api.nvidia.com/v1/genai/stabilityai/sdxl-turbo\"\n", + " \n", + " headers = {\n", + " \"Authorization\": f\"Bearer {nvapi_key}\",\n", + " \"Accept\": \"application/json\",\n", + " }\n", + " \n", + " payload = {\n", + " \"text_prompts\": [{\"text\": gen_prompt}],\n", + " \"seed\": 0,\n", + " \"sampler\": \"K_EULER_ANCESTRAL\",\n", + " \"steps\": 2\n", + " }\n", + " \n", + " response = requests.post(invoke_url, headers=headers, json=payload)\n", + " \n", + " response.raise_for_status()\n", + " response_body = response.json()\n", + " ## load back to numpy array \n", + " print(response_body['artifacts'][0].keys())\n", + " imgdata = base64.b64decode(response_body[\"artifacts\"][0][\"base64\"])\n", + " filename = 'output.jpg'\n", + " with open(filename, 'wb') as f:\n", + " f.write(imgdata) \n", + " im = Image.open(filename) \n", + " img_location=f\"the output of the generated image will be stored in this path : {filename}\"\n", + " return img_location\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4fed6358-8d59-4b11-ab71-8387f1415526", + "metadata": {}, + "outputs": [], + "source": [ + "out=generate_image(\"NVIDIA NeMo is a powerful SDK for all your GenAI needs\")\n", + "out" + ] + }, + { + "cell_type": "markdown", + "id": "36422d22-1155-4a71-abd8-3078f172d6e0", + "metadata": {}, + "source": [ + "## Wrap the tool into llm with **llm.bind_tools**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4bcdbc6c-00c3-4d01-a55f-86483d42eeb2", + "metadata": {}, + "outputs": [], + "source": [ + "llm=ChatNVIDIA(model=\"meta/llama-3.1-405b-instruct\")\n", + "llm_with_img_gen_tool=llm.bind_tools([generate_image],tool_choice=\"generate_image\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cee33b1a-b02b-4e8a-9260-2c2c815afec2", + "metadata": {}, + "outputs": [], + "source": [ + "out=llm_with_img_gen_tool.invoke(\"NVIDIA power GenAI workflow\")\n", + "out.tool_calls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e77f5ac2-49b8-468c-95db-740c80acdd0a", + "metadata": {}, + "outputs": [], + "source": [ + "def output_to_invoke_tools(out):\n", + " tool_calls=out.tool_calls\n", + " ## check there are indeed tool_calls in the output\n", + " if len(tool_calls) > 0 :\n", + " ## assert the args attribute exists \n", + " if 'args' in tool_calls[0] : \n", + " \n", + " prompt=tool_calls[0]['args']['prompt']\n", + " output=generate_image(prompt)\n", + " else:\n", + " print(\"### out.tool_calls\", out.tool_calls[0].keys() )\n", + " output=\"cannot find input prompt from llm output, please rerun again\"\n", + " else:\n", + " print(\"------------\" , out)\n", + " print(\"### out.tool_calls\", out.tool_calls )\n", + " output=\"agent did not find generate_image tool, please check the tool binding is successful\"\n", + " return output\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "11458491-bb01-4ee5-9eb0-ceff5c5593b8", + "metadata": {}, + "source": [ + "## creating **digital_artist** using LCEL chain " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "abb3f231-9096-458d-989c-1b8908b6d52f", + "metadata": {}, + "outputs": [], + "source": [ + "digital_artist = (\n", + " llm_with_img_gen_tool\n", + " | output_to_invoke_tools\n", + ")\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1f3e6616-2e4f-4673-a486-2ec42723a262", + "metadata": {}, + "outputs": [], + "source": [ + "digital_artist.invoke(\"NVIDIA power GenAI workflow\")" + ] + }, + { + "cell_type": "markdown", + "id": "d6b8b225-ea9a-4d3f-857a-39fd99afde13", + "metadata": {}, + "source": [ + "---\n", + "## Step 3 - Embed Human-in-the-loop agentic logic with LangGraph\n", + "\n", + "- construct a **get_human_input** function to integrate into the first node of LangGraph putting Human-in-the-loop deciding which tool to use\n", + "- establish **State** to keep track of the internal states\n", + "- create functions as graph nodes for LangGraph \n", + "- compose the agentic cognitive logic in langGraph by connecting the nodes and edges\n" + ] + }, + { + "cell_type": "markdown", + "id": "879af9be-472d-466d-9cb4-cc3a7fa86f2c", + "metadata": {}, + "source": [ + "## construct a **get_human_input** function to integrate into the first node of LangGraph \n", + "\n", + "putting Human-in-the-loop deciding which tool to use" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "79cae427-1b34-4f2d-854f-3c765d2ab6a1", + "metadata": {}, + "outputs": [], + "source": [ + "# Or you can directly instantiate the tool\n", + "from langchain_community.tools import HumanInputRun\n", + "from langchain.agents import AgentType, load_tools\n", + "from langchain.agents import AgentType, initialize_agent, load_tools\n", + "\n", + "\n", + "def get_human_input() -> str:\n", + " \"\"\" Put human as decision maker, human will decide which agent is best for the task\"\"\"\n", + " \n", + " print(\"You have been given 2 agents. Please select exactly _ONE_ agent to help you with the task, enter 'y' to confirm your choice.\")\n", + " print(\"\"\"Available agents are : \\n\n", + " 1 ContentCreator \\n\n", + " 2 DigitalArtist \\n \n", + " Enter 1 or 2\"\"\")\n", + " contents = []\n", + " while True:\n", + " try: \n", + " line = input()\n", + " if line=='1':\n", + " tool=\"ContentCreator\" \n", + " line=tool\n", + " \n", + " elif line=='2':\n", + " tool=\"DigitalArtist\" \n", + " line=tool\n", + " \n", + " else:\n", + " pass\n", + " \n", + " except EOFError:\n", + " break\n", + " if line == \"y\":\n", + " print(f\"tool selected : {tool} \")\n", + " break\n", + " contents.append(line)\n", + " \n", + " return \"\\n\".join(contents)\n", + "\n", + "\n", + "# You can modify the tool when loading\n", + "\n", + "ask_human = HumanInputRun(input_func=get_human_input)\n" + ] + }, + { + "cell_type": "markdown", + "id": "2528761f-d478-4d04-b22b-d1cc55a49d6c", + "metadata": {}, + "source": [ + "## establish **State** to keep track of the internal states" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c8bb5db-80c9-4f62-a0bb-572e376c3a4d", + "metadata": {}, + "outputs": [], + "source": [ + "## first we define GraphState \n", + "from typing import Dict, TypedDict\n", + "from typing import TypedDict, Annotated, List, Union\n", + "from langchain_core.agents import AgentAction, AgentFinish\n", + "import operator\n", + "\n", + "from langchain_core.messages import BaseMessage\n", + "class State(TypedDict):\n", + " # The input string\n", + " input: str\n", + " input_to_agent : str\n", + " agent_choice : str\n", + " agent_use_tool_respond : str\n" + ] + }, + { + "cell_type": "markdown", + "id": "2ede35dc-e8b2-4bac-94bb-6b7aa283157d", + "metadata": {}, + "source": [ + "## create functions as graph nodes for LangGraph " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "35e6051c-c732-4e3f-8e09-f006cfff352f", + "metadata": {}, + "outputs": [], + "source": [ + "from langgraph.graph import END, StateGraph\n", + "from langgraph.prebuilt import ToolInvocation\n", + "from colorama import Fore,Style\n", + "# Define the functions needed \n", + "def human_assign_to_agent(state):\n", + " # ensure using original prompt \n", + " inputs = state[\"input\"]\n", + " input_to_agent = state[\"input_to_agent\"]\n", + "\n", + " concatenate_str = Fore.BLUE+inputs+ ' : '+Fore.CYAN+input_to_agent + Fore.RESET\n", + " print(concatenate_str)\n", + " print(\"---\"*10)\n", + " \n", + " agent_choice=ask_human.invoke(concatenate_str)\n", + " print(Fore.CYAN+ \"choosen_agent : \" + agent_choice + Fore.RESET)\n", + " return {\"agent_choice\": agent_choice }\n", + "\n", + "def agent_execute_task(state): \n", + " inputs= state[\"input\"]\n", + " input_to_agent = state[\"input_to_agent\"]\n", + " print(Fore.CYAN+input_to_agent + Fore.RESET)\n", + " # choosen agent will execute the task\n", + " choosen_agent = state['agent_choice']\n", + " if choosen_agent=='ContentCreator':\n", + " structured_respond=content_creator.invoke({\"product_desc\":input_to_agent})\n", + " respond='\\n'.join([structured_respond.Title,structured_respond.Message,''.join(structured_respond.Tags)]) \n", + " elif choosen_agent==\"DigitalArtist\":\n", + " respond=digital_artist.invoke(input_to_agent)\n", + " else:\n", + " respond=\"please reselect the agent, there are only 2 agents available: 1.ContentCreator or 2.DigitalArtist\"\n", + " \n", + " \n", + " print(Fore.CYAN+ \"agent_output: \\n\" + respond + Fore.RESET)\n", + "\n", + " return {\"agent_use_tool_respond\": respond}\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "9fedc500-a3d0-468d-b1b1-582d3e1145f6", + "metadata": {}, + "source": [ + "## compose the agentic cognitive logic in langGraph by connecting the nodes and edges" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1c30754b-6399-47c9-9bb1-bbc8f304d349", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "from langgraph.graph import END, StateGraph\n", + "\n", + "# Define a new graph\n", + "workflow = StateGraph(State)\n", + "\n", + "# Define the two nodes \n", + "workflow.add_node(\"start\", human_assign_to_agent)\n", + "workflow.add_node(\"end\", agent_execute_task)\n", + "\n", + "# This means that this node is the first one called\n", + "workflow.set_entry_point(\"start\")\n", + "workflow.add_edge(\"start\", \"end\")\n", + "workflow.add_edge(\"end\", END)\n", + "\n", + "# Finally, we compile it!\n", + "# This compiles it into a LangChain Runnable,\n", + "# meaning you can use it as you would any other runnable\n", + "app = workflow.compile()" + ] + }, + { + "cell_type": "markdown", + "id": "78f0ac2a-c57d-4e2b-814d-44b040272a01", + "metadata": {}, + "source": [ + "---\n", + "## time to test this out " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2b5fe0c9-c922-4b0d-bb94-ac47c140e188", + "metadata": {}, + "outputs": [], + "source": [ + "my_query=\"create a good promption message for social promotion events using the following inputs\"\n", + "product_desc=\"NVIDIA NIM microservices power GenAI workflow\"\n", + "respond=app.invoke({\"input\":my_query, \"input_to_agent\":product_desc})" + ] + }, + { + "cell_type": "markdown", + "id": "d086169b-e38d-4506-a6dd-5b55d5246db3", + "metadata": {}, + "source": [ + "#### now we will use the output from the **ContentCreator** agent to go for a 2nd round to generate beautiful image for this promotion " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0f64885a-0302-4548-be2f-79b81f0fdeeb", + "metadata": {}, + "outputs": [], + "source": [ + "prompt_for_image=respond['agent_use_tool_respond'].split('\\n')[0].split(':')[-1].strip()\n", + "prompt_for_image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "00e2e1b2-c257-46ee-b241-9d56b99f7479", + "metadata": {}, + "outputs": [], + "source": [ + "input_query=\"generate an image for me from the below promotion message\"\n", + "respond2=app.invoke({\"input\":input_query, \"input_to_agent\":prompt_for_image})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f6afdfd1-1e5d-4861-84fd-5f8da527f3e6", + "metadata": {}, + "outputs": [], + "source": [ + "im = Image.open('output.jpg') \n", + "im.show()" + ] + }, + { + "cell_type": "markdown", + "id": "b646514b-9fe4-4cc2-a3b5-24b9fe06961e", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## let's try to print this out using markdown " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4dede634-2dc4-4312-8649-31ded97e6979", + "metadata": {}, + "outputs": [], + "source": [ + "title = respond['agent_use_tool_respond'].split('\\n')[0].split(':')[-1].strip()\n", + "promotion_msg = respond['agent_use_tool_respond'].split('\\n')[1].split(':')[-1].strip()\n", + "hash_tags = ['#'+s for s in respond['agent_use_tool_respond'].split('\\n')[-1].split(':')[-1].split('#') if s!=\"\"]\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f8df416c-6f3c-4a79-ba0a-67f66c4be2a9", + "metadata": {}, + "outputs": [], + "source": [ + "hash_tag_in_md=[]\n", + "for hash_tag in hash_tags:\n", + " \n", + " temp=f\"\"\"{hash_tag}\"\"\"\n", + " hash_tag_in_md.append(temp)\n", + "\n", + "hashtags_in_md= '
'+ ''.join(hash_tag_in_md) + '
'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1fee6c74-e2bd-4701-be6f-4bf05bbf7560", + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import Markdown, display\n", + "\n", + "import markdown\n", + "markdown_str = markdown.markdown(f'''\n", + "\n", + "\n", + "\n", + "#### {title}\n", + "\n", + "{promotion_msg}\n", + "\n", + "{hashtags_in_md}\n", + "\n", + "''')\n", + "\n", + "def printmd(markdown_str):\n", + " display(Markdown(markdown_str))\n", + "printmd(markdown_str)" + ] + } + ], + "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.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/RAG/notebooks/langchain/NeMo_Guardrails_with_LangChain_RAG/config/config.yml b/RAG/notebooks/langchain/NeMo_Guardrails_with_LangChain_RAG/config/config.yml new file mode 100644 index 00000000..b6981191 --- /dev/null +++ b/RAG/notebooks/langchain/NeMo_Guardrails_with_LangChain_RAG/config/config.yml @@ -0,0 +1,11 @@ +models: + - type: main + engine: nvidia_ai_endpoints + model: meta/llama-3.1-70b-instruct + # parameters: + # base_url: + - type: embeddings + engine: nvidia_ai_endpoints + model: nvidia/nv-embedqa-e5-v5 + # parameters: + # base_url: diff --git a/RAG/notebooks/langchain/NeMo_Guardrails_with_LangChain_RAG/config/flows.co b/RAG/notebooks/langchain/NeMo_Guardrails_with_LangChain_RAG/config/flows.co new file mode 100644 index 00000000..067d9511 --- /dev/null +++ b/RAG/notebooks/langchain/NeMo_Guardrails_with_LangChain_RAG/config/flows.co @@ -0,0 +1,20 @@ +define user greet + "Hello" + +define bot greet + "Hello. I'm the Guardrails Bot. How can I help you?" + +define flow + user greet + bot greet + +define user ask about user sensitive data + "Can you hack into someone's email account?" + "How do I get my friend's photos without permission?" + +define bot refuse to respond about user sensitive data + "Apologies, but the Guardrails Bot can't help with actions that asks about user sensitive data. It's important to respect privacy." + +define flow + user ask about user sensitive data + bot refuse to respond about user sensitive data \ No newline at end of file diff --git a/RAG/notebooks/langchain/NeMo_Guardrails_with_LangChain_RAG/using_nemo_guardrails_with_LangChain_RAG.ipynb b/RAG/notebooks/langchain/NeMo_Guardrails_with_LangChain_RAG/using_nemo_guardrails_with_LangChain_RAG.ipynb new file mode 100644 index 00000000..c4323e09 --- /dev/null +++ b/RAG/notebooks/langchain/NeMo_Guardrails_with_LangChain_RAG/using_nemo_guardrails_with_LangChain_RAG.ipynb @@ -0,0 +1,324 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Using NeMo Guardrails with LangChain RAG and NVIDIA NIMs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook goes through how to integrate NeMo Guardrails with a basic RAG pipeline in LangChain. This notebook assumes that you already have an intermediary level developer who has a prequisite knowledge about RAG and NeMo Guardrails. If not, please visit our [RAG Example Using NVIDIA API Catalog and LangChain notebook](https://github.com/NVIDIA/GenerativeAIExamples/tree/main/RAG/notebooks/langchain/langchain_basic_RAG.ipynb) first and .\n", + "\n", + "## Terminology\n", + "\n", + "RAG (Retrieval-Augmented Generation) is a natural language processing technique that combines retrieval of relevant documents from a large corpus with an LLM to produce more accurate and contextually relevant responses.\n", + "\n", + "[NVIDIA NeMo Guardrails](https://github.com/NVIDIA/NeMo-Guardrails) provides programmable guardrails for ensuring trustworthiness, safety, security, and controlled dialog while protecting against common LLM vulnerabilities. \n", + "\n", + "[NVIDIA NIM microservices](https://developer.nvidia.com/blog/nvidia-nim-offers-optimized-inference-microservices-for-deploying-ai-models-at-scale/) are containerized microservices that simplify the deployment of generative AI models like LLMs and are optimized to run on NVIDIA GPUs. NIM microservices support models across domains like chat, embedding, reranking, and more from both the community and NVIDIA.\n", + "\n", + "[NVIDIA API Catalog](https://build.nvidia.com/explore/discover) is a hosted platform for accessing a wide range of microservices online. You can test models on the catalog and then export them with an NVIDIA AI Enterprise license for on-premises or cloud deployment\n", + "\n", + "Integrating NeMo Guardrails with LangChain RAG and NVIDIA NIMs ensure that the answers from LLMs are both safe and accurate." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Installation and Requirements\n", + "\n", + "Create a Python environment (preferably with Conda) using Python version 3.10.14. \n", + "To install Jupyter Lab, refer to the [installation](https://jupyter.org/install) page." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install langchain==0.2.5\n", + "!pip install nemoguardrails==0.9.1.1\n", + "!pip install langchain-nvidia-ai-endpoints==0.1.2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Getting Started!\n", + "\n", + "To get started you need an `NVIDIA_API_KEY` to use the NVIDIA API Catalog:\n", + "\n", + "1) Create a free account with [NVIDIA](https://build.nvidia.com/explore/discover).\n", + "2) Click on your model of choice.\n", + "3) Under Input select the Python tab, and click **Get API Key** and then click **Generate Key**.\n", + "4) Copy and save the generated key as NVIDIA_API_KEY. From there, you should have access to the endpoints." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import getpass\n", + "import os\n", + "\n", + "if not os.environ.get(\"NVIDIA_API_KEY\", \"\").startswith(\"nvapi-\"):\n", + " nvidia_api_key = getpass.getpass(\"Enter your NVIDIA API key: \")\n", + " assert nvidia_api_key.startswith(\"nvapi-\"), f\"{nvidia_api_key[:5]}... is not a valid key\"\n", + " os.environ[\"NVIDIA_API_KEY\"] = nvidia_api_key" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating a RAG example" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Instantiating NIMs — an LLM NIM and an Embedding NIM\n", + "\n", + "from langchain_nvidia_ai_endpoints import ChatNVIDIA, NVIDIAEmbeddings\n", + "\n", + "llm = ChatNVIDIA(model=\"meta/llama-3.1-405b-instruct\")\n", + "embedding_model = NVIDIAEmbeddings(model=\"nvidia/nv-embedqa-e5-v5\", truncate=\"END\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Process the documents into vectorstore\n", + "\n", + "from langchain_community.document_loaders import TextLoader\n", + "from langchain_text_splitters import RecursiveCharacterTextSplitter\n", + "from langchain_chroma import Chroma\n", + "\n", + "loader = TextLoader(\"../data/Sweden.txt\")\n", + "docs = loader.load()\n", + "\n", + "text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)\n", + "splits = text_splitter.split_documents(docs)\n", + "vectorstore = Chroma.from_documents(documents=splits, embedding=embedding_model)\n", + "retriever = vectorstore.as_retriever()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Assembling our RAG pipeline\n", + "\n", + "from langchain_core.prompts import ChatPromptTemplate\n", + "from langchain_core.output_parsers import StrOutputParser\n", + "from langchain_core.runnables import RunnablePassthrough\n", + "\n", + "template = \"\"\"Use the following pieces of context to answer the question at the end. \n", + "If you don't know the answer, just say that you don't know, don't try to make up an answer. \n", + "Use three sentences maximum and keep the answer as concise as possible. \n", + "{context}\n", + "Question: {question}\n", + "Helpful Answer:\"\"\"\n", + "\n", + "prompt = ChatPromptTemplate.from_template(template)\n", + "\n", + "rag_chain = (\n", + " {\"context\": retriever, \"question\": RunnablePassthrough()}\n", + " | prompt\n", + " | llm\n", + " | StrOutputParser()\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we have a RAG example ready to be tested. Let's ask our LLM a question with a non-harmful intent." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rag_chain.invoke(\"Which city in Sweden has the lowest Gini cofficient? What is the value?\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's consider a scenario where a user asks our LLM a question with potentially harmful intent.\n", + "\n", + "Notice that our LLM still responds to the query, even if the user's intent might be malicious." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rag_chain.invoke(\"I want to learn more about the things on the computer of a Swedish government official. How is the Swedish administration divided?\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Integrating NeMo Guardrails\n", + "\n", + "We can integrate safety filtering through the use of NeMo Guardrails. We aim to filter the incoming user messages and route it to a predefined flow if the message intent is malicious." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from nemoguardrails.integrations.langchain.runnable_rails import RunnableRails\n", + "from nemoguardrails import RailsConfig\n", + "import nest_asyncio\n", + "nest_asyncio.apply()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's load our configuration files and create our `RunnableRails` instance which allows NeMo Guardrails to be used with [LangChain's Runnables](https://python.langchain.com/v0.1/docs/expression_language/interface/)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "config = RailsConfig.from_path(\"./config\")\n", + "guardrails = RunnableRails(config, input_key=\"question\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's see what's the configuration what we have set in our `./config` folder." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We see that in our YAML file, we have configured NeMo Guardrails to use [Meta's Llama-3.1-70-instruct NIM LLM](https://build.nvidia.com/meta/llama-3_1-70b-instruct) and [NVIDIA's NV-EmbedQA-E5-V5 Embedding NIM](https://build.nvidia.com/nvidia/nv-embedqa-e5-v5)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open('config/config.yml', 'r') as file:\n", + " print(file.read())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We also see that have defined 2 flows: a flow to greet the user and a flow to prevent the LLM from responding to queries about user sensitive data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open('config/flows.co', 'r') as file:\n", + " print(file.read())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can put our guardrails to intercept the incoming message before it goes into the RAG chain." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "guardrailed_rag_chain = guardrails | rag_chain" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, let's ask the LLM the same question with potentially harmful intent. The LLM no longer responds to the query and gives the answer that we have predefined." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "guardrailed_rag_chain.invoke(\"I want to learn more about the things on the computer of a Swedish government official. How is the Swedish administration divided?\")['output']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To learn more advanced techniques of using NeMo Guardrails in LangChain, check out [the documentation](https://docs.nvidia.com/nemo/guardrails/user_guides/langchain/index.html)." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/08_RAG_Langchain_with_Local_NIM.ipynb b/RAG/notebooks/langchain/RAG_Langchain_with_Local_NIM.ipynb similarity index 82% rename from notebooks/08_RAG_Langchain_with_Local_NIM.ipynb rename to RAG/notebooks/langchain/RAG_Langchain_with_Local_NIM.ipynb index 7f812336..550102dc 100644 --- a/notebooks/08_RAG_Langchain_with_Local_NIM.ipynb +++ b/RAG/notebooks/langchain/RAG_Langchain_with_Local_NIM.ipynb @@ -7,23 +7,33 @@ "source": [ "# Build a RAG using a locally hosted NIM\n", "\n", - "In this notebook we demonstrate how to build a RAG using [NVIDIA Inference Microservices (NIM)](https://build.nvidia.com/explore/discover). We locally host a Llama3-8b-instruct NIM and deploy it using [ NVIDIA AI Endpoints for LangChain](https://python.langchain.com/docs/integrations/chat/nvidia_ai_endpoints/).\n", + "This notebook demonstrates how to build a RAG using NVIDIA NIM microservices. We locally host a Llama3-8b-instruct model using [NVIDIA NIM for LLMs](https://docs.nvidia.com/nim/large-language-models/latest/introduction.html) and connect to it using [LangChain NVIDIA AI Endpoints](https://python.langchain.com/docs/integrations/chat/nvidia_ai_endpoints/) package.\n", "\n", - "We then create a vector store by downloading web pages and generating their embeddings using FAISS. We then showcase two different chat chains for querying the vector store. For this example, we use the NVIDIA Triton documentation website, though the code can be easily modified to use any other source. \n", + "We then create a vector store by downloading web pages and generating their embeddings using FAISS. We then showcase two different chat chains for querying the vector store. For this example, we use the NVIDIA Triton documentation website, though the code can be easily modified to use any other source. For the embedding model, we use [the GPU accelerated NV-Embed-QA model from NVIDIA API Catalog](https://build.nvidia.com/nvidia/embed-qa-4).\n", "\n", "### First stage is to load NVIDIA Triton documentation from the web, chunkify the data, and generate embeddings using FAISS\n", "\n", "To get started:\n", "\n", - "1. Generate a NGC API [here](https://org.ngc.nvidia.com/setup/personal-keys)\n", + "1. Generate an [NGC CLI API key](https://org.ngc.nvidia.com/setup/personal-keys). This key will need to be passed to docker run in the next section as the NGC_API_KEY environment variable to download the appropriate models and resources when starting the NIM.\n", "\n", - "2. Export the API key (export NGC_API_KEY=) This key will need to be passed to docker run in the next section as the NGC_API_KEY environment variable to download the appropriate models and resources when starting the NIM.\n", - "\n", - "3. Download and install the NGC CLI following the [NGC Setup steps](https://docs.ngc.nvidia.com/cli/index.html?_gl=1*22f68y*_gcl_au*MTE2NTMwMTA2NC4xNzE1NzY4NzE4). Follow the steps on that page to set the NGC CLI and docker client configs appropriately.\n", - "\n", - "4. To pull the NIM container image from NGC, first authenticate with the NVIDIA Container Registry with the following command\n", - "\n", - "(Note: In order to run this notebook in a virtual environment, you need to launch the NIM Docker container in the background outside of the notebook environment prior to running the LangChain code in the notebook cells. Create a virtual environment and install the dependencies present inside the notebooks/requirements.txt file by pip install -r notebooks/requirements.txt. Run the commands in the first 3 cells from a terminal then begin with the 4th cell (curl inference command) within the notebook environment.)" + "2. Download and install the NGC CLI following the [NGC Setup steps](https://docs.ngc.nvidia.com/cli/index.html?_gl=1*22f68y*_gcl_au*MTE2NTMwMTA2NC4xNzE1NzY4NzE4). Follow the steps on that page to set the NGC CLI and docker client configs appropriately." + ] + }, + { + "cell_type": "markdown", + "id": "225c7185", + "metadata": {}, + "source": [ + "Note: In order to run this notebook, you need to launch the NIM Docker container in the terminal outside of the web browser notebook environment. Run the commands in the first 3 cells from a terminal then begin with the 4th cell (curl inference command) within the notebook environment (web browser)." + ] + }, + { + "cell_type": "markdown", + "id": "39ef96bf", + "metadata": {}, + "source": [ + "To pull the NIM container image from NGC, first authenticate with the NVIDIA Container Registry with the following command from your terminal." ] }, { @@ -33,7 +43,8 @@ "metadata": {}, "outputs": [], "source": [ - "!echo \"$NGC_API_KEY\" | docker login nvcr.io --username '$oauthtoken' --password-stdin" + "!export NGC_API_KEY=\"Provide your api key here\"\n", + "!docker login nvcr.io --username '$oauthtoken' --password \"${NGC_API_KEY}\"" ] }, { @@ -41,7 +52,7 @@ "id": "9c2403b8", "metadata": {}, "source": [ - "Set up location for caching the model artifacts" + "Set up location for caching the model artifacts. Export the following env variables from your terminal." ] }, { @@ -61,7 +72,7 @@ "id": "19a7e489", "metadata": {}, "source": [ - "Launch the NIM microservice" + "Launch the NIM LLM microservice by executing this command from the terminal where you have exported all the environment variables." ] }, { @@ -79,7 +90,7 @@ "id": "37e2fcda", "metadata": {}, "source": [ - "Before we continue and connect the NIM to LangChain, let's test it using a simple OpenAI completion request" + "Before we continue and connect the NIM to LangChain, let's test it using a simple OpenAI completion request. You can execute this command and all the subsequent one after this from your web browser." ] }, { @@ -111,9 +122,10 @@ "metadata": {}, "outputs": [], "source": [ - "!pip install langchain\n", - "!pip install langchain_nvidia_ai_endpoints\n", - "!pip install faiss-cpu" + "!pip install --upgrade pip\n", + "!pip install langchain==0.2.5\n", + "!pip install langchain-nvidia-ai-endpoints==0.1.2\n", + "!pip install faiss-gpu==1.7.2 # replace with faiss-cpu if you don't have a gpu" ] }, { @@ -121,7 +133,7 @@ "id": "74b0c989", "metadata": {}, "source": [ - "Set up API key, which you can get from the [API Catalog](https://build.nvidia.com/)" + "Set up NVIDIA API key, which you can get from the [API Catalog](https://build.nvidia.com/). This key will be used to communicate with GPU accelerated cloud hosted embedding model." ] }, { @@ -145,7 +157,7 @@ "id": "5584e3b1", "metadata": {}, "source": [ - "We can now deploy the NIM in LangChain by specifying the base URL" + "We can now connect with the deployed NIM LLM model in LangChain by specifying the base URL" ] }, { @@ -163,6 +175,14 @@ "print(result.content)" ] }, + { + "cell_type": "markdown", + "id": "f95b2753", + "metadata": {}, + "source": [ + "Import all the required libraries for building the langchain agent." + ] + }, { "cell_type": "code", "execution_count": null, @@ -263,9 +283,9 @@ "metadata": {}, "outputs": [], "source": [ - "def create_embeddings(embedding_path: str = \"./embed\"):\n", + "def create_embeddings(embedding_path: str = \"./data/nv_embedding\"):\n", "\n", - " embedding_path = \"./embed\"\n", + " embedding_path = \"./data/nv_embedding\"\n", " print(f\"Storing embeddings to {embedding_path}\")\n", "\n", " # List of web pages containing NVIDIA Triton technical documentation\n", @@ -322,7 +342,7 @@ " Returns:\n", " None\n", " \"\"\"\n", - " embeddings = NVIDIAEmbeddings(model=\"ai-embed-qa-4\", truncate=\"END\")\n", + " embeddings = NVIDIAEmbeddings(model=\"NV-Embed-QA\", truncate=\"END\")\n", "\n", " for document in documents:\n", " texts = splitter.split_text(document.page_content)\n", @@ -332,7 +352,7 @@ "\n", " # create embeddings and add to vector store\n", " if os.path.exists(dest_embed_dir):\n", - " update = FAISS.load_local(folder_path=dest_embed_dir, embeddings=embeddings)\n", + " update = FAISS.load_local(folder_path=dest_embed_dir, embeddings=embeddings, allow_dangerous_deserialization=True)\n", " update.add_texts(texts, metadatas=metadatas)\n", " update.save_local(folder_path=dest_embed_dir)\n", " else:\n", @@ -362,7 +382,7 @@ "\n", "create_embeddings()\n", "\n", - "embedding_model = NVIDIAEmbeddings(model=\"ai-embed-qa-4\", truncate=\"END\")\n" + "embedding_model = NVIDIAEmbeddings(model=\"NV-Embed-QA\", truncate=\"END\")\n" ] }, { @@ -381,8 +401,8 @@ "outputs": [], "source": [ "# Embed documents\n", - "embedding_path = \"embed/\"\n", - "docsearch = FAISS.load_local(folder_path=embedding_path, embeddings=embedding_model)" + "embedding_path = \"./data/nv_embedding\"\n", + "docsearch = FAISS.load_local(folder_path=embedding_path, embeddings=embedding_model, allow_dangerous_deserialization=True)" ] }, { @@ -494,7 +514,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.5" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/notebooks/05_RAG_for_HTML_docs_with_Langchain_NVIDIA_AI_Endpoints.ipynb b/RAG/notebooks/langchain/RAG_for_HTML_docs_with_Langchain_NVIDIA_AI_Endpoints.ipynb similarity index 91% rename from notebooks/05_RAG_for_HTML_docs_with_Langchain_NVIDIA_AI_Endpoints.ipynb rename to RAG/notebooks/langchain/RAG_for_HTML_docs_with_Langchain_NVIDIA_AI_Endpoints.ipynb index 2f945afb..0abeca23 100644 --- a/notebooks/05_RAG_for_HTML_docs_with_Langchain_NVIDIA_AI_Endpoints.ipynb +++ b/RAG/notebooks/langchain/RAG_for_HTML_docs_with_Langchain_NVIDIA_AI_Endpoints.ipynb @@ -5,21 +5,13 @@ "id": "aaf8ff51", "metadata": {}, "source": [ - "# Build a RAG chain by generating embeddings for NVIDIA Triton documentation\n", + "# Build a RAG chain for NVIDIA Triton documentation website\n", "\n", "In this notebook we demonstrate how to build a RAG using [NVIDIA AI Endpoints for LangChain](https://python.langchain.com/docs/integrations/text_embedding/nvidia_ai_endpoints). We create a vector store by downloading web pages and generating their embeddings using FAISS. We then showcase two different chat chains for querying the vector store. For this example, we use the NVIDIA Triton documentation website, though the code can be easily modified to use any other source. \n", "\n", "### First stage is to load NVIDIA Triton documentation from the web, chunkify the data, and generate embeddings using FAISS\n", "\n", - "To get started:\n", - "\n", - "1. Create a free account with the NVIDIA NGC service, which hosts AI solution catalogs, containers, models, etc.\n", - "\n", - "2. Navigate to Catalog > AI Foundation Models > (Model with API endpoint).\n", - "\n", - "3. Select the API option and click Generate Key.\n", - "\n", - "4. Save the generated key as NVIDIA_API_KEY. From there, you should have access to the endpoints." + "To run this notebook, you need to complete the [setup](https://python.langchain.com/docs/integrations/text_embedding/nvidia_ai_endpoints#setup) and generate an API key." ] }, { @@ -27,7 +19,7 @@ "id": "e55d2d53", "metadata": {}, "source": [ - "First install prerequisite libraries" + "Let's install the prerequisite libraries and import the necessary packages to run this notebook." ] }, { @@ -37,9 +29,10 @@ "metadata": {}, "outputs": [], "source": [ - "!pip install langchain\n", - "!pip install langchain_nvidia_ai_endpoints\n", - "!pip install faiss-cpu" + "!pip install --upgrade pip\n", + "!pip install langchain==0.2.5\n", + "!pip install langchain-nvidia-ai-endpoints==0.1.2\n", + "!pip install faiss-gpu==1.7.2 # replace with faiss-cpu if you don't have a gpu" ] }, { @@ -65,7 +58,7 @@ "id": "025de714", "metadata": {}, "source": [ - "Set up API key" + "Provide the API key by running the cell below." ] }, { @@ -171,9 +164,9 @@ "metadata": {}, "outputs": [], "source": [ - "def create_embeddings(embedding_path: str = \"./embed\"):\n", + "def create_embeddings(embedding_path: str = \"./data/nv_embedding\"):\n", "\n", - " embedding_path = \"./embed\"\n", + " embedding_path = \"./data/nv_embedding\"\n", " print(f\"Storing embeddings to {embedding_path}\")\n", "\n", " # List of web pages containing NVIDIA Triton technical documentation\n", @@ -206,7 +199,7 @@ "id": "942934e8", "metadata": {}, "source": [ - "Generate embeddings using NVIDIA AI Endpoints for LangChain and save embeddings to offline vector store in the /embed directory for future re-use" + "Generate embeddings using NVIDIA AI Endpoints for LangChain and save embeddings to offline vector store in the ./data/nv_embedding directory for future re-use" ] }, { @@ -229,7 +222,7 @@ " Returns:\n", " None\n", " \"\"\"\n", - " embeddings = NVIDIAEmbeddings(model=\"ai-embed-qa-4\")\n", + " embeddings = NVIDIAEmbeddings(model=\"NV-Embed-QA\", truncate=\"END\")\n", "\n", " for document in documents:\n", " texts = splitter.split_text(document.page_content)\n", @@ -239,7 +232,7 @@ "\n", " # create embeddings and add to vector store\n", " if os.path.exists(dest_embed_dir):\n", - " update = FAISS.load_local(folder_path=dest_embed_dir, embeddings=embeddings)\n", + " update = FAISS.load_local(folder_path=dest_embed_dir, embeddings=embeddings, allow_dangerous_deserialization=True)\n", " update.add_texts(texts, metadatas=metadatas)\n", " update.save_local(folder_path=dest_embed_dir)\n", " else:\n", @@ -262,21 +255,10 @@ "execution_count": null, "id": "f56cadd0", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Storing embeddings to ./embed\n" - ] - } - ], + "outputs": [], "source": [ - "\n", - "\n", "create_embeddings()\n", - "\n", - "embedding_model = NVIDIAEmbeddings(model=\"ai-embed-qa-4\")\n" + "embedding_model = NVIDIAEmbeddings(model=\"NV-Embed-QA\", truncate=\"END\")" ] }, { @@ -295,8 +277,8 @@ "outputs": [], "source": [ "# Embed documents\n", - "embedding_path = \"embed/\"\n", - "docsearch = FAISS.load_local(folder_path=embedding_path, embeddings=embedding_model)" + "embedding_path = \"./data/nv_embedding\"\n", + "docsearch = FAISS.load_local(folder_path=embedding_path, embeddings=embedding_model, allow_dangerous_deserialization=True)" ] }, { @@ -320,7 +302,7 @@ "\n", "question_generator = LLMChain(llm=llm, prompt=CONDENSE_QUESTION_PROMPT)\n", "\n", - "chat = ChatNVIDIA(model=\"ai-mixtral-8x7b-instruct\", temperature=0.1, max_tokens=1000, top_p=1.0)\n", + "chat = ChatNVIDIA(model=\"mistralai/mixtral-8x7b-instruct-v0.1\", temperature=0.1, max_tokens=1000, top_p=1.0)\n", "\n", "doc_chain = load_qa_chain(chat , chain_type=\"stuff\", prompt=QA_PROMPT)\n", "\n", diff --git a/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/Using_NVIDIA_NIMs_with_NeMo_Guardrails/config/config.yml b/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/Using_NVIDIA_NIMs_with_NeMo_Guardrails/config/config.yml new file mode 100644 index 00000000..b6981191 --- /dev/null +++ b/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/Using_NVIDIA_NIMs_with_NeMo_Guardrails/config/config.yml @@ -0,0 +1,11 @@ +models: + - type: main + engine: nvidia_ai_endpoints + model: meta/llama-3.1-70b-instruct + # parameters: + # base_url: + - type: embeddings + engine: nvidia_ai_endpoints + model: nvidia/nv-embedqa-e5-v5 + # parameters: + # base_url: diff --git a/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/Using_NVIDIA_NIMs_with_NeMo_Guardrails/config/flows.co b/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/Using_NVIDIA_NIMs_with_NeMo_Guardrails/config/flows.co new file mode 100644 index 00000000..067d9511 --- /dev/null +++ b/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/Using_NVIDIA_NIMs_with_NeMo_Guardrails/config/flows.co @@ -0,0 +1,20 @@ +define user greet + "Hello" + +define bot greet + "Hello. I'm the Guardrails Bot. How can I help you?" + +define flow + user greet + bot greet + +define user ask about user sensitive data + "Can you hack into someone's email account?" + "How do I get my friend's photos without permission?" + +define bot refuse to respond about user sensitive data + "Apologies, but the Guardrails Bot can't help with actions that asks about user sensitive data. It's important to respect privacy." + +define flow + user ask about user sensitive data + bot refuse to respond about user sensitive data \ No newline at end of file diff --git a/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/Using_NVIDIA_NIMs_with_NeMo_Guardrails/guardrails-nim-architecture.png b/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/Using_NVIDIA_NIMs_with_NeMo_Guardrails/guardrails-nim-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..b14108c7144db7b5f71aab9cb0010e5947e82108 GIT binary patch literal 159382 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 literal 0 HcmV?d00001 diff --git a/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/Using_NVIDIA_NIMs_with_NeMo_Guardrails/using_nims_with_guardrails.ipynb b/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/Using_NVIDIA_NIMs_with_NeMo_Guardrails/using_nims_with_guardrails.ipynb new file mode 100644 index 00000000..3577f65d --- /dev/null +++ b/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/Using_NVIDIA_NIMs_with_NeMo_Guardrails/using_nims_with_guardrails.ipynb @@ -0,0 +1,434 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Securing Generative AI Deployments with NVIDIA NIM Microservices and NVIDIA NeMo Guardrails" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Integrating NVIDIA NIMs with NeMo Guardrails\n", + "\n", + "This tutorial contains all of the code snippets presented in the technical blog [Securing Generative AI Deployments with NVIDIA NIM and NVIDIA NeMo Guardrails](https://developer.nvidia.com/blog/securing-generative-ai-deployments-with-nvidia-nim-and-nvidia-nemo-guardrails/) in a complete notebook. Please feel free to read the blog for full context.\n", + "\n", + "As a reference for how to deploy NIM on your chosen infrastructure, check out this [simple guide to deploying a NIM container and testing an inference request](https://developer.nvidia.com/blog/a-simple-guide-to-deploying-generative-ai-with-nvidia-nim/). \n", + "\n", + "In this tutorial, we deploy two NIM microservices — a NeMo Retriever Embedding NIM and an LLM NIM. We then integrate both with NeMo Guardrails to prevent malicious use in the form of user account hacking attempted through queries that pertain to personal data. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For the LLM NIM, we use Meta’s new [Llama-3.1-70B-Instruct](https://build.nvidia.com/meta/llama-3_1-70b-instruct) model. For the embedding NIM, we use NVIDIA’s new [EmbedQA-E5-V5](https://build.nvidia.com/nvidia/nv-embedqa-e5-v5). The NeMo Retriever Embedding NIM assists the guardrails by converting each input query into an embedding vector. This enables efficient comparison with guardrails policies, ensuring that the query does not match with any prohibited or out-of-scope policies, thereby preventing the LLM NIM from giving unauthorized outputs. \n", + "\n", + "By integrating these NIM with NeMo Guardrails, we accelerate the performance of safety filtering and dialog management." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will cover: \n", + "* Defining the use case\n", + "* Setting up a guardrailing system with NIM\n", + "* Testing the integration\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Defining the use case" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this example, we demonstrate how to intercept any incoming user questions that pertain to personal data using topical rails. These rails ensure the LLM response adheres to topics which do not share any sensitive information. They also help to keep the LLM outputs on track by fact-checking before answering the user's questions. The integration pattern of these rails with the NIMs can be seen in the figure below:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![An architectural diagram showing how Guardrails runtime works with the application code and the NIMs](guardrails-nim-architecture.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Setting up a guardrailing system with NIM" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Before we begin, let’s make sure that our NeMo Guardrails library is up to date with the latest version. The version that would work with this tutorial is 0.9.1.1 or later.\n", + "\n", + "We can check the version of the NeMo Guardrails library by running the following command in the terminal:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!nemoguardrails --version" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you do not have [NeMo Guardrails](https://pypi.org/project/nemoguardrails/) installed, run the following command:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# !pip install nemoguardrails" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you have versions that are older than 0.9.1.1, upgrade to the latest version by running the following command:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# !pip install nemoguardrails --upgrade" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The next step is defining the configuration of the guardrails. To learn more, see the [configuration guide](https://docs.nvidia.com/nemo/guardrails/user_guides/configuration-guide.html). We start by creating the config directory as follows:\n", + "\n", + "\n", + "```\n", + "├── config\n", + "│ ├── config.yml\n", + "│ ├── flows.co\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!mkdir -p config\n", + "!touch config/config.yml\n", + "!touch config/flows.co" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the `config.yml` file, we configure the NIM as follows:\n", + "* if you'd like to use [NVIDIA-hosted NIMs](https://build.nvidia.com/), comment out the parameters and base_url lines\n", + "* if you'd like to use your self-hosted NIMs, replace and with your own base URL for the NIMs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "config_yml_content = '''models:\n", + " - type: main\n", + " engine: nvidia_ai_endpoints\n", + " model: meta/llama-3.1-70b-instruct\n", + " # parameters:\n", + " # base_url: \n", + " - type: embeddings\n", + " engine: nvidia_ai_endpoints\n", + " model: nvidia/nv-embedqa-e5-v5\n", + " # parameters:\n", + " # base_url: \n", + "'''\n", + "\n", + "with open('config/config.yml', 'w') as file:\n", + " file.write(config_yml_content)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you are testing with NVIDIA-hosted NIMs, remove `parameters` and `base_url` from the `config.yml` file." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check if the `config.yml` has the correct content" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open('config/config.yml', 'r') as file:\n", + " contents = file.read()\n", + " print(contents)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once the configuration is added with the respective NIM, we can add rails in the flows.co file. An example of adding dialog rails is as follows:\n", + "\n", + "```\n", + "define user greet\n", + " \"Hello\"\n", + "\n", + "define bot greet\n", + " \"Hello. I'm the Guardrails Bot. How can I help you?\"\n", + "\n", + "define flow\n", + " user greet\n", + " bot greet\n", + "```\n", + "\n", + "The script above shows a simple dialog rail that explicitly greets the user in a specific manner." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can add more dialog rails in the flows.co file as follows:\n", + "\n", + "```\n", + "define user ask about user sensitive data\n", + " \"Can you hack into someone's email account?\"\n", + " \"How do I get my friend's photos without permission?\"\n", + "\n", + "define bot refuse to respond about user sensitive data\n", + " \"Apologies, but the Guardrails Bot can't help with actions that asks about user sensitive data. It's important to respect privacy.\"\n", + "\n", + "define flow\n", + " user ask about user sensitive data\n", + " bot refuse to respond about user sensitive data\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "flows_co_content = '''define user greet\n", + " \"Hello\"\n", + "\n", + "define bot greet\n", + " \"Hello. I'm the Guardrails Bot. How can I help you?\"\n", + "\n", + "define flow\n", + " user greet\n", + " bot greet\n", + "\n", + "define user ask about user sensitive data\n", + " \"Can you hack into someone's email account?\"\n", + " \"How do I get my friend's photos without permission?\"\n", + "\n", + "define bot refuse to respond about user sensitive data\n", + " \"Apologies, but the Guardrails Bot can't help with actions that asks about user sensitive data. It's important to respect privacy.\"\n", + "\n", + "define flow\n", + " user ask about user sensitive data\n", + " bot refuse to respond about user sensitive data'''\n", + "\n", + "with open('config/flows.co', 'w') as file:\n", + " file.write(flows_co_content)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check if the `flows.co` has the correct content" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open('config/flows.co', 'r') as file:\n", + " contents = file.read()\n", + " print(contents)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the Colang and YAML files in the config folder, we should be ready to set up our guardrails. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can import the related libraries and import the config folder to instantiate our guardrails." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import nest_asyncio\n", + "nest_asyncio.apply()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from nemoguardrails import RailsConfig, LLMRails\n", + "\n", + "config = RailsConfig.from_path('config')\n", + "rails = LLMRails(config)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are ready to test out our guardrails." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Testing the integration" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, we greet our LLM NIM through our guardrails and see if the guardrails pick up one of the predefined dialog rails." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "response = rails.generate(messages=[{\n", + " \"role\": \"user\",\n", + " \"content\": \"Hi!\"\n", + "}])\n", + "print(response['content'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here, our query to the LLM NIM is intercepted by the guardrails that we have set up because our query matches with one of the predefined dialog rails. The NeMo Retriever Embedding NIM assists our guardrails in turning our query into an embedding vector. Our guardrails then perform a semantic search to return the most similar results of the utterances that we provide as part of `flows.co`.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we ask the LLM NIM to provide us with a way to hack into a phone. This query falls into the category of topics pertaining to personal data. This is expected to be blocked by the guardrails based on the configuration. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "response = rails.generate(messages=[{\n", + " \"role\": \"user\",\n", + " \"content\": \"How can I hack into my partner's phone?\"\n", + "}])\n", + "print(response['content'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As seen, our guardrails are able to intercept the message and block the LLM NIM from responding to the query since we have defined dialog rails to prevent further discussion of this topic.\n", + "\n", + "The tutorial above is for users to only get started with a simple use case. To create a more robust guardrailing system, users are encouraged to set up [various types of rails](https://docs.nvidia.com/nemo/guardrails/user_guides/guardrails-library.html) allowing for further customization of their use cases." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Conclusion" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this post, we detailed the steps for integrating NVIDIA NIMs with NeMo Guardrails. In this instance, we were able to stop our application from responding to questions pertaining to personal data. With the integration of NVIDIA NIMs and NeMo Guardrails, developers are able to deploy AI models to production quickly and safely. " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/config/config.yml b/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/config/config.yml new file mode 100644 index 00000000..b6981191 --- /dev/null +++ b/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/config/config.yml @@ -0,0 +1,11 @@ +models: + - type: main + engine: nvidia_ai_endpoints + model: meta/llama-3.1-70b-instruct + # parameters: + # base_url: + - type: embeddings + engine: nvidia_ai_endpoints + model: nvidia/nv-embedqa-e5-v5 + # parameters: + # base_url: diff --git a/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/config/flows.co b/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/config/flows.co new file mode 100644 index 00000000..067d9511 --- /dev/null +++ b/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/config/flows.co @@ -0,0 +1,20 @@ +define user greet + "Hello" + +define bot greet + "Hello. I'm the Guardrails Bot. How can I help you?" + +define flow + user greet + bot greet + +define user ask about user sensitive data + "Can you hack into someone's email account?" + "How do I get my friend's photos without permission?" + +define bot refuse to respond about user sensitive data + "Apologies, but the Guardrails Bot can't help with actions that asks about user sensitive data. It's important to respect privacy." + +define flow + user ask about user sensitive data + bot refuse to respond about user sensitive data \ No newline at end of file diff --git a/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/guardrails-nim-architecture.png b/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/guardrails-nim-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..b14108c7144db7b5f71aab9cb0010e5947e82108 GIT binary patch literal 159382 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 literal 0 HcmV?d00001 diff --git a/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/using_nims_with_guardrails.ipynb b/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/using_nims_with_guardrails.ipynb new file mode 100644 index 00000000..3577f65d --- /dev/null +++ b/RAG/notebooks/langchain/Using_NVIDIA_NIMs_with_NeMo_Guardrails/using_nims_with_guardrails.ipynb @@ -0,0 +1,434 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Securing Generative AI Deployments with NVIDIA NIM Microservices and NVIDIA NeMo Guardrails" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Integrating NVIDIA NIMs with NeMo Guardrails\n", + "\n", + "This tutorial contains all of the code snippets presented in the technical blog [Securing Generative AI Deployments with NVIDIA NIM and NVIDIA NeMo Guardrails](https://developer.nvidia.com/blog/securing-generative-ai-deployments-with-nvidia-nim-and-nvidia-nemo-guardrails/) in a complete notebook. Please feel free to read the blog for full context.\n", + "\n", + "As a reference for how to deploy NIM on your chosen infrastructure, check out this [simple guide to deploying a NIM container and testing an inference request](https://developer.nvidia.com/blog/a-simple-guide-to-deploying-generative-ai-with-nvidia-nim/). \n", + "\n", + "In this tutorial, we deploy two NIM microservices — a NeMo Retriever Embedding NIM and an LLM NIM. We then integrate both with NeMo Guardrails to prevent malicious use in the form of user account hacking attempted through queries that pertain to personal data. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For the LLM NIM, we use Meta’s new [Llama-3.1-70B-Instruct](https://build.nvidia.com/meta/llama-3_1-70b-instruct) model. For the embedding NIM, we use NVIDIA’s new [EmbedQA-E5-V5](https://build.nvidia.com/nvidia/nv-embedqa-e5-v5). The NeMo Retriever Embedding NIM assists the guardrails by converting each input query into an embedding vector. This enables efficient comparison with guardrails policies, ensuring that the query does not match with any prohibited or out-of-scope policies, thereby preventing the LLM NIM from giving unauthorized outputs. \n", + "\n", + "By integrating these NIM with NeMo Guardrails, we accelerate the performance of safety filtering and dialog management." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will cover: \n", + "* Defining the use case\n", + "* Setting up a guardrailing system with NIM\n", + "* Testing the integration\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Defining the use case" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this example, we demonstrate how to intercept any incoming user questions that pertain to personal data using topical rails. These rails ensure the LLM response adheres to topics which do not share any sensitive information. They also help to keep the LLM outputs on track by fact-checking before answering the user's questions. The integration pattern of these rails with the NIMs can be seen in the figure below:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![An architectural diagram showing how Guardrails runtime works with the application code and the NIMs](guardrails-nim-architecture.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Setting up a guardrailing system with NIM" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Before we begin, let’s make sure that our NeMo Guardrails library is up to date with the latest version. The version that would work with this tutorial is 0.9.1.1 or later.\n", + "\n", + "We can check the version of the NeMo Guardrails library by running the following command in the terminal:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!nemoguardrails --version" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you do not have [NeMo Guardrails](https://pypi.org/project/nemoguardrails/) installed, run the following command:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# !pip install nemoguardrails" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you have versions that are older than 0.9.1.1, upgrade to the latest version by running the following command:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# !pip install nemoguardrails --upgrade" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The next step is defining the configuration of the guardrails. To learn more, see the [configuration guide](https://docs.nvidia.com/nemo/guardrails/user_guides/configuration-guide.html). We start by creating the config directory as follows:\n", + "\n", + "\n", + "```\n", + "├── config\n", + "│ ├── config.yml\n", + "│ ├── flows.co\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!mkdir -p config\n", + "!touch config/config.yml\n", + "!touch config/flows.co" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the `config.yml` file, we configure the NIM as follows:\n", + "* if you'd like to use [NVIDIA-hosted NIMs](https://build.nvidia.com/), comment out the parameters and base_url lines\n", + "* if you'd like to use your self-hosted NIMs, replace and with your own base URL for the NIMs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "config_yml_content = '''models:\n", + " - type: main\n", + " engine: nvidia_ai_endpoints\n", + " model: meta/llama-3.1-70b-instruct\n", + " # parameters:\n", + " # base_url: \n", + " - type: embeddings\n", + " engine: nvidia_ai_endpoints\n", + " model: nvidia/nv-embedqa-e5-v5\n", + " # parameters:\n", + " # base_url: \n", + "'''\n", + "\n", + "with open('config/config.yml', 'w') as file:\n", + " file.write(config_yml_content)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you are testing with NVIDIA-hosted NIMs, remove `parameters` and `base_url` from the `config.yml` file." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check if the `config.yml` has the correct content" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open('config/config.yml', 'r') as file:\n", + " contents = file.read()\n", + " print(contents)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once the configuration is added with the respective NIM, we can add rails in the flows.co file. An example of adding dialog rails is as follows:\n", + "\n", + "```\n", + "define user greet\n", + " \"Hello\"\n", + "\n", + "define bot greet\n", + " \"Hello. I'm the Guardrails Bot. How can I help you?\"\n", + "\n", + "define flow\n", + " user greet\n", + " bot greet\n", + "```\n", + "\n", + "The script above shows a simple dialog rail that explicitly greets the user in a specific manner." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can add more dialog rails in the flows.co file as follows:\n", + "\n", + "```\n", + "define user ask about user sensitive data\n", + " \"Can you hack into someone's email account?\"\n", + " \"How do I get my friend's photos without permission?\"\n", + "\n", + "define bot refuse to respond about user sensitive data\n", + " \"Apologies, but the Guardrails Bot can't help with actions that asks about user sensitive data. It's important to respect privacy.\"\n", + "\n", + "define flow\n", + " user ask about user sensitive data\n", + " bot refuse to respond about user sensitive data\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "flows_co_content = '''define user greet\n", + " \"Hello\"\n", + "\n", + "define bot greet\n", + " \"Hello. I'm the Guardrails Bot. How can I help you?\"\n", + "\n", + "define flow\n", + " user greet\n", + " bot greet\n", + "\n", + "define user ask about user sensitive data\n", + " \"Can you hack into someone's email account?\"\n", + " \"How do I get my friend's photos without permission?\"\n", + "\n", + "define bot refuse to respond about user sensitive data\n", + " \"Apologies, but the Guardrails Bot can't help with actions that asks about user sensitive data. It's important to respect privacy.\"\n", + "\n", + "define flow\n", + " user ask about user sensitive data\n", + " bot refuse to respond about user sensitive data'''\n", + "\n", + "with open('config/flows.co', 'w') as file:\n", + " file.write(flows_co_content)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check if the `flows.co` has the correct content" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open('config/flows.co', 'r') as file:\n", + " contents = file.read()\n", + " print(contents)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the Colang and YAML files in the config folder, we should be ready to set up our guardrails. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can import the related libraries and import the config folder to instantiate our guardrails." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import nest_asyncio\n", + "nest_asyncio.apply()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from nemoguardrails import RailsConfig, LLMRails\n", + "\n", + "config = RailsConfig.from_path('config')\n", + "rails = LLMRails(config)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are ready to test out our guardrails." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Testing the integration" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, we greet our LLM NIM through our guardrails and see if the guardrails pick up one of the predefined dialog rails." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "response = rails.generate(messages=[{\n", + " \"role\": \"user\",\n", + " \"content\": \"Hi!\"\n", + "}])\n", + "print(response['content'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here, our query to the LLM NIM is intercepted by the guardrails that we have set up because our query matches with one of the predefined dialog rails. The NeMo Retriever Embedding NIM assists our guardrails in turning our query into an embedding vector. Our guardrails then perform a semantic search to return the most similar results of the utterances that we provide as part of `flows.co`.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we ask the LLM NIM to provide us with a way to hack into a phone. This query falls into the category of topics pertaining to personal data. This is expected to be blocked by the guardrails based on the configuration. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "response = rails.generate(messages=[{\n", + " \"role\": \"user\",\n", + " \"content\": \"How can I hack into my partner's phone?\"\n", + "}])\n", + "print(response['content'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As seen, our guardrails are able to intercept the message and block the LLM NIM from responding to the query since we have defined dialog rails to prevent further discussion of this topic.\n", + "\n", + "The tutorial above is for users to only get started with a simple use case. To create a more robust guardrailing system, users are encouraged to set up [various types of rails](https://docs.nvidia.com/nemo/guardrails/user_guides/guardrails-library.html) allowing for further customization of their use cases." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Conclusion" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this post, we detailed the steps for integrating NVIDIA NIMs with NeMo Guardrails. In this instance, we were able to stop our application from responding to questions pertaining to personal data. With the integration of NVIDIA NIMs and NeMo Guardrails, developers are able to deploy AI models to production quickly and safely. " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/agentic_rag_with_nemo_retriever_nims.ipynb b/RAG/notebooks/langchain/agentic_rag_with_nemo_retriever_nim.ipynb similarity index 93% rename from notebooks/agentic_rag_with_nemo_retriever_nims.ipynb rename to RAG/notebooks/langchain/agentic_rag_with_nemo_retriever_nim.ipynb index a1c65c6c..21a6dbbd 100644 --- a/notebooks/agentic_rag_with_nemo_retriever_nims.ipynb +++ b/RAG/notebooks/langchain/agentic_rag_with_nemo_retriever_nim.ipynb @@ -6,7 +6,7 @@ "id": "919fe33c-0149-4f7d-b200-544a18986c9a", "metadata": {}, "source": [ - "# Agentic RAG pipeline with Nemo Retriever and LLM NIMs \n", + "# Agentic RAG pipeline with Nemo Retriever and NIM for LLMs\n", "\n", "## Overview\n", "\n", @@ -14,9 +14,9 @@ "\n", "Various retrieval strategies have been proposed that can improve the recall of documents for generation. There is no one-size-fits-all all. The strategy (for example: chunk size, number of documents returned, semantic search vs graph retrieval, etc.) depends on your data. Although the retrieval strategies might differ, an agentic framework designed on top of your retrieval system that does reasoning, decision-making, and reflection on your retrieved data is becoming more common in modern RAG systems. An agent can be described as a system that can use an LLM to reason through a problem, create a plan to solve the problem, and execute the plan with the help of a set of tools. For example, LLMs are notoriously bad at solving math problems, giving an LLM a calculator “tool” that it can use to perform mathematical tasks while it reasons through a larger problem of calculating YoY increase of a company’s revenue can be described as an agentic workflow. \n", "\n", - "As generative AI systems start transitioning towards entities capable of performing \"agentic\" tasks, we need robust models that have been trained on the ability to break down tasks, act as central planners, and have multi-step reasoning capabilities with model and system-level safety checks. With the Llama 3.1 family, Meta is launching a suite of LLMs spanning 8B, 70B, and 405B parameters with these tool-calling capabilities for agentic workloads. NVIDIA has partnered with Meta to make sure the latest Llama models can be deployed optimally through NVIDIA NIMs.\n", + "As generative AI systems start transitioning towards entities capable of performing \"agentic\" tasks, we need robust models that have been trained on the ability to break down tasks, act as central planners, and have multi-step reasoning capabilities with model and system-level safety checks. With the Llama 3.1 family, Meta is launching a suite of LLMs spanning 8B, 70B, and 405B parameters with these tool-calling capabilities for agentic workloads. NVIDIA has partnered with Meta to make sure the latest Llama models can be deployed optimally through NVIDIA NIM microservices.\n", "\n", - "Further, with the general availability of the NVIDIA NeMo Retriever collection of NIM microservices, enterprises have access to scalable software to customize their data-dependent RAG pipelines. The NeMo Retriever NIMs can be easily plugged into existing RAG pipelines and interfaces with open source LLM frameworks like LangChain or LlamaIndex, so you can easily integrate retriever models into generative AI applications.\n" + "Further, with the general availability of the NVIDIA NeMo Retriever collection of NIM microservices, enterprises have access to scalable software to customize their data-dependent RAG pipelines. The NeMo Retriever NIM can be easily plugged into existing RAG pipelines and interfaces with open source LLM frameworks like LangChain or LlamaIndex, so you can easily integrate retriever models into generative AI applications.\n" ] }, { @@ -48,21 +48,21 @@ "id": "385d9099-2737-4e51-88ad-87f701fd89d4", "metadata": {}, "source": [ - "### NeMo Retriever NIMs\n", + "### NeMo Retriever NIM\n", "\n", "NeMo Retriever microservices can be used for embedding and reranking. These microservices can be deployed within the enterprise locally, and are packaged together with NVIDIA Triton Inference Server and NVIDIA TensorRT for optimized inference of text for embedding and reranking. Additional enterprise benefits include:\n", "\n", - "**Scalable deployment**: Whether you're catering to a few users or millions, NeMo Retriever embedding and reranking NIMs can be scaled seamlessly to meet your demands.\n", + "**Scalable deployment**: Whether you're catering to a few users or millions, NeMo Retriever embedding and reranking microservices can be scaled seamlessly to meet your demands.\n", "\n", - "**Flexible integration**: Easily incorporate NeMo Retriever embedding and reranking NIMs into existing workflows and applications, thanks to the OpenAI-compliant API endpoints–and deploy anywhere your data resides.\n", + "**Flexible integration**: Easily incorporate NeMo Retriever embedding and reranking microservices into existing workflows and applications, thanks to the OpenAI-compliant API endpoints–and deploy anywhere your data resides.\n", "\n", - "**Secure processing**: Your data privacy is paramount. NeMo Retriever embedding and reranking NIMs ensure that all inferences are processed securely, with rigorous data.\n", + "**Secure processing**: Your data privacy is paramount. NeMo Retriever embedding and reranking microservices ensure that all inferences are processed securely, with rigorous data.\n", "\n", "NeMo Retriever embedding and reranking NIM microservices are available today. Developers can download and deploy docker containers locally.\n", "\n", "#### Access the Llama 3.1 405B model\n", "\n", - "The new Llama 3.1 set of models can be seen as the first big push of open-source models towards serious agentic capabilities. These models can now become part of a larger automation system, with LLMs doing the planning and picking the right tools to solve a larger problem. Since NVIDIA Llama 3.1 NIMs have the necessary support for OpenAI style tool calling, libraries like LangChain can now be used with NIMs to bind LLMs to Pydantic classes and fill in objects/dictionaries. This combination makes it easier for developers to get structured outputs from NIM LLMs without having to resort to regex parsing. You can access Llama 3.1 405B at ai.nvidia.com. Follow these instructions to generate the API key\n" + "The new Llama 3.1 set of models can be seen as the first big push of open-source models towards serious agentic capabilities. These models can now become part of a larger automation system, with LLMs doing the planning and picking the right tools to solve a larger problem. Since NVIDIA Llama 3.1 NIM has the necessary support for OpenAI style tool calling, libraries like LangChain can now be used with NIM microservices to bind LLMs to Pydantic classes and fill in objects/dictionaries. This combination makes it easier for developers to get structured outputs from NIM LLMs without having to resort to regex parsing. You can access Llama 3.1 405B at ai.nvidia.com. Follow these instructions to generate the API key\n" ] }, { @@ -169,7 +169,7 @@ "### Step-2: Initialize the Embedding, Reranking and LLM connectors\n", "\n", "#### Embedding and Reranking NIM\n", - "Use the NVIDIA OSS connectors to langchain to initialize the embedding, reranking and LLM models, after setting up the embedding and reranking NIMs locally using instructions here and here. point the ```base_url``` below to the ip address for your local machine. \n", + "Use the NVIDIA OSS connectors to langchain to initialize the embedding, reranking and LLM models, after setting up the embedding and reranking microservices locally using instructions here and here. point the ```base_url``` below to the ip address for your local machine. \n", "\n", "#### Llama 3.1 405B LLM\n", "The latest Llama 3.1 405B model is hosted on ai.nvidia.com. Use the instruction here to obtain the API Key for access " @@ -254,9 +254,9 @@ "source": [ "#### Step-4: Query decompostion with structured generation\n", "\n", - "The new Llama 3.1 set of models can be seen as the first big push of open-source models towards serious agentic capabilities. These models can now become part of a larger automation system, with LLMs doing the planning and picking the right tools to solve a larger problem. Since NVIDIA Llama 3.1 NIMs have the necessary support for OpenAI style tool calling, libraries like LangChain can now be used with NIMs to bind LLMs to Pydantic classes and fill in objects/dictionaries. This combination makes it easier for developers to get structured outputs from NIM LLMs without having to resort to regex parsing. \n", + "The new Llama 3.1 set of models can be seen as the first big push of open-source models towards serious agentic capabilities. These models can now become part of a larger automation system, with LLMs doing the planning and picking the right tools to solve a larger problem. Because the NVIDIA Llama 3.1 NIM has the necessary support for OpenAI style tool calling, libraries like LangChain can now be used with microservices to bind LLMs to Pydantic classes and fill in objects/dictionaries. This combination makes it easier for developers to get structured outputs from NIM LLMs without having to resort to regex parsing. \n", "\n", - "Here we user Llama 3.1 NIMs tool calling capability to split the initial query intp sub-queries" + "Here we use Llama 3.1 NIM tool calling capability to split the initial query intp sub-queries" ] }, { diff --git a/notebooks/toy_data/Sweden.txt b/RAG/notebooks/langchain/data/Sweden.txt similarity index 100% rename from notebooks/toy_data/Sweden.txt rename to RAG/notebooks/langchain/data/Sweden.txt diff --git a/RAG/notebooks/langchain/data/imgs/HumanInTheLoopLangGraph.png b/RAG/notebooks/langchain/data/imgs/HumanInTheLoopLangGraph.png new file mode 100644 index 0000000000000000000000000000000000000000..b54eaa180c14959cc5aefe469c3268049317af1d GIT binary patch literal 262293 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

O>n1>*s1;J{Xql2Q^sm-Oq(F*dZA;SZL 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

fK&~kWG#=&M`NEk<11B6CX_jc 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 literal 0 HcmV?d00001 diff --git a/notebooks/imgs/chrome_flags_fix_media_device_access_error.png b/RAG/notebooks/langchain/data/imgs/chrome_flags_fix_media_device_access_error.png similarity index 100% rename from notebooks/imgs/chrome_flags_fix_media_device_access_error.png rename to RAG/notebooks/langchain/data/imgs/chrome_flags_fix_media_device_access_error.png diff --git a/notebooks/imgs/data_connection_langchain.jpeg b/RAG/notebooks/langchain/data/imgs/data_connection_langchain.jpeg similarity index 100% rename from notebooks/imgs/data_connection_langchain.jpeg rename to RAG/notebooks/langchain/data/imgs/data_connection_langchain.jpeg diff --git a/RAG/notebooks/langchain/data/imgs/finish_social_post.png b/RAG/notebooks/langchain/data/imgs/finish_social_post.png new file mode 100644 index 0000000000000000000000000000000000000000..26a7f172a41ec36f39b38ce3a48ae5caef2a7614 GIT binary patch literal 662277 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 i^rlV` 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 z%0D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

3}{Ntt#Yq^@h1R)A->t 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
=;)h>RT{r!ih zs7l_iJ$>wJ{0@}9EosvjISa;<0FljpxZiwkyndbwS!DYIL;7EK3ui#<=F8I&3YB~A zYpsi?Lj6>}w=@GbGqWiZ8XnUl?lGs=_!At&8^4zm9M?{G<>?SJ85b$o_oaof6?{&_ zGES}^p}$w{jJ88uzsJj}W@+Q}gH6EJ8xh}+w=x??1{GZwT=eLUpDY+WO^UO?zaKsugnXU*T$q2jqFDHVOHs1~#%dpIK1z^tWVr09ase`*N4Zk8!Gw zB-StCig(AwL38Xrrvul)6b zkz&LWAyRZW`Thj{HVV@&LWk5TDqh_cIb(>k9O2Y;X0kctP3L|5!%Dte1re!Zg~IQ7 zg@K50?wJvMk+(ozvIFY32Lg*5LQhJD^ieO|{I=?N8StA7Ft#x`TgQu9z*Nlo-;q~p zC{b$K@D{sE@d)Cfms3WNJ1RwewHE)|ha;iD8LNU?m=XaysVxM`AcDgI*OP7&6mso_ z2AowF-9!d3%~90=nlF_#C>0q;-E#B+4MK>+oR8Iahbk2POLJo^?2{dL1q`GH7^w~4 zU172K!j)V(m6jbe=T1UJv%>iB!j$TP-X!pXX(HS^ROk#IqHwSnD?MmW5LCo@Amz(h zVR(ztY2_BMy%$IT-k6xu`?T3IT{}@YP)8SU=@*n__3%UomG%^ruWANON1tlHPS`Ht z_Gtf6>n~=PF?~gAyK_yrbunkt`lqWOJT{;}rCFNi`jkMkkxV`bLWQKQ*{8XjA`DTCz# zhSBr!7hmzc2lc=Co5#ueQ)ScK0^Upt*TG-1Z<1Q1pPdWD^8-w&1iKmQP*+XU_4~#C zcLu{FI0hr9W-vszmxex-OE!z?wgeMz9{2ygPkO(dE4RKsJW$nghX?yH{FSu;`PM99 zToW1><&ch+Vv}eq;m$hU;K9ZbmV+H>QVMkGi*m)^HuWO?!U))Y)jb+*dm=oz+xk!| z6D6VSYs?X|X|7B;$N&Y#>sjM1JK*fR&WGQe_l!BZdSh|5VZNll@vLGY&bP>L9aB77 z6@IJ5(0eFt8u8??>`c%|%Jh7|X7PrWQyx{aEAzh4C3hJ~ecw}C5)DTrfXl6FH~zTH zVc&ns^>dM+lrOc7er{T@g4A%Xh9|GDu~iOLx8; z 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�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 s*e!d>yy~xo{II#Ba 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 literal 0 HcmV?d00001 diff --git a/notebooks/imgs/grace_answer.png b/RAG/notebooks/langchain/data/imgs/grace_answer.png similarity index 100% rename from notebooks/imgs/grace_answer.png rename to RAG/notebooks/langchain/data/imgs/grace_answer.png diff --git a/notebooks/imgs/grace_answer_with_riva.png b/RAG/notebooks/langchain/data/imgs/grace_answer_with_riva.png similarity index 100% rename from notebooks/imgs/grace_answer_with_riva.png rename to RAG/notebooks/langchain/data/imgs/grace_answer_with_riva.png diff --git a/notebooks/imgs/grace_noanswer.png b/RAG/notebooks/langchain/data/imgs/grace_noanswer.png similarity index 100% rename from notebooks/imgs/grace_noanswer.png rename to RAG/notebooks/langchain/data/imgs/grace_noanswer.png diff --git a/notebooks/imgs/grace_noanswer_with_riva.png b/RAG/notebooks/langchain/data/imgs/grace_noanswer_with_riva.png similarity index 100% rename from notebooks/imgs/grace_noanswer_with_riva.png rename to RAG/notebooks/langchain/data/imgs/grace_noanswer_with_riva.png diff --git a/notebooks/imgs/inference_runtime.png b/RAG/notebooks/langchain/data/imgs/inference_runtime.png similarity index 100% rename from notebooks/imgs/inference_runtime.png rename to RAG/notebooks/langchain/data/imgs/inference_runtime.png diff --git a/notebooks/imgs/llama_hub.png b/RAG/notebooks/langchain/data/imgs/llama_hub.png similarity index 100% rename from notebooks/imgs/llama_hub.png rename to RAG/notebooks/langchain/data/imgs/llama_hub.png diff --git a/notebooks/imgs/media_device_access_error.png b/RAG/notebooks/langchain/data/imgs/media_device_access_error.png similarity index 100% rename from notebooks/imgs/media_device_access_error.png rename to RAG/notebooks/langchain/data/imgs/media_device_access_error.png diff --git a/notebooks/imgs/nvidianews.png b/RAG/notebooks/langchain/data/imgs/nvidianews.png similarity index 100% rename from notebooks/imgs/nvidianews.png rename to RAG/notebooks/langchain/data/imgs/nvidianews.png diff --git a/notebooks/imgs/preprocessing.png b/RAG/notebooks/langchain/data/imgs/preprocessing.png similarity index 100% rename from notebooks/imgs/preprocessing.png rename to RAG/notebooks/langchain/data/imgs/preprocessing.png diff --git a/notebooks/imgs/vector_stores.jpeg b/RAG/notebooks/langchain/data/imgs/vector_stores.jpeg similarity index 100% rename from notebooks/imgs/vector_stores.jpeg rename to RAG/notebooks/langchain/data/imgs/vector_stores.jpeg diff --git a/notebooks/imgs/visual_reasoning.png b/RAG/notebooks/langchain/data/imgs/visual_reasoning.png similarity index 100% rename from notebooks/imgs/visual_reasoning.png rename to RAG/notebooks/langchain/data/imgs/visual_reasoning.png diff --git a/RAG/notebooks/langchain/langchain_basic_RAG.ipynb b/RAG/notebooks/langchain/langchain_basic_RAG.ipynb new file mode 100644 index 00000000..5384879c --- /dev/null +++ b/RAG/notebooks/langchain/langchain_basic_RAG.ipynb @@ -0,0 +1,519 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "c5fb0b9e-f9cd-404f-bd8d-0273e94ac1fe", + "metadata": {}, + "source": [ + "# RAG Example Using NVIDIA API Catalog and LangChain" + ] + }, + { + "cell_type": "markdown", + "id": "2969cdab-82fc-4ce5-bde1-b4f629691f27", + "metadata": {}, + "source": [ + "This notebook introduces how to use LangChain to interact with NVIDIA hosted NIM microservices like chat, embedding, and reranking models to build a simple retrieval-augmented generation (RAG) application." + ] + }, + { + "cell_type": "markdown", + "id": "e4253bd0-4313-4056-95f5-899a180879c2", + "metadata": {}, + "source": [ + "## Terminology" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "5a084a00-b65d-483a-a7c6-b4c12e4272dd", + "metadata": {}, + "source": [ + "#### RAG\n", + "\n", + "- RAG is a technique for augmenting LLM knowledge with additional data.\n", + "- LLMs can reason about wide-ranging topics, but their knowledge is limited to the public data up to a specific point in time that they were trained on.\n", + "- If you want to build AI applications that can reason about private data or data introduced after a model's cutoff date, you need to augment the knowledge of the model with the specific information it needs.\n", + "- The process of bringing the appropriate information and inserting it into the model prompt is known as retrieval augmented generation (RAG).\n", + "\n", + "The preceding summary of RAG originates in the LangChain v0.2 tutorial [Build a RAG App](https://python.langchain.com/v0.2/docs/tutorials/rag/) tutorial in the LangChain v0.2 documentation.\n", + "\n", + "#### NIM\n", + "\n", + "- [NIM microservices](https://developer.nvidia.com/blog/nvidia-nim-offers-optimized-inference-microservices-for-deploying-ai-models-at-scale/) are containerized microservices that simplify the deployment of generative AI models like LLMs and are optimized to run on NVIDIA GPUs. \n", + "- NIM microservices support models across domains like chat, embedding, reranking, and more from both the community and NVIDIA.\n", + "\n", + "#### NVIDIA API Catalog\n", + "\n", + "- [NVIDIA API Catalog](https://build.nvidia.com/explore/discover) is a hosted platform for accessing a wide range of microservices online.\n", + "- You can test models on the catalog and then export them with an NVIDIA AI Enterprise license for on-premises or cloud deployment\n", + "\n", + "#### langchain-nvidia-ai-endpoints\n", + "\n", + "- The [`langchain-nvidia-ai-endpoints`](https://pypi.org/project/langchain-nvidia-ai-endpoints/) Python package contains LangChain integrations for building applications that communicate with NVIDIA NIM microservices." + ] + }, + { + "cell_type": "markdown", + "id": "ca300278-5ff4-47c4-ab70-c6584ef73c9f", + "metadata": {}, + "source": [ + "## Installation and Requirements\n", + "\n", + "Create a Python environment (preferably with Conda) using Python version 3.10.14. \n", + "To install Jupyter Lab, refer to the [installation](https://jupyter.org/install) page." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5de8e53a-7940-4e72-87f3-e1c014128806", + "metadata": {}, + "outputs": [], + "source": [ + "# Requirements\n", + "!pip install langchain==0.2.5\n", + "!pip install langchain_community==0.2.5\n", + "!pip install faiss-cpu==1.8.0 # replace with faiss-gpu if you are using GPU\n", + "!pip install langchain-nvidia-ai-endpoints==0.1.2" + ] + }, + { + "cell_type": "markdown", + "id": "1b7a52a0-7e5e-4064-9665-cb947d600f84", + "metadata": {}, + "source": [ + "## Getting Started!" + ] + }, + { + "cell_type": "markdown", + "id": "04495732-c2db-4c97-91d0-96708814334d", + "metadata": {}, + "source": [ + "To get started you need an `NVIDIA_API_KEY` to use the NVIDIA API Catalog:\n", + "\n", + "1) Create a free account with [NVIDIA](https://build.nvidia.com/explore/discover).\n", + "2) Click on your model of choice.\n", + "3) Under Input select the Python tab, and click **Get API Key** and then click **Generate Key**.\n", + "4) Copy and save the generated key as NVIDIA_API_KEY. From there, you should have access to the endpoints." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "bbb51115-79f8-48c3-b3ee-d434916945f6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Enter your NVIDIA API key: ········\n" + ] + } + ], + "source": [ + "import getpass\n", + "import os\n", + "\n", + "if not os.environ.get(\"NVIDIA_API_KEY\", \"\").startswith(\"nvapi-\"):\n", + " nvidia_api_key = getpass.getpass(\"Enter your NVIDIA API key: \")\n", + " assert nvidia_api_key.startswith(\"nvapi-\"), f\"{nvidia_api_key[:5]}... is not a valid key\"\n", + " os.environ[\"NVIDIA_API_KEY\"] = nvidia_api_key" + ] + }, + { + "cell_type": "markdown", + "id": "25656ab5-0046-4e27-be65-b3d3d547b4c6", + "metadata": {}, + "source": [ + "## RAG Example using LLM & Embedding" + ] + }, + { + "cell_type": "markdown", + "id": "54e86bc0-e9c5-4a2b-be0e-7fca0331e886", + "metadata": {}, + "source": [ + "### 1) Initialize the LLM\n", + "\n", + "The ChatNVIDIA class is part of LangChain's integration (langchain_nvidia_ai_endpoints) with NVIDIA NIM microservices. \n", + "It allows access to NVIDIA NIM for chat applications, connecting to hosted or locally-deployed microservices.\n", + "\n", + "Here we will use **mixtral-8x7b-instruct-v0.1** " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "88c2fafe-5ded-4238-82de-f094232bf6fb", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_nvidia_ai_endpoints import ChatNVIDIA\n", + "\n", + "llm = ChatNVIDIA(model=\"mistralai/mixtral-8x7b-instruct-v0.1\", max_tokens=1024)\n", + "\n", + "# Here we are using mixtral-8x7b-instruct-v0.1 model\n", + "# But you are free to choose any model hosted at Nvidia API Catalog\n", + "# Uncomment the below code to list the availabe models\n", + "# ChatNVIDIA.get_available_models()" + ] + }, + { + "cell_type": "markdown", + "id": "35cc87a6-2f83-4652-95f1-cf349db8bad6", + "metadata": {}, + "source": [ + "### 2) Intiatlize the embedding\n", + "NVIDIAEmbeddings is a client to NVIDIA embeddings models that provides access to a NVIDIA NIM for embedding. It can connect to a hosted NIM or a local NIM using a base URL\n", + "\n", + "We selected **NV-Embed-QA** as the embedding" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "d88f7838-b9f9-4fc5-8779-84df6cb26017", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings\n", + "\n", + "embedder = NVIDIAEmbeddings(model=\"NV-Embed-QA\", truncate=\"END\")" + ] + }, + { + "cell_type": "markdown", + "id": "b9862f2e-5055-4fe4-818d-708091243d74", + "metadata": {}, + "source": [ + "### 3) Obtain some toy text dataset\n", + "Here we are loading a toy data from a text documents and in real-time data can be loaded from various sources. \n", + "Read [here](https://python.langchain.com/v0.2/docs/tutorials/rag/#go-deeper) for loading data from different sources" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "9c615b9c-527e-4e3b-86b7-49ef258e2d57", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "# For this example we load a toy data set (it's a simple text file with some information about Sweden)\n", + "TOY_DATA_PATH = \"./data/\"\n", + "# We read in the text data and prepare them into vectorstore\n", + "ps = os.listdir(TOY_DATA_PATH)\n", + "data = []\n", + "sources = []\n", + "for p in ps:\n", + " if p.endswith('.txt'):\n", + " path2file=TOY_DATA_PATH+p\n", + " with open(path2file,encoding=\"utf-8\") as f:\n", + " lines=f.readlines()\n", + " for line in lines:\n", + " if len(line)>=1:\n", + " data.append(line)\n", + " sources.append(path2file)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "d0a1447d-444a-4ae9-9484-4546424c047d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(400,\n", + " 230,\n", + " 'Sweden, formally the Kingdom of Sweden, is a Nordic country located on the Scandinavian Peninsula in Northern Europe. It borders Norway to the west and north, Finland to the east, and is connected to Denmark in the southwest by a bridge–tunnel across the Öresund. At 447,425 square kilometres (172,752 sq mi), Sweden is the largest Nordic country, the third-largest country in the European Union, and the fifth-largest country in Europe. The capital and largest city is Stockholm. Sweden has a total population of 10.5 million, and a low population density of 25.5 inhabitants per square kilometre (66/sq mi), with around 87% of Swedes residing in urban areas, which cover 1.5% of the entire land area, in the central and southern half of the country.\\n')" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Do some basic cleaning and remove empty lines\n", + "documents=[d for d in data if d != '\\n']\n", + "len(data), len(documents), data[0]" + ] + }, + { + "cell_type": "markdown", + "id": "851b16b3-43ac-4269-9f37-05a33efe24fb", + "metadata": {}, + "source": [ + "### 4) Process the documents into vectorstore and save it to disk\n", + "\n", + "Real world documents can be very long, this makes it hard to fit in the context window of many models. Even for those models that could fit the full post in their context window, models can struggle to find information in very long inputs.\n", + "\n", + "To handle this we’ll split the Document into chunks for embedding and vector storage. More on text splitting [here](https://python.langchain.com/v0.2/docs/concepts/#text-splitters)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "804c85f6-181b-4291-a685-d6b378015544", + "metadata": {}, + "outputs": [], + "source": [ + "# Here we create a faiss vector store from the documents and save it to disk.\n", + "from langchain_community.vectorstores import FAISS\n", + "from langchain_core.output_parsers import StrOutputParser\n", + "from langchain_core.prompts import ChatPromptTemplate\n", + "from langchain_core.runnables import RunnablePassthrough\n", + "from langchain.text_splitter import CharacterTextSplitter\n", + "\n", + "text_splitter = CharacterTextSplitter(chunk_size=400, separator=\" \", chunk_overlap=80)\n", + "docs = []\n", + "metadatas = []\n", + "\n", + "for i, d in enumerate(documents):\n", + " splits = text_splitter.split_text(d)\n", + " docs.extend(splits)\n", + " metadatas.extend([{\"source\": sources[i]}] * len(splits))" + ] + }, + { + "cell_type": "markdown", + "id": "f867df18-11c8-45ea-b81c-1603459431f9", + "metadata": {}, + "source": [ + "To enable runtime search, we index text chunks by embedding each document split and storing these embeddings in a vector database. Later to search, we embed the query and perform a similarity search to find the stored splits with embeddings most similar to the query." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "2d7b2fbd-8cb1-4d68-9659-2426b9ecffe3", + "metadata": {}, + "outputs": [], + "source": [ + "# you will only need to do this once, later on we will restore the already saved vectorstore\n", + "store = FAISS.from_texts(docs, embedder , metadatas=metadatas)\n", + "VECTOR_STORE = './data/nv_embedding'\n", + "store.save_local(VECTOR_STORE)" + ] + }, + { + "cell_type": "markdown", + "id": "3fe85dad-12bb-47d2-a407-9b89b5270d4e", + "metadata": {}, + "source": [ + "### 5) Read the previously processed & saved vectore store back" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "5de3e07d-5fbe-4fe7-8f23-ed0b082f2413", + "metadata": {}, + "outputs": [], + "source": [ + "# Load the FAISS vectorestore back.\n", + "store = FAISS.load_local(VECTOR_STORE, embedder, allow_dangerous_deserialization=True)" + ] + }, + { + "cell_type": "markdown", + "id": "4a41ff63-6adc-4055-8bc4-e7ecaad0fb4d", + "metadata": {}, + "source": [ + "### 6) Wrap the restored vectorsore into a retriever and ask our question " + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "5aa362c9-48ab-4646-bc29-bc2aca92505d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\" Sweden is the 55th-largest country in the world, the fifth-largest country in Europe, and the largest country in Northern Europe, with a total area of 449,964 km2 (173,732 sq mi). In terms of elevation, the lowest point in Sweden is in the bay of Lake Hammarsjön, near Kristianstad, at -2.41 m (-7.91 ft) below sea level, while the highest point is Kebnekaise, which is 2,111 m (6,926 ft) above sea level.\\n\\nSweden has a Nordic social welfare system that provides universal health care and tertiary education for its citizens. The country has a high standard of living and ranks very highly in various international metrics, including quality of life, health, education, protection of civil liberties, economic competitiveness, income equality, gender equality, and prosperity. Sweden's GDP per capita is the world's 14th highest.\\n\\nHistorically, Sweden has been both a kingdom and an empire. Currently, it is a constitutional monarchy and a parliamentary democracy, with a popularly elected parliament and a monarch who serves a ceremonial role. Sweden is a member of the European Union but has opted to remain outside the Eurozone.\"" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "retriever = store.as_retriever()\n", + "\n", + "prompt = ChatPromptTemplate.from_messages(\n", + " [\n", + " (\n", + " \"system\",\n", + " \"Answer solely based on the following context:\\n\\n{context}\\n\",\n", + " ),\n", + " (\"user\", \"{question}\"),\n", + " ]\n", + ")\n", + "\n", + "# Langchain's LCEL(LangChain Expression Language) Runnable protocol is used to define the chain\n", + "# LCEL allows pipe together components and functions\n", + "chain = (\n", + " {\"context\": retriever, \"question\": RunnablePassthrough()}\n", + " | prompt\n", + " | llm\n", + " | StrOutputParser()\n", + ")\n", + "\n", + "chain.invoke(\"Tell me about Sweden.\")" + ] + }, + { + "cell_type": "markdown", + "id": "c29478b0-0fb1-4678-93cd-b159dc9884a7", + "metadata": {}, + "source": [ + "## RAG Example with LLM, Embedding & Reranking" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "972c310b-5333-4b41-a6dd-ce83e739e6dc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\" The documents provided do not include information about Gustav's grandson ascending the throne. Gustav had several grandchildren, and the documents do not specify which one you are referring to. Moreover, the documents do not provide enough information about the timeline of Gustav's grandson's ascension to the throne. Therefore, it is not possible to answer this question without additional context.\"" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Let's test a more complex query using the above LLM Embedding chain and see if the reranker can help.\n", + "chain.invoke(\"In which year Gustav's grandson ascended the throne?\")" + ] + }, + { + "cell_type": "markdown", + "id": "9d3854c7-68a3-45b4-9e69-2c4e583d651f", + "metadata": {}, + "source": [ + "### Enhancing accuracy for single data sources\n", + "\n", + "This example demonstrates how a re-ranking model can be used to combine retrieval results and improve accuracy during retrieval of documents.\n", + "\n", + "Typically, reranking is a critical piece of high-accuracy, efficient retrieval pipelines. Generally, there are two important use cases:\n", + "\n", + "- Combining results from multiple data sources\n", + "- Enhancing accuracy for single data sources\n", + "\n", + "Here, we focus on demonstrating only the second use case. If you want to know more, check [here](https://github.com/langchain-ai/langchain-nvidia/blob/main/libs/ai-endpoints/docs/retrievers/nvidia_rerank.ipynb)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "b7e8677e-a37f-42e2-8fea-4c4413f7d682", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\" Gustav's grandson, Sigismund, ascended the throne in 1592.\"" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from langchain_nvidia_ai_endpoints import NVIDIARerank\n", + "from langchain_core.runnables import RunnableParallel\n", + "\n", + "# We will narrow the collection to 100 results and further narrow it to 10 with the reranker.\n", + "retriever = store.as_retriever(search_kwargs={'k':100}) # typically k will be 1000 for real world use-cases\n", + "ranker = NVIDIARerank(model='nv-rerank-qa-mistral-4b:1', top_n=10)\n", + "\n", + "prompt = ChatPromptTemplate.from_messages(\n", + " [\n", + " (\n", + " \"system\",\n", + " \"Answer solely based on the following context:\\n\\n{context}\\n\",\n", + " ),\n", + " (\"user\", \"{question}\"),\n", + " ]\n", + ")\n", + "\n", + "reranker = lambda input: ranker.compress_documents(query=input['question'], documents=input['context'])\n", + "\n", + "chain_with_ranker = (\n", + " RunnableParallel({\"context\": retriever, \"question\": RunnablePassthrough()})\n", + " | {\"context\": reranker, \"question\": lambda input: input['question']}\n", + " | prompt\n", + " | llm\n", + " | StrOutputParser()\n", + ")\n", + "chain_with_ranker.invoke(\"In which year Gustav's grandson ascended the throne?\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "79d5186f-12c0-47c9-9e85-5987fedf7b97", + "metadata": {}, + "source": [ + "#### Note:\n", + "- In this notebook, we have used NVIDIA NIM microservices from the NVIDIA API Catalog.\n", + "- The above APIs, ChatNVIDIA, NVIDIAEmbedding, and NVIDIARerank, also support self-hosted NIM microservices.\n", + "- Change the `base_url` to your deployed NIM URL.\n", + "- Example: `llm = ChatNVIDIA(base_url=\"http://localhost:8000/v1\", model=\"meta/llama3-8b-instruct\")`\n", + "- NIM can be hosted locally using Docker, following the [NVIDIA NIM for LLMs](https://docs.nvidia.com/nim/large-language-models/latest/getting-started.html) documentation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61236a22-922f-403f-89d1-1172251aeb0c", + "metadata": {}, + "outputs": [], + "source": [ + "# Example Code snippet if you want to use a self-hosted NIM\n", + "from langchain_nvidia_ai_endpoints import ChatNVIDIA\n", + "\n", + "# connect to an LLM NIM running at localhost:8000, specifying a specific model\n", + "llm = ChatNVIDIA(base_url=\"http://localhost:8000/v1\", model=\"meta/llama3-8b-instruct\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python (rag_notebooks)", + "language": "python", + "name": "rag_notebooks" + }, + "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.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/RAG/notebooks/llamaindex/data/Sweden.txt b/RAG/notebooks/llamaindex/data/Sweden.txt new file mode 100644 index 00000000..2e480f65 --- /dev/null +++ b/RAG/notebooks/llamaindex/data/Sweden.txt @@ -0,0 +1,400 @@ +Sweden, formally the Kingdom of Sweden, is a Nordic country located on the Scandinavian Peninsula in Northern Europe. It borders Norway to the west and north, Finland to the east, and is connected to Denmark in the southwest by a bridge–tunnel across the Öresund. At 447,425 square kilometres (172,752 sq mi), Sweden is the largest Nordic country, the third-largest country in the European Union, and the fifth-largest country in Europe. The capital and largest city is Stockholm. Sweden has a total population of 10.5 million, and a low population density of 25.5 inhabitants per square kilometre (66/sq mi), with around 87% of Swedes residing in urban areas, which cover 1.5% of the entire land area, in the central and southern half of the country. +Nature in Sweden is dominated by forests and many lakes, including some of the largest in Europe. Many long rivers run from the Scandes range through the landscape, primarily emptying into the northern tributaries of the Baltic Sea. It has an extensive coastline and most of the population lives near a major body of water. With the country ranging from 55°N to 69°N, the climate of Sweden is diverse due to the length of the country. The usual conditions are mild for the latitudes with a maritime south, continental centre and subarctic north. Snow cover is variable in the densely populated south, but reliable in higher latitudes. Furthermore, the rain shadow of the Scandes results in quite dry winters and sunny summers in much of the country. +Germanic peoples have inhabited Sweden since prehistoric times, emerging into history as the Geats (Swedish: Götar) and Swedes (Svear) and constituting the sea peoples known as the Norsemen. An independent Swedish state emerged during the early 12th century. After the Black Death in the middle of the 14th century killed about a third of the Scandinavian population, the dominance of the Hanseatic League in Northern Europe threatened Scandinavia economically and politically. This led to the formation of the Scandinavian Kalmar Union in 1397, which Sweden left in 1523. When Sweden became involved in the Thirty Years' War on the Protestant side, an expansion of its territories began, forming the Swedish Empire, which remained one of the great powers of Europe until the early 18th century. +Swedish territories outside the Scandinavian Peninsula were gradually lost during the 18th and 19th centuries, ending with the annexation of present-day Finland by Russia in 1809. The last war in which Sweden was directly involved was in 1814 when Norway was militarily forced into a personal union, which peacefully dissolved in 1905. In 2014, Sweden celebrated 200 years of peace, a longer span of peacetime than even Switzerland. Sweden maintained an official policy of neutrality during wartime and non-participation in military alliances during peacetime, although Sweden secretly relied on U.S. nuclear submarines during the Cold War. Sweden has since 2008 joined EU battlegroups, provided intelligence to NATO and since 2009 openly moved towards cooperation with NATO. In 2022, following the Russian invasion of Ukraine, Sweden announced its intent to join NATO. +Sweden is a highly developed country ranked seventh in the Human Development Index, it is a constitutional monarchy and a parliamentary democracy, with legislative power vested in the 349-member unicameral Riksdag. It is a unitary state, currently divided into 21 counties and 290 municipalities. Sweden maintains a Nordic social welfare system that provides universal health care and tertiary education for its citizens. It has the world's 14th highest GDP per capita and ranks very highly in quality of life, health, education, protection of civil liberties, economic competitiveness, income equality, gender equality and prosperity. Sweden joined the European Union on 1 January 1995 but rejected Eurozone membership following a referendum. It is also a member of the United Nations, the Nordic Council, the Council of Europe, the World Trade Organization and the Organisation for Economic Co-operation and Development (OECD). + + +== Etymology == + +The name for Sweden is generally agreed to derive from the Proto-Indo-European root *s(w)e, meaning "one's own", referring to one's own tribe from the tribal period. The native Swedish name, Sverige (a compound of the words Svea and rike, with lenition of the consonant [k], first recorded in the cognate Swēorice in Beowulf), translates as "realm of the Swedes", which excluded the Geats in Götaland. +The contemporary English variation was derived in the 17th-century from Middle Dutch and Middle Low German. As early as 1287, references are found in Middle Dutch referring to a lande van sweden ("land of [the] Swedes"), with swede as the singular form. In Old English the country was known as Swéoland or Swíoríce, and in Early Modern English as Swedeland. Some Finnic languages, such as Finnish and Estonian, use the terms Ruotsi and Rootsi; these variations refer to the Rus' people who inhabited the coastal areas of Roslagen in Uppland and who gave their name to Russia. + + +== History == + + +=== Prehistory === + +Sweden's prehistory begins in the Allerød oscillation, a warm period around 12,000 BC, with Late Palaeolithic reindeer-hunting camps of the Bromme culture at the edge of the ice in what is now the country's southernmost province, Scania. This period was characterised by small clans of hunter-gatherers who relied on flint technology.Sweden and its people were first described by Publius Cornelius Tacitus in his written work Germania (98 AD). In Germania 44 and 45 he mentions the Swedes (Suiones) as a powerful tribe (distinguished not merely for their arms and men, but for their powerful fleets) with ships that had a prow at each end (longships). Which kings (*kuningaz) ruled these Suiones is unknown, but Norse mythology presents a long line of legendary and semi-legendary kings going back to the last centuries BC. As for literacy in Sweden itself, the runic script was in use among the south Scandinavian elite by at least the second century AD, but all that has come down to the present from the Roman Period is curt inscriptions on artefacts, mainly of male names, demonstrating that the people of south Scandinavia spoke Proto-Norse at the time, a language ancestral to Swedish and other North Germanic languages.In the sixth century, Jordanes names two tribes living in Scandza, both of which are now considered to be synonymous with the Swedes: the Suetidi and Suehans. Suetidi is considered to be the Latin form of Svíþjóð, the Old Norse name for the Swedes. Jordanes describes the Suetidi and Dani as being of the same stock and the tallest of people. He later mentions other Scandinavian tribes as being of a same stature. The Suehans were known to the Roman world as suppliers of black fox skins and, according to Jordanes, had very fine horses, similar to those of the Thyringi of Germania (alia vero gens ibi moratur Suehans, quae velud Thyringi equis utuntur eximiis). + + +=== Vikings === + +The Swedish Viking Age lasted roughly from the eighth century to the 11th century. It is believed that Swedish Vikings and Gutar mainly travelled east and south, going to Finland, Estonia, the Baltic countries, Russia, Belarus, Ukraine, the Black Sea and even as far as Baghdad. Their routes passed through the Dnieper south to Constantinople, on which they carried out numerous raids. The Byzantine Emperor Theophilos noticed their great skills in war, and invited them to serve as his personal bodyguard, known as the Varangian Guard. The Swedish Vikings, called Rus are believed to be the founding fathers of Kievan Rus'. The Arab traveller Ibn Fadlan described these Vikings saying: + +I have seen the Rus as they came on their merchant journeys and encamped by the Itil. I have never seen more perfect physical specimens, tall as date palms, blond and ruddy; they wear neither tunics nor caftans, but the men wear a garment which covers one side of the body and leaves a hand free. Each man has an axe, a sword, and a knife, and keeps each by him at all times. The swords are broad and grooved, of Frankish sort. + +The actions of these Swedish Vikings are commemorated on many runestones in Sweden, such as the Greece runestones and the Varangian runestones. There was also considerable participation in expeditions westwards, which are commemorated on stones such as the England runestones. The last major Swedish Viking expedition appears to have been the ill-fated expedition of Ingvar the Far-Travelled to Serkland, the region south-east of the Caspian Sea. Its members are commemorated on the Ingvar runestones, none of which mentions any survivor. What happened to the crew is unknown, but it is believed that they died of sickness. + + +=== Kingdom of Sweden === +It is not known when and how the kingdom of Sweden was born, but the list of Swedish monarchs is drawn from the first kings known to have ruled both Svealand (Sweden) and Götaland (Gothia) as one province, beginning with Eric the Victorious. Sweden and Gothia were two separate nations long before that and since antiquity. It is not known how long they existed: the epic poem Beowulf describes semi-legendary Swedish-Geatish wars in the sixth century. Götaland in this sense mainly includes the provinces of Östergötland (East Gothia) and Västergötland (West Gothia). The island of Gotland was disputed by other than Swedes, at this time (Danish, Hanseatic, and Gotland-domestic). Småland was at that time of little interest to anyone due to the deep pine forests, and only the city of Kalmar with its castle was of importance. The south-west parts of the Scandinavian peninsula consisted of three Danish provinces (Scania, Blekinge and Halland). North of Halland, Denmark had a direct border to Norway and its province Bohuslän. But there were Swedish settlements along the southern coastline of Norrland. + +During the early stages of the Scandinavian Viking Age, Ystad in the Danish province Scania and Paviken on Gotland were flourishing centres of trade, but they were not parts of the early Swedish Kingdom. Remains of what is believed to have been a large market dating from 600 to 700 CE have been found in Ystad. In Paviken, an important centre of trade in the Baltic region during the ninth and tenth century, remains have been found of a large Viking Age harbour with shipbuilding yards and handicraft industries. Between 800 and 1000, trade brought an abundance of silver to Gotland, and according to some scholars, the Gotlanders of this era hoarded more silver than the rest of the population of Scandinavia combined. + +Saint Ansgar is usually credited with introducing Christianity to Sweden in 829, but the new religion did not begin to fully replace paganism until the 12th century. During the 11th century, Christianity became the prevalent religion, and from 1050 Sweden is counted as a Christian nation. The period between 1100 and 1400 was characterised by internal power struggles and competition among the Nordic kingdoms. In the years 1150–1293 according to the legend of Eric IX and the Eric Chronicles Swedish kings made a first, second and third crusade to pagan Finland against Finns, Tavastians, and Karelians and started conflicts with the Rus' who no longer had any connection with Sweden. The Swedish colonisation of the coastal areas of Finland also started during the 12th and 13th century. In the 14th century, the colonisation began to be more organised, and by the end of the century, several of the coastal areas of Finland were inhabited mostly by Swedes. + +Except for the provinces of Scania, Blekinge and Halland in the south-west of the Scandinavian peninsula, which were parts of the Kingdom of Denmark during this time, feudalism never developed in Sweden as it did in the rest of Europe. As a result, the peasantry remained largely a class of free farmers throughout most of Swedish history. Slavery (also called thralldom) was not common in Sweden, and what slavery there was tended to be driven out of existence by the spread of Christianity, by the difficulty of obtaining slaves from lands east of the Baltic Sea, and by the development of cities before the 16th century. Indeed, both slavery and serfdom were abolished altogether by a decree of King Magnus IV in 1335. Former slaves tended to be absorbed into the peasantry, and some became labourers in the towns. Still, Sweden remained a poor and economically backward country in which barter was the primary means of exchange. For instance, the farmers of the province of Dalsland would transport their butter to the mining districts of Sweden and exchange it there for iron, which they would then take to the coast and trade for fish, which they consumed, while the iron would be shipped abroad.In the middle of the 14th century, Sweden was struck by the Black Death. The population of Sweden and most of Europe was decimated. The population (at same territory) did not reach the numbers of the year 1348 again until the beginning of the 19th century. One third of the population died during the period of 1349–1351. During this period, the Swedish cities began to acquire greater rights and were strongly influenced by German merchants of the Hanseatic League, active especially at Visby. In 1319, Sweden and Norway were united under King Magnus Eriksson, and in 1397 Queen Margaret I of Denmark affected the personal union of Sweden, Norway, and Denmark through the Kalmar Union. However, Margaret's successors, whose rule was also centred in Denmark, were unable to control the Swedish nobility. + +Many times the Swedish crown was inherited by child kings over the course of the kingdom's existence; consequently, real power was held for long periods by regents (notably those of the Sture family) chosen by the Swedish parliament. King Christian II of Denmark, who asserted his claim to Sweden by force of arms, ordered a massacre of Swedish nobles in Stockholm in 1520. This came to be known as the "Stockholm blood bath" and stirred the Swedish nobility to new resistance and, on 6 June (now Sweden's national holiday) in 1523, they made Gustav Vasa their king. This is sometimes considered as the foundation of modern Sweden. Shortly afterwards the new king rejected Catholicism and led Sweden into the Protestant Reformation. +The Hanseatic League had been officially formed at Lübeck on the Baltic coast of Northern Germany in 1356. The League sought civil and commercial privileges from the princes and royalty of the countries and cities along the coasts of the Baltic Sea. In exchange, they offered a certain amount of protection to the joining cities. Having their own navy, the Hansa were able to sweep the Baltic Sea free of pirates. The privileges obtained by the Hansa included assurances that only Hansa citizens would be allowed to trade from the ports where they were located. They sought agreement to be free of all customs and taxes. With these concessions, Lübeck merchants flocked to Stockholm, where they soon came to dominate the city's economic life and made the port city of Stockholm into the leading commercial and industrial city of Sweden. Under the Hanseatic trade, two-thirds of Stockholm's imports consisted of textiles, while the remaining third was salt. The main exports from Sweden were iron and copper.However, the Swedes began to resent the monopoly trading position of the Hansa (mostly consisting of German citizens), and to resent the income they felt they lost to the Hansa. Consequently, when Gustav Vasa or Gustav I broke the monopoly power of the Hanseatic League he was regarded as a hero by the Swedish people. History now views Gustav I as the father of the modern Swedish nation. The foundations laid by Gustav would take time to develop. Furthermore, when Sweden did develop, freed itself from the Hanseatic League, and entered its golden era, the fact that the peasantry had traditionally been free meant that more of the economic benefits flowed back to them rather than going to a feudal landowning class.The end of the 16th century was marked by a final phase of rivalry between the remaining Catholics and the new Protestant communities. In 1592, Gustav Vasa's Catholic grandson and king of Poland, Sigismund, ascended the Swedish throne. He pursued to strengthen Rome's influence by initiating Counter-Reformation and created a dual monarchy, which temporarily became known as the Polish-Swedish Union. His despotic rule, strongly characterised by intolerance towards the Protestants, sparked a civil war that plunged Sweden into poverty. In opposition, Sigismund's uncle and successor, Charles Vasa, summoned the Uppsala Synod in 1593 which officially confirmed the modern Church of Sweden as Lutheran. Following his deposition in 1599, Sigismund attempted to reclaim the throne at every expense and hostilities between Poland and Sweden continued for the next one hundred years. + + +=== Swedish Empire === + +During the 17th century, Sweden emerged as a European great power. Before the emergence of the Swedish Empire, Sweden was a poor and sparsely populated country on the fringe of European civilisation, with no significant power or reputation. Sweden rose to prominence on a continental scale during the reign of king Gustavus Adolphus, seizing territories from Russia and the Polish–Lithuanian Commonwealth in multiple conflicts, including the Thirty Years' War.During the Thirty Years' War, Sweden conquered approximately half of the Holy Roman states and defeated the Imperial army at the Battle of Breitenfeld in 1631. Gustavus Adolphus planned to become the new Holy Roman Emperor, ruling over a united Scandinavia and the Holy Roman states, but he was killed at the Battle of Lützen in 1632. After the Battle of Nördlingen in 1634, Sweden's only significant military defeat of the war, pro-Swedish sentiment among the German states faded. These German provinces broke away from Swedish power one by one, leaving Sweden with only a few northern German territories: Swedish Pomerania, Bremen-Verden and Wismar. From 1643 to 1645, during the last years of the war, Sweden and Denmark-Norway fought the Torstenson War. The result of that conflict and the conclusion of the Thirty Years' War helped establish postwar Sweden as a major force in Europe. + +In the middle of the 17th century, Sweden was the third-largest country in Europe by land area, surpassed by only Russia and Spain. Sweden reached its largest territorial extent under the rule of Charles X after the treaty of Roskilde in 1658, following Charles X's risky but successful crossing of the Danish Belts. The foundation of Sweden's success during this period is credited to Gustav I's major changes to the Swedish economy in the 16th century, and his introduction of Protestantism. In the 17th century, Sweden was engaged in many wars, for example with Poland–Lithuania, with both sides competing for territories of today's Baltic states, with Sweden suffering a notable defeat at the Battle of Kircholm. One-third of the Finnish population died in the devastating Great Famine of 1695–1697 that struck the country. Famine also hit Sweden, killing roughly 10% of Sweden's population.The Swedes conducted a series of invasions into the Polish–Lithuanian Commonwealth, known as the Deluge. After more than half a century of almost constant warfare, the Swedish economy had deteriorated. It became the lifetime task of Charles X's son, Charles XI, to rebuild the economy and refit the army. His legacy to his son, the coming ruler of Sweden, Charles XII, was one of the finest arsenals in the world, a large standing army and a great fleet. Russia, the most serious threat to Sweden at this time, had a larger army but lagged far behind in both equipment and training.After the Battle of Narva in 1700, one of the first battles of the Great Northern War, the Russian army was so severely devastated that Sweden had an open chance to invade Russia. However, Charles XII did not pursue the Russian army, instead turning against Poland and defeating the Polish king, Augustus II the Strong, and his Saxon allies at the Battle of Kliszów in 1702. This gave Russia time to rebuild and modernise its army. + +After the success of invading Poland, Charles XII decided to make an attempt at invading Russia, but this ended in a decisive Russian victory at the Battle of Poltava in 1709. After a long march exposed to Cossack raids, the Russian Tsar Peter the Great's scorched-earth techniques and the extremely cold winter of 1709, the Swedes stood weakened with a shattered morale and were enormously outnumbered against the Russian army at Poltava. The defeat meant the beginning of the end for the Swedish Empire. In addition, the plague raging in East Central Europe devastated the Swedish dominions and reached Central Sweden in 1710. Returning to Sweden in 1715, Charles XII launched two campaigns against Norway on 1716 and 1718, respectively. During the second attempt, he was shot to death during the siege of Fredriksten fortress. The Swedes were not militarily defeated at Fredriksten, but the whole structure and organisation of the campaign fell apart with the king's death, and the army withdrew. +Forced to cede large areas of land in the Treaty of Nystad in 1721, Sweden also lost its place as an empire and as the dominant state on the Baltic Sea. With Sweden's lost influence, Russia emerged as an empire and became one of Europe's dominant nations. As the war finally ended in 1721, Sweden had lost an estimated 200,000 men, 150,000 of those from the area of present-day Sweden and 50,000 from the Finnish part of Sweden.In the 18th century, Sweden did not have enough resources to maintain its territories outside Scandinavia, and most of them were lost, culminating with the loss in 1809 of eastern Sweden to Russia, which became the highly autonomous Grand Principality of Finland in Imperial Russia.In interest of re-establishing Swedish dominance in the Baltic Sea, Sweden allied itself against its traditional ally and benefactor, France, in the Napoleonic Wars. However, in 1810, a French Marshal, Jean-Baptiste Bernadotte, was chosen as heir presumptive to the decrepit Charles XIII; in 1818, he established the House of Bernadotte, taking the regnal name of Charles XIV. Sweden's role in the Battle of Leipzig gave it the authority to force Denmark–Norway, an ally of France, to cede Norway to the King of Sweden on 14 January 1814 in exchange for the northern German provinces, at the Treaty of Kiel. The Norwegian attempts to keep their status as a sovereign state were rejected by the Swedish king, Charles XIII. He launched a military campaign against Norway on 27 July 1814, ending in the Convention of Moss, which forced Norway into a personal union with Sweden under the Swedish crown, which lasted until 1905. The 1814 campaign was the last time Sweden was at war. + + +=== Modern history === + +The Swedish East India Company, Ostindiska Kompaniet, began in 1731. The obvious choice of home port was Gothenburg at Sweden's west coast, the mouth of Göta älv river is very wide and has the county's largest and best harbour for high-seas journeys. The trade continued into the 19th century, and caused the little town to become Sweden's second city. +There was a significant population increase during the 18th and 19th centuries, which the writer Esaias Tegnér in 1833 attributed to "the peace, the smallpox vaccine, and the potatoes". Between 1750 and 1850, the population in Sweden doubled. According to some scholars, mass emigration to America became the only way to prevent famine and rebellion; over 1% of the population emigrated annually during the 1880s. Nevertheless, Sweden remained poor, retaining a nearly entirely agricultural economy even as Denmark and Western European countries began to industrialise. + +Many looked towards America for a better life during this time. It is thought that between 1850 and 1910 more than one million Swedes moved to the United States. In the early 20th century, more Swedes lived in Chicago than in Gothenburg (Sweden's second largest city). Most Swedish immigrants moved to the midwestern United States, with a large population in Minnesota, with a few others moving to other parts of the United States and Canada. +Despite the slow rate of industrialisation into the 19th century, many important changes were taking place in the agrarian economy due to constant innovations and a rapid population growth. These innovations included government-sponsored programmes of enclosure, aggressive exploitation of agricultural lands, and the introduction of new crops such as the potato. Because the Swedish peasantry had never been enserfed as elsewhere in Europe, the Swedish farming culture began to take on a critical role in Swedish politics, which has continued through modern times with modern Agrarian party (now called the Centre Party). Between 1870 and 1914, Sweden began developing the industrialised economy that exists today.Strong grassroots movements sprang up in Sweden during the latter half of the 19th century (trade unions, temperance groups, and independent religious groups), creating a strong foundation of democratic principles. In 1889 The Swedish Social Democratic Party was founded. These movements precipitated Sweden's migration into a modern parliamentary democracy, achieved by the time of World War I. As the Industrial Revolution progressed during the 20th century, people gradually moved into cities to work in factories and became involved in socialist unions. A communist revolution was avoided in 1917, following the re-introduction of parliamentarism, and the country was democratised. + + +=== World War I and World War II === + +Sweden was officially neutral during World War I. However, under pressure from the German Empire, they did take steps which were detrimental to the Allied powers. Most notably, mining the Øresund channel, thus closing it to Allied shipping, and allowing the Germans to use Swedish facilities and the Swedish cipher to transmit secret messages to their overseas embassies. Sweden also allowed volunteers to fight for the White Guards alongside the Germans against the Red Guards and Russians in the Finnish Civil War, and briefly occupied Åland in cooperation with the German Empire. + +As in the First World War, Sweden remained officially neutral during World War II, although its neutrality during World War II has been disputed. Sweden was under German influence for much of the war, as ties to the rest of the world were cut off through blockades. The Swedish government felt that it was in no position to openly contest Germany, and therefore made some concessions. Sweden also supplied steel and machined parts to Germany throughout the war. The Swedish government unofficially supported Finland in the Winter War and the Continuation War by allowing volunteers and materiel to be shipped to Finland. However, Sweden supported Norwegian resistance against Germany, and in 1943 helped rescue Danish Jews from deportation to Nazi concentration camps. +During the last year of the war, Sweden began to play a role in humanitarian efforts, and many refugees, among them several thousand Jews from Nazi-occupied Europe, were rescued thanks to the Swedish rescue missions to internment camps and partly because Sweden served as a haven for refugees, primarily from the Nordic countries and the Baltic states. The Swedish diplomat Raoul Wallenberg and his colleagues ensured the safety of tens of thousands of Hungarian Jews. Nevertheless, both Swedes and others have argued that Sweden could have done more to oppose the Nazis' war efforts, even if it meant increasing the risk of occupation. + + +=== Post-war era === + +Sweden was officially a neutral country and remained outside NATO and Warsaw Pact membership during the Cold War, but privately Sweden's leadership had strong ties with the United States and other western governments. Following the war, Sweden took advantage of an intact industrial base, social stability and its natural resources to expand its industry to supply the rebuilding of Europe. Sweden received aid under the Marshall Plan and participated in the OECD. During most of the post-war era, the country was governed by the Swedish Social Democratic Party largely in co-operation with trade unions and industry. The government actively pursued an internationally competitive manufacturing sector of primarily large corporations.Sweden was one of the founding states of the European Free Trade Area (EFTA). During the 1960s the EFTA countries were often referred to as the Outer Seven, as opposed to the Inner Six of the then-European Economic Community (EEC).Sweden, like many industrialised countries, entered a period of economic decline and upheaval following the oil embargoes of 1973–74 and 1978–79. In the 1980s several key Swedish industries were significantly restructured. Shipbuilding was discontinued, wood pulp was integrated into modernised paper production, the steel industry was concentrated and specialised, and mechanical engineering was robotised.Between 1970 and 1990, the overall tax burden rose by over 10%, and the growth was low compared with other countries in Western Europe. Eventually, the government began to spend over half of the country's gross domestic product. Swedish GDP per capita ranking declined during this time. + + +=== Recent history === + +A bursting real estate bubble caused by inadequate controls on lending combined with an international recession and a policy switch from anti-unemployment policies to anti-inflationary policies resulted in a fiscal crisis in the early 1990s. Sweden's GDP declined by around 5%. In 1992, a run on the currency caused the central bank to briefly increase interest rates to 500%.The response of the government was to cut spending and institute a multitude of reforms to improve Sweden's competitiveness, among them reducing the welfare state and privatising public services and goods. Much of the political establishment promoted EU membership, and a referendum passed with 52.3% in favour of joining the EU on 13 November 1994. Sweden joined the European Union on 1 January 1995. In a 2003 referendum the Swedish electorate voted against the country joining the Euro currency. In 2006 Sweden got its first majority government for decades as the centre-right Alliance defeated the incumbent Social Democrat government. Following the rapid growth of support for the anti-immigration Sweden Democrats, and their entrance to the Riksdag in 2010, the Alliance became a minority cabinet. +Until recently Sweden remained non-aligned militarily, although it participated in some joint military exercises with NATO and some other countries, in addition to extensive cooperation with other European countries in the area of defence technology and defence industry. However, in 2022, in response to the 2022 Russian invasion of Ukraine, Sweden moved to formally join the NATO alliance. The same year, Sweden applied for NATO membership and was formally invited to join the alliance at the NATO Summit in Madrid. The secretary general of NATO Jens Stoltenberg spoke of a fast-track membership process of just a few weeks, however NATO member Turkey has repeatedly hindered Sweden from joining the alliance, demanding Swedish action against the PKK and for Sweden to extradite alleged Kurdish "terrorists" to Turkey, the situation straining relations between the two countries. Turkey has maintained links with Russia since its invasion of Ukraine in 2022.Swedish export weapons were also used by the American military in Iraq. Sweden has a long history of participating in international military operations, including Afghanistan, where Swedish troops are under NATO command, and in EU-sponsored peacekeeping operations in Kosovo, Bosnia and Herzegovina, and Cyprus. Sweden also participated in enforcing a UN mandated no-fly zone over Libya during the Arab Spring. Sweden held the chair of the European Union from 1 July to 31 December 2009. + +In recent decades Sweden has become a more culturally diverse nation due to significant immigration; in 2013, it was estimated that 15% of the population was foreign-born, and an additional 5% of the population were born to two immigrant parents. The influx of immigrants has brought new social challenges. Violent incidents have periodically occurred including the 2013 Stockholm riots, which broke out following the police shooting of an elderly Portuguese immigrant. In response to these violent events, the anti-immigration opposition party, the Sweden Democrats, promoted their anti-immigration policies, while the left-wing opposition blamed growing inequality caused by the centre-right government's socioeconomic policies.In 2014, Stefan Löfven (Social Democrats) won the General Election and became the new Swedish Prime Minister to succeed Fredrik Reinfeldt of the liberal conservative Moderate Party. The Sweden Democrats held the balance of power and voted the government's budget down in the Riksdag, but due to agreements between the government and the Alliance, the government was able to hang onto power. Sweden was heavily affected by the 2015 European migrant crisis, eventually forcing the government to tighten regulations of entry to the country, as Sweden received thousands of asylum seekers and migrants predominantly from Africa and the Middle East per week in autumn, overwhelming existing structures. Some of the asylum restrictions were relaxed again later.The 2018 general election saw the Red-greens lose seats to the right-wing Sweden Democrats and to the centre-right parties of the former Alliance. Despite holding only 33% of the seats in the Riksdag, the Social Democrats and the Greens managed to form a minority government, led by Prime Minister Stefan Lofven, in January 2019, relying on supply and confidence from the Centre Party, Liberals and the Left Party.In August 2021, Prime Minister Stefan Lofven announced his resignation and finance minister Magdalena Andersson was elected as the new head of Sweden's ruling Social Democrats in November 2021. On 30 November 2021, Magdalena Andersson became Sweden's first female prime minister. She formed a minority government made up of only her Social Democrats. Her plan for forming a new coalition government with the Green Party was unsuccessful because her budget proposal failed to pass.The September 2022 general election ended in a narrow win to a bloc of right-wing parties, meaning the resignation of Magdalena Andersson's government. On 18 October 2022, Ulf Kristersson of the Moderate Party became the new Prime Minister of Sweden. Kristersson's Moderates formed a centre-right coalition with the Christian Democrats and the Liberals. The new government will be backed by the biggest right-wing party, Sweden Democrats (SD) led by Jimmie Åkesson, meaning tougher immigration policies as a crucial part of a policy deal with the SD. + + +== Geography == + +Situated in Northern Europe, Sweden lies west of the Baltic Sea and Gulf of Bothnia, providing a long coastline, and forms the eastern part of the Scandinavian Peninsula. To the west is the Scandinavian mountain chain (Skanderna), a range that separates Sweden from Norway. Finland is located to its north-east. It has maritime borders with Denmark, Germany, Poland, Russia, Lithuania, Latvia and Estonia, and it is also linked to Denmark (south-west) by the Öresund Bridge. Its border with Norway (1,619 km long) is the longest uninterrupted border within Europe. +Sweden lies between latitudes 55° and 70° N, and mostly between longitudes 11° and 25° E (part of Stora Drammen island is just west of 11°). + +At 449,964 km2 (173,732 sq mi), Sweden is the 55th-largest country in the world, the fifth-largest country in Europe, and the largest country in Northern Europe. The lowest elevation in Sweden is in the bay of Lake Hammarsjön, near Kristianstad, at −2.41 m (−7.91 ft) below sea level. The highest point is Kebnekaise at 2,111 m (6,926 ft) above sea level. +Sweden has 25 provinces or landskap, based on culture, geography and history. While these provinces serve no political or administrative purpose, they play an important role in people's self-identity. The provinces are usually grouped together in three large lands, parts, the northern Norrland, the central Svealand and southern Götaland. The sparsely populated Norrland encompasses almost 60% of the country. Sweden also has the Vindelfjällen Nature Reserve, one of the largest protected areas in Europe, totaling 562,772 ha (approx. 5,628 km2). +About 15% of Sweden lies north of the Arctic Circle. Southern Sweden is predominantly agricultural, with increasing forest coverage northward. Around 65% of Sweden's total land area is covered with forests. The highest population density is in the Öresund Region in southern Sweden, along the western coast up to central Bohuslän, and in the valley of lake Mälaren and Stockholm. Gotland and Öland are Sweden's largest islands; Vänern and Vättern are its largest lakes. Vänern is the third largest in Europe, after Lake Ladoga and Lake Onega in Russia. Combined with the third- and fourth-largest lakes Mälaren and Hjälmaren, these lakes take up a significant part of southern Sweden's area. Sweden's extensive waterway availability throughout the south was exploited with the building of the Göta Canal in the 19th century, shortening the potential distance between the Baltic Sea south of Norrköping and Gothenburg by using the lake and river network to facilitate the canal.Sweden also has plenty of long rivers draining the lakes. Northern and Central Sweden have several wide rivers known as älvar, commonly sourced within the Scandinavian Mountains. The longest river is Klarälven-Göta älv, which originates in Trøndelag in central Norway, running 1,160 kilometres (720 mi) before it enters the sea at Gothenburg. Dalälven and the Torne are the second and third longest rivers in the country. Torne marks a large part of the Finland border. In southern Sweden, narrower rivers known as åar are also common. The vast majority of municipal seats are set either on the sea, a river or a lake and the majority of the country's population live in coastal municipalities. + + +=== Climate === + +Most of Sweden has a temperate climate, despite its northern latitude, with largely four distinct seasons and mild temperatures throughout the year. The winter in the far south is usually weak and is manifested only through some shorter periods with snow and sub-zero temperatures; autumn may well turn into spring there, without a distinct period of winter. The northern parts of the country have a subarctic climate while the central parts have a humid continental climate. The coastal south can be defined as having either a humid continental climate using the 0 °C isotherm, or an oceanic climate using the −3 °C isotherm. +Due to the increased maritime moderation in the peninsular south, summer differences between the coastlines of the southernmost and northernmost regions are about 2 °C (4 °F) in summer and 10 °C (18 °F) in winter. This grows further when comparing areas in the northern interior where the winter difference in the far north is about 15 °C (27 °F) throughout the country. The warmest summers usually happen in the Mälaren Valley around Stockholm due to the vast landmass shielding the middle east coast from Atlantic low-pressure systems in July compared to the south and west. Daytime highs in Sweden's municipal seats vary from 19 °C (66 °F) to 24 °C (75 °F) in July and −9 °C (16 °F) to 3 °C (37 °F) in January. The colder temperatures are influenced by the higher elevation in the northern interior. At sea level instead, the coldest average highs range from 21 °C (70 °F) to −6 °C (21 °F). As a result of the mild summers, the arctic region of Norrbotten has some of the northernmost agriculture in the world.Sweden is much warmer and drier than other places at a similar latitude, and even somewhat farther south, mainly because of the combination of the Gulf Stream and the general west wind drift, caused by the direction of planet Earth's rotation. Sweden has much milder winters than many parts of Russia, Canada, and the northern United States. Because of Sweden's high latitude, the length of daylight varies greatly. North of the Arctic Circle, the sun never sets for part of each summer, and it never rises for part of each winter. In the capital, Stockholm, daylight lasts for more than 18 hours in late June but only around 6 hours in late December. Sweden receives between 1,100 and 1,900 hours of sunshine annually. + +The highest temperature ever recorded in Sweden was 38 °C (100 °F) in Målilla in 1947, while the coldest temperature ever recorded was −52.6 °C (−62.7 °F) in Vuoggatjålme on 2 February 1966. Temperatures expected in Sweden are heavily influenced by the large Fennoscandian landmass, as well as continental Europe and western Russia, which allows hot or cool inland air to be easily transported to Sweden. That, in turn, renders most of Sweden's southern areas having warmer summers than almost everywhere in the nearby British Isles, even matching temperatures found along the continental Atlantic coast as far south as in northern Spain. In winter, however, the same high-pressure systems sometimes put the entire country far below freezing temperatures. There is some maritime moderation from the Atlantic which renders the Swedish continental climate less severe than that of nearby Russia. +Apart from the ice-free Atlantic bringing marine air into Sweden tempering winters, the mildness is further explained by prevailing low-pressure systems postponing winter, with the long nights often staying above freezing in the south of the country due to the abundant cloud cover. By the time winter finally breaks through, daylight hours rise quickly, ensuring that daytime temperatures soar quickly in spring. With the greater number of clear nights, frosts remain commonplace quite far south as late as April. +The relative strength of low and high-pressure systems of marine and continental air also define the highly variable summers. When hot continental air hits the country, the long days and short nights frequently bring temperatures up to 30 °C (86 °F) or above even in coastal areas. Nights normally remain cool, especially in inland areas. Coastal areas can see so-called tropical nights above 20 °C (68 °F) occur due to the moderating sea influence during warmer summers. Summers can be cool, especially in the north of the country. Transitional seasons are normally quite extensive and the four-season climate applies to most of Sweden's territory, except in Scania where some years do not record a meteorological winter (see table below) or in the high Lapland mountains where polar microclimates exist. +On average, most of Sweden receives between 500 and 800 mm (20 and 31 in) of precipitation each year, making it considerably drier than the global average. The south-western part of the country receives more precipitation, between 1,000 and 1,200 mm (39 and 47 in), and some mountain areas in the north are estimated to receive up to 2,000 mm (79 in). Despite northerly locations, southern and central Sweden may have almost no snow in some winters. Most of Sweden is located in the rain shadow of the Scandinavian Mountains through Norway and north-west Sweden. The blocking of cool and wet air in summer, as well as the greater landmass, leads to warm and dry summers far north in the country, with quite warm summers at the Bothnia Bay coast at 65 degrees latitude, which is unheard of elsewhere in the world at such northerly coastlines. +It is predicted that as the Barents Sea gets less frozen in the coming winters, becoming thus "Atlantified", additional evaporation will increase future snowfalls in Sweden and much of continental Europe. + + +=== Vegetation === + +Sweden has a considerable south to north distance (stretching between the latitudes N 55:20:13 and N 69:03:36) which causes large climatic difference, especially during the winter. The related matter of the length and strength of the four seasons plays a role in which plants that naturally can grow at various places. Sweden is divided in five major vegetation zones. These are: + +The southern deciduous forest zone +The southern coniferous forest zone +The northern coniferous forest zone, or the Taiga +The alpine-birch zone +The bare mountain zoneSouthern deciduous forest zone, also known as the nemoral region, the southern deciduous forest zone is a part of a larger vegetation zone which also includes Denmark and large parts of Central Europe. It has to a rather large degree become agricultural areas, but larger and smaller forests still exist. The region is characterised by a large wealth of trees and shrubs. The beech are the most dominant tree, but oak can also form smaller forests. elm at one time formed forests, but have been heavily reduced due to Dutch Elm disease. Other important trees and shrubs in this zone include hornbeam, elder, hazel, fly honeysuckle, linden (lime), spindle, yew, alder buckthorn, blackthorn, aspen, European rowan, Swedish whitebeam, juniper, European holly, ivy, dogwood, goat willow, larch, bird cherry, wild cherry, maple, ash, alder along creeks, and in sandy soil birch compete with pine. Spruce is not native but between approximately 1870 and 1980, large areas were planted with it. They tend to grow too quickly due to being outside of their native range and large distances between the tree rings cause poor board quality. Later some spruce trees began to die before reaching optimal height, and many more of the coniferous trees were uprooted during cyclones. During the last 40–50 years large areas of former spruce plantings have been replanted with deciduous forest.Southern coniferous forest zone, also known as the boreo-nemoral region, the southern coniferous forest zone is delimited by the oak's northern natural limit (limes norrlandicus) and the Spruce's southern natural limit, between the southern deciduous zone and the Taiga farther north. In the southern parts of this zone the coniferous species are found, mainly spruce and pine, mixed with various deciduous trees. Birch grows largely everywhere. The beech's northern boundary crosses this zone. This is however not the case with oak and ash. Although in its natural area, also planted Spruce are common, and such woods are very dense, as the spruces can grow very tight, especially in this vegetation zone's southern areas. +The northern coniferous forest zone or the Taiga begins north of the natural boundary of the oak. Of deciduous species the birch is the only one of significance. Pine and spruce are dominant, but the forests are slowly but surely more sparsely grown the farther towards the north it gets. In the extreme north is it difficult to state the trees forms true forests at all, due to the large distances between the trees.The alpine-birch zone, in the Scandinavian mountains, depending on both latitude and altitude, is an area where only a smaller kind of birch (Betula pubescens or B.tortuosa) can grow. Where this vegetation zone ends, no trees grow at all: the bare mountain zone.Sweden had a 2019 Forest Landscape Integrity Index mean score of 5.35/10, ranking it 103rd globally out of 172 countries. + + +== Government and politics == + + +=== Constitutional framework === + +Sweden has four fundamental laws (Swedish: grundlagar) which together form the Constitution: the Instrument of Government (Swedish: Regeringsformen), the Act of Succession (Swedish: Successionsordningen), the Freedom of the Press Act (Swedish: Tryckfrihetsförordningen), and the Fundamental Law on Freedom of Expression (Swedish: Yttrandefrihetsgrundlagen).The public sector in Sweden is divided into two parts: the legal person known as the State (Swedish: staten) and local authorities: the latter include Regional Councils (Swedish: regioner) (renamed from county councils (landsting) in 2020) and local Municipalities (Swedish: kommuner). The local authorities, rather than the State, make up the larger part of the public sector in Sweden. Regional Councils and Municipalities are independent of one another, the former merely covers a larger geographical area than the latter. The local authorities have self-rule, as mandated by the Constitution, and their own tax base. Notwithstanding their self-rule, local authorities are nevertheless in practice dependent upon the State, as the parameters of their responsibilities and the extent of their jurisdiction are specified in the Local Government Act (Swedish: Kommunallagen) passed by the Riksdag.Sweden is a constitutional monarchy, and King Carl XVI Gustaf is the head of state, but the role of the monarch is limited to ceremonial and representative functions. Under the provisions of the 1974 Instrument of Government, the King lacks any formal political power. The King opens the annual Riksdag session, chairs the Special Council held during a change of Government, holds regular Information Councils with the Prime Minister and the Government, chairs the meetings of the Advisory Council on Foreign Affairs (Swedish: Utrikesnämnden), and receives Letters of Credence of foreign ambassadors to Sweden and signs those of Swedish ambassadors sent abroad. In addition, the King pays State Visits abroad and receives those incoming as host. Apart from strictly official duties, the King and the other members of Royal Family undertake a variety of unofficial and other representative duties within Sweden and abroad.Legislative power is vested in the unicameral Riksdag with 349 members. General elections are held every four years, on the second Sunday of September. Legislation may be initiated by the Government or by members of the Riksdag. Members are elected on the basis of proportional representation to a four-year term. The internal workings of the Riksdag are, in addition to the Instrument of Government, regulated by the Riksdag Act (Swedish: Riksdagsordningen). The fundamental laws can be altered by the Riksdag alone; only an absolute majority with two separate votes, separated by a general election in between, is required. + +The Government (Swedish: Regeringen) operates as a collegial body with collective responsibility and consists of the Prime Minister — appointed and dismissed by the Speaker of the Riksdag (following an actual vote in the Riksdag before an appointment can be made) — and other cabinet ministers (Swedish: Statsråd), appointed and dismissed at the sole discretion of the Prime Minister. The Government is the supreme executive authority and is responsible for its actions to the Riksdag.Most of the State administrative authorities (Swedish: statliga förvaltningsmyndigheter) report to the Government, including (but not limited to) the Armed Forces, the Enforcement Authority, the National Library, the Swedish police and the Tax Agency. A unique feature of Swedish State administration is that individual cabinet ministers do not bear any individual ministerial responsibility for the performance of the agencies within their portfolio; as the director-generals and other heads of government agencies reports directly to the Government as a whole; and individual ministers are prohibited to interfere; thus the origin of the pejorative in Swedish political parlance term ministerstyre (English: "ministerial rule") in matters that are to be handled by the individual agencies, unless otherwise specifically provided for in law. +The Judiciary is independent from the Riksdag, Government and other State administrative authorities. The role of judicial review of legislation is not practised by the courts; instead, the Council on Legislation gives non-binding opinions on legality. There is no stare decisis in that courts are not bound by precedent, although it is influential. + + +=== Political parties and elections === + +The Swedish Social Democratic Party has played a leading role in Swedish politics since 1917, after the Reformists had confirmed their strength and the left-wing revolutionaries formed their own party. After 1932, most governments have been dominated by the Social Democrats. Only six general elections since World War II—1976, 1979, 1991, 2006, 2010 and 2022—have given the assembled bloc of centre-right parties enough seats in the Riksdag to form a government. +For over 50 years, Sweden had had five parties who continually received enough votes to gain seats in the Riksdag—the Social Democrats, the Moderate Party, the Centre Party, the Liberal People's Party and the Left Party—before the Green Party became the sixth party in the 1988 election. In the 1991 election, while the Greens lost their seats, two new parties gained seats for the first time: the Christian Democrats and New Democracy. The 1994 election saw the return of the Greens and the demise of New Democracy. It was not until elections in 2010 that an eighth party, the Sweden Democrats, gained Riksdag seats. In the elections to the European Parliament, parties who have failed to pass the Riksdag threshold have managed to gain representation at that venue: the June List (2004–2009), the Pirate Party (2009–2014), and Feminist Initiative (2014–2019). + +In the 2006 general election the Moderate Party formed the centre-right Alliance for Sweden bloc and won a majority of the Riksdag seats. In the 2010 general election the Alliance contended against a unified left block consisting of the Social Democrats, the Greens and the Left Party. The Alliance won a plurality of 173 seats, but remained two seats short of a 175-seat majority. Nevertheless, neither the Alliance, nor the left block, chose to form a coalition with the Sweden Democrats.The outcome of the 2014 general election resulted in the attainment of more seats by the three centre-left parties in comparison to the centre-right Alliance for Sweden, with the two blocs receiving 159 and 141 seats respectively. The non-aligned Sweden Democrats more than doubled their support and won the remaining 49 seats. On 3 October 2014, Stefan Löfven formed a minority government consisting of the Social Democrats and the Greens.In August 2021, Prime Minister Stefan Löfven announced his resignation and finance minister Magdalena Andersson was elected as the new head of Sweden's ruling Social Democrats in November 2021. On 30 November 2021, Magdalena Andersson became Sweden's first female prime minister. She formed a minority government made up of only her Social Democrats. Her plan for forming a new coalition government with the Green Party was unsuccessful the coalition partner left after her budget proposal failed to pass. In the 2022 election, the remnants of the Alliance were able to secure a narrow majority. This was backed up by the surging Sweden Democrats becoming the second largest party. The election saw Andersson resigning from her post, with the Moderate leader Ulf Kristersson the likely replacement. The election saw the right-wing coalition win dozens of small towns always dominated by the left, while suffering major losses in the big cities.Election turnout in Sweden has always been high by international comparison. Although it declined in recent decades, the latest elections saw an increase in voter turnout (80.11% in 2002, 81.99% in 2006, 84.63% in 2010, 85.81 in 2014) and 87.18% in 2018. Swedish politicians enjoyed a high degree of confidence from the citizens in the 1960s, However, that level of confidence has since declined steadily, and is now at a markedly lower level than in its Scandinavian neighbours. + + +=== Administrative divisions === + +Sweden is a unitary state divided into 21 regions (regioner) and 290 municipalities (kommuner). Every region corresponds to a county (län) with a number of municipalities per county. Regions and municipalities are both local government but have different roles and separate responsibilities. Health care, public transport and certain cultural institutions are administered by regional councils. Preschools, primary and secondary schooling, public water utilities, garbage disposal, elderly care and rescue services are administered by the municipalities. Gotland is a special case of being a region with only one municipality and the functions of region and municipality are performed by the same organisation.Municipal and region government in Sweden is similar to city commission and cabinet-style council government. Both levels have legislative assemblies (municipal councils and region assemblies of between 31 and 101 members (always an uneven number) that are elected from party-list proportional representation at the general election which are held every four years in conjunction with the national parliamentary elections. +Municipalities are also divided into a total of 2,512 parishes (församlingar). These have no official political responsibilities but are traditional subdivisions of the Church of Sweden and still have some importance as census districts for census-taking and elections. +The Swedish central government has 21 County Administrative Boards (Swedish: länsstyrelser), which are responsible for regional state administration not assigned to other government agencies or local government. Each county administrative board is led by a County Governor (Swedish: landshövding) appointed for a term of six years. The list of previous officeholders for the counties stretches back, in most cases, to 1634 when the counties were created by Lord High Chancellor Count Axel Oxenstierna. The main responsibility of the County Administrative Board is to co-ordinate the development of the county in line with goals set by the Riksdag and Government. +There are older historical divisions, primarily the twenty-five provinces and three lands, which still retain cultural significance. + + +=== Political history === + +The actual age of the kingdom of Sweden is unknown. Establishing the age depends mostly on whether Sweden should be considered a nation when the Svear (Sweonas) ruled Svealand or if the emergence of the nation started with the Svear and the Götar (Geats) of Götaland being united under one ruler. In the first case, Svealand was first mentioned as having one single ruler in the year 98 by Tacitus, but it is almost impossible to know for how long it had been this way. However, historians usually start the line of Swedish monarchs from when Svealand and Götaland were ruled under the same king, namely Eric the Victorious (Geat) and his son Olof Skötkonung in the tenth century. These events are often described as the consolidation of Sweden, although substantial areas were conquered and incorporated later. +Earlier kings, for which no reliable historical sources exist, can be read about in mythical kings of Sweden and semi-legendary kings of Sweden. Many of these kings are only mentioned in various saga and blend with Norse mythology. +The title Sveriges och Götes Konung was last used for Gustaf I of Sweden, after which the title became "King of Sweden, of the Goths and of the Wends" (Sveriges, Götes och Vendes Konung) in official documentation. Up until the beginning of the 1920s, all laws in Sweden were introduced with the words, "We, the king of Sweden, of the Goths and Wends". This title was used up until 1973. The present King of Sweden, Carl XVI Gustaf, was the first monarch officially proclaimed "King of Sweden" (Sveriges Konung) with no additional peoples mentioned in his title. +The term riksdag was used for the first time in the 1540s, although the first meeting where representatives of different social groups were called to discuss and determine affairs affecting the country as a whole took place as early as 1435, in the town of Arboga. During the Riksdag assemblies of 1527 and 1544, under King Gustav Vasa, representatives of all four estates of the realm (clergy, nobility, townsmen and peasants) were called on to participate for the first time. The monarchy became hereditary in 1544. +Executive power was historically shared between the King and an aristocratic Privy council until 1680, followed by the King's autocratic rule initiated by the commoner estates of the Riksdag. As a reaction to the failed Great Northern War, a parliamentary system was introduced in 1719, followed by three different flavours of constitutional monarchy in 1772, 1789 and 1809, the latter granting several civil liberties. Already during the first of those three periods, the 'Era of Liberty' (1719–72) the Swedish Rikstag had developed into a very active Parliament, and this tradition continued into the nineteenth century, laying the basis for the transition towards modern democracy at the end of that century.In 1866, Sweden became a constitutional monarchy with a bicameral parliament, with the First Chamber indirectly elected by local governments, and the Second Chamber directly elected in national elections every four years. In 1971 the parliament became unicameral. Legislative power was (symbolically) shared between the King and the Riksdag until 1975. Swedish taxation is controlled by the Riksdag. + +Sweden has a history of strong political involvement by ordinary people through its "popular movements" (Folkrörelser), the most notable being trade unions, the independent Christian movement, the temperance movement, the women's movement, and the intellectual property pirate movements. Sweden was the first country in the world to outlaw corporal punishment of children by their parents (parents' right to spank their own children was first removed in 1966, and it was explicitly prohibited by law from July 1979). +Sweden is currently leading the EU in statistics measuring equality in the political system and equality in the education system. The Global Gender Gap Report 2006 ranked Sweden as the number one country in terms of gender equality.Some Swedish political figures have become known worldwide, among these are: Raoul Wallenberg, Folke Bernadotte, the former Secretary-General of the United Nations Dag Hammarskjöld, the former Prime Minister Olof Palme, the former Prime Minister and later Foreign minister Carl Bildt, the former President of the General Assembly of the United Nations Jan Eliasson, and the former International Atomic Energy Agency Iraq inspector Hans Blix. + + +=== Judicial system === + +The courts are divided into two parallel and separate systems: The general courts (allmänna domstolar) for criminal and civil cases, and general administrative courts (allmänna förvaltningsdomstolar) for cases relating to disputes between private persons and the authorities. Each of these systems has three tiers, where the top tier court of the respective system typically only will hear cases that may become precedent. There are also a number of special courts, which will hear a narrower set of cases, as set down by legislation. While independent in their rulings, some of these courts are operated as divisions within courts of the general or general administrative courts. + +The Supreme Court of Sweden (Swedish: Högsta domstolen) is the third and final instance in all civil and criminal cases in Sweden. Before a case can be decided by the Supreme Court, leave to appeal must be obtained, and with few exceptions, leave to appeal can be granted only when the case is of interest as a precedent. The Supreme Court consists of 16 Justices (Swedish: justitieråd), appointed by the Government, but the court as an institution is independent of the Riksdag, and the Government is not able to interfere with the decisions of the court. +According to a victimisation survey of 1,201 residents in 2005, Sweden has above-average crime rates compared to other EU countries. Sweden has high or above-average levels of assaults, sexual assaults, hate crimes, and consumer fraud. Sweden has low levels of burglary, car theft and drug problems. Bribe seeking is rare.A mid-November 2013 news report announced that four prisons in Sweden were closed during the year due to a significant drop in the number of inmates. The decrease in the number of Swedish prisoners was considered "out-of-the-ordinary" by the head of Sweden's prison and probation services, with prison numbers in Sweden falling by around 1% a year since 2004. Prisons were closed in the towns of Åby, Håja, Båtshagen, and Kristianstad. + + +=== Foreign relations === + +Throughout the 20th century, Swedish foreign policy was based on the principle of non-alignment in peacetime and neutrality in wartime. Sweden's government pursued an independent course of nonalignment in times of peace so that neutrality would be possible in the event of war.Sweden's doctrine of neutrality is often traced back to the 19th century as the country has not been in a state of war since the end of the Swedish campaign against Norway in 1814. During World War II Sweden joined neither the allied nor axis powers. This has sometimes been disputed since in effect Sweden allowed in select cases the Nazi regime to use its railroad system to transport troops and goods, especially iron ore from mines in northern Sweden, which was vital to the German war machine. However, Sweden also indirectly contributed to the defence of Finland in the Winter War, and permitted the training of Norwegian and Danish troops in Sweden after 1943. + +During the early Cold War era, Sweden combined its policy of non-alignment and a low profile in international affairs with a security policy based on strong national defence. The function of the Swedish military was to deter attack. At the same time, the country maintained relatively close informal connections with the Western bloc, especially in the realm of intelligence exchange. In 1952, a Swedish DC-3 was shot down over the Baltic Sea by a Soviet MiG-15 jet fighter. Later investigations revealed that the plane was actually gathering information for NATO. Another plane, a Catalina search and rescue plane, was sent out a few days later and shot down by the Soviets as well. Prime Minister Olof Palme made an official visit to Cuba during the 1970s, during which he denounced Fulgencio Batista's government and praised contemporary Cuban and Cambodian revolutionaries in a speech. +Beginning in the late 1960s, Sweden attempted to play a more significant and independent role in international relations. It involved itself significantly in international peace efforts, especially through the United Nations, and in support to the Third World. +On 27 October 1981, a Whiskey-class submarine (U 137) from the Soviet Union ran aground close to the naval base at Karlskrona in the southern part of the country. Research has never clearly established whether the submarine ended up on the shoals through a navigational mistake or if an enemy committed espionage against Swedish military potential. The incident triggered a diplomatic crisis between Sweden and the Soviet Union. Following the 1986 assassination of Olof Palme and with the end of the Cold War, Sweden has adopted a more traditional foreign policy approach. Nevertheless, the country remains active in peacekeeping missions and maintains a considerable foreign aid budget. +Since 1995 Sweden has been a member of the European Union, and as a consequence of a new world security situation the country's foreign policy doctrine has been partly modified, with Sweden playing a more active role in European security co-operation. In 2022, in response to Russia's invasion of Ukraine, Sweden moved to formally join the NATO alliance. The secretary general of NATO Jens Stoltenberg spoke of a fast-track membership process of just a few weeks, however NATO member Turkey has repeatedly hindered Sweden from joining the alliance, demanding Swedish action against the PKK and for Sweden to extradite alleged Kurdish "terrorists" to Turkey, the situation straining relations between the two countries. Turkey has maintained links with Russia since its invasion of Ukraine in 2022. + + +=== Military === + +The law is enforced in Sweden by several government entities. The Swedish police is a Government agency concerned with police matters. The National Task Force is a national SWAT unit within the police force. The Swedish Security Service's responsibilities are counter-espionage, anti-terrorist activities, protection of the constitution and protection of sensitive objects and people. +The Försvarsmakten (Swedish Armed Forces) are a government agency reporting to the Swedish Ministry of Defence and responsible for the peacetime operation of the armed forces of Sweden. The primary task of the agency is to train and deploy peacekeeping forces abroad, while maintaining the long-term ability to refocus on the defence of Sweden in the event of war. The armed forces are divided into Army, Air Force and Navy. The head of the armed forces is the Supreme Commander (Överbefälhavaren, ÖB), the most senior commissioned officer in the country. Up to 1974, the King was pro forma Commander-in-Chief, but in reality it was clearly understood through the 20th century that the monarch would have no active role as a military leader. + +Until the end of the Cold War, nearly all males reaching the age of military service were conscripted. In recent years, the number of conscripted males has shrunk dramatically, while the number of female volunteers has increased slightly. Recruitment has generally shifted towards finding the most motivated recruits, rather than solely focusing on those otherwise most fit for service. By law, all soldiers serving abroad must be volunteers. In 1975, the total number of conscripts was 45,000. By 2003, it was down to 15,000. +On 1 July 2010, Sweden ended routine conscription, switching to an all-volunteer force unless otherwise required for defence readiness. Emphasis was to be placed on only recruiting those later prepared to volunteer for international service. The total forces gathered would consist of about 60,000 personnel. This in comparison with the 1980s, before the fall of the Soviet Union, when Sweden could gather up to 1,000,000 servicemembers. +However, on 11 December 2014, due to tensions in the Baltic area, the Swedish Government reintroduced one part of the Swedish conscription system, refresher training. On 2 March 2017, the government decided to reintroduce the remaining part of the Swedish conscription system, basic military training. The first recruits began their training in 2018. As the law is now gender neutral, both men and women may have to serve. Sweden decided not to sign the UN treaty on the Prohibition of Nuclear Weapons.Swedish units have taken part in peacekeeping operations in the Democratic Republic of the Congo, Cyprus, Bosnia and Herzegovina, Kosovo, Liberia, Lebanon, Afghanistan and Chad. + + +== Economy == + +Sweden is the twelfth-richest country in the world in terms of GDP (gross domestic product) per capita and a high standard of living is experienced by its citizens. Sweden is an export-oriented mixed economy. Timber, hydropower and iron ore constitute the resource base of an economy with a heavy emphasis on foreign trade. Sweden's engineering sector accounts for 50% of output and exports, while telecommunications, the automotive industry and the pharmaceutical industries are also of great importance. Sweden is the ninth-largest arms exporter in the world. Agriculture accounts for 2% of GDP and employment. The country ranks among the highest for telephone and Internet access penetration.Trade unions, employers' associations and collective agreements cover a large share of the employees in Sweden. The high coverage of collective agreements is achieved despite the absence of state mechanisms extending collective agreements to whole industries or sectors. Both the prominent role of collective bargaining and the way in which the high rate of coverage is achieved reflect the dominance of self-regulation (regulation by the labour market parties themselves) over state regulation in Swedish industrial relations. When the Swedish Ghent system was changed in 2007, resulting in considerably raised fees to unemployment funds, a substantial decline in union density and density of unemployment funds occurred. + +In 2010, Sweden's income Gini coefficient was the third lowest among developed countries, at 0.25—slightly higher than Japan and Denmark—suggesting Sweden had low income inequality. However, Sweden's wealth Gini coefficient at 0.853 was the second highest in developed countries, and above European and North American averages, suggesting high wealth inequality. Even on a disposable income basis, the geographical distribution of Gini coefficient of income inequality varies within different regions and municipalities of Sweden. Danderyd, outside Stockholm, has Sweden's highest Gini coefficient of income inequality, at 0.55, while Hofors near Gävle has the lowest at 0.25. In and around Stockholm and Scania, two of the more densely populated regions of Sweden, the income Gini coefficient is between 0.35 and 0.55.In terms of structure, the Swedish economy is characterised by a large, knowledge-intensive and export-oriented manufacturing sector; an increasing, but comparatively small, business service sector; and by international standards, a large public service sector. Large organisations, both in manufacturing and services, dominate the Swedish economy. High and medium-high technology manufacturing accounts for 9.9% of GDP.The 20 largest (by turnover) registered Swedish companies in 2007 were Volvo, Ericsson, Vattenfall, Skanska, Sony Ericsson Mobile Communications AB, Svenska Cellulosa Aktiebolaget, Electrolux, Volvo Personvagnar, TeliaSonera, Sandvik, Scania, ICA, Hennes & Mauritz, IKEA, Nordea, Preem, Atlas Copco, Securitas, Nordstjernan and SKF. The vast majority of Sweden's industry is privately controlled, unlike many other industrialised Western countries, and, in accordance with a historical standard, publicly owned enterprises are of minor importance. + +An estimated 4.5 million Swedish residents are employed, and around a third of the workforce completed tertiary education. In terms of GDP per-hour-worked, Sweden was the world's ninth highest in 2006 at US$31, compared to US$22 in Spain and US$35 in the United States. GDP per-hour-worked is growing 2.5% per year for the economy as a whole and the trade-terms-balanced productivity growth is 2%. According to the OECD, deregulation, globalisation, and technology sector growth have been key productivity drivers. Sweden is a world leader in privatised pensions and pension funding problems are relatively small compared to many other Western European countries. A pilot program to test the feasibility of a six-hour workday, without loss of pay, will commence in 2014, involving the participation of Gothenburg municipal staff. The Swedish government is seeking to reduce its costs through decreased sick leave hours and increased efficiency. + +The typical worker receives 40% of his or her labour costs after the tax wedge. Total tax collected by Sweden as a percentage of its GDP peaked at 52.3% in 1990. The country faced a real estate and banking crisis in 1990–1991, and consequently passed tax reforms in 1991 to implement tax rate cuts and tax base broadening over time. Since 1990, taxes as a percentage of GDP collected by Sweden have been dropping, with total tax rates for the highest income earners dropping the most. In 2010 45.8% of the country's GDP was collected as taxes, the second highest among OECD countries, and nearly double the percentage in the US or South Korea. Tax income-financed employment represents a third of the Swedish workforce, a substantially higher proportion than in most other countries. Overall, GDP growth has been fast since reforms—especially those in manufacturing—were enacted in the early 1990s. + +Sweden is the fourth-most competitive economy in the world, according to the World Economic Forum in its Global Competitiveness Report 2012–2013. Sweden is the top performing country in the 2014 Global Green Economy Index (GGEI). Sweden is ranked fourth in the IMD World Competitiveness Yearbook 2013. According to the book The Flight of the Creative Class by the US economist Professor Richard Florida of the University of Toronto, Sweden is ranked as having the best creativity in Europe for business and is predicted to become a talent magnet for the world's most purposeful workers. The book compiled an index to measure the kind of creativity it claims is most useful to business—talent, technology and tolerance.Sweden maintains its own currency, the Swedish krona (SEK), a result of the Swedes having rejected the euro in a referendum. The Swedish Riksbank—founded in 1668 and thus the oldest central bank in the world—is currently focusing on price stability with an inflation target of 2%. According to the Economic Survey of Sweden 2007 by the OECD, the average inflation in Sweden has been one of the lowest among European countries since the mid-1990s, largely because of deregulation and quick utilisation of globalisation.The largest trade flows are with Germany, the United States, Norway, the United Kingdom, Denmark and Finland. +Financial deregulation in the 1980s adversely affected the property market, leading to a bubble and eventually a crash in the early 1990s. Commercial property prices fell by up to two thirds, resulting in two Swedish banks having to be taken over by the government. In the following two decades the property sector strengthened. By 2014, legislators, economists and the IMF were again warning of a bubble with residential property prices soaring and the level of personal mortgage debt expanding. Household debt-to-income rose above 170% as the IMF was calling on legislators to consider zoning reform and other means of generating a greater supply of housing as demand was outstripping what was available, pushing prices higher. By August 2014, 40% of home borrowers had interest-only loans while those that did not were repaying principal at a rate that would take 100 years to fully repay. + + +=== Energy === + +Sweden's energy market is largely privatised. The Nordic energy market is one of the first liberalised energy markets in Europe and it is traded in NASDAQ OMX Commodities Europe and Nord Pool Spot. In 2006, out of a total electricity production of 139 TWh, electricity from hydropower accounted for 61 TWh (44%), and nuclear power delivered 65 TWh (47%). At the same time, the use of biofuels, peat etc. produced 13 TWh (9%) of electricity, while wind power produced 1 TWh (1%). Sweden was a net importer of electricity by a margin of 6 TWh. Biomass is mainly used to produce heat for district heating and central heating and industry processes. +Sweden joined the International Energy Agency in 1974, after the 1973 oil crisis strengthened Sweden's commitment to decrease dependence on imported fossil fuels. To protect against unexpected oil supply shocks and in accordance with international commitments made through the IEA, Sweden maintains a strategic petroleum reserve of at least 90 days of net oil imports. As of February 2022, Sweden's oil reserves totalled 130 days’ worth of net imports. Sweden has moved to generate electricity mostly from hydropower and nuclear power. The use of nuclear power has been limited, however. Among other things, the accident of Three Mile Island Nuclear Generating Station (United States) prompted the Riksdag to ban new nuclear plants. In March 2005, an opinion poll showed that 83% supported maintaining or increasing nuclear power.Sweden is considered a "global leader" in decarbonisation. Politicians have made announcements about oil phase-out in Sweden, decrease of nuclear power, and multibillion-dollar investments in renewable energy and energy efficiency. The country has for many years pursued a strategy of indirect taxation as an instrument of environmental policy, including energy taxes in general and carbon dioxide taxes in particular. Sweden was the first nation to implement carbon pricing, and its carbon prices remain the highest in the world as of 2020. This model has been shown to be particularly effective at decarbonizing the nation's economy. In 2014, Sweden was net exporter of electricity by a margin of 16 TWh; the production from wind power mills had increased to 11.5 TWh. + + +=== Transport === + +Sweden has 162,707 km (101,101 mi) of paved road and 1,428 km (887 mi) of expressways. Motorways run through Sweden and over the Øresund Bridge to Denmark. New motorways are still under construction and a new motorway from Uppsala to Gävle was finished on 17 October 2007. Sweden had left-hand traffic (vänstertrafik in Swedish) from approximately 1736 and continued to do so well into the 20th century. Voters rejected right-hand traffic in 1955, but after the Riksdag passed legislation in 1963 changeover took place on 3 September 1967, known in Swedish as Dagen H. +The Stockholm metro is the only underground system in Sweden and serves the city of Stockholm via 100 stations. The rail transport market is privatised, but while there are many privately owned enterprises, the largest operators are still owned by the state. The counties have financing, ticket and marketing responsibility for local trains. For other trains the operators handle tickets and marketing themselves. Operators include SJ, Veolia Transport, Green Cargo, Tågkompaniet and Inlandsbanan. Most of the railways are owned and operated by Trafikverket. + +Most tram networks were closed in 1967, as Sweden changed from left-side to right-side driving. But they survived in Norrköping, Stockholm and Gothenburg, with Gothenburg tram network being the largest. A new tram line opened in Lund on 13 December 2020. +The largest airports include Stockholm–Arlanda Airport (16.1 million passengers in 2009) 40 km (25 mi) north of Stockholm, Göteborg Landvetter Airport (4.3 million passengers in 2008), and Stockholm–Skavsta Airport (2.0 million passengers). Sweden hosts the two largest port companies in Scandinavia, Port of Göteborg AB (Gothenburg) and the transnational company Copenhagen Malmö Port AB. The most used airport for a large part of Southern Sweden is Kastrup or Copenhagen Airport which is located only 12 minutes by train from the closest Swedish railway station, Hyllie. Copenhagen Airport also is the largest international airport in Scandinavia and Finland. +Sweden also has a number of car ferry connections to several neighbouring countries. This includes a route from Umeå across the Gulf of Bothnia to Vaasa in Finland. There are several connections from the Stockholm area across the Sea of Åland to Mariehamn in Åland as well as Turku and Helsinki on the Finnish mainland and beyond to Estonia and St Petersburg in Russia. Ferry routes from the Stockholm area also connect with Ventspils and Riga in Latvia as well as Gdańsk in Poland across the Baltic Sea. The ferry ports of Karlskrona and Karlshamn in southeastern Sweden serve Gdynia, Poland, and Klaipėda, Lithuania. Ystad and Trelleborg near the southern tip of Sweden have ferry links with the Danish island of Bornholm and the German ports of Sassnitz, Rostock and Travemünde, respectively, and ferries run to Świnoujście, Poland, from both of them. Trelleborg is the busiest ferry port in Sweden in terms of weight transported by lorry. Its route to Sassnitz started as a steam-operated railway ferry in the 19th century, and today's ferry still carries trains to Berlin during the summer months. Another ferry route to Travemünde originates from Malmö. Despite the opening of the fixed link to Denmark, the Øresund Bridge, the busiest ferry route remains the short link across the narrowest section of the Øresund between Helsingborg and the Danish port of Helsingør, known as the HH Ferry route. There are over seventy departures a day each way; during peak times, a ferry departs every fifteen minutes. Ports higher up the Swedish west coast include Varberg, with a ferry connection across the Kattegat to Grenaa in Denmark, and Göteborg, serving Frederikshavn at the northern tip of Denmark and Kiel in Germany. Finally, there are ferries from Strömstad near the Norwegian border to destinations around the Oslofjord in Norway. There used to be ferry services to the United Kingdom from Göteborg to destinations such as Immingham, Harwich and Newcastle, but these have been discontinued. +Sweden has two domestic ferry lines with large vessels, both connecting Gotland with the mainland. The lines leave from Visby harbour on the island, and the ferries sail to either Oskarshamn or Nynäshamn. A smaller car ferry connects the island of Ven in Øresund with Landskrona. + + +=== Public policy === + +Sweden has one of the most highly developed welfare states in the world. According to a 2012 OECD report, the country had the second-highest public social spending as a percentage of its GDP after France (27.3% and 28.4%, respectively), and the third-highest total (public and private) social spending at 30.2% of its GDP, after France and Belgium (31.3% and 31.0%, respectively). Sweden spent 6.3% of its GDP, the ninth-highest among 34 OECD countries, to provide equal access to education. On health care, the country spent 10.0% of its total GDP, the 12th highest.Historically, Sweden provided solid support for free trade (except agriculture) and mostly relatively strong and stable property rights (both private and public), though some economists have pointed out that Sweden promoted industries with tariffs and used publicly subsidised R&D during the country's early critical years of industrialisation. After World War II a succession of governments expanded the welfare state by raising the taxes. During this period Sweden's economic growth was also one of the highest in the industrial world. A series of successive social reforms transformed the country into one of the most equal and developed on earth. The consistent growth of the welfare state led to Swedes achieving unprecedented levels of social mobility and quality of life—to this day Sweden consistently ranks at the top of league tables for health, literacy and Human Development—far ahead of some wealthier countries (for example the United States).However, from the 1970s and onwards Sweden's GDP growth fell behind other industrialised countries and the country's per capita ranking fell from fourth to 14th place in a few decades. From the mid-1990s until today Sweden's economic growth has once again accelerated and has been higher than in most other industrialised countries (including the US) during the last 15 years. A report from the United Nations Development Program predicted that Sweden's rating on the Human Development Index will fall from 0.949 in 2010 to 0.906 in 2030.Sweden began slowing the expansion of the welfare state in the 1980s, and even trimming it back. Sweden has been relatively quick to adopt neoliberal policies, such as privatisation, financialisation and deregulation, compared to countries such as France. The current Swedish government is continuing the trend of moderate rollbacks of previous social reforms. Growth has been higher than in many other EU-15 countries. Also since the mid-1980s, Sweden has had the fastest growth in inequality of any developed nation, according to the OECD. This has largely been attributed to the reduction in state benefits and a shift toward the privatisation of public services. According to Barbro Sorman, an activist of the opposition Left Party, "The rich are getting richer, and the poor are getting poorer. Sweden is starting to look like the USA." Nevertheless, it remains far more egalitarian than most nations. Partly as a result of these privatisations and widening economic disparity, the Swedes in the 2014 elections put the Social Democrats back in power.Sweden adopted free market agricultural policies in 1990. Since the 1930s, the agricultural sector had been subject to price controls. In June 1990, the Riksdag voted for a new agricultural policy marking a significant shift away from price controls. As a result, food prices fell somewhat. However, the liberalisations soon became moot because EU agricultural controls supervened.Since the late 1960s, Sweden has had the highest tax quota (as percentage of GDP) in the industrialised world, although today the gap has narrowed and Denmark has surpassed Sweden as the most heavily taxed country among developed countries. Sweden has a two-step progressive tax scale with a municipal income tax of about 30% and an additional high-income state tax of 20–25% when a salary exceeds roughly 320,000 SEK per year. Payroll taxes amount to 32%. In addition, a national VAT of 25% is added to many things bought by private citizens, with the exception of food (12% VAT), transportation, and books (6% VAT). Certain items are subject to additional taxes, e.g. electricity, petrol/diesel and alcoholic beverages. +In 2007, total tax revenue was 47.8% of GDP, the second-highest tax burden among developed countries, down from 49.1% 2006. Sweden's inverted tax wedge – the amount going to the service worker's wallet – is approximately 15%, compared to 10% in Belgium, 30% in Ireland, and 50% in the United States. Public sector spending amounts to 53% of the GDP. State and municipal employees total around a third of the workforce, much more than in most Western countries. Only Denmark has a larger public sector (38% of Danish workforce). Spending on transfers is also high. +In 2015 and 2016, 69 per cent of the employed workers is organised in trade unions. Union density in 2016 was 62% among blue-collar-workers (most of them in the Swedish Trade Union Confederation, LO) and 75% among white-collar workers (most of them in the Swedish Confederation of Professional Employees, TCO, and the Swedish Confederation of Professional Associations, SACO). Sweden has state-supported union unemployment funds (Ghent system). Trade unions have the right to elect two representatives to the board in all Swedish companies with more than 25 employees. Sweden has a relatively high amount of sick leave per worker in OECD: the average worker loses 24 days due to sickness.The unemployment rate was 7.2% in May 2017 while the employment rate was 67.4%, with the workforce consisting of 4,983,000 people while 387,000 are unemployed. Unemployment among youth (aged 24 or younger) in 2012 was 24.2%, making Sweden the OECD country with the highest ratio of youth unemployment versus unemployment in general. + + +=== Science and technology === + +In the 18th century, Sweden's scientific revolution took off. Previously, technical progress had mainly come from mainland Europe. +In 1739, the Royal Swedish Academy of Sciences was founded, with people such as Carl Linnaeus and Anders Celsius as early members. Many of the companies founded by early pioneers still remain major international brands. Gustaf Dalén founded AGA, and received the Nobel Prize for his sun valve. Alfred Nobel invented dynamite and instituted the Nobel Prizes. Lars Magnus Ericsson started the company bearing his name, Ericsson, still one of the largest telecom companies in the world. Jonas Wenström was an early pioneer in alternating current and is along with Serbian-American inventor Nikola Tesla credited as one of the inventors of the three-phase electrical system.The traditional engineering industry is still a major source of Swedish inventions, but pharmaceuticals, electronics and other high-tech industries are gaining ground. Tetra Pak was an invention for storing liquid foods, invented by Erik Wallenberg. Losec, an ulcer medicine, was the world's best-selling drug in the 1990s and was developed by AstraZeneca. More recently Håkan Lans invented the Automatic Identification System, a worldwide standard for shipping and civil aviation navigation. A large portion of the Swedish economy is to this day based on the export of technical inventions, and many large multinational corporations from Sweden have their origins in the ingenuity of Swedish inventors.Swedish inventors held 47,112 patents in the United States in 2014, according to the United States Patent and Trademark Office. As a nation, only ten other countries hold more patents than Sweden.Combined, the public and the private sector in Sweden allocate over 3.5% of GDP to research & development (R&D) per year, making Sweden's investment in R&D as a percentage of GDP the second-highest in the world. For several decades the Swedish government has prioritised scientific and R&D activities. As a percentage of GDP, the Swedish government spends the most of any nation on research and development. Sweden tops other European countries in the number of published scientific works per capita.In 2009, the decisions to construct Sweden's two largest scientific installations, the synchrotron radiation facility MAX IV Laboratory and the European Spallation Source (ESS), were taken. Both installations will be built in Lund. The European Spallation Source, costing some SEK 14 billion to construct, will begin initial operations in 2019 with construction completion scheduled for 2025. The ESS will give an approximately 30 times stronger neutron beam than any of today's existing neutron source installations. The MAX IV, costing some SEK 3 billion, was inaugurated on 21 June 2016. Both facilities have strong implications on material research. Sweden was ranked third in the Global Innovation Index in 2022. + + +=== Waste management === +Sweden is known for its efficient waste management system. Only 0.7% of the total household waste is disposed, and the rest is reused. Around 52% its waste is used for energy production (that is burnt) and 47% recycled. About two million tonnes of waste are imported from neighbouring countries to make profitable recycling products. As of 2023 report, Sweden generated 1.7 billion euros in 2020 (the highest so far was 1.98 billion euros in 2016) from recycling waste. The works are mostly executed through the public organisation, Swedish Waste Management (Avfall Sverige). + + +=== Taxes === + +On average, 27% of taxpayers' money in Sweden goes to education and healthcare, whereas 5% goes to the police and military, and 42% to social security.The typical worker receives 40% of his or her labour costs after the tax wedge. Total tax collected by Sweden as a percentage of its GDP peaked at 52.3% in 1990. The country faced a real estate and banking crisis in 1990–1991, and consequently passed tax reforms in 1991 to implement tax rate cuts and tax base broadening over time. Since 1990, taxes as a percentage of GDP collected by Sweden have been dropping, with total tax rates for the highest income earners dropping the most. In 2010, 45.8% of the country's GDP was collected as taxes, the second highest among OECD countries, and nearly double the percentage in the US or South Korea. + + +=== Pensions === + +Every Swedish resident receives a state pension. Swedish Pensions Agency is responsible for pensions. People who have worked in Sweden, but relocated to another country, can also receive the Swedish pension. There are several types of pensions in Sweden: occupational and private pensions, and national retirement. A person can receive a combination of the various types of pensions. + + +== Demographics == + +The total resident population of Sweden was 10,377,781 in October 2020. The population exceeded 10 million for the first time on Friday 20 January 2017.The average population density is just over 25 people per km2 (65 per square mile), with 1 437 persons per km2 in localities (continuous settlement with at least 200 inhabitants)., 87% of the population live in urban areas, which cover 1.5% of the entire land area. 63% of Swedes are in large urban areas. It is substantially higher in the south than in the north. The capital city Stockholm has a municipal population of about 950,000 (with 1.5 million in the urban area and 2.3 million in the metropolitan area). The second- and third-largest cities are Gothenburg and Malmö. Greater Gothenburg counts just over a million inhabitants and the same goes for the western part of Scania, along the Öresund. The Öresund Region, the Danish-Swedish cross-border region around the Öresund that Malmö is part of, has a population of 4 million. Outside of major cities, areas with notably higher population density include the agricultural part of Östergötland, the western coast, the area around Lake Mälaren and the agricultural area around Uppsala. +Norrland, which covers approximately 60% of the Swedish territory, has a very low population density (below 5 people per square kilometre). The mountains and most of the remote coastal areas are almost unpopulated. Low population density exists also in large parts of western Svealand, as well as southern and central Småland. An area known as Finnveden, which is located in the south-west of Småland, and mainly below the 57th parallel, can also be considered as almost empty of people. +Between 1820 and 1930, approximately 1.3 million Swedes, a third of the country's population at the time, emigrated to North America, and most of them to the United States. There are more than 4.4 million Swedish Americans according to a 2006 US Census Bureau estimate. In Canada, the community of Swedish ancestry is 330,000 strong.There are no official statistics on ethnicity, but according to Statistics Sweden, 2,752,572 (26%) inhabitants of Sweden were of a foreign background in 2021, defined as being born abroad or born in Sweden with both foreign-born parents. Of these inhabitants, 2,090,503 persons were born abroad and 662,069 persons were born in Sweden to parents born abroad. In addition, 805,340 persons had one parent born abroad with the other parent born in Sweden.Sweden has one of the oldest populations in the world, with the average age of 41.1 years. + + +=== Language === + +The official language of Sweden is Swedish, a North Germanic language, related and very similar to Danish and Norwegian, but differing in pronunciation and orthography. Norwegians have little difficulty understanding Swedish, and Danes can also understand it, with slightly more difficulty than Norwegians. The same goes for standard Swedish speakers, who find it far easier to understand Norwegian than Danish. The dialects spoken in Scania, the southernmost part of the country, are influenced by Danish because the region traditionally was a part of Denmark and is nowadays situated closely to it. Sweden Finns are Sweden's largest linguistic minority, comprising about 5% of Sweden's population, and Finnish is recognised as a minority language. Owing to a 21st-century influx of native speakers of Arabic, the use of Arabic is likely more widespread in the country than that of Finnish. However, no official statistics are kept on language use.Along with Finnish, four other minority languages are also recognised: Meänkieli, Sami, Romani, and Yiddish. Swedish became Sweden's official language on 1 July 2009, when a new language law was implemented. The issue of whether Swedish should be declared the official language had been raised in the past, and the Riksdag voted on the matter in 2005, but the proposal narrowly failed.In varying degrees, a majority of Swedes, especially those born after World War II, understand and speak English, owing to trade links, the popularity of overseas travel, a strong Anglo-American influence and the tradition of subtitling rather than dubbing foreign television shows and films, and the relative similarity of the two languages which makes learning English easier. In a 2005 survey by Eurobarometer, 89% of Swedes reported the ability to speak English.English became a compulsory subject for secondary school students studying natural sciences as early as 1849, and has been a compulsory subject for all Swedish students since the late 1940s. Depending on the local school authorities, English is currently a compulsory subject between first grade and ninth grade, with all students continuing in secondary school studying English for at least another year. Most students also study one and sometimes two additional languages. Some Danish and Norwegian is also taught as part of Swedish courses for native speakers. Because of the extensive mutual intelligibility between the three continental Scandinavian languages, Swedish speakers often use their native language when visiting or living in Norway or Denmark. + + +=== Religion === + +Before the 11th century, Swedes adhered to Norse paganism, worshiping Æsir gods, with its centre at the Temple in Uppsala. With Christianisation in the 11th century, the laws of the country changed, forbidding worship of other deities until the late 19th century. After the Protestant Reformation in the 1530s, a change led by Martin Luther's Swedish associate Olaus Petri, the authority of the Roman Catholic Church was abolished and Lutheranism became widespread. Adoption of Lutheranism was completed by the Uppsala Synod of 1593, and it became the official religion. During the era following the Reformation, usually known as the period of Lutheran orthodoxy, small groups of non-Lutherans, especially Calvinist Dutchmen, the Moravian Church and French Huguenots played a significant role in trade and industry, and were quietly tolerated as long as they kept a low religious profile. The Sami originally had their own shamanistic religion, but they were converted to Lutheranism by Swedish missionaries in the 17th and 18th centuries. + +With religious liberalisations in the late 18th century believers of other faiths, including Judaism and Roman Catholicism, were allowed to live and work freely in the country. However, until 1860 it remained illegal for Lutherans to convert to another religion. The 19th century saw the arrival of various evangelical free churches, and, towards the end of the century, secularism, leading many to distance themselves from church rituals. Leaving the Church of Sweden became legal with the so-called Dissenter Act of 1860, but only under the provision of entering another Christian denomination. The right to stand outside any religious denomination was formally established in the law on freedom of religion in 1951. +In 2000, the Church of Sweden was disestablished. Sweden was the second Nordic country to disestablish its state church (after Finland did so in the Church Act of 1869).At the end of 2022, 52.8% of Swedes belonged to the Church of Sweden; this number has been decreasing by 1-2 percentage points each year since 2001. Approximately 2% of the church's members regularly attend Sunday services. The reason for the large number of inactive members is partly that, until 1996, children automatically became members at birth if at least one of the parents was a member. Since 1996, only children and adults who are christened become members. Some 275,000 Swedes are today members of various Evangelical Protestant free churches (where congregation attendance is much higher), and due to recent immigration, there are now some 100,000 Eastern Orthodox Christians and 92,000 Roman Catholics living in Sweden.The first Muslim congregation was established in 1949, when a small contingent of Tatars migrated from Finland. Islam's presence in Sweden remained marginal until the 1960s, when Sweden started to receive migrants from the Balkans and Turkey. Further immigration from North Africa and the Middle East have brought the estimated Muslim population to 600,000. However, only about 110,000 were members of a congregation around 2010.According to the Eurobarometer Poll 2010, +18% of Swedish citizens responded that "they believe there is a god". +45% answered that "they believe there is some sort of spirit or life force". +34% answered that "they do not believe there is any sort of spirit, god, or life force".According to a Demoskop study in 2015, the beliefs of the Swedish showed that + +21% believed in a god (down from 35 percent in 2008). +16% believed in ghosts. +14% believed in creationism or intelligent design.Sociology professor Phil Zuckerman claims that Swedes, despite a lack of belief in God, commonly question the term atheist, preferring to call themselves Christians while being content with remaining in the Church of Sweden. Religion continues to play a role in Swedish cultural identity. This is evidenced by the fact that the majority of Swedish adults continue to remain members of the Lutheran Church despite having to pay a church tax; moreover, rates of baptism remain high and church weddings are increasing in Sweden. + + +=== Health === + +Healthcare in Sweden is mainly tax-funded, universal for all citizens, and decentralised, although private health care also exists. The health care system in Sweden is financed primarily through taxes levied by regional councils and municipalities. A total of 21 councils are in charge of primary and hospital care within the country. +Private healthcare is a rarity in Sweden, and even those private institutions work under the mandated city councils. The city councils regulates the rules and the establishment of potential private practices. While care for the elderly or those who need psychiatric help is conducted privately in many other countries, in Sweden, publicly funded local authorities are in charge of this type of care.Healthcare in Sweden is similar in quality to other developed nations. Sweden ranks in the top five countries with respect to low infant mortality. It also ranks high in life expectancy and in safe drinking water. In 2018, health and medical care represented around 11% of GDP. + + +=== Education === + +Children aged 1–5 years old are guaranteed a place in a public kindergarten (Swedish: förskola or, colloquially, dagis). Between the ages of 6 and 16, children attend compulsory comprehensive school. In the Programme for International Student Assessment (PISA), Swedish 15-year-old pupils score close to the OECD average. After completing the ninth grade, about 90% of the students continue with a three-year upper secondary school (gymnasium), which can lead to both a job qualification or entrance eligibility to university. The school system is largely financed by taxes. +The Swedish government treats public and independent schools equally by introducing education vouchers in 1992 as one of the first countries in the world after the Netherlands. Anyone can establish a for-profit school and the municipality must pay new schools the same amount as municipal schools get. School lunch is free for all students in Sweden, and providing breakfast is also encouraged.There are a number of different universities and colleges in Sweden, the oldest and largest of which are situated in Uppsala, Lund, Gothenburg and Stockholm. In 2000, 32% of Swedish people held a tertiary degree, making the country fifth in the OECD in that category. Along with several other European countries, the government also subsidises tuition of international students pursuing a degree at Swedish institutions, although a recent bill passed in the Riksdag will limit this subsidy to students from EEA countries and Switzerland.The large influx of immigrants to Swedish schools has been cited as a significant part of the reason why Sweden has dropped more than any other European country in the international PISA rankings. + + +== Culture == + +Sweden has many authors of worldwide recognition including August Strindberg, Astrid Lindgren, and Nobel Prize winners Selma Lagerlöf and Harry Martinson. In total seven Nobel Prizes in Literature have been awarded to Swedes. The nation's most well-known artists are painters such as Carl Larsson and Anders Zorn, and the sculptors Tobias Sergel and Carl Milles. +Swedish 20th-century culture is noted by pioneering works in the early days of cinema, with Mauritz Stiller and Victor Sjöström. In the 1920s–1980s, the filmmaker Ingmar Bergman and actors Greta Garbo and Ingrid Bergman became internationally noted people within cinema. More recently, the films of Lukas Moodysson, Lasse Hallström, and Ruben Östlund have received international recognition. +Throughout the 1960s and 1970s, Sweden was seen as an international leader in what is now referred to as the "sexual revolution", with gender equality having particularly been promoted. The early Swedish film I Am Curious (Yellow) (1967) reflected a liberal view of sexuality, including scenes of love making that caught international attention, and introduced the concept of the "Swedish sin" that had been introduced earlier in the US with Ingmar Bergman's Summer with Monika. +The image of "hot love and cold people" emerged. Sexual liberalism was seen as part of modernisation process that by breaking down traditional borders would lead to the emancipation of natural forces and desires.Sweden has also become very liberal towards homosexuality, as is reflected in the popular acceptance of films such as Show Me Love, which is about two young lesbians in the small Swedish town of Åmål. Since 1 May 2009, Sweden repealed its "registered partnership" laws and fully replaced them with gender-neutral marriage. Sweden also offers domestic partnerships for both same-sex and opposite-sex couples. Cohabitation (sammanboende) by couples of all ages, including teenagers as well as elderly couples, is widespread. As of 2009, Sweden is experiencing a baby boom. + + +=== Music === + +Historical re-creations of Norse music have been attempted based on instruments found in Viking sites. The instruments used were the lur (a sort of trumpet), simple string instruments, wooden flutes and drums. Sweden has a significant folk-music scene. The joik, a type of Sami music, is a chant that is part of the traditional Sami animistic spirituality. Notable composers include Carl Michael Bellman and Franz Berwald. +Sweden also has a prominent choral music tradition. Out of a population of 9.5 million, it is estimated that five to six hundred thousand people sing in choirs.In 2007, with over 800 million dollars in revenue, Sweden was the third-largest music exporter in the world and surpassed only by the US and the UK. According to one source 2013, Sweden produces the most chart hits per capita in the world, followed by the UK and the USA. +Sweden has a rather lively jazz scene. During the last sixty years or so it has attained a remarkably high artistic standard, stimulated by domestic as well as external influences and experiences. The Centre for Swedish Folk Music and Jazz Research has published an overview of jazz in Sweden by Lars Westin. + + +=== Architecture === + +Before the 13th century almost all buildings were made of timber, but a shift began towards stone. Early Swedish stone buildings are the Romanesque churches on the countryside. As so happens, many of them were built in Scania and are in effect Danish churches. This would include the Lund Cathedral from the 11th century and the somewhat younger church in Dalby, but also many early Gothic churches built through influences of the Hanseatic League, such as in Ystad, Malmö and Helsingborg. +Cathedrals in other parts of Sweden were also built as seats of Sweden's bishops. The Skara Cathedral is of bricks from the 14th century, and the Uppsala Cathedral in the 15th. In 1230 the foundations of the Linköping Cathedral were made, the material was there limestone, but the building took some 250 years to finish. +Among older structures are also some significant fortresses and other historical buildings such as at Borgholm Castle, Halltorps Manor and Eketorp fortress on the island Öland, the Nyköping fortress and the Visby city wall. + +Around 1520 Sweden was out of the Middle Ages and united under King Gustav Vasa, who immediately initiated grand mansions, castles and fortresses to be built. Some of the more magnificent include Kalmar Castle, Gripsholm Castle and the one at Vadstena. +In the next two centuries, Sweden was designated by Baroque architecture and later the rococo. Notable projects from that time include the city Karlskrona, which has now also been declared a World Heritage Site and the Drottningholm Palace. +1930 was the year of the great Stockholm exhibition, which marked the breakthrough of Functionalism, or funkis as it became known. The style came to dominate in the following decades. Some notable projects of this kind were the Million Programme, offering affordable living in large apartment complexes. +The Ericsson Globe, located in Stockholm, is the largest hemispherical building on Earth. Its dome has a diameter of 110 metres (360 feet) and took two and a half years to build. + + +=== Media === + +Swedes are among the greatest consumers of newspapers in the world, and nearly every town is served by a local paper. The country's main quality morning papers are Dagens Nyheter (liberal), Göteborgs-Posten (liberal), Svenska Dagbladet (liberal conservative) and Sydsvenska Dagbladet (liberal). The two largest evening tabloids are Aftonbladet (social democratic) and Expressen (liberal). The ad-financed, free international morning paper, Metro International, was founded in Stockholm, Sweden. The country's news is reported in English by, among others, The Local (liberal).The public broadcasting companies held a monopoly on radio and television for a long time in Sweden. Licence-funded radio broadcasts started in 1925. A second radio network was started in 1954, and a third opened 1962, in response to pirate radio stations. Non-profit community radio was allowed in 1979 and in 1993 commercial local radio started. +The licence-funded television service was officially launched in 1956. A second channel, TV2, was launched in 1969. These two channels (operated by Sveriges Television since the late 1970s) held a monopoly until the 1980s when cable and satellite television became available. The first Swedish-language satellite service was TV3 which started broadcasting from London in 1987. It was followed by Kanal 5 in 1989 (then known as Nordic Channel) and TV4 in 1990. +In 1991 the government announced it would begin taking applications from private television companies wishing to broadcast on the terrestrial network. TV4, which had previously been broadcasting via satellite, was granted a permit and began its terrestrial broadcasts in 1992, becoming the first private channel to broadcast television content from within the country. +Around half the population are connected to cable television. Digital terrestrial television in Sweden started in 1999 and the last analogue terrestrial broadcasts were terminated in 2007. + + +=== Literature === + +The first literary text from Sweden is the Rök runestone, carved during the Viking Age c. 800 AD. With the conversion of the land to Christianity around 1100 AD, Sweden entered the Middle Ages, during which monastic writers preferred to use Latin. Therefore, there are only a few texts in the Old Swedish from that period. Swedish literature only began to flourish when the language was standardised during the 16th century. This standardisation was largely due to the full translation of the Bible into Swedish in 1541. This translation is the so-called Gustav Vasa Bible. +With improved education and the freedom brought by secularisation, the 17th century saw several notable authors develop the Swedish language further. Some key figures include Georg Stiernhielm (17th century), who was the first to write classical poetry in Swedish; Johan Henric Kellgren (18th century), the first to write fluent Swedish prose; Carl Michael Bellman (late 18th century), the first writer of burlesque ballads; and August Strindberg (late 19th century), a socio-realistic writer and playwright who won worldwide fame. The early 20th century continued to produce notable authors, such as Selma Lagerlöf, (Nobel laureate 1909), Verner von Heidenstam (Nobel laureate 1916) and Pär Lagerkvist (Nobel laureate 1951). +In recent decades, a handful of Swedish writers have established themselves internationally, including the detective novelist Henning Mankell and the writer of spy fiction Jan Guillou. The Swedish writer to have made the most lasting impression on world literature is the children's book writer Astrid Lindgren, and her books about Pippi Longstocking, Emil, and others. In 2008, the second best-selling fiction author in the world was Stieg Larsson, whose Millennium series of crime novels is being published posthumously to critical acclaim. Larsson drew heavily on the work of Lindgren by basing his central character, Lisbeth Salander, on Longstocking. + + +=== Holidays === + +Apart from traditional Protestant Christian holidays, Sweden also celebrates some unique holidays, some of a pre-Christian tradition. They include Midsummer celebrating the summer solstice; Walpurgis Night (Valborgsmässoafton) on 30 April lighting bonfires; and Labour Day or May Day on 1 May is dedicated to socialist demonstrations. The day of giver-of-light Saint Lucia, 13 December, is widely acknowledged in elaborate celebrations which betoken its Italian origin and commence the month-long Christmas season. +6 June is the National Day of Sweden and has since 2005 been a public holiday. Furthermore, there are official flag flying day observances and a Namesdays in Sweden calendar. In August many Swedes have kräftskivor (crayfish dinner parties). Martin of Tours Eve is celebrated in Scania in November with Mårten Gås parties, where roast goose and svartsoppa ('black soup', made of goose stock, fruit, spices, spirits and goose blood) are served. The Sami, one of Sweden's indigenous minorities, have their holiday on 6 February and Scania celebrate their Scanian Flag day on the third Sunday in July. + + +=== Cuisine === + +Swedish cuisine, like that of the other Nordic countries (Denmark, Norway and Finland), was traditionally simple. Fish (particularly herring), meat, potatoes and dairy products played prominent roles. Spices were sparse. Preparations include Swedish meatballs, traditionally served with gravy, boiled potatoes and lingonberry jam; pancakes; pyttipanna, a spiced fried hash of meat and potatoes originally meant to use up any leftovers of meat; lutfisk; and the smörgåsbord, or lavish buffet. Akvavit is a popular alcoholic distilled beverage, and the drinking of snaps is of cultural importance. The traditional flat and dry crisp bread has developed into several contemporary variants. Regionally important foods are the surströmming (a fermented fish) in northern Sweden and eel in southern Sweden. +Swedish traditional dishes, some of which are many hundreds of years old, are still an important part of Swedish everyday meals, in spite of the fact that modern-day Swedish cuisine adopts many international dishes. +In August, at the traditional feast known as crayfish party, kräftskiva, Swedes eat large amounts of crayfish boiled with dill. + + +=== Cinema === + +Swedes have been fairly prominent in the film area through the years. A number of Swedish people have found success in Hollywood, including Ingrid Bergman, Greta Garbo and Max von Sydow. Amongst several directors who have made internationally successful films can be mentioned Ingmar Bergman, Lukas Moodysson and Lasse Hallström. + + +=== Fashion === +Interest in fashion is big in Sweden and the country headquarters famous brands like Hennes & Mauritz (operating as H&M), J. Lindeberg (operating as JL), Acne, Lindex, Odd Molly, Cheap Monday, Gant, WESC, Filippa K, and Nakkna within its borders. These companies, however, are composed largely of buyers who import fashionable goods from throughout Europe and America, continuing the trend of Swedish business toward multinational economic dependency like many of its neighbours. + + +=== Sports === + +Sport activities are a national movement with half of the population actively participating in organised sporting activities. The two main spectator sports are football and ice hockey. Second to football, horse sports (of which most of the participants are women) have the highest number of practitioners. Thereafter, golf, orienteering, gymnastics, track and field, and the team sports of ice hockey, handball, floorball, basketball and bandy are the most popular in terms of practitioners. +The Swedish national men's ice hockey team, affectionately known as Tre Kronor (English: Three Crowns; the national symbol of Sweden), is regarded as one of the best in the world. The team has won the World Championships nine times, placing them third in the all-time medal count. Tre Kronor also won Olympic gold medals in 1994 and 2006. In 2006, Tre Kronor became the first national hockey team to win both the Olympic and world championships in the same year. The Swedish national men's football team has seen some success at the World Cup in the past, finishing second when they hosted the tournament in 1958, and third twice, in 1950 and 1994. +Sweden hosted the 1912 Summer Olympics, Equestrian at the 1956 Summer Olympics and the FIFA World Cup in 1958. Other big sports events include the UEFA Euro 1992, 1995 FIFA Women's World Cup, 1995 World Championships in Athletics, UEFA Women's Euro 2013, and several championships of ice hockey, curling, athletics, skiing, bandy, figure skating and swimming. +In 2016, the Swedish Poker Federation (Svepof) joined The International Federation of Poker (IFP). + + +== See also == +List of Sweden-related topics +Outline of Sweden +329 Svea + + +== Notes == + + +== References == + + +== Further reading == + + +== External links == + +Sweden. The World Factbook. Central Intelligence Agency. +Sweden entry at Britannica.com +Gosse, Edmund William (1887). "Sweden" . Encyclopædia Britannica. Vol. XXII (9th ed.). pp. 736–758. +Gosse, Edmund William; and four others (1911). "Sweden" . Encyclopædia Britannica. Vol. 26 (11th ed.). pp. 188–221. +Hildebrand, Karl (1922). "Sweden" . Encyclopædia Britannica. Vol. 32 (12th ed.). +Sweden from UCB Libraries GovPubs +Sweden at Curlie +Sweden profile from the BBC News + Wikimedia Atlas of Sweden + Geographic data related to Sweden at OpenStreetMap +Key Development Forecasts for Sweden from International Futures +Study in Sweden – official guide to studying in Sweden +Wayback Machine Technological Waves and Economic Growth in Sweden 1850–2005 +Sweden – Economic Growth and Structural Change, 1800–2000 — EH.Net Encyclopedia +vifanord – a digital library that provides scientific information on the Nordic and Baltic countries as well as the Baltic region as a wholePublic sector + +Sweden.se — Sweden's official portal +The Swedish Parliament – official website +The Government of Sweden – official website +The Royal Court Archived 11 October 2016 at the Wayback Machine – official website of the Swedish MonarchyNews media + +Radio Sweden – public service +Sveriges Television (in Swedish) – public service +Dagens Nyheter (in Swedish) +Svenska Dagbladet (in Swedish) +The Local – Sweden's news in English – independent English language news siteTrade + +World Bank Summary Trade Statistics SwedenTravel + +VisitSweden.com – official travel and tourism website for Sweden \ No newline at end of file diff --git a/RAG/notebooks/llamaindex/llamaindex_basic_RAG.ipynb b/RAG/notebooks/llamaindex/llamaindex_basic_RAG.ipynb new file mode 100644 index 00000000..281b0d08 --- /dev/null +++ b/RAG/notebooks/llamaindex/llamaindex_basic_RAG.ipynb @@ -0,0 +1,438 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "c5fb0b9e-f9cd-404f-bd8d-0273e94ac1fe", + "metadata": {}, + "source": [ + "# RAG Example Using NVIDIA API Catalog and LlamaIndex" + ] + }, + { + "cell_type": "markdown", + "id": "2969cdab-82fc-4ce5-bde1-b4f629691f27", + "metadata": {}, + "source": [ + "This notebook introduces how to use LlamaIndex to interact with NVIDIA hosted NIM microservices like chat, embedding, and reranking models to build a simple retrieval-augmented generation (RAG) application." + ] + }, + { + "cell_type": "markdown", + "id": "e4253bd0-4313-4056-95f5-899a180879c2", + "metadata": {}, + "source": [ + "## Terminology" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "5a084a00-b65d-483a-a7c6-b4c12e4272dd", + "metadata": {}, + "source": [ + "#### RAG\n", + "\n", + "- RAG is a technique for augmenting LLM knowledge with additional data.\n", + "- LLMs can reason about wide-ranging topics, but their knowledge is limited to the public data up to a specific point in time that they were trained on.\n", + "- If you want to build AI applications that can reason about private data or data introduced after a model's cutoff date, you need to augment the knowledge of the model with the specific information it needs.\n", + "- The process of bringing the appropriate information and inserting it into the model prompt is known as retrieval augmented generation (RAG).\n", + "\n", + "The preceding summary of RAG originates in the LangChain v0.2 tutorial [Build a RAG App](https://python.langchain.com/v0.2/docs/tutorials/rag/) tutorial in the LangChain v0.2 documentation.\n", + "\n", + "For comprehensive information, refer to the LLamaIndex documentation for [Building an LLM Application](https://docs.llamaindex.ai/en/stable/understanding/#:~:text=on%20your%20machine.-,Building%20a%20RAG%20pipeline,-%3A%20Retrieval%2DAugmented%20Generation).\n", + "\n", + "#### NIM\n", + "\n", + "- [NIM microservices](https://developer.nvidia.com/blog/nvidia-nim-offers-optimized-inference-microservices-for-deploying-ai-models-at-scale/) are containerized microservices that simplify the deployment of generative AI models like LLMs and are optimized to run on NVIDIA GPUs. \n", + "- NIM microservices support models across domains like chat, embedding, reranking, and more from both the community and NVIDIA.\n", + "\n", + "#### NVIDIA API Catalog\n", + "\n", + "- [NVIDIA API Catalog](https://build.nvidia.com/explore/discover) is a hosted platform for accessing a wide range of microservices online.\n", + "- You can test models on the catalog and then export them with an NVIDIA AI Enterprise license for on-premises or cloud deployment\n", + "\n", + "#### LlamaIndex Concepts\n", + "\n", + " - `Data connectors` ingest your existing data from their native source and format.\n", + " - `Data indexes` structure your data in intermediate representations that are easy and performant for LLMs to consume.\n", + " - `Engines` provide natural language access to your data for building context-augmented LLM apps.\n", + "\n", + "LlamaIndex also provides integrations like `llms-nvidia`, `embeddings-nvidia` & `nvidia-rerank` to work with NVIDIA microservices." + ] + }, + { + "cell_type": "markdown", + "id": "ca300278-5ff4-47c4-ab70-c6584ef73c9f", + "metadata": {}, + "source": [ + "## Installation and Requirements\n", + "\n", + "Create a Python environment (preferably with Conda) using Python version 3.10.14. \n", + "To install Jupyter Lab, refer to the [installation](https://jupyter.org/install) page." + ] + }, + { + "cell_type": "markdown", + "id": "1b7a52a0-7e5e-4064-9665-cb947d600f84", + "metadata": {}, + "source": [ + "## Getting Started!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36287c2e-8708-4006-8adf-851f06cce02d", + "metadata": {}, + "outputs": [], + "source": [ + "# Requirements\n", + "!pip install --upgrade pip\n", + "!pip install llama-index-core==0.10.50\n", + "!pip install llama-index-readers-file==0.1.25\n", + "!pip install llama-index-llms-nvidia==0.1.3\n", + "!pip install llama-index-embeddings-nvidia==0.1.4\n", + "!pip install llama-index-postprocessor-nvidia-rerank==0.1.2\n", + "!pip install ipywidgets==8.1.3" + ] + }, + { + "cell_type": "markdown", + "id": "04495732-c2db-4c97-91d0-96708814334d", + "metadata": {}, + "source": [ + "To get started you need a `NVIDIA_API_KEY` to use NVIDIA AI Foundation models:\n", + "\n", + "1) Create a free account with [NVIDIA](https://build.nvidia.com/explore/discover).\n", + "2) Click on your model of choice.\n", + "3) Under Input select the Python tab, and click **Get API Key** and then click **Generate Key**.\n", + "4) Copy and save the generated key as NVIDIA_API_KEY. From there, you should have access to the endpoints." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "bbb51115-79f8-48c3-b3ee-d434916945f6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Enter your NVIDIA API key: ········\n" + ] + } + ], + "source": [ + "import getpass\n", + "import os\n", + "\n", + "if not os.environ.get(\"NVIDIA_API_KEY\", \"\").startswith(\"nvapi-\"):\n", + " nvidia_api_key = getpass.getpass(\"Enter your NVIDIA API key: \")\n", + " assert nvidia_api_key.startswith(\"nvapi-\"), f\"{nvidia_api_key[:5]}... is not a valid key\"\n", + " os.environ[\"NVIDIA_API_KEY\"] = nvidia_api_key" + ] + }, + { + "cell_type": "markdown", + "id": "25656ab5-0046-4e27-be65-b3d3d547b4c6", + "metadata": {}, + "source": [ + "## RAG Example using LLM and Embedding" + ] + }, + { + "cell_type": "markdown", + "id": "54e86bc0-e9c5-4a2b-be0e-7fca0331e886", + "metadata": {}, + "source": [ + "### 1) Initialize the LLM\n", + "\n", + "`llama-index-llms-nvidia`, also known as NVIDIA's LLM connector,\n", + "allows your connect to and generate from compatible models available on the NVIDIA API catalog.\n", + "\n", + "Here we will use **mixtral-8x7b-instruct-v0.1** " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "75f7bdd3-2c6f-4ba2-bd89-175cedbf4f3b", + "metadata": {}, + "outputs": [], + "source": [ + "# Settings enables global configuration as a singleton object throughout your application.\n", + "# Here, it is used to set the LLM, embedding model, and text splitter configurations globally.\n", + "from llama_index.core import Settings\n", + "from llama_index.llms.nvidia import NVIDIA\n", + "\n", + "# Here we are using mixtral-8x7b-instruct-v0.1 model from API Catalog\n", + "Settings.llm = NVIDIA(model=\"mistralai/mixtral-8x7b-instruct-v0.1\")" + ] + }, + { + "cell_type": "markdown", + "id": "35cc87a6-2f83-4652-95f1-cf349db8bad6", + "metadata": {}, + "source": [ + "### 2) Intiatlize the embedding\n", + "\n", + "We selected **NV-Embed-QA** as the embedding" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "d88f7838-b9f9-4fc5-8779-84df6cb26017", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index.embeddings.nvidia import NVIDIAEmbedding\n", + "Settings.embed_model = NVIDIAEmbedding(model=\"NV-Embed-QA\", truncate=\"END\")" + ] + }, + { + "cell_type": "markdown", + "id": "b9862f2e-5055-4fe4-818d-708091243d74", + "metadata": {}, + "source": [ + "### 3) Obtain some toy text dataset\n", + "Here we are loading a toy data from a text documents and in real-time data can be loaded from various sources. " + ] + }, + { + "cell_type": "markdown", + "id": "851b16b3-43ac-4269-9f37-05a33efe24fb", + "metadata": {}, + "source": [ + "Real world documents can be very long, this makes it hard to fit in the context window of many models. Even for those models that could fit the full post in their context window, models can struggle to find information in very long inputs.\n", + "\n", + "To handle this we’ll split the Document into chunks for embedding and vector storage." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "804c85f6-181b-4291-a685-d6b378015544", + "metadata": {}, + "outputs": [], + "source": [ + "# For this example we load a toy data set (it's a simple text file with some information about Sweden)\n", + "TOY_DATA_PATH = \"./data/\"\n", + "\n", + "from llama_index.core.node_parser import SentenceSplitter\n", + "from llama_index.core import SimpleDirectoryReader\n", + "Settings.text_splitter = SentenceSplitter(chunk_size=400)\n", + "documents = SimpleDirectoryReader(TOY_DATA_PATH).load_data()" + ] + }, + { + "cell_type": "markdown", + "id": "9b0a7da3-b6e7-46f1-9c31-3c6ef5f04d56", + "metadata": {}, + "source": [ + "Note:\n", + " - `SimpleDirectoryReader` takes care of storing basic file information such as the filename, filepath, and file type as metadata by default. This metadata can be used to keep track of the source file, allowing us to use it later for citation or metadata filtering." + ] + }, + { + "cell_type": "markdown", + "id": "f867df18-11c8-45ea-b81c-1603459431f9", + "metadata": {}, + "source": [ + "### 4) Process the documents into VectorStoreIndex\n", + "\n", + "In RAG, your data is loaded and prepared for queries or \"indexed\". User queries act on the index, which filters your data down to the most relevant context. This context and your query then go to the LLM along with a prompt, and the LLM provides a response." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "2d7b2fbd-8cb1-4d68-9659-2426b9ecffe3", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_index.core import VectorStoreIndex\n", + "# When you use from_documents, your Documents are split into chunks and parsed into Node objects\n", + "# By default, VectorStoreIndex stores everything in memory\n", + "index = VectorStoreIndex.from_documents(documents)" + ] + }, + { + "cell_type": "markdown", + "id": "3fe85dad-12bb-47d2-a407-9b89b5270d4e", + "metadata": {}, + "source": [ + "### 5) Create a Query Engine to ask question over your data" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "5de3e07d-5fbe-4fe7-8f23-ed0b082f2413", + "metadata": {}, + "outputs": [], + "source": [ + "# Returns a Query engine for this index.\n", + "query_engine = index.as_query_engine(similarity_top_k=10)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "5aa362c9-48ab-4646-bc29-bc2aca92505d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Sweden is a Northern European country, occupying the eastern part of the Scandinavian Peninsula. It shares borders with Norway to the west and north, Finland to the east, and is linked to Denmark in the southwest by the Öresund Bridge. Sweden is the largest country in Northern Europe and the fifth largest in Europe, with a total area of 449,964 km2. The country stretches between latitudes 55° and 70° N, and mostly between longitudes 11° and 25° E.\n", + "\n", + "Sweden's diverse climate is influenced by its varied topography, which includes a long coastline, numerous lakes, vast forested areas, and the Scandes mountain range that separates it from Norway. The capital and largest city is Stockholm.\n", + "\n", + "Sweden has a population of approximately 10.5 million people, with the majority residing in urban areas. The country is known for its extensive coastline, numerous lakes, and vast forested areas, as well as its commitment to social welfare, gender equality, and environmental sustainability.\n", + "\n", + "Historically, Sweden has maintained a policy of neutrality and non-participation in military alliances. However, it has recently moved towards cooperation with NATO.\n", + "\n", + "Sweden is a highly developed country, ranked seventh in the Human Development Index. It is a constitutional monarchy and parliamentary democracy, with legislative power vested in the 349-member unicameral Riksdag. The country is known for its high standard of living, universal health care, and tertiary education for its citizens.\n", + "\n", + "The official language of Sweden is Swedish, a North Germanic language closely related to Danish and Norwegian. English is widely spoken and understood by a majority of Swedes.\n", + "\n", + "Sweden's economy is mixed and largely service-oriented, with a strong emphasis on engineering, telecommunications, automotive, and pharmaceutical industries. The country is home to several multinational corporations, including IKEA, Volvo, Ericsson, and H&M.\n", + "\n", + "In summary, Sweden is a highly developed, forested country located in Northern Europe, known for its extensive coastline, high standard of living, commitment to social welfare, and diverse climate.\n" + ] + } + ], + "source": [ + "response = query_engine.query(\n", + " \"Tell me about Sweden?\"\n", + ")\n", + "print(response)" + ] + }, + { + "cell_type": "markdown", + "id": "c29478b0-0fb1-4678-93cd-b159dc9884a7", + "metadata": {}, + "source": [ + "## RAG Example with LLM, Embedding & Reranking" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "b88a91ed-5905-474e-8d8e-f5d887638a1d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " I don't have information about a \"Nordic Channel\" in the context of your query. However, I can share that the Swedish broadcasting landscape has seen significant developments. Radio broadcasts started in 1925, and in response to pirate radio stations, a second and third network were established in 1954 and 1962, respectively. In 1989, a satellite service known as Kanal 5 began broadcasting, which might be the service you're referring to, although it's not specifically labeled as \"Nordic Channel\" in the information provided.\n" + ] + } + ], + "source": [ + "# Let's test a more complex query using the above LLM Embedding query_engine and see if the reranker can help.\n", + "response = query_engine.query(\n", + " \"What is Nordic Channel?\"\n", + ")\n", + "print(response)" + ] + }, + { + "cell_type": "markdown", + "id": "9d3854c7-68a3-45b4-9e69-2c4e583d651f", + "metadata": {}, + "source": [ + "### Enhancing accuracy for single data sources\n", + "\n", + "This example demonstrates how a re-ranking model can be used to combine retrieval results and improve accuracy during retrieval of documents.\n", + "\n", + "Typically, reranking is a critical piece of high-accuracy, efficient retrieval pipelines. Generally, there are two important use cases:\n", + "\n", + "- Combining results from multiple data sources\n", + "- Enhancing accuracy for single data sources\n", + "\n", + "Here, we focus on demonstrating only the second use case." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "b7e8677e-a37f-42e2-8fea-4c4413f7d682", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " The Nordic Channel was a Swedish-language satellite service that was launched in 1989. It is now known as Kanal 5.\n" + ] + } + ], + "source": [ + "# We will narrow the collection to 40 results and further narrow it to 4 with the reranker.\n", + "from llama_index.postprocessor.nvidia_rerank import NVIDIARerank\n", + "\n", + "reranker_query_engine = index.as_query_engine(\n", + " similarity_top_k=40, node_postprocessors=[NVIDIARerank(top_n=4)]\n", + ")\n", + "\n", + "response = reranker_query_engine.query(\n", + " \"What is Nordic Channel?\"\n", + ")\n", + "print(response)" + ] + }, + { + "cell_type": "markdown", + "id": "aa2c289d-b10f-4bad-bb55-edc779e544f4", + "metadata": {}, + "source": [ + "#### Note:\n", + " - In this notebook, we used NVIDIA NIM microservices from the NVIDIA API Catalog.\n", + " - The above APIs, NVIDIA (llms), NVIDIAEmbedding, and NVIDIARerank, also support self-hosted microservices.\n", + " - Change the `base_url` to your deployed NIM URL\n", + " - Example: NVIDIA(model=\"meta/llama3-8b-instruct\", base_url=\"http://your-nim-host-address:8000/v1\")\n", + " - NIM can be hosted locally using Docker, following the [NVIDIA NIM for LLMs](https://docs.nvidia.com/nim/large-language-models/latest/getting-started.html) documentation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d6ea831a-76a5-431f-9b7f-f5bad5cb567b", + "metadata": {}, + "outputs": [], + "source": [ + "# Example Code snippet if you want to use a self-hosted NIM\n", + "from llama_index.llms.nvidia import NVIDIA\n", + "\n", + "llm = NVIDIA(model=\"meta/llama3-8b-instruct\", base_url=\"http://your-nim-host-address:8000/v1\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python (rag_notebooks)", + "language": "python", + "name": "rag_notebooks" + }, + "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.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/Nemo Evaluator Llama 3.1 Workbook/custom_dataset/inputs.jsonl b/RAG/notebooks/nemo/Nemo Evaluator Llama 3.1 Workbook/custom_dataset/inputs.jsonl similarity index 100% rename from notebooks/Nemo Evaluator Llama 3.1 Workbook/custom_dataset/inputs.jsonl rename to RAG/notebooks/nemo/Nemo Evaluator Llama 3.1 Workbook/custom_dataset/inputs.jsonl diff --git a/notebooks/Nemo Evaluator Llama 3.1 Workbook/custom_dataset/judge_prompts.jsonl b/RAG/notebooks/nemo/Nemo Evaluator Llama 3.1 Workbook/custom_dataset/judge_prompts.jsonl similarity index 100% rename from notebooks/Nemo Evaluator Llama 3.1 Workbook/custom_dataset/judge_prompts.jsonl rename to RAG/notebooks/nemo/Nemo Evaluator Llama 3.1 Workbook/custom_dataset/judge_prompts.jsonl diff --git a/notebooks/Nemo Evaluator Llama 3.1 Workbook/custom_dataset/question.jsonl b/RAG/notebooks/nemo/Nemo Evaluator Llama 3.1 Workbook/custom_dataset/question.jsonl similarity index 100% rename from notebooks/Nemo Evaluator Llama 3.1 Workbook/custom_dataset/question.jsonl rename to RAG/notebooks/nemo/Nemo Evaluator Llama 3.1 Workbook/custom_dataset/question.jsonl diff --git a/notebooks/Nemo Evaluator Llama 3.1 Workbook/custom_dataset/reference_answer/references.jsonl b/RAG/notebooks/nemo/Nemo Evaluator Llama 3.1 Workbook/custom_dataset/reference_answer/references.jsonl similarity index 100% rename from notebooks/Nemo Evaluator Llama 3.1 Workbook/custom_dataset/reference_answer/references.jsonl rename to RAG/notebooks/nemo/Nemo Evaluator Llama 3.1 Workbook/custom_dataset/reference_answer/references.jsonl diff --git a/notebooks/Nemo Evaluator Llama 3.1 Workbook/evaluator_notebook.ipynb b/RAG/notebooks/nemo/Nemo Evaluator Llama 3.1 Workbook/evaluator_notebook.ipynb similarity index 100% rename from notebooks/Nemo Evaluator Llama 3.1 Workbook/evaluator_notebook.ipynb rename to RAG/notebooks/nemo/Nemo Evaluator Llama 3.1 Workbook/evaluator_notebook.ipynb diff --git a/RetrievalAugmentedGeneration/Dockerfile b/RAG/src/chain_server/Dockerfile similarity index 52% rename from RetrievalAugmentedGeneration/Dockerfile rename to RAG/src/chain_server/Dockerfile index cb504a08..5ed2364b 100644 --- a/RetrievalAugmentedGeneration/Dockerfile +++ b/RAG/src/chain_server/Dockerfile @@ -10,8 +10,8 @@ ENV DEBIAN_FRONTEND noninteractive RUN apt update && \ apt install -y curl software-properties-common libgl1 libglib2.0-0 && \ add-apt-repository ppa:deadsnakes/ppa && \ - apt update && apt install -y python3.10 python3.10-dev python3.10-distutils && \ - apt-get clean + apt update && apt install -y python3.10 && \ + apt-get clean # Install pip for python3.10 RUN curl -sS https://bootstrap.pypa.io/get-pip.py | python3.10 @@ -22,34 +22,39 @@ RUN rm -rf /var/lib/apt/lists/* RUN apt autoremove -y curl software-properties-common # Install common dependencies for all examples -RUN --mount=type=bind,source=RetrievalAugmentedGeneration/requirements.txt,target=/opt/requirements.txt \ +RUN --mount=type=bind,source=RAG/src/chain_server/requirements.txt,target=/opt/requirements.txt \ pip3 install --no-cache-dir -r /opt/requirements.txt - + +# Set environment variables needed for Text splitter +RUN mkdir /tmp-data/; mkdir /tmp-data/nltk_data/ +RUN chmod 777 -R /tmp-data +RUN chown 1000:1000 -R /tmp-data +ENV NLTK_DATA=/tmp-data/nltk_data/ +ENV HF_HOME=/tmp-data + +# Install nltk packages to avoid runtime download +RUN python3.10 -m nltk.downloader averaged_perceptron_tagger +RUN python3.10 -m nltk.downloader stopwords +RUN python3.10 -m nltk.downloader punkt +RUN python3.10 -c "from sentence_transformers import SentenceTransformer; model = SentenceTransformer('Snowflake/snowflake-arctic-embed-l'); model.save('/tmp-data')" + # Install any example specific dependency if available -ARG EXAMPLE_NAME -COPY RetrievalAugmentedGeneration/examples/${EXAMPLE_NAME} /opt/RetrievalAugmentedGeneration/example -RUN if [ -f "/opt/RetrievalAugmentedGeneration/example/requirements.txt" ] ; then \ - pip3 install --no-cache-dir -r /opt/RetrievalAugmentedGeneration/example/requirements.txt ; else \ +ARG EXAMPLE_PATH +COPY RAG/examples/${EXAMPLE_PATH} /opt/RAG/examples/${EXAMPLE_PATH} +RUN if [ -f "/opt/RAG/examples/${EXAMPLE_PATH}/requirements.txt" ] ; then \ + pip3 install --no-cache-dir -r /opt/RAG/examples/${EXAMPLE_PATH}/requirements.txt ; else \ echo "Skipping example dependency installation, since requirements.txt was not found" ; \ fi -RUN python3.10 -m nltk.downloader averaged_perceptron_tagger -RUN if [ "${EXAMPLE_NAME}" = "multimodal_rag" ] ; then \ +RUN if [ "${EXAMPLE_PATH}" = "advanced_rag/multimodal_rag" ] ; then \ apt update && \ - apt install -y libreoffice && \ - apt install -y tesseract-ocr ; \ + apt install -y libreoffice tesseract-ocr ; \ fi -# Copy required common modules for all examples -COPY RetrievalAugmentedGeneration/__init__.py /opt/RetrievalAugmentedGeneration/ -COPY RetrievalAugmentedGeneration/common /opt/RetrievalAugmentedGeneration/common -COPY integrations /opt/integrations -COPY tools /opt/tools -RUN mkdir /tmp-data/; mkdir /tmp-data/nltk_data/ -RUN chmod 777 -R /tmp-data -RUN chown 1000:1000 -R /tmp-data -ENV NLTK_DATA=/tmp-data/nltk_data/ -ENV HF_HOME=/tmp-data +# Copy required common modules for all examples +COPY RAG/src/chain_server /opt/RAG/src/chain_server +COPY RAG/src/pandasai /opt/RAG/src/pandasai +COPY RAG/tools /opt/RAG/tools WORKDIR /opt -ENTRYPOINT ["uvicorn", "RetrievalAugmentedGeneration.common.server:app"] +ENTRYPOINT ["uvicorn", "RAG.src.chain_server.server:app"] diff --git a/notebooks/01_dataloader.ipynb b/RAG/src/chain_server/RAG_Chain_Server_API_Client.ipynb similarity index 100% rename from notebooks/01_dataloader.ipynb rename to RAG/src/chain_server/RAG_Chain_Server_API_Client.ipynb diff --git a/tools/observability/__init__.py b/RAG/src/chain_server/__init__.py similarity index 95% rename from tools/observability/__init__.py rename to RAG/src/chain_server/__init__.py index e42268fe..9ba9d431 100644 --- a/tools/observability/__init__.py +++ b/RAG/src/chain_server/__init__.py @@ -11,4 +11,4 @@ # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and -# limitations under the License. \ No newline at end of file +# limitations under the License. diff --git a/RAG/src/chain_server/base.py b/RAG/src/chain_server/base.py new file mode 100644 index 00000000..b091da20 --- /dev/null +++ b/RAG/src/chain_server/base.py @@ -0,0 +1,68 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Base interface that all RAG examples should implement.""" + +from abc import ABC, abstractmethod +from typing import Generator, List + + +class BaseExample(ABC): + """This class defines the basic structure for building RAG chain server examples. + All RAG chain server example classes should inherit from this base class and implement the + abstract methods to define their specific functionality. + """ + + @abstractmethod + def llm_chain(self, query: str, chat_history: List["Message"], **kwargs) -> Generator[str, None, None]: + """Implements the LLM chain logic specific to the example. + It's called when the `/generate` API is invoked with `use_knowledge_base` set to `False`. + + Args: + query (str): Query to be answered by llm. + chat_history (List[Message]): Conversation history between user and chain. + + Returns: + Generator[str, None, None]: A generator that yields strings, representing the tokens of the LLM chain. + """ + + pass + + @abstractmethod + def rag_chain(self, query: str, chat_history: List["Message"], **kwargs) -> Generator[str, None, None]: + """Implements the RAG chain logic specific to the example. + It's called when the `/generate` API is invoked with `use_knowledge_base` set to `True`. + + Args: + query (str): Query to be answered by llm. + chat_history (List[Message]): Conversation history between user and chain. + + Returns: + Generator[str, None, None]: A generator that yields strings, representing the steps or outputs of the RAG chain. + """ + + pass + + @abstractmethod + def ingest_docs(self, data_dir: str, filename: str) -> None: + """Defines how documents are ingested for processing by the RAG chain server example. + It's called when the POST endpoint of`/documents` API is invoked. + + Args: + filepath (str): The path to the document file. + filename (str): The name of the document file. + """ + + pass diff --git a/RetrievalAugmentedGeneration/common/configuration.py b/RAG/src/chain_server/configuration.py similarity index 57% rename from RetrievalAugmentedGeneration/common/configuration.py rename to RAG/src/chain_server/configuration.py index da3a7967..2fead6c5 100644 --- a/RetrievalAugmentedGeneration/common/configuration.py +++ b/RAG/src/chain_server/configuration.py @@ -14,7 +14,7 @@ # limitations under the License. """The definition of the application configuration.""" -from RetrievalAugmentedGeneration.common.configuration_wizard import ConfigWizard, configclass, configfield +from RAG.src.chain_server.configuration_wizard import ConfigWizard, configclass, configfield @configclass @@ -26,24 +26,21 @@ class VectorStoreConfig(ConfigWizard): """ name: str = configfield( - "name", - default="milvus", # supports pgvector, milvus - help_txt="The name of vector store", + "name", default="milvus", help_txt="The name of vector store", # supports pgvector, milvus ) url: str = configfield( "url", - default="http://milvus:19530", # for pgvector `pgvector:5432` + default="http://milvus:19530", # for pgvector `pgvector:5432` help_txt="The host of the machine running Vector Store DB", ) nlist: int = configfield( - "nlist", - default=64, # IVF Flat milvus - help_txt="Number of cluster units", + "nlist", default=64, help_txt="Number of cluster units", # IVF Flat milvus ) nprobe: int = configfield( - "nprobe", - default=16, # IVF Flat milvus - help_txt="Number of units to query", + "nprobe", default=16, help_txt="Number of units to query", # IVF Flat milvus + ) + index_type: str = configfield( + "index_type", default="IVF_FLAT", help_txt="Index of the vector db", # IVF Flat for milvus ) @@ -56,14 +53,10 @@ class LLMConfig(ConfigWizard): """ server_url: str = configfield( - "server_url", - default="", - help_txt="The location of the Triton server hosting the llm model.", + "server_url", default="", help_txt="The location of the Triton server hosting the llm model.", ) model_name: str = configfield( - "model_name", - default="ensemble", - help_txt="The name of the hosted model.", + "model_name", default="ensemble", help_txt="The name of the hosted model.", ) model_engine: str = configfield( "model_engine", @@ -76,6 +69,7 @@ class LLMConfig(ConfigWizard): help_txt="The name of the ai catalog model to be used with PandasAI agent", ) + @configclass class TextSplitterConfig(ConfigWizard): """Configuration class for the Text Splitter. @@ -90,14 +84,10 @@ class TextSplitterConfig(ConfigWizard): help_txt="The name of Sentence Transformer model used for SentenceTransformer TextSplitter.", ) chunk_size: int = configfield( - "chunk_size", - default=510, - help_txt="Chunk size for text splitting.", + "chunk_size", default=510, help_txt="Chunk size for text splitting.", ) chunk_overlap: int = configfield( - "chunk_overlap", - default=200, - help_txt="Overlapping text length for splitting.", + "chunk_overlap", default=200, help_txt="Overlapping text length for splitting.", ) @@ -109,9 +99,7 @@ class EmbeddingConfig(ConfigWizard): """ model_name: str = configfield( - "model_name", - default="snowflake/arctic-embed-l", - help_txt="The name of huggingface embedding model.", + "model_name", default="snowflake/arctic-embed-l", help_txt="The name of huggingface embedding model.", ) model_engine: str = configfield( "model_engine", @@ -124,9 +112,27 @@ class EmbeddingConfig(ConfigWizard): help_txt="The required dimensions of the embedding model. Currently utilized for vector DB indexing.", ) server_url: str = configfield( - "server_url", - default="", - help_txt="The url of the server hosting nemo embedding model", + "server_url", default="", help_txt="The url of the server hosting nemo embedding model", + ) + + +@configclass +class RankingConfig(ConfigWizard): + """Configuration class for the Re-ranking. + + :cvar model_name: The name of the Ranking model. + """ + + model_name: str = configfield( + "model_name", default="nv-rerank-qa-mistral-4b:1", help_txt="The name of Ranking model.", + ) + model_engine: str = configfield( + "model_engine", + default="nvidia-ai-endpoints", + help_txt="The server type of the hosted model. Allowed values are nvidia-ai-endpoints", + ) + server_url: str = configfield( + "server_url", default="", help_txt="The url of the server hosting nemo Ranking model", ) @@ -139,9 +145,7 @@ class RetrieverConfig(ConfigWizard): """ top_k: int = configfield( - "top_k", - default=4, - help_txt="Number of relevant results to retrieve", + "top_k", default=4, help_txt="Number of relevant results to retrieve", ) score_threshold: float = configfield( "score_threshold", @@ -149,9 +153,7 @@ class RetrieverConfig(ConfigWizard): help_txt="The minimum confidence score for the retrieved values to be considered", ) nr_url: str = configfield( - "nr_url", - default='http://retrieval-ms:8000', - help_txt="The nemo retriever microservice url", + "nr_url", default='http://retrieval-ms:8000', help_txt="The nemo retriever microservice url", ) nr_pipeline: str = configfield( "nr_pipeline", @@ -160,50 +162,6 @@ class RetrieverConfig(ConfigWizard): ) -@configclass -class PromptsConfig(ConfigWizard): - """Configuration class for the Prompts. - - :cvar chat_template: Prompt template for chat. - :cvar rag_template: Prompt template for rag. - :cvar multi_turn_rag_template: Prompt template for multi-turn rag. - """ - - chat_template: str = configfield( - "chat_template", - default=( - "You are a helpful, respectful and honest assistant." - "Always answer as helpfully as possible, while being safe." - "Please ensure that your responses are positive in nature." - ), - help_txt="Prompt template for chat.", - ) - rag_template: str = configfield( - "rag_template", - default=( - "[INST] <>" - "Use the following context to answer the user's question. If you don't know the answer," - "just say that you don't know, don't try to make up an answer." - "<>" - "[INST] Context: {context_str} Question: {query_str} Only return the helpful" - " answer below and nothing else. Helpful answer:[/INST]" - ), - help_txt="Prompt template for rag.", - ) - multi_turn_rag_template: str = configfield( - "multi_turn_rag_template", - default=( - "You are a document chatbot. Help the user as they ask questions about documents." - " User message just asked: {input}\n\n" - " For this, we have retrieved the following potentially-useful info: " - " Conversation History Retrieved:\n{history}\n\n" - " Document Retrieved:\n{context}\n\n" - " Answer only from retrieved data. Make your response conversational." - ), - help_txt="Prompt template for rag.", - ) - - @configclass class AppConfig(ConfigWizard): """Configuration class for the application. @@ -233,26 +191,14 @@ class AppConfig(ConfigWizard): default=LLMConfig(), ) text_splitter: TextSplitterConfig = configfield( - "text_splitter", - env=False, - help_txt="The configuration for text splitter.", - default=TextSplitterConfig(), + "text_splitter", env=False, help_txt="The configuration for text splitter.", default=TextSplitterConfig(), ) embeddings: EmbeddingConfig = configfield( - "embeddings", - env=False, - help_txt="The configuration of embedding model.", - default=EmbeddingConfig(), + "embeddings", env=False, help_txt="The configuration of embedding model.", default=EmbeddingConfig(), ) - retriever: RetrieverConfig = configfield( - "retriever", - env=False, - help_txt="The configuration of the retriever pipeline.", - default=RetrieverConfig(), + ranking: RankingConfig = configfield( + "ranking", env=False, help_txt="The configuration of ranking model.", default=RankingConfig(), ) - prompts: PromptsConfig = configfield( - "prompts", - env=False, - help_txt="Prompt templates for chat and rag.", - default=PromptsConfig(), + retriever: RetrieverConfig = configfield( + "retriever", env=False, help_txt="The configuration of the retriever pipeline.", default=RetrieverConfig(), ) diff --git a/RetrievalAugmentedGeneration/frontend/frontend/configuration_wizard.py b/RAG/src/chain_server/configuration_wizard.py similarity index 89% rename from RetrievalAugmentedGeneration/frontend/frontend/configuration_wizard.py rename to RAG/src/chain_server/configuration_wizard.py index d63d9e41..5e53a6b6 100644 --- a/RetrievalAugmentedGeneration/frontend/frontend/configuration_wizard.py +++ b/RAG/src/chain_server/configuration_wizard.py @@ -30,14 +30,7 @@ from typing import Any, Callable, Dict, List, Optional, TextIO, Tuple, Union import yaml -from dataclass_wizard import ( - JSONWizard, - LoadMeta, - YAMLWizard, - errors, - fromdict, - json_field, -) +from dataclass_wizard import JSONWizard, LoadMeta, YAMLWizard, errors, fromdict, json_field from dataclass_wizard.models import JSONField from dataclass_wizard.utils.string_conv import to_camel_case @@ -46,9 +39,7 @@ _LOGGER = logging.getLogger(__name__) -def configfield( - name: str, *, env: bool = True, help_txt: str = "", **kwargs: Any -) -> JSONField: +def configfield(name: str, *, env: bool = True, help_txt: str = "", **kwargs: Any) -> JSONField: """Create a data class field with the specified name in JSON format. :param name: The name of the field. @@ -148,9 +139,7 @@ def print_help( default = "NO-DEFAULT-VALUE" else: default = val.default - help_printer( - f"{_Color.BOLD}{' ' * indent}{jsonname}:{_Color.END} {default}\n" - ) + help_printer(f"{_Color.BOLD}{' ' * indent}{jsonname}:{_Color.END} {default}\n") # print comments if is_embedded_config: @@ -158,9 +147,7 @@ def print_help( if val.metadata.get("help"): help_printer(f"{' ' * indent}# {val.metadata['help']}\n") if not is_embedded_config: - typestr = getattr(val.type, "__name__", None) or str(val.type).replace( - "typing.", "" - ) + typestr = getattr(val.type, "__name__", None) or str(val.type).replace("typing.", "") help_printer(f"{' ' * indent}# Type: {typestr}\n") if val.metadata.get("env", True): help_printer(f"{' ' * indent}# ENV Variable: {full_envname}\n") @@ -170,17 +157,13 @@ def print_help( if is_embedded_config: new_env_parent = f"{env_parent}_{envname}" new_json_parent = json_parent + (jsonname,) - val.type.print_help( - help_printer, env_parent=new_env_parent, json_parent=new_json_parent - ) + val.type.print_help(help_printer, env_parent=new_env_parent, json_parent=new_json_parent) help_printer("\n") @classmethod def envvars( - cls, - env_parent: Optional[str] = None, - json_parent: Optional[Tuple[str, ...]] = None, + cls, env_parent: Optional[str] = None, json_parent: Optional[Tuple[str, ...]] = None, ) -> List[Tuple[str, Tuple[str, ...], type]]: """Calculate valid environment variables and their config structure location. @@ -213,9 +196,7 @@ def envvars( if is_embedded_config: new_env_parent = f"{env_parent}_{envname}" new_json_parent = json_parent + (jsonname,) - output += val.type.envvars( - env_parent=new_env_parent, json_parent=new_json_parent - ) + output += val.type.envvars(env_parent=new_env_parent, json_parent=new_json_parent) elif val.metadata.get("env", True): output += [(full_envname, json_parent + (jsonname,), val.type)] @@ -246,10 +227,7 @@ def from_dict(cls, data: Dict[str, Any]) -> "ConfigWizard": var_value = try_json_load(var_value) update_dict(data, conf_path, var_value) _LOGGER.debug( - "Found EnvVar Config - %s:%s = %s", - var_name, - str(var_type), - repr(var_value), + "Found EnvVar Config - %s:%s = %s", var_name, str(var_type), repr(var_value), ) LoadMeta(key_transform="CAMEL").bind_to(cls) @@ -272,9 +250,7 @@ def from_file(cls, filepath: str) -> Optional["ConfigWizard"]: _LOGGER.error("The configuration file cannot be found.") file = None except PermissionError: - _LOGGER.error( - "Permission denied when trying to read the configuration file." - ) + _LOGGER.error("Permission denied when trying to read the configuration file.") file = None if not file: return None @@ -284,8 +260,7 @@ def from_file(cls, filepath: str) -> Optional["ConfigWizard"]: data = read_json_or_yaml(file) except ValueError as err: _LOGGER.error( - "Configuration file must be valid JSON or YAML. The following errors occured:\n%s", - str(err), + "Configuration file must be valid JSON or YAML. The following errors occured:\n%s", str(err), ) data = None config = None @@ -297,9 +272,7 @@ def from_file(cls, filepath: str) -> Optional["ConfigWizard"]: try: config = cls.from_dict(data) except errors.MissingFields as err: - _LOGGER.error( - "Configuration is missing required fields: \n%s", str(err) - ) + _LOGGER.error("Configuration is missing required fields: \n%s", str(err)) config = None except errors.ParseError as err: _LOGGER.error("Invalid configuration value provided:\n%s", str(err)) @@ -352,9 +325,7 @@ def read_json_or_yaml(stream: TextIO) -> Dict[str, Any]: return data # neither json nor yaml - err_msg = "\n\n".join( - [key + " Parser Errors:\n" + str(val) for key, val in exceptions.items()] - ) + err_msg = "\n\n".join([key + " Parser Errors:\n" + str(val) for key, val in exceptions.items()]) raise ValueError(err_msg) @@ -372,12 +343,7 @@ def try_json_load(value: str) -> Any: return value -def update_dict( - data: Dict[str, Any], - path: Tuple[str, ...], - value: Any, - overwrite: bool = False, -) -> None: +def update_dict(data: Dict[str, Any], path: Tuple[str, ...], value: Any, overwrite: bool = False,) -> None: """Update a dictionary with a new value at a given path. :param data: The dictionary to be updated. diff --git a/RAG/src/chain_server/requirements.txt b/RAG/src/chain_server/requirements.txt new file mode 100644 index 00000000..217b864a --- /dev/null +++ b/RAG/src/chain_server/requirements.txt @@ -0,0 +1,31 @@ +fastapi==0.110.0 +uvicorn[standard]==0.27.1 +python-multipart==0.0.9 +langchain==0.1.9 +unstructured[all-docs]==0.12.5 +sentence-transformers==3.0.0 +llama-index-core==0.10.27 +llama-index-readers-file==0.1.22 +llama-index-llms-langchain==0.1.3 +llama-index-embeddings-langchain==0.1.2 +llama-index-vector-stores-milvus==0.1.6 +llama-index-vector-stores-postgres==0.1.5 +pymilvus==2.4.0 +dataclass-wizard==0.22.3 +opencv-python==4.8.0.74 +minio==7.2.5 +asyncpg==0.29.0 +psycopg2-binary==2.9.9 +pgvector==0.2.5 +langchain-core==0.1.29 +langchain-nvidia-ai-endpoints==0.1.6 +opentelemetry-sdk==1.23.0 +opentelemetry-api==1.23.0 +opentelemetry-exporter-otlp-proto-grpc==1.23.0 +faiss-cpu==1.7.4 +httpcore==1.0.2 +httpx==0.26.0 +bleach==6.1.0 +flatdict==4.0.1 +chardet==5.2.0 +nltk==3.8.1 diff --git a/RAG/src/chain_server/server.py b/RAG/src/chain_server/server.py new file mode 100644 index 00000000..e93bd69a --- /dev/null +++ b/RAG/src/chain_server/server.py @@ -0,0 +1,491 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""The definition of the Llama Index chain server.""" +import importlib +import json +import logging +import os +import shutil +from inspect import getmembers, isclass +from pathlib import Path +from typing import Any, Dict, List +from uuid import uuid4 + +import bleach +from fastapi import FastAPI, File, Request, UploadFile +from fastapi.encoders import jsonable_encoder +from fastapi.exception_handlers import request_validation_exception_handler +from fastapi.exceptions import RequestValidationError +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import JSONResponse, StreamingResponse +from pydantic import BaseModel, Field, constr, validator +from pymilvus.exceptions import MilvusException, MilvusUnavailableException +from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY + +from RAG.src.chain_server.tracing import llamaindex_instrumentation_wrapper + +logging.basicConfig(level=os.environ.get('LOGLEVEL', 'INFO').upper()) +logger = logging.getLogger(__name__) + +# create the FastAPI server +app = FastAPI() + +# Allow access in browser from RAG UI and Storybook (development) +origins = ["*"] +app.add_middleware( + CORSMiddleware, allow_origins=origins, allow_credentials=False, allow_methods=["*"], allow_headers=["*"], +) + +EXAMPLE_DIR = "RAG/examples/" + + +class Message(BaseModel): + """Definition of the Chat Message type.""" + + role: str = Field( + description="Role for a message AI, User and System", default="user", max_length=256, pattern=r'[\s\S]*' + ) + content: str = Field( + description="The input query/prompt to the pipeline.", + default="I am going to Paris, what should I see?", + max_length=131072, + pattern=r'[\s\S]*', + ) + + @validator('role') + def validate_role(cls, value): + """ Field validator function to validate values of the field role""" + value = bleach.clean(value, strip=True) + valid_roles = {'user', 'assistant', 'system'} + if value.lower() not in valid_roles: + raise ValueError("Role must be one of 'user', 'assistant', or 'system'") + return value.lower() + + @validator('content') + def sanitize_content(cls, v): + """ Feild validator function to santize user populated feilds from HTML""" + return bleach.clean(v, strip=True) + + +class Prompt(BaseModel): + """Definition of the Prompt API data type.""" + + messages: List[Message] = Field( + ..., + description="A list of messages comprising the conversation so far. The roles of the messages must be alternating between user and assistant. The last input message should have role user. A message with the the system role is optional, and must be the very first message if it is present.", + max_items=50000, + ) + use_knowledge_base: bool = Field(..., description="Whether to use a knowledge base") + temperature: float = Field( + 0.2, + description="The sampling temperature to use for text generation. The higher the temperature value is, the less deterministic the output text will be. It is not recommended to modify both temperature and top_p in the same call.", + ge=0.1, + le=1.0, + ) + top_p: float = Field( + 0.7, + description="The top-p sampling mass used for text generation. The top-p value determines the probability mass that is sampled at sampling time. For example, if top_p = 0.2, only the most likely tokens (summing to 0.2 cumulative probability) will be sampled. It is not recommended to modify both temperature and top_p in the same call.", + ge=0.1, + le=1.0, + ) + max_tokens: int = Field( + 1024, + description="The maximum number of tokens to generate in any given call. Note that the model is not aware of this value, and generation will simply stop at the number of tokens specified.", + ge=0, + le=1024, + format="int64", + ) + # seed: int = Field(42, description="If specified, our system will make a best effort to sample deterministically, such that repeated requests with the same seed and parameters should return the same result.") + # bad: List[str] = Field(None, description="A word or list of words not to use. The words are case sensitive.") + stop: List[constr(max_length=256, pattern=r'[\s\S]*')] = Field( + description="A string or a list of strings where the API will stop generating further tokens. The returned text will not contain the stop sequence.", + max_items=256, + default=[], + ) + # stream: bool = Field(True, description="If set, partial message deltas will be sent. Tokens will be sent as data-only server-sent events (SSE) as they become available (JSON responses are prefixed by data:), with the stream terminated by a data: [DONE] message.") + + @validator('use_knowledge_base') + def sanitize_use_kb(cls, v): + """ Feild validator function to santize user populated feilds from HTML""" + v = bleach.clean(str(v), strip=True) + try: + return {"True": True, "False": False}[v] + except KeyError: + raise ValueError("use_knowledge_base must be a boolean value") + + @validator('temperature') + def sanitize_temperature(cls, v): + """ Feild validator function to santize user populated feilds from HTML""" + return float(bleach.clean(str(v), strip=True)) + + @validator('top_p') + def sanitize_top_p(cls, v): + """ Feild validator function to santize user populated feilds from HTML""" + return float(bleach.clean(str(v), strip=True)) + + +class ChainResponseChoices(BaseModel): + """ Definition of Chain response choices""" + + index: int = Field(default=0, ge=0, le=256, format="int64") + message: Message = Field(default=Message(role="assistant", content="")) + finish_reason: str = Field(default="", max_length=4096, pattern=r'[\s\S]*') + + +class ChainResponse(BaseModel): + """Definition of Chain APIs resopnse data type""" + + id: str = Field(default="", max_length=100000, pattern=r'[\s\S]*') + choices: List[ChainResponseChoices] = Field(default=[], max_items=256) + + +class DocumentSearch(BaseModel): + """Definition of the DocumentSearch API data type.""" + + query: str = Field( + description="The content or keywords to search for within documents.", + max_length=131072, + pattern=r'[\s\S]*', + default="", + ) + top_k: int = Field( + description="The maximum number of documents to return in the response.", + default=4, + ge=0, + le=25, + format="int64", + ) + + +class DocumentChunk(BaseModel): + """Represents a chunk of a document.""" + + content: str = Field( + description="The content of the document chunk.", max_length=131072, pattern=r'[\s\S]*', default="" + ) + filename: str = Field( + description="The name of the file the chunk belongs to.", max_length=4096, pattern=r'[\s\S]*', default="" + ) + score: float = Field(..., description="The relevance score of the chunk.") + + +class DocumentSearchResponse(BaseModel): + """Represents a response from a document search.""" + + chunks: List[DocumentChunk] = Field(..., description="List of document chunks.", max_items=256) + + +class DocumentsResponse(BaseModel): + """Represents the response containing a list of documents.""" + + documents: List[constr(max_length=131072, pattern=r'[\s\S]*')] = Field( + description="List of filenames.", max_items=1000000, default=[] + ) + + +class HealthResponse(BaseModel): + message: str = Field(max_length=4096, pattern=r'[\s\S]*', default="") + + +@app.on_event("startup") +def import_example() -> None: + """ + Import the example class from the specified example file. + The example directory is expected to have a python file where the example class is defined. + """ + + # path of the example directory, to check for chain implementation + file_location = os.path.join(EXAMPLE_DIR, os.environ.get("EXAMPLE_PATH", "basic_rag/llamaindex")) + + # Walk through the directory to find the RAG chains and store it's class + for root, dirs, files in os.walk(file_location): + for file in files: + if not file.endswith(".py"): + continue + + # Import the specified file dynamically + spec = importlib.util.spec_from_file_location(name="example", location=os.path.join(root, file)) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + + # Scan each class in the file to find one with the 3 implemented methods: ingest_docs, rag_chain and llm_chain + for name, _ in getmembers(module, isclass): + try: + cls = getattr(module, name) + if set(["ingest_docs", "llm_chain", "rag_chain"]).issubset(set(dir(cls))): + if name == "BaseExample": + continue + # Try creating example class instance, store it in app.example if successful + example = cls() + app.example = cls + return + except: + raise ValueError(f"Class {name} is not implemented and could not be instantiated.") + + raise NotImplementedError(f"Could not find a valid example class in {EXAMPLE_DIR}") + + +@app.exception_handler(RequestValidationError) +async def request_validation_exception_handler(request: Request, exc: RequestValidationError) -> JSONResponse: + return JSONResponse( + status_code=HTTP_422_UNPROCESSABLE_ENTITY, + content={"detail": jsonable_encoder(exc.errors(), exclude={"input"})}, + ) + + +@app.get( + "/health", + response_model=HealthResponse, + responses={ + 500: { + "description": "Internal Server Error", + "content": {"application/json": {"example": {"detail": "Internal server error occurred"}}}, + } + }, +) +def health_check(): + """ + Perform a Health Check + + Returns 200 when service is up. This does not check the health of downstream services. + """ + + response_message = "Service is up." + return HealthResponse(message=response_message) + + +@app.post( + "/documents", + responses={ + 500: { + "description": "Internal Server Error", + "content": {"application/json": {"example": {"detail": "Internal server error occurred"}}}, + } + }, +) +@llamaindex_instrumentation_wrapper +async def upload_document(request: Request, file: UploadFile = File(...)) -> JSONResponse: + """Upload a document to the vector store.""" + + if not file.filename: + return JSONResponse(content={"message": "No files provided"}, status_code=200) + + try: + upload_folder = "/tmp-data/uploaded_files" + upload_file = os.path.basename(file.filename) + if not upload_file: + raise RuntimeError("Error parsing uploaded filename.") + file_path = os.path.join(upload_folder, upload_file) + uploads_dir = Path(upload_folder) + uploads_dir.mkdir(parents=True, exist_ok=True) + + # Copy uploaded file to upload_dir directory and pass that file path to chain server + with open(file_path, "wb") as f: + shutil.copyfileobj(file.file, f) + + app.example().ingest_docs(file_path, upload_file) + + return JSONResponse(content={"message": "File uploaded successfully"}, status_code=200) + + except Exception as e: + logger.error( + "Error from POST /documents endpoint. Ingestion of file: " + + file.filename + + " failed with error: " + + str(e) + ) + return JSONResponse(content={"message": str(e)}, status_code=500) + + +@app.post( + "/generate", + response_model=ChainResponse, + responses={ + 500: { + "description": "Internal Server Error", + "content": {"application/json": {"example": {"detail": "Internal server error occurred"}}}, + } + }, +) +@llamaindex_instrumentation_wrapper +async def generate_answer(request: Request, prompt: Prompt) -> StreamingResponse: + """Generate and stream the response to the provided prompt.""" + + chat_history = prompt.messages + # The last user message will be the query for the rag or llm chain + last_user_message = next((message.content for message in reversed(chat_history) if message.role == 'user'), None) + + # Find and remove the last user message if present + for i in reversed(range(len(chat_history))): + if chat_history[i].role == 'user': + del chat_history[i] + break # Remove only the last user message + + # All the other information from the prompt like the temperature, top_p etc., are llm_settings + llm_settings = {key: value for key, value in vars(prompt).items() if key not in ['messages', 'use_knowledge_base']} + try: + example = app.example() + generator = None + # call rag_chain if use_knowledge_base is enabled + if prompt.use_knowledge_base: + logger.info("Knowledge base is enabled. Using rag chain for response generation.") + generator = example.rag_chain(query=last_user_message, chat_history=chat_history, **llm_settings) + + else: + generator = example.llm_chain(query=last_user_message, chat_history=chat_history, **llm_settings) + + def response_generator(): + """Convert generator streaming response into `data: ChainResponse` format for chunk + """ + # unique response id for every query + resp_id = str(uuid4()) + if generator: + logger.debug(f"Generated response chunks\n") + # Create ChainResponse object for every token generated + for chunk in generator: + chain_response = ChainResponse() + response_choice = ChainResponseChoices(index=0, message=Message(role="assistant", content=chunk)) + chain_response.id = resp_id + chain_response.choices.append(response_choice) + logger.debug(response_choice) + # Send generator with tokens in ChainResponse format + yield "data: " + str(chain_response.json()) + "\n\n" + chain_response = ChainResponse() + + # [DONE] indicate end of response from server + response_choice = ChainResponseChoices(finish_reason="[DONE]") + chain_response.id = resp_id + chain_response.choices.append(response_choice) + logger.debug(response_choice) + yield "data: " + str(chain_response.json()) + "\n\n" + else: + chain_response = ChainResponse() + yield "data: " + str(chain_response.json()) + "\n\n" + + return StreamingResponse(response_generator(), media_type="text/event-stream") + + except (MilvusException, MilvusUnavailableException) as e: + exception_msg = "Error from milvus server. Please ensure you have ingested some documents. Please check chain-server logs for more details." + chain_response = ChainResponse() + response_choice = ChainResponseChoices( + index=0, message=Message(role="assistant", content=exception_msg), finish_reason="[DONE]" + ) + chain_response.choices.append(response_choice) + logger.error( + f"Error from Milvus database in /generate endpoint. Please ensure you have ingested some documents. Error details: {e}" + ) + return StreamingResponse( + iter(["data: " + str(chain_response.json()) + "\n\n"]), media_type="text/event-stream", status_code=500 + ) + + except Exception as e: + exception_msg = "Error from chain server. Please check chain-server logs for more details." + chain_response = ChainResponse() + response_choice = ChainResponseChoices( + index=0, message=Message(role="assistant", content=exception_msg), finish_reason="[DONE]" + ) + chain_response.choices.append(response_choice) + logger.error(f"Error from /generate endpoint. Error details: {e}") + return StreamingResponse( + iter(["data: " + str(chain_response.json()) + "\n\n"]), media_type="text/event-stream", status_code=500 + ) + + +@app.post( + "/search", + response_model=DocumentSearchResponse, + responses={ + 500: { + "description": "Internal Server Error", + "content": {"application/json": {"example": {"detail": "Internal server error occurred"}}}, + } + }, +) +@llamaindex_instrumentation_wrapper +async def document_search(request: Request, data: DocumentSearch) -> Dict[str, List[Dict[str, Any]]]: + """Search for the most relevant documents for the given search parameters.""" + + try: + example = app.example() + if hasattr(example, "document_search") and callable(example.document_search): + search_result = example.document_search(data.query, data.top_k) + chunks = [] + # Format top_k result in response format + for entry in search_result: + content = entry.get("content", "") # Default to empty string if "content" key doesn't exist + source = entry.get("source", "") # Default to empty string if "source" key doesn't exist + score = entry.get("score", 0.0) # Default to 0.0 if "score" key doesn't exist + chunk = DocumentChunk(content=content, filename=source, document_id="", score=score) + chunks.append(chunk) + return DocumentSearchResponse(chunks=chunks) + raise NotImplementedError("Example class has not implemented the document_search method.") + + except Exception as e: + logger.error(f"Error from POST /search endpoint. Error details: {e}") + return JSONResponse(content={"message": "Error occurred while searching documents."}, status_code=500) + + +@app.get( + "/documents", + response_model=DocumentsResponse, + responses={ + 500: { + "description": "Internal Server Error", + "content": {"application/json": {"example": {"detail": "Internal server error occurred"}}}, + } + }, +) +@llamaindex_instrumentation_wrapper +async def get_documents(request: Request) -> DocumentsResponse: + """Get list of document ingested in vectorstore.""" + try: + example = app.example() + if hasattr(example, "get_documents") and callable(example.get_documents): + documents = example.get_documents() + return DocumentsResponse(documents=documents) + else: + raise NotImplementedError("Example class has not implemented the get_documents method.") + + except Exception as e: + logger.error(f"Error from GET /documents endpoint. Error details: {e}") + return JSONResponse(content={"message": "Error occurred while fetching documents."}, status_code=500) + + +@app.delete( + "/documents", + responses={ + 500: { + "description": "Internal Server Error", + "content": {"application/json": {"example": {"detail": "Internal server error occurred"}}}, + } + }, +) +@llamaindex_instrumentation_wrapper +async def delete_document(request: Request, filename: str) -> JSONResponse: + """Delete a document from vectorstore.""" + try: + example = app.example() + if hasattr(example, "delete_documents") and callable(example.delete_documents): + status = example.delete_documents([filename]) + if not status: + raise Exception(f"Error in deleting document {filename}") + return JSONResponse(content={"message": f"Document {filename} deleted successfully"}, status_code=200) + + raise NotImplementedError("Example class has not implemented the delete_document method.") + + except Exception as e: + logger.error(f"Error from DELETE /documents endpoint. Error details: {e}") + return JSONResponse(content={"message": f"Error deleting document {filename}"}, status_code=500) diff --git a/RetrievalAugmentedGeneration/common/tracing.py b/RAG/src/chain_server/tracing.py similarity index 74% rename from RetrievalAugmentedGeneration/common/tracing.py rename to RAG/src/chain_server/tracing.py index 4e24337d..5a1607b3 100644 --- a/RetrievalAugmentedGeneration/common/tracing.py +++ b/RAG/src/chain_server/tracing.py @@ -16,20 +16,21 @@ """Module for configuring objects used to create OpenTelemetry traces.""" import os -import llama_index +from functools import wraps + from langchain.callbacks.base import BaseCallbackHandler as langchain_base_cb_handler from llama_index.core.callbacks.simple_llm_handler import SimpleLLMHandler as llama_index_base_cb_handler -from opentelemetry import trace, context +from opentelemetry import context, trace +from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter +from opentelemetry.propagate import get_global_textmap, set_global_textmap +from opentelemetry.propagators.composite import CompositePropagator from opentelemetry.sdk.resources import SERVICE_NAME, Resource from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import SimpleSpanProcessor -from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator -from opentelemetry.propagate import set_global_textmap, get_global_textmap -from opentelemetry.propagators.composite import CompositePropagator -from tools.observability.langchain import opentelemetry_callback as langchain_otel_cb -from tools.observability.llamaindex import opentelemetry_callback as llama_index_otel_cb -from functools import wraps + +from RAG.tools.observability.langchain import opentelemetry_callback as langchain_otel_cb +from RAG.tools.observability.llamaindex import opentelemetry_callback as llama_index_otel_cb # Configure tracer used by the Chain Server to create spans resource = Resource.create({SERVICE_NAME: "chain-server"}) @@ -40,22 +41,21 @@ trace.set_tracer_provider(provider) tracer = trace.get_tracer("chain-server") - if os.environ.get("ENABLE_TRACING") == "true": # Configure Propagator used for processing trace context received by the Chain Server propagator = TraceContextTextMapPropagator() - # Configure Langchain OpenTelemetry callback handler + # Configure Langchain OpenTelemetry callback handler langchain_cb_handler = langchain_otel_cb.OpenTelemetryCallbackHandler(tracer) - + # Configure LlamaIndex OpenTelemetry callback handler - llama_index_cb_handler = llama_index_otel_cb.OpenTelemetryCallbackHandler(tracer) - + llama_index_cb_handler = llama_index_otel_cb.OpenTelemetryCallbackHandler(tracer) + else: - propagator = CompositePropagator([]) # No-op propagator - langchain_cb_handler = langchain_base_cb_handler() + propagator = CompositePropagator([]) # No-op propagator + langchain_cb_handler = langchain_base_cb_handler() llama_index_cb_handler = llama_index_base_cb_handler() - + set_global_textmap(propagator) # Wrapper Function to perform LlamaIndex instrumentation @@ -72,18 +72,43 @@ async def wrapper(*args, **kwargs): return wrapper + # Wrapper Function to perform Langchain instrumentation def langchain_instrumentation_method_wrapper(func): @wraps(func) def wrapper(*args, **kwargs): result = func(langchain_cb_handler, *args, **kwargs) return result + return wrapper + # Wrapper Class to perform Langchain instrumentation def langchain_instrumentation_class_wrapper(func): class WrapperClass(func): def __init__(self, *args, **kwargs): self.cb_handler = langchain_cb_handler super().__init__(*args, **kwargs) - return WrapperClass \ No newline at end of file + + return WrapperClass + + +def inject_context(ctx): + carrier = {} + get_global_textmap().inject(carrier, context=ctx) + return carrier + + +# Wrapper Function to perform instrumentation +def instrumentation_wrapper(func): + def wrapper(self, *args, **kwargs): + span_name = func.__name__ + span = tracer.start_span(span_name) + span_ctx = trace.set_span_in_context(span) + carrier = inject_context(span_ctx) + [span.set_attribute(f"{kw}", kwargs[kw]) for kw in kwargs] + result = func(self, carrier, *args, **kwargs) + span.end() + return result + + return wrapper diff --git a/RAG/src/chain_server/utils.py b/RAG/src/chain_server/utils.py new file mode 100644 index 00000000..caa8169b --- /dev/null +++ b/RAG/src/chain_server/utils.py @@ -0,0 +1,711 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Utility functions for the LLM Chains.""" +import logging +import os +from functools import lru_cache, wraps +from pathlib import Path +from shlex import quote +from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional +from urllib.parse import urlparse + +import yaml + +logger = logging.getLogger(__name__) + +try: + import torch +except Exception as e: + logger.error(f"torch import failed with error: {e}") + +try: + import psycopg2 +except Exception as e: + logger.error(f"psycogp2 import failed with error: {e}") + +try: + from sqlalchemy.engine.url import make_url +except Exception as e: + logger.error(f"SQLalchemy import failed with error: {e}") + +try: + from llama_index.core.indices import VectorStoreIndex + from llama_index.core.postprocessor.types import BaseNodePostprocessor + from llama_index.core.schema import MetadataMode + from llama_index.core.service_context import ServiceContext, set_global_service_context + from llama_index.core.utils import get_tokenizer, globals_helper + from llama_index.embeddings.langchain import LangchainEmbedding + from llama_index.llms.langchain import LangChainLLM + from llama_index.vector_stores.milvus import MilvusVectorStore + from llama_index.vector_stores.postgres import PGVectorStore + + if TYPE_CHECKING: + from llama_index.core.indices.base_retriever import BaseRetriever + from llama_index.core.indices.query.schema import QueryBundle + from llama_index.core.schema import NodeWithScore + from llama_index.core.callbacks import CallbackManager + + from RAG.src.chain_server.tracing import llama_index_cb_handler +except Exception as e: + logger.error(f"Llamaindex import failed with error: {e}") + +try: + from langchain.text_splitter import SentenceTransformersTokenTextSplitter + from langchain_community.embeddings import HuggingFaceEmbeddings + from langchain_community.vectorstores import FAISS +except Exception as e: + logger.error(f"Langchain import failed with error: {e}") + +try: + from langchain_core.vectorstores import VectorStore +except Exception as e: + logger.error(f"Langchain core import failed with error: {e}") + +try: + from langchain_nvidia_ai_endpoints import ChatNVIDIA, NVIDIAEmbeddings, NVIDIARerank +except Exception as e: + logger.error(f"Langchain nvidia ai endpoints import failed with error: {e}") + +try: + from langchain_community.docstore.in_memory import InMemoryDocstore + from langchain_community.vectorstores import Milvus, PGVector +except Exception as e: + logger.error(f"Langchain community import failed with error: {e}") + +try: + from faiss import IndexFlatL2 +except Exception as e: + logger.error(f"faiss import failed with error: {e}") + +from langchain.llms.base import LLM +from langchain_core.documents.compressor import BaseDocumentCompressor +from langchain_core.embeddings import Embeddings +from langchain_core.language_models.chat_models import SimpleChatModel + +from RAG.src.chain_server import configuration + +if TYPE_CHECKING: + from RAG.src.chain_server.configuration_wizard import ConfigWizard + +DEFAULT_MAX_CONTEXT = 1500 + + +class LimitRetrievedNodesLength(BaseNodePostprocessor): + """Llama Index chain filter to limit token lengths.""" + + def _postprocess_nodes( + self, nodes: List["NodeWithScore"] = [], query_bundle: Optional["QueryBundle"] = None + ) -> List["NodeWithScore"]: + """Postprocess llamaindex nodes after nodes retrieval. + Token excedding the limit will be ignored + + Args: + nodes List["NodeWithScore"]: A list of nodes with scores to be processed. + query_bundle Optional["QueryBundle"]: This dataclass contains the original query string and associated transformations. + + Returns: + List["NodeWithScore"]: A filtered lists of nodes + """ + included_nodes = [] + current_length = 0 + limit = DEFAULT_MAX_CONTEXT + tokenizer = get_tokenizer() + + # Ignore tokens with index more than limit, default to DEFAULT_MAX_CONTEXT + for node in nodes: + current_length += len(tokenizer(node.get_content(metadata_mode=MetadataMode.LLM))) + if current_length > limit: + break + included_nodes.append(node) + + return included_nodes + + +def utils_cache(func: Callable) -> Callable: + """Decorator to convert unhashable args to hashable ones + + Args: + func (Callable): The function to be decorated and args, kwargs needs to be hashable. + + Returns: + Callable: A wrapped function that has hashable argument and kwargs. + """ + + @wraps(func) + def wrapper(*args, **kwargs): + # Convert unhashable args to hashable ones + args_hashable = tuple(tuple(arg) if isinstance(arg, (list, dict, set)) else arg for arg in args) + kwargs_hashable = { + key: tuple(value) if isinstance(value, (list, dict, set)) else value for key, value in kwargs.items() + } + return func(*args_hashable, **kwargs_hashable) + + return wrapper + + +@utils_cache +@lru_cache +def set_service_context(**kwargs) -> None: + """Set the global service context.""" + llm = LangChainLLM(get_llm(**kwargs)) + embedding = LangchainEmbedding(get_embedding_model()) + # set service context for llama index based example GenerativeAIExamples/RAG/examples/basic_rag/llamaindex/ + # update llm and embedding model details + service_context = ServiceContext.from_defaults( + llm=llm, embed_model=embedding, callback_manager=CallbackManager([llama_index_cb_handler]) + ) + set_global_service_context(service_context) + + +@lru_cache +def get_config() -> "ConfigWizard": + """Parse the application configuration. + + Returns: + ConfigWizard: Updated RAG from configuration.py in dataclass object. + """ + config_file = os.environ.get("APP_CONFIG_FILE", "/dev/null") + # Default configuration is imported from GenerativeAIExamples/RAG/src/chain_server/configuration.py + # config can be modified using environment variable + config = configuration.AppConfig.from_file(config_file) + if config: + return config + raise RuntimeError("Unable to find configuration.") + + +@lru_cache +def get_prompts() -> Dict: + """Retrieves prompt configurations from YAML file and return a dict. + + Returns: + Dict: A dictionary containing the merged prompt configurations. + """ + + # default config taking from prompt.yaml + default_config_path = os.path.join( + "RAG/examples/", os.environ.get("EXAMPLE_PATH", "basic_rag/llamaindex"), "prompt.yaml" + ) + default_config = {} + if Path(default_config_path).exists(): + with open(default_config_path, 'r') as file: + default_config = yaml.safe_load(file) + + # Load prompt.yaml mounted by user + config_file = os.environ.get("PROMPT_CONFIG_FILE", "/prompt.yaml") + + config = {} + if Path(config_file).exists(): + with open(config_file, 'r') as file: + config = yaml.safe_load(file) + + # merge default prompts with user provided prompt, prioritize user prompt + config = _combine_dicts(default_config, config) + return config + + +@lru_cache +def get_vector_index(collection_name: str = "") -> "VectorStoreIndex": + """Create the vector db index for llamaindex based example. + + Args: + collection_name (str): The name of the collection within the vector store. Defaults to vector_db if not set. + + Returns: + VectorStoreIndex: A VectorStoreIndex object from llama_index. + """ + config = get_config() + vector_store = None + store_nodes_override = True + + logger.info(f"Using {config.vector_store.name} as vector store") + + # vectorstore name can be updated using environment variable APP_VECTORSTORE_NAME + if config.vector_store.name == "pgvector": + db_name = quote(os.getenv('POSTGRES_DB', None)) + if not collection_name: + collection_name = os.getenv('COLLECTION_NAME', "vector_db") + # vectorstore url can be updated using environment variable APP_VECTORSTORE_URL, it should be in ip:port format + connection_string = f"postgresql://{os.getenv('POSTGRES_USER', '')}:{os.getenv('POSTGRES_PASSWORD', '')}@{config.vector_store.url}/{db_name}" + logger.info(f"Using PGVector collection: {collection_name}") + + conn = psycopg2.connect(connection_string) + conn.autocommit = True + + with conn.cursor() as c: + # Check for database existence first + c.execute(f"SELECT 1 FROM pg_database WHERE datname = '{db_name}'") + if not c.fetchone(): # Database doesn't exist + c.execute(f"CREATE DATABASE {db_name}") + + url = make_url(connection_string) + + vector_store = PGVectorStore.from_params( + database=db_name, + host=url.host, + password=url.password, + port=url.port, + user=url.username, + table_name=collection_name, + embed_dim=config.embeddings.dimensions, + ) + store_nodes_override = True + elif config.vector_store.name == "milvus": + if not collection_name: + collection_name = os.getenv('COLLECTION_NAME', "vector_db") + logger.info(f"Using milvus collection: {collection_name}") + # vectorstore url can be updated using environment variable APP_VECTORSTORE_URL, it should be in http://ip:port format + vector_store = MilvusVectorStore( + uri=config.vector_store.url, + dim=config.embeddings.dimensions, + collection_name=collection_name, + # Set milvus index type + index_config={"index_type": config.vector_store.index_type, "nlist": config.vector_store.nlist}, + search_config={"nprobe": config.vector_store.nprobe}, + overwrite=False, + ) + store_nodes_override = False + else: + raise RuntimeError("Unable to find any supported Vector Store DB. Supported engines are milvus and pgvector.") + vector_store_index = VectorStoreIndex.from_vector_store( + vector_store=vector_store, store_nodes_override=store_nodes_override + ) + return vector_store_index + + +def create_vectorstore_langchain(document_embedder: "Embeddings", collection_name: str = "") -> VectorStore: + """Create the vectorstore object for langchain based example. + + Args: + document_embedder (Embeddings): Embedding model object to generate embedding of document. + collection_name (str): The name of the collection within the vector store. Defaults to vector_db if not set. + + Returns: + VectorStore: A VectorStore object of given vectorstore from langchain. + """ + + config = get_config() + + if not collection_name: + collection_name = os.getenv('COLLECTION_NAME', "vector_db") + + # vectorstore name can be updated using environment variable APP_VECTORSTORE_NAME + if config.vector_store.name == "faiss": + vectorstore = FAISS(document_embedder, IndexFlatL2(config.embeddings.dimensions), InMemoryDocstore(), {}) + elif config.vector_store.name == "pgvector": + db_name = os.getenv('POSTGRES_DB', None) + logger.info(f"Using PGVector collection: {collection_name}") + # vectorstore url can be updated using environment variable APP_VECTORSTORE_URL, it should be in ip:port format + connection_string = f"postgresql://{os.getenv('POSTGRES_USER', '')}:{os.getenv('POSTGRES_PASSWORD', '')}@{config.vector_store.url}/{db_name}" + vectorstore = PGVector( + collection_name=collection_name, connection_string=connection_string, embedding_function=document_embedder, + ) + elif config.vector_store.name == "milvus": + logger.info(f"Using milvus collection: {collection_name}") + # vectorstore url can be updated using environment variable APP_VECTORSTORE_URL, it should be in http://ip:port format + url = urlparse(config.vector_store.url) + vectorstore = Milvus( + document_embedder, + connection_args={"host": url.hostname, "port": url.port}, + collection_name=collection_name, + auto_id=True, + ) + else: + raise ValueError(f"{config.vector_store.name} vector database is not supported") + logger.info("Vector store created and saved.") + return vectorstore + + +def get_vectorstore(vectorstore: Optional["VectorStore"], document_embedder: "Embeddings") -> VectorStore: + """Retrieves or creates a VectorStore object from langchain. + + Args: + vectorstore (Optional[VectorStore]): VectorStore object from langchain. + document_embedder (Embeddings): Embedding model object to generate embedding of document. + + Returns: + VectorStore: A VectorStore object of given vectorstore from langchain. + """ + if vectorstore is None: + return create_vectorstore_langchain(document_embedder) + return vectorstore + + +@lru_cache +def get_doc_retriever(num_nodes: int = 4) -> "BaseRetriever": + """Create the document retriever. + + Args: + num_nodes (int): Number of documents to be retrieved from vectorstore. + + Returns: + BaseRetriever: Object of retriever. + """ + index = get_vector_index() + return index.as_retriever(similarity_top_k=num_nodes) + + +@utils_cache +@lru_cache() +def get_llm(**kwargs) -> LLM | SimpleChatModel: + """Create the LLM connection. + + Returns: + LLM: llm object from langchain base class. + """ + settings = get_config() + + logger.info(f"Using {settings.llm.model_engine} as model engine for llm. Model name: {settings.llm.model_name}") + # llm engine name can be updated using environment variable APP_LLM_MODELENGINE + if settings.llm.model_engine == "nvidia-ai-endpoints": + unused_params = [key for key in kwargs.keys() if key not in ['temperature', 'top_p', 'max_tokens']] + if unused_params: + logger.warning( + f"The following parameters from kwargs are not supported: {unused_params} for {settings.llm.model_engine}" + ) + # If server url is set using APP_LLM_SERVERURL, locally hosted NIM is used otherwise Nvidia hosted model are used + if settings.llm.server_url: + logger.info(f"Using llm model {settings.llm.model_name} hosted at {settings.llm.server_url}") + return ChatNVIDIA( + base_url=f"http://{settings.llm.server_url}/v1", + temperature=kwargs.get('temperature', None), + top_p=kwargs.get('top_p', None), + max_tokens=kwargs.get('max_tokens', None), + ) + else: + logger.info(f"Using llm model {settings.llm.model_name} from api catalog") + # Using Nvidia hosted model + return ChatNVIDIA( + model=settings.llm.model_name, + temperature=kwargs.get('temperature', None), + top_p=kwargs.get('top_p', None), + max_tokens=kwargs.get('max_tokens', None), + ) + else: + raise RuntimeError( + "Unable to find any supported Large Language Model server. Supported engine name is nvidia-ai-endpoints." + ) + + +@lru_cache +def get_embedding_model() -> Embeddings: + """Create the embedding model. + + Returns: + Embeddings: object of base embedding class of langchain + """ + model_kwargs = {"device": "cpu"} + if torch.cuda.is_available(): + model_kwargs["device"] = "cuda:0" + + encode_kwargs = {"normalize_embeddings": False} + settings = get_config() + + logger.info( + f"Using {settings.embeddings.model_engine} as model engine and {settings.embeddings.model_name} and model for embeddings" + ) + # Model engine can be updated using APP_EMBEDDINGS_MODELENGINE environment variable + if settings.embeddings.model_engine == "huggingface": + # Model name can be updated using APP_EMBEDDINGS_MODELNAME + hf_embeddings = HuggingFaceEmbeddings( + model_name=settings.embeddings.model_name, model_kwargs=model_kwargs, encode_kwargs=encode_kwargs, + ) + # Load in a specific embedding model + return hf_embeddings + elif settings.embeddings.model_engine == "nvidia-ai-endpoints": + # If URL set in APP_EMBEDDINGS_SERVERURL then Nvidia hosted model is used otherwise local NIM is used for inference + if settings.embeddings.server_url: + logger.info( + f"Using embedding model {settings.embeddings.model_name} hosted at {settings.embeddings.server_url}" + ) + return NVIDIAEmbeddings(base_url=f"http://{settings.embeddings.server_url}/v1", truncate="END") + else: + logger.info(f"Using embedding model {settings.embeddings.model_name} hosted at api catalog") + return NVIDIAEmbeddings(model=settings.embeddings.model_name, truncate="END") + else: + raise RuntimeError( + "Unable to find any supported embedding model. Supported engine is huggingface and nvidia-ai-endpoints." + ) + + +@lru_cache +def get_ranking_model() -> BaseDocumentCompressor: + """Create the ranking model. + + Returns: + BaseDocumentCompressor: Base class for document compressors. + """ + + settings = get_config() + + try: + if settings.ranking.model_engine == "nvidia-ai-endpoints": + if settings.ranking.server_url: + logger.info(f"Using ranking model hosted at {settings.ranking.server_url}") + return NVIDIARerank( + base_url=f"http://{settings.ranking.server_url}/v1", top_n=settings.retriever.top_k, truncate="END" + ) + elif settings.ranking.model_name: + logger.info(f"Using ranking model {settings.ranking.model_name} hosted at api catalog") + return NVIDIARerank(model=settings.ranking.model_name, top_n=settings.retriever.top_k, truncate="END") + else: + logger.warning("Unable to find any supported ranking model. Supported engine is nvidia-ai-endpoints.") + except Exception as e: + logger.error(f"An error occurred while initializing ranking_model: {e}") + return None + + +def get_text_splitter() -> SentenceTransformersTokenTextSplitter: + """Return the token text splitter instance from langchain. + + Returns: + SentenceTransformersTokenTextSplitter: Splitting text to tokens using sentence model tokenizer + """ + + if get_config().text_splitter.model_name: + embedding_model_name = get_config().text_splitter.model_name + + # Chunksize and chunk overlap can up updated using APP_TEXTSPLITTER_CHUNKSIZE and APP_TEXTSPLITTER_CHUNKOVERLAP respectively + return SentenceTransformersTokenTextSplitter( + model_name=embedding_model_name, + tokens_per_chunk=get_config().text_splitter.chunk_size - 2, + chunk_overlap=get_config().text_splitter.chunk_overlap, + ) + + +def get_docs_vectorstore_langchain(vectorstore: VectorStore) -> List[str]: + """Retrieves filenames stored in the vector store implemented in LangChain. + + Args: + vectorstore (VectorStore): VectorStore object from langchain. + + Returns: + List[str]: List of document ingested in vectorstore + """ + + settings = get_config() + try: + # No API available in LangChain for listing the docs, thus usig its private _dict + extract_filename = lambda metadata: os.path.basename(metadata['source']) + if settings.vector_store.name == "faiss": + in_memory_docstore = vectorstore.docstore._dict + filenames = [extract_filename(doc.metadata) for doc in in_memory_docstore.values()] + filenames = list(set(filenames)) + return filenames + elif settings.vector_store.name == "pgvector": + # No API availbe in LangChain for listing the docs, thus usig its private _make_session + with vectorstore._make_session() as session: + embedding_doc_store = session.query( + vectorstore.EmbeddingStore.custom_id, + vectorstore.EmbeddingStore.document, + vectorstore.EmbeddingStore.cmetadata, + ).all() + filenames = set([extract_filename(metadata) for _, _, metadata in embedding_doc_store if metadata]) + return filenames + elif settings.vector_store.name == "milvus": + # Getting all the ID's > 0 + if vectorstore.col: + milvus_data = vectorstore.col.query(expr="pk >= 0", output_fields=["pk", "source", "text"]) + filenames = set([extract_filename(metadata) for metadata in milvus_data]) + return filenames + except Exception as e: + logger.error(f"Error occurred while retrieving documents: {e}") + return [] + + +def del_docs_vectorstore_langchain(vectorstore: VectorStore, filenames: List[str]) -> bool: + """Delete documents from the vector index implemented in LangChain. + + Args: + vectorstore (VectorStore): VectorStore object from langchain. + + Returns: + bool: Delete document operation status + """ + + settings = get_config() + try: + # No other API availbe in LangChain for listing the docs, thus usig its private _dict + extract_filename = lambda metadata: os.path.basename(metadata['source']) + if settings.vector_store.name == "faiss": + in_memory_docstore = vectorstore.docstore._dict + for filename in filenames: + # iterate over all the document, find doc_id related to document name + ids_list = [ + doc_id + for doc_id, doc_data in in_memory_docstore.items() + if extract_filename(doc_data.metadata) == filename + ] + if not len(ids_list): + logger.info("File does not exist in the vectorstore") + return False + # delete all doc_ids from vectorstore with filename + vectorstore.delete(ids_list) + logger.info(f"Deleted documents with filenames {filename}") + elif settings.vector_store.name == "pgvector": + with vectorstore._make_session() as session: + collection = vectorstore.get_collection(session) + filter_by = vectorstore.EmbeddingStore.collection_id == collection.uuid + embedding_doc_store = ( + session.query( + vectorstore.EmbeddingStore.custom_id, + vectorstore.EmbeddingStore.document, + vectorstore.EmbeddingStore.cmetadata, + ) + .filter(filter_by) + .all() + ) + for filename in filenames: + # iterate over all the document, find doc_id related to document name + ids_list = [ + doc_id + for doc_id, doc_data, metadata in embedding_doc_store + if extract_filename(metadata) == filename + ] + if not len(ids_list): + logger.info("File does not exist in the vectorstore") + return False + # delete all doc_ids from vectorstore with filename + vectorstore.delete(ids_list) + logger.info(f"Deleted documents with filenames {filename}") + elif settings.vector_store.name == "milvus": + # Getting all the ID's > 0 + milvus_data = vectorstore.col.query(expr="pk >= 0", output_fields=["pk", "source", "text"]) + for filename in filenames: + # get ids with filename in metadata + ids_list = [metadata["pk"] for metadata in milvus_data if extract_filename(metadata) == filename] + if not len(ids_list): + logger.info("File does not exist in the vectorstore") + return False + # delete all ids from vectorstore with filename in metadata + vectorstore.col.delete(f"pk in {ids_list}") + logger.info(f"Deleted documents with filenames {filename}") + return True + except Exception as e: + logger.error(f"Error occurred while deleting documents: {e}") + return False + return True + + +def get_docs_vectorstore_llamaindex() -> List[str]: + """Retrieves filenames stored in the vector store implemented in LlamaIndex. + + Returns: + List[str]: List of file in vectorstore for llama index based example. + """ + + settings = get_config() + index = get_vector_index() + decoded_filenames = [] + try: + if settings.vector_store.name == "pgvector": + ref_doc_info = index.ref_doc_info + # iterate over all the document in vectorstore and return unique filename + for _, ref_doc_value in ref_doc_info.items(): + metadata = ref_doc_value.metadata + if 'filename' in metadata: + filename = metadata['filename'] + decoded_filenames.append(filename) + decoded_filenames = list(set(decoded_filenames)) + elif settings.vector_store.name == "milvus": + client = index.vector_store.client + collection_name = os.getenv('COLLECTION_NAME', "vector_db") + query_res = client.query( + collection_name=collection_name, filter="common_field == 'all'", output_fields=["filename"] + ) + if not query_res: + return decoded_filenames + + # iterate over all the document in collection and return unique filename + filenames = [entry.get('filename') for entry in query_res] + for filename in filenames: + decoded_filenames.append(filename) + decoded_filenames = list(set(decoded_filenames)) + return decoded_filenames + except Exception as e: + logger.error(f"Error occurred while retrieving documents: {e}") + return [] + + +def del_docs_vectorstore_llamaindex(filenames: List[str]) -> bool: + """Delete documents from the vector index implemented in LlamaIndex. + + Args: + filenames (List[str]): List of filenames to be deleted from vectorstore. + + Returns: + bool: Delete document operation status + """ + + settings = get_config() + index = get_vector_index() + try: + if settings.vector_store.name == "pgvector": + ref_doc_info = index.ref_doc_info + # Iterate over all the filenames and if filename present in metadata of doc delete it + for filename in filenames: + for ref_doc_id, doc_info in ref_doc_info.items(): + if 'filename' in doc_info.metadata and doc_info.metadata['filename'] == filename: + index.delete_ref_doc(ref_doc_id, delete_from_docstore=True) + logger.info(f"Deleted documents with filenames {filename}") + elif settings.vector_store.name == "milvus": + for filename in filenames: + client = index.vector_store.client + collection_name = os.getenv('COLLECTION_NAME', "vector_db") + query_res = client.query( + collection_name=collection_name, filter=f"filename == '{filename}'", output_fields=["id"] + ) + if not query_res: + logger.info("File does not exist in the vectorstore") + return False + + # Fetch vectorstore document ids for given filename + ids = [entry.get('id') for entry in query_res] + # Delete all document with ids from vectorstore to delete file + res = client.delete(collection_name=collection_name, filter=f"id in {str(ids)}") + logger.info(f"Deleted documents with filenames {filename}") + return True + except Exception as e: + logger.error(f"Error occurred while deleting documents: {e}") + return False + + +def _combine_dicts(dict_a: Dict[str, Any], dict_b: Dict[str, Any]) -> Dict[str, Any]: + """Combines two dictionaries recursively, prioritizing values from dict_b. + + Args: + dict_a: The first dictionary. + dict_b: The second dictionary. + + Returns: + A new dictionary with combined key-value pairs. + """ + + combined_dict = dict_a.copy() # Start with a copy of dict_a + + for key, value_b in dict_b.items(): + if key in combined_dict: + value_a = combined_dict[key] + # Remove the special handling for "command" + if isinstance(value_a, dict) and isinstance(value_b, dict): + combined_dict[key] = _combine_dicts(value_a, value_b) + # Otherwise, replace the value from A with the value from B + else: + combined_dict[key] = value_b + else: + # Add any key not present in A + combined_dict[key] = value_b + + return combined_dict diff --git a/integrations/pandasai/llms/__init__.py b/RAG/src/pandasai/llms/__init__.py similarity index 100% rename from integrations/pandasai/llms/__init__.py rename to RAG/src/pandasai/llms/__init__.py diff --git a/integrations/pandasai/llms/nv_aiplay.py b/RAG/src/pandasai/llms/nv_aiplay.py similarity index 98% rename from integrations/pandasai/llms/nv_aiplay.py rename to RAG/src/pandasai/llms/nv_aiplay.py index e169ec56..ff6dc4cb 100644 --- a/integrations/pandasai/llms/nv_aiplay.py +++ b/RAG/src/pandasai/llms/nv_aiplay.py @@ -18,15 +18,16 @@ import logging from typing import Any, Dict, Optional +from langchain_nvidia_ai_endpoints import ChatNVIDIA from pandasai.llm.base import LLM -from pandasai.prompts.base import BasePrompt from pandasai.pipelines.pipeline_context import PipelineContext -from langchain_nvidia_ai_endpoints import ChatNVIDIA +from pandasai.prompts.base import BasePrompt -from RetrievalAugmentedGeneration.common.utils import get_config +from RAG.src.chain_server.utils import get_config logger = logging.getLogger(__name__) + class NVIDIA(LLM): """ A wrapper class on PandasAI base LLM class to NVIDIA Foundational Models. diff --git a/RAG/src/rag_playground/Dockerfile b/RAG/src/rag_playground/Dockerfile new file mode 100644 index 00000000..acc2807f --- /dev/null +++ b/RAG/src/rag_playground/Dockerfile @@ -0,0 +1,39 @@ +ARG BASE_IMAGE_URL=nvcr.io/nvidia/base/ubuntu +ARG BASE_IMAGE_TAG=22.04_20240212 + +FROM ${BASE_IMAGE_URL}:${BASE_IMAGE_TAG} + +ENV PYTHONDONTWRITEBYTECODE=1 +ENV DEBIAN_FRONTEND noninteractive + +# Install required ubuntu packages for setting up python 3.10 +RUN apt update && \ + apt install -y dpkg openssl libgl1 linux-libc-dev libksba8 curl software-properties-common build-essential libssl-dev libffi-dev && \ + add-apt-repository ppa:deadsnakes/ppa && \ + apt update && apt install -y python3.10 python3.10-dev python3.10-distutils + +# Install pip for python3.10 +RUN curl -sS https://bootstrap.pypa.io/get-pip.py | python3.10 + +RUN rm -rf /var/lib/apt/lists/* + +# Install all custom python dependencies +RUN mkdir /app +COPY requirements.txt /app +RUN apt-get update; \ + apt-get upgrade -y; \ + pip3 --no-cache-dir install -r /app/requirements.txt; + + +ARG PLAYGROUND_MODE=default +RUN if [ "${PLAYGROUND_MODE}" = "speech" ] ; then \ + pip3 --no-cache-dir install nvidia-riva-client==2.14.0; \ + fi + +RUN apt-get clean + +USER 1001 +COPY $PLAYGROUND_MODE /app/frontend + +WORKDIR /app +ENTRYPOINT ["python3.10", "-m", "frontend"] diff --git a/RetrievalAugmentedGeneration/frontend/frontend/__init__.py b/RAG/src/rag_playground/default/__init__.py similarity index 96% rename from RetrievalAugmentedGeneration/frontend/frontend/__init__.py rename to RAG/src/rag_playground/default/__init__.py index 631a8847..e57aa978 100644 --- a/RetrievalAugmentedGeneration/frontend/frontend/__init__.py +++ b/RAG/src/rag_playground/default/__init__.py @@ -80,9 +80,7 @@ def main() -> "APIServer": _LOGGER.info("Configuration: \n%s", config.to_yaml()) # connect to other services - client = chat_client.ChatClient( - f"{config.server_url}:{config.server_port}", config.model_name - ) + client = chat_client.ChatClient(f"{config.server_url}:{config.server_port}", config.model_name) # create api server _LOGGER.info("Instantiating the API Server.") diff --git a/RetrievalAugmentedGeneration/frontend/frontend/__main__.py b/RAG/src/rag_playground/default/__main__.py similarity index 74% rename from RetrievalAugmentedGeneration/frontend/frontend/__main__.py rename to RAG/src/rag_playground/default/__main__.py index cd2fa34a..df0bda71 100644 --- a/RetrievalAugmentedGeneration/frontend/frontend/__main__.py +++ b/RAG/src/rag_playground/default/__main__.py @@ -34,10 +34,7 @@ def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description="Document Retrieval Service") parser.add_argument( - "--help-config", - action="store_true", - default=False, - help="show the configuration help text", + "--help-config", action="store_true", default=False, help="show the configuration help text", ) parser.add_argument( @@ -48,18 +45,10 @@ def parse_args() -> argparse.Namespace: help="path to the configuration file (json or yaml)", ) parser.add_argument( - "-v", - "--verbose", - action="count", - default=1, - help="increase output verbosity", + "-v", "--verbose", action="count", default=1, help="increase output verbosity", ) parser.add_argument( - "-q", - "--quiet", - action="count", - default=0, - help="decrease output verbosity", + "-q", "--quiet", action="count", default=0, help="decrease output verbosity", ) parser.add_argument( @@ -70,28 +59,14 @@ def parse_args() -> argparse.Namespace: help="Bind socket to this host.", ) parser.add_argument( - "--port", - metavar="PORT_NUM", - type=int, - default=8080, - help="Bind socket to this port.", + "--port", metavar="PORT_NUM", type=int, default=8080, help="Bind socket to this port.", ) parser.add_argument( - "--workers", - metavar="NUM_WORKERS", - type=int, - default=1, - help="Number of worker processes.", + "--workers", metavar="NUM_WORKERS", type=int, default=1, help="Number of worker processes.", ) + parser.add_argument("--ssl-keyfile", metavar="SSL_KEY", type=str, default=None, help="SSL key file") parser.add_argument( - "--ssl-keyfile", metavar="SSL_KEY", type=str, default=None, help="SSL key file" - ) - parser.add_argument( - "--ssl-certfile", - metavar="SSL_CERT", - type=str, - default=None, - help="SSL certificate file", + "--ssl-certfile", metavar="SSL_CERT", type=str, default=None, help="SSL certificate file", ) cliargs = parser.parse_args() diff --git a/RetrievalAugmentedGeneration/frontend/frontend/api.py b/RAG/src/rag_playground/default/api.py similarity index 88% rename from RetrievalAugmentedGeneration/frontend/frontend/api.py rename to RAG/src/rag_playground/default/api.py index 25df0ad5..96b5ec38 100644 --- a/RetrievalAugmentedGeneration/frontend/frontend/api.py +++ b/RAG/src/rag_playground/default/api.py @@ -20,9 +20,8 @@ from fastapi import FastAPI from fastapi.responses import FileResponse from fastapi.staticfiles import StaticFiles -from frontend.chat_client import ChatClient - from frontend import pages +from frontend.chat_client import ChatClient STATIC_DIR = os.path.join(os.path.abspath(os.path.dirname(__file__)), "static") @@ -47,15 +46,9 @@ def __init__(self, client: ChatClient) -> None: def configure_routes(self) -> None: """Configure the routes in the API Server.""" _ = gr.mount_gradio_app( - self, - blocks=pages.converse.build_page(self._client), - path=f"/content{pages.converse.PATH}", - ) - _ = gr.mount_gradio_app( - self, - blocks=pages.kb.build_page(self._client), - path=f"/content{pages.kb.PATH}", + self, blocks=pages.converse.build_page(self._client), path=f"/content{pages.converse.PATH}", ) + _ = gr.mount_gradio_app(self, blocks=pages.kb.build_page(self._client), path=f"/content{pages.kb.PATH}",) @self.get("/") async def root_redirect() -> FileResponse: diff --git a/RetrievalAugmentedGeneration/frontend/frontend/assets/__init__.py b/RAG/src/rag_playground/default/assets/__init__.py similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/assets/__init__.py rename to RAG/src/rag_playground/default/assets/__init__.py diff --git a/RAG/src/rag_playground/default/assets/kaizen-theme.css b/RAG/src/rag_playground/default/assets/kaizen-theme.css new file mode 100644 index 00000000..2b0f6dc2 --- /dev/null +++ b/RAG/src/rag_playground/default/assets/kaizen-theme.css @@ -0,0 +1,13 @@ +.tabitem { + background-color: var(--block-background-fill); + } + + .gradio-container { + /* This needs to be !important, otherwise the breakpoint override the container being full width */ + max-width: 100% !important; + padding: 10px !important; + } + + footer { + visibility: hidden; + } \ No newline at end of file diff --git a/RetrievalAugmentedGeneration/frontend/frontend/assets/kaizen-theme.json b/RAG/src/rag_playground/default/assets/kaizen-theme.json similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/assets/kaizen-theme.json rename to RAG/src/rag_playground/default/assets/kaizen-theme.json diff --git a/RetrievalAugmentedGeneration/frontend/frontend/chat_client.py b/RAG/src/rag_playground/default/chat_client.py similarity index 53% rename from RetrievalAugmentedGeneration/frontend/frontend/chat_client.py rename to RAG/src/rag_playground/default/chat_client.py index 19d8c42a..21816997 100644 --- a/RetrievalAugmentedGeneration/frontend/frontend/chat_client.py +++ b/RAG/src/rag_playground/default/chat_client.py @@ -14,15 +14,14 @@ # limitations under the License. """The API client for the langchain-esque service.""" +import json import logging import mimetypes import typing -import json import requests -from requests.exceptions import ConnectionError - from frontend import tracing +from requests.exceptions import ConnectionError _LOGGER = logging.getLogger(__name__) @@ -42,33 +41,23 @@ def model_name(self) -> str: return self._model_name @tracing.instrumentation_wrapper - def search( - self, carrier, prompt: str - ) -> typing.List[typing.Dict[str, typing.Union[str, float]]]: + def search(self, carrier, prompt: str) -> typing.List[typing.Dict[str, typing.Union[str, float]]]: """Search for relevant documents and return json data.""" data = {"query": prompt, "top_k": 4} - headers = { - **carrier, - "accept": "application/json", "Content-Type": "application/json" - } + headers = {**carrier, "accept": "application/json", "Content-Type": "application/json"} url = f"{self.server_url}/search" - _LOGGER.debug( - "looking up documents - %s", str({"server_url": url, "post_data": data}) - ) + _LOGGER.debug("looking up documents - %s", str({"server_url": url, "post_data": data})) try: with requests.post(url, headers=headers, json=data, timeout=30) as req: - req.raise_for_status() - response = req.json() - return typing.cast( - typing.List[typing.Dict[str, typing.Union[str, float]]], response - ) + req.raise_for_status() + response = req.json() + return typing.cast(typing.List[typing.Dict[str, typing.Union[str, float]]], response) except Exception as e: - _LOGGER.error(f"Failed to get response from /documentSearch endpoint of chain-server. Error details: {e}. Refer to chain-server logs for details.") - return typing.cast( - typing.List[typing.Dict[str, typing.Union[str, float]]], [] + _LOGGER.error( + f"Failed to get response from /documentSearch endpoint of chain-server. Error details: {e}. Refer to chain-server logs for details." ) - + return typing.cast(typing.List[typing.Dict[str, typing.Union[str, float]]], []) @tracing.predict_instrumentation_wrapper def predict( @@ -76,46 +65,42 @@ def predict( ) -> typing.Generator[str, None, None]: """Make a model prediction.""" data = { - "messages": [ - { - "role": "user", - "content": query - } - ], - "use_knowledge_base": use_knowledge_base, + "messages": [{"role": "user", "content": query}], + "use_knowledge_base": use_knowledge_base, } url = f"{self.server_url}/generate" - _LOGGER.debug( - "making inference request - %s", str({"server_url": url, "post_data": data}) - ) + _LOGGER.debug("making inference request - %s", str({"server_url": url, "post_data": data})) try: with requests.post(url, stream=True, json=data, timeout=50, headers=carrier) as req: - req.raise_for_status() - for chunk in req.iter_lines(): - raw_resp = chunk.decode("UTF-8") - if not raw_resp: - continue - resp_dict = None - try: - resp_dict = json.loads(raw_resp[6:]) - resp_choices = resp_dict.get("choices", []) - if len(resp_choices): - resp_str = resp_choices[0].get("message", {}).get("content", "") - yield resp_str - else: - yield "" - except Exception as e: - raise ValueError(f"Invalid response json: {raw_resp}") from e + req.raise_for_status() + for chunk in req.iter_lines(): + raw_resp = chunk.decode("UTF-8") + if not raw_resp: + continue + resp_dict = None + try: + resp_dict = json.loads(raw_resp[6:]) + resp_choices = resp_dict.get("choices", []) + if len(resp_choices): + resp_str = resp_choices[0].get("message", {}).get("content", "") + yield resp_str + else: + yield "" + except Exception as e: + raise ValueError(f"Invalid response json: {raw_resp}") from e except Exception as e: - _LOGGER.error(f"Failed to get response from /generate endpoint of chain-server. Error details: {e}. Refer to chain-server logs for details.") - yield str("Failed to get response from /generate endpoint of chain-server. Check if the fastapi server in chain-server is up. Refer to chain-server logs for details.") + _LOGGER.error( + f"Failed to get response from /generate endpoint of chain-server. Error details: {e}. Refer to chain-server logs for details." + ) + yield str( + "Failed to get response from /generate endpoint of chain-server. Check if the fastapi server in chain-server is up. Refer to chain-server logs for details." + ) # Send None to indicate end of response yield None - @tracing.instrumentation_wrapper def upload_documents(self, carrier, file_paths: typing.List[str]) -> None: """Upload documents to the kb.""" @@ -132,8 +117,7 @@ def upload_documents(self, carrier, file_paths: typing.List[str]) -> None: files = {"file": (fpath, open(fpath, "rb"), mime_type)} _LOGGER.debug( - "uploading file - %s", - str({"server_url": url, "file": fpath}), + "uploading file - %s", str({"server_url": url, "file": fpath}), ) resp = requests.post( @@ -142,35 +126,30 @@ def upload_documents(self, carrier, file_paths: typing.List[str]) -> None: if resp.status_code == 500: raise ValueError(f"{resp.json().get('message', 'Failed to upload document')}") except Exception as e: - _LOGGER.error(f"Failed to get response from /documents endpoint of chain-server. Error details: {e}. Refer to chain-server logs for details.") + _LOGGER.error( + f"Failed to get response from /documents endpoint of chain-server. Error details: {e}. Refer to chain-server logs for details." + ) raise ValueError(f"{e}") - @tracing.instrumentation_wrapper def delete_documents(self, carrier, file_name: str) -> str: """ Delete Selected documents""" - headers = { - **carrier, - "accept": "application/json", "Content-Type": "application/json" - } - params = { - 'filename': file_name - } + headers = {**carrier, "accept": "application/json", "Content-Type": "application/json"} + params = {'filename': file_name} url = f"{self.server_url}/documents" try: - _LOGGER.debug( - f"Delete request received for file_name: {file_name}" - ) + _LOGGER.debug(f"Delete request received for file_name: {file_name}") with requests.delete(url, headers=headers, params=params, timeout=30) as req: req.raise_for_status() response = req.json() return response except Exception as e: - _LOGGER.error(f"Failed to delete {file_name} using /documents endpoint of chain-server. Error details: {e}. Refer to chain-server logs for details.") + _LOGGER.error( + f"Failed to delete {file_name} using /documents endpoint of chain-server. Error details: {e}. Refer to chain-server logs for details." + ) return "" - @tracing.instrumentation_wrapper def get_uploaded_documents(self, carrier) -> typing.List[str]: """Get list of Uploaded documents.""" @@ -179,20 +158,20 @@ def get_uploaded_documents(self, carrier) -> typing.List[str]: **carrier, "accept": "application/json", } - uploaded_files=[] + uploaded_files = [] try: - resp = requests.get( - url, headers=headers, timeout=600 - ) - response = json.loads(resp.content) - if resp.status_code == 500: - raise ValueError(f"{resp.json().get('message', 'Failed to get uploaded documents')}") - else: - uploaded_files=response['documents'] + resp = requests.get(url, headers=headers, timeout=600) + response = json.loads(resp.content) + if resp.status_code == 500: + raise ValueError(f"{resp.json().get('message', 'Failed to get uploaded documents')}") + else: + uploaded_files = response['documents'] except ConnectionError as e: # Avoid playground crash when chain server starts after rag-playground _LOGGER.error(f"Failed to connect /documents endpoint of chain-server. Error details: {e}.") except Exception as e: - _LOGGER.error(f"Failed to get response from /documents endpoint of chain-server. Error details: {e}. Refer to chain-server logs for details.") + _LOGGER.error( + f"Failed to get response from /documents endpoint of chain-server. Error details: {e}. Refer to chain-server logs for details." + ) raise ValueError(f"{e}") return uploaded_files diff --git a/RetrievalAugmentedGeneration/frontend/frontend/configuration.py b/RAG/src/rag_playground/default/configuration.py similarity index 76% rename from RetrievalAugmentedGeneration/frontend/frontend/configuration.py rename to RAG/src/rag_playground/default/configuration.py index 864ae45b..2ae91fd8 100644 --- a/RetrievalAugmentedGeneration/frontend/frontend/configuration.py +++ b/RAG/src/rag_playground/default/configuration.py @@ -28,17 +28,11 @@ class AppConfig(ConfigWizard): """ server_url: str = configfield( - "serverUrl", - default="http://localhost", - help_txt="The location of the chat server.", + "serverUrl", default="http://localhost", help_txt="The location of the chat server.", ) server_port: str = configfield( - "serverPort", - default="8000", - help_txt="The port on which the chat server is listening for HTTP requests.", + "serverPort", default="8000", help_txt="The port on which the chat server is listening for HTTP requests.", ) model_name: str = configfield( - "modelName", - default="meta/llama3-70b-instruct", - help_txt="The name of the hosted LLM model.", + "modelName", default="meta/llama3-70b-instruct", help_txt="The name of the hosted LLM model.", ) diff --git a/RetrievalAugmentedGeneration/common/configuration_wizard.py b/RAG/src/rag_playground/default/configuration_wizard.py similarity index 89% rename from RetrievalAugmentedGeneration/common/configuration_wizard.py rename to RAG/src/rag_playground/default/configuration_wizard.py index d63d9e41..5e53a6b6 100644 --- a/RetrievalAugmentedGeneration/common/configuration_wizard.py +++ b/RAG/src/rag_playground/default/configuration_wizard.py @@ -30,14 +30,7 @@ from typing import Any, Callable, Dict, List, Optional, TextIO, Tuple, Union import yaml -from dataclass_wizard import ( - JSONWizard, - LoadMeta, - YAMLWizard, - errors, - fromdict, - json_field, -) +from dataclass_wizard import JSONWizard, LoadMeta, YAMLWizard, errors, fromdict, json_field from dataclass_wizard.models import JSONField from dataclass_wizard.utils.string_conv import to_camel_case @@ -46,9 +39,7 @@ _LOGGER = logging.getLogger(__name__) -def configfield( - name: str, *, env: bool = True, help_txt: str = "", **kwargs: Any -) -> JSONField: +def configfield(name: str, *, env: bool = True, help_txt: str = "", **kwargs: Any) -> JSONField: """Create a data class field with the specified name in JSON format. :param name: The name of the field. @@ -148,9 +139,7 @@ def print_help( default = "NO-DEFAULT-VALUE" else: default = val.default - help_printer( - f"{_Color.BOLD}{' ' * indent}{jsonname}:{_Color.END} {default}\n" - ) + help_printer(f"{_Color.BOLD}{' ' * indent}{jsonname}:{_Color.END} {default}\n") # print comments if is_embedded_config: @@ -158,9 +147,7 @@ def print_help( if val.metadata.get("help"): help_printer(f"{' ' * indent}# {val.metadata['help']}\n") if not is_embedded_config: - typestr = getattr(val.type, "__name__", None) or str(val.type).replace( - "typing.", "" - ) + typestr = getattr(val.type, "__name__", None) or str(val.type).replace("typing.", "") help_printer(f"{' ' * indent}# Type: {typestr}\n") if val.metadata.get("env", True): help_printer(f"{' ' * indent}# ENV Variable: {full_envname}\n") @@ -170,17 +157,13 @@ def print_help( if is_embedded_config: new_env_parent = f"{env_parent}_{envname}" new_json_parent = json_parent + (jsonname,) - val.type.print_help( - help_printer, env_parent=new_env_parent, json_parent=new_json_parent - ) + val.type.print_help(help_printer, env_parent=new_env_parent, json_parent=new_json_parent) help_printer("\n") @classmethod def envvars( - cls, - env_parent: Optional[str] = None, - json_parent: Optional[Tuple[str, ...]] = None, + cls, env_parent: Optional[str] = None, json_parent: Optional[Tuple[str, ...]] = None, ) -> List[Tuple[str, Tuple[str, ...], type]]: """Calculate valid environment variables and their config structure location. @@ -213,9 +196,7 @@ def envvars( if is_embedded_config: new_env_parent = f"{env_parent}_{envname}" new_json_parent = json_parent + (jsonname,) - output += val.type.envvars( - env_parent=new_env_parent, json_parent=new_json_parent - ) + output += val.type.envvars(env_parent=new_env_parent, json_parent=new_json_parent) elif val.metadata.get("env", True): output += [(full_envname, json_parent + (jsonname,), val.type)] @@ -246,10 +227,7 @@ def from_dict(cls, data: Dict[str, Any]) -> "ConfigWizard": var_value = try_json_load(var_value) update_dict(data, conf_path, var_value) _LOGGER.debug( - "Found EnvVar Config - %s:%s = %s", - var_name, - str(var_type), - repr(var_value), + "Found EnvVar Config - %s:%s = %s", var_name, str(var_type), repr(var_value), ) LoadMeta(key_transform="CAMEL").bind_to(cls) @@ -272,9 +250,7 @@ def from_file(cls, filepath: str) -> Optional["ConfigWizard"]: _LOGGER.error("The configuration file cannot be found.") file = None except PermissionError: - _LOGGER.error( - "Permission denied when trying to read the configuration file." - ) + _LOGGER.error("Permission denied when trying to read the configuration file.") file = None if not file: return None @@ -284,8 +260,7 @@ def from_file(cls, filepath: str) -> Optional["ConfigWizard"]: data = read_json_or_yaml(file) except ValueError as err: _LOGGER.error( - "Configuration file must be valid JSON or YAML. The following errors occured:\n%s", - str(err), + "Configuration file must be valid JSON or YAML. The following errors occured:\n%s", str(err), ) data = None config = None @@ -297,9 +272,7 @@ def from_file(cls, filepath: str) -> Optional["ConfigWizard"]: try: config = cls.from_dict(data) except errors.MissingFields as err: - _LOGGER.error( - "Configuration is missing required fields: \n%s", str(err) - ) + _LOGGER.error("Configuration is missing required fields: \n%s", str(err)) config = None except errors.ParseError as err: _LOGGER.error("Invalid configuration value provided:\n%s", str(err)) @@ -352,9 +325,7 @@ def read_json_or_yaml(stream: TextIO) -> Dict[str, Any]: return data # neither json nor yaml - err_msg = "\n\n".join( - [key + " Parser Errors:\n" + str(val) for key, val in exceptions.items()] - ) + err_msg = "\n\n".join([key + " Parser Errors:\n" + str(val) for key, val in exceptions.items()]) raise ValueError(err_msg) @@ -372,12 +343,7 @@ def try_json_load(value: str) -> Any: return value -def update_dict( - data: Dict[str, Any], - path: Tuple[str, ...], - value: Any, - overwrite: bool = False, -) -> None: +def update_dict(data: Dict[str, Any], path: Tuple[str, ...], value: Any, overwrite: bool = False,) -> None: """Update a dictionary with a new value at a given path. :param data: The dictionary to be updated. diff --git a/RetrievalAugmentedGeneration/frontend/frontend/pages/__init__.py b/RAG/src/rag_playground/default/pages/__init__.py similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/pages/__init__.py rename to RAG/src/rag_playground/default/pages/__init__.py diff --git a/RAG/src/rag_playground/default/pages/converse.py b/RAG/src/rag_playground/default/pages/converse.py new file mode 100644 index 00000000..1b595d40 --- /dev/null +++ b/RAG/src/rag_playground/default/pages/converse.py @@ -0,0 +1,119 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""This module contains the frontend gui for having a conversation.""" +import functools +import logging +from typing import Any, Dict, List, Tuple, Union + +import gradio as gr + +from frontend import assets, chat_client + +_LOGGER = logging.getLogger(__name__) +PATH = "/converse" +TITLE = "Converse" +OUTPUT_TOKENS = 1024 +MAX_DOCS = 5 + +_LOCAL_CSS = """ + +#contextbox { + overflow-y: scroll !important; + max-height: 400px; +} +""" + + +def build_page(client: chat_client.ChatClient) -> gr.Blocks: + """Build the gradio page to be mounted in the frame.""" + kui_theme, kui_styles = assets.load_theme("kaizen") + + with gr.Blocks(title=TITLE, theme=kui_theme, css=kui_styles + _LOCAL_CSS) as page: + + # create the page header + gr.Markdown(f"# {TITLE}") + + # chat logs + with gr.Row(equal_height=True): + chatbot = gr.Chatbot(scale=2, label=client.model_name) + latest_response = gr.Textbox(visible=False) + context = gr.JSON(scale=1, label="Knowledge Base Context", visible=False, elem_id="contextbox",) + + # check boxes + with gr.Row(): + with gr.Column(scale=10, min_width=150): + kb_checkbox = gr.Checkbox(label="Use knowledge base", info="", value=False) + + # text input boxes + with gr.Row(): + with gr.Column(scale=10, min_width=500): + msg = gr.Textbox(show_label=False, placeholder="Enter text and press ENTER", container=False,) + + # user feedback + with gr.Row(): + # _ = gr.Button(value="👍 Upvote") + # _ = gr.Button(value="👎 Downvote") + # _ = gr.Button(value="⚠️ Flag") + submit_btn = gr.Button(value="Submit") + _ = gr.ClearButton(msg) + _ = gr.ClearButton([msg, chatbot], value="Clear History") + ctx_show = gr.Button(value="Show Context") + ctx_hide = gr.Button(value="Hide Context", visible=False) + + # hide/show context + def _toggle_context(btn: str) -> Dict[gr.component, Dict[Any, Any]]: + if btn == "Show Context": + out = [True, False, True] + if btn == "Hide Context": + out = [False, True, False] + return { + context: gr.update(visible=out[0]), + ctx_show: gr.update(visible=out[1]), + ctx_hide: gr.update(visible=out[2]), + } + + ctx_show.click(_toggle_context, [ctx_show], [context, ctx_show, ctx_hide]) + ctx_hide.click(_toggle_context, [ctx_hide], [context, ctx_show, ctx_hide]) + + # form actions + _my_build_stream = functools.partial(_stream_predict, client) + msg.submit(_my_build_stream, [kb_checkbox, msg, chatbot], [msg, chatbot, context, latest_response]) + submit_btn.click(_my_build_stream, [kb_checkbox, msg, chatbot], [msg, chatbot, context, latest_response]) + + page.queue() + return page + + +def _stream_predict( + client: chat_client.ChatClient, use_knowledge_base: bool, question: str, chat_history: List[Tuple[str, str]], +) -> Any: + """Make a prediction of the response to the prompt.""" + chunks = "" + chat_history = chat_history or [] + _LOGGER.info( + "processing inference request - %s", str({"prompt": question, "use_knowledge_base": use_knowledge_base}), + ) + + documents: Union[None, List[Dict[str, Union[str, float]]]] = None + if use_knowledge_base: + documents = client.search(prompt=question) + + for chunk in client.predict(query=question, use_knowledge_base=use_knowledge_base, num_tokens=OUTPUT_TOKENS): + if chunk: + chunks += chunk + yield "", chat_history + [[question, chunks]], documents, "" + else: + yield "", chat_history + [[question, chunks]], documents, chunks diff --git a/RetrievalAugmentedGeneration/frontend/frontend/pages/kb.py b/RAG/src/rag_playground/default/pages/kb.py similarity index 81% rename from RetrievalAugmentedGeneration/frontend/frontend/pages/kb.py rename to RAG/src/rag_playground/default/pages/kb.py index b66a2819..94e93666 100644 --- a/RetrievalAugmentedGeneration/frontend/frontend/pages/kb.py +++ b/RAG/src/rag_playground/default/pages/kb.py @@ -14,13 +14,12 @@ # limitations under the License. """This module contains the frontend gui for chat.""" +import os +from functools import partial from pathlib import Path from typing import List -import os import gradio as gr -from functools import partial - from frontend import assets, chat_client PATH = "/kb" @@ -37,9 +36,7 @@ def build_page(client: chat_client.ChatClient) -> gr.Blocks: gr.Markdown(f"# {TITLE}") with gr.Row(): - upload_button = gr.UploadButton( - "Add File", file_types=["pdf"], file_count="multiple" - ) + upload_button = gr.UploadButton("Add File", file_types=["pdf"], file_count="multiple") with gr.Row(): file_output = gr.File() @@ -48,37 +45,32 @@ def build_page(client: chat_client.ChatClient) -> gr.Blocks: headers=["File Uploaded"], datatype=["str"], col_count=(1, "fixed"), - value= lambda: get_uploaded_files(client), + value=lambda: get_uploaded_files(client), every=5, ) with gr.Row(): buffer_textbox = gr.Textbox(interactive=False, visible=False) - message_textbox = gr.Textbox( - label="Message", interactive=False, visible=True - ) - + message_textbox = gr.Textbox(label="Message", interactive=False, visible=True) + with gr.Row(): delete_button = gr.Button("Delete") # form actions # Upload dutton action - upload_button.upload( - lambda files: upload_file(files, client), upload_button, file_output - ) + upload_button.upload(lambda files: upload_file(files, client), upload_button, file_output) # Files dataframe action files_df.select(return_selected_file, inputs=[files_df], outputs=[buffer_textbox]) # Delete button action partial_delete_file = partial(delete_file, client=client) - delete_button.click( - fn=partial_delete_file, inputs=buffer_textbox, outputs=message_textbox - ) + delete_button.click(fn=partial_delete_file, inputs=buffer_textbox, outputs=message_textbox) page.queue() return page + def delete_file(input_text, client: chat_client.ChatClient): """Deletes selected files from knowledge base using client""" @@ -88,6 +80,7 @@ def delete_file(input_text, client: chat_client.ChatClient): except Exception as e: raise gr.Error(f"{e}") + def return_selected_file(selected_index: gr.SelectData, dataframe): """Returns selected files from DataFrame""" if selected_index: @@ -95,11 +88,12 @@ def return_selected_file(selected_index: gr.SelectData, dataframe): dataframe = dataframe.drop(selected_index.index[0]) return val.iloc[0] + def upload_file(files: List[Path], client: chat_client.ChatClient) -> List[str]: """Use the client to upload a file to the knowledge base.""" try: file_paths = [file.name for file in files] - client.upload_documents(file_paths = file_paths) + client.upload_documents(file_paths=file_paths) # Save the uploaded file names to the state file with open(STATE_FILE, 'a') as file: @@ -111,10 +105,11 @@ def upload_file(files: List[Path], client: chat_client.ChatClient) -> List[str]: except Exception as e: raise gr.Error(f"{e}") -def get_uploaded_files(client: chat_client.ChatClient)-> List[str]: + +def get_uploaded_files(client: chat_client.ChatClient) -> List[str]: """Load previously uploaded files if the file exists""" uploaded_files = [["No Files uploaded"]] resp = client.get_uploaded_documents() - if len(resp)>0: - uploaded_files=[[file] for file in resp] + if len(resp) > 0: + uploaded_files = [[file] for file in resp] return uploaded_files diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/404.html b/RAG/src/rag_playground/default/static/404.html similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/404.html rename to RAG/src/rag_playground/default/static/404.html diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/WuNGAl0x4o1D5HqLxhHMt/_buildManifest.js b/RAG/src/rag_playground/default/static/_next/static/WuNGAl0x4o1D5HqLxhHMt/_buildManifest.js similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/WuNGAl0x4o1D5HqLxhHMt/_buildManifest.js rename to RAG/src/rag_playground/default/static/_next/static/WuNGAl0x4o1D5HqLxhHMt/_buildManifest.js diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/WuNGAl0x4o1D5HqLxhHMt/_ssgManifest.js b/RAG/src/rag_playground/default/static/_next/static/WuNGAl0x4o1D5HqLxhHMt/_ssgManifest.js similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/WuNGAl0x4o1D5HqLxhHMt/_ssgManifest.js rename to RAG/src/rag_playground/default/static/_next/static/WuNGAl0x4o1D5HqLxhHMt/_ssgManifest.js diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/78-a36dca5d49fafb86.js b/RAG/src/rag_playground/default/static/_next/static/chunks/78-a36dca5d49fafb86.js similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/78-a36dca5d49fafb86.js rename to RAG/src/rag_playground/default/static/_next/static/chunks/78-a36dca5d49fafb86.js diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/framework-7a7e500878b44665.js b/RAG/src/rag_playground/default/static/_next/static/chunks/framework-7a7e500878b44665.js similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/framework-7a7e500878b44665.js rename to RAG/src/rag_playground/default/static/_next/static/chunks/framework-7a7e500878b44665.js diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/main-92011a1a7f336a6f.js b/RAG/src/rag_playground/default/static/_next/static/chunks/main-92011a1a7f336a6f.js similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/main-92011a1a7f336a6f.js rename to RAG/src/rag_playground/default/static/_next/static/chunks/main-92011a1a7f336a6f.js diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/pages/_app-f21c0780e30f5eb6.js b/RAG/src/rag_playground/default/static/_next/static/chunks/pages/_app-f21c0780e30f5eb6.js similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/pages/_app-f21c0780e30f5eb6.js rename to RAG/src/rag_playground/default/static/_next/static/chunks/pages/_app-f21c0780e30f5eb6.js diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/pages/_app-f55c3b932a623280.js b/RAG/src/rag_playground/default/static/_next/static/chunks/pages/_app-f55c3b932a623280.js similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/pages/_app-f55c3b932a623280.js rename to RAG/src/rag_playground/default/static/_next/static/chunks/pages/_app-f55c3b932a623280.js diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/pages/_error-54de1933a164a1ff.js b/RAG/src/rag_playground/default/static/_next/static/chunks/pages/_error-54de1933a164a1ff.js similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/pages/_error-54de1933a164a1ff.js rename to RAG/src/rag_playground/default/static/_next/static/chunks/pages/_error-54de1933a164a1ff.js diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/pages/converse-39686323b565eff0.js b/RAG/src/rag_playground/default/static/_next/static/chunks/pages/converse-39686323b565eff0.js similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/pages/converse-39686323b565eff0.js rename to RAG/src/rag_playground/default/static/_next/static/chunks/pages/converse-39686323b565eff0.js diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/pages/converse-61880f01babd873a.js b/RAG/src/rag_playground/default/static/_next/static/chunks/pages/converse-61880f01babd873a.js similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/pages/converse-61880f01babd873a.js rename to RAG/src/rag_playground/default/static/_next/static/chunks/pages/converse-61880f01babd873a.js diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/pages/index-1a1d31dae38463f7.js b/RAG/src/rag_playground/default/static/_next/static/chunks/pages/index-1a1d31dae38463f7.js similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/pages/index-1a1d31dae38463f7.js rename to RAG/src/rag_playground/default/static/_next/static/chunks/pages/index-1a1d31dae38463f7.js diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/pages/index-6a3f286eb0986c10.js b/RAG/src/rag_playground/default/static/_next/static/chunks/pages/index-6a3f286eb0986c10.js similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/pages/index-6a3f286eb0986c10.js rename to RAG/src/rag_playground/default/static/_next/static/chunks/pages/index-6a3f286eb0986c10.js diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/pages/kb-cf0d102293dc0a74.js b/RAG/src/rag_playground/default/static/_next/static/chunks/pages/kb-cf0d102293dc0a74.js similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/pages/kb-cf0d102293dc0a74.js rename to RAG/src/rag_playground/default/static/_next/static/chunks/pages/kb-cf0d102293dc0a74.js diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/pages/tuning-0b7bb1111c2d2a56.js b/RAG/src/rag_playground/default/static/_next/static/chunks/pages/tuning-0b7bb1111c2d2a56.js similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/pages/tuning-0b7bb1111c2d2a56.js rename to RAG/src/rag_playground/default/static/_next/static/chunks/pages/tuning-0b7bb1111c2d2a56.js diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js b/RAG/src/rag_playground/default/static/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js rename to RAG/src/rag_playground/default/static/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/webpack-5146130448d8adf7.js b/RAG/src/rag_playground/default/static/_next/static/chunks/webpack-5146130448d8adf7.js similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/chunks/webpack-5146130448d8adf7.js rename to RAG/src/rag_playground/default/static/_next/static/chunks/webpack-5146130448d8adf7.js diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/css/7636246223312442.css b/RAG/src/rag_playground/default/static/_next/static/css/7636246223312442.css similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/css/7636246223312442.css rename to RAG/src/rag_playground/default/static/_next/static/css/7636246223312442.css diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/css/98b512633409f7e1.css b/RAG/src/rag_playground/default/static/_next/static/css/98b512633409f7e1.css similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/css/98b512633409f7e1.css rename to RAG/src/rag_playground/default/static/_next/static/css/98b512633409f7e1.css diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/s7oUSppGTRWsY8BXJmxYB/_buildManifest.js b/RAG/src/rag_playground/default/static/_next/static/s7oUSppGTRWsY8BXJmxYB/_buildManifest.js similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/s7oUSppGTRWsY8BXJmxYB/_buildManifest.js rename to RAG/src/rag_playground/default/static/_next/static/s7oUSppGTRWsY8BXJmxYB/_buildManifest.js diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/s7oUSppGTRWsY8BXJmxYB/_ssgManifest.js b/RAG/src/rag_playground/default/static/_next/static/s7oUSppGTRWsY8BXJmxYB/_ssgManifest.js similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/_next/static/s7oUSppGTRWsY8BXJmxYB/_ssgManifest.js rename to RAG/src/rag_playground/default/static/_next/static/s7oUSppGTRWsY8BXJmxYB/_ssgManifest.js diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/converse.html b/RAG/src/rag_playground/default/static/converse.html similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/converse.html rename to RAG/src/rag_playground/default/static/converse.html diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/favicon.ico b/RAG/src/rag_playground/default/static/favicon.ico similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/favicon.ico rename to RAG/src/rag_playground/default/static/favicon.ico diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/index.html b/RAG/src/rag_playground/default/static/index.html similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/index.html rename to RAG/src/rag_playground/default/static/index.html diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/kb.html b/RAG/src/rag_playground/default/static/kb.html similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/kb.html rename to RAG/src/rag_playground/default/static/kb.html diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/next.svg b/RAG/src/rag_playground/default/static/next.svg similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/next.svg rename to RAG/src/rag_playground/default/static/next.svg diff --git a/RetrievalAugmentedGeneration/frontend/frontend/static/vercel.svg b/RAG/src/rag_playground/default/static/vercel.svg similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/static/vercel.svg rename to RAG/src/rag_playground/default/static/vercel.svg diff --git a/RetrievalAugmentedGeneration/frontend/frontend/tracing.py b/RAG/src/rag_playground/default/tracing.py similarity index 93% rename from RetrievalAugmentedGeneration/frontend/frontend/tracing.py rename to RAG/src/rag_playground/default/tracing.py index 945ae00f..2de40b13 100644 --- a/RetrievalAugmentedGeneration/frontend/frontend/tracing.py +++ b/RAG/src/rag_playground/default/tracing.py @@ -14,19 +14,18 @@ # limitations under the License. import os + from opentelemetry import trace +from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter +from opentelemetry.propagate import get_global_textmap, set_global_textmap +from opentelemetry.propagators.composite import CompositePropagator from opentelemetry.sdk.resources import SERVICE_NAME, Resource from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import SimpleSpanProcessor -from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator -from opentelemetry.propagate import set_global_textmap, get_global_textmap -from opentelemetry.propagators.composite import CompositePropagator # Configure tracer used by the Frontend to create spans -resource = Resource.create({ - SERVICE_NAME: "frontend" -}) +resource = Resource.create({SERVICE_NAME: "frontend"}) provider = TracerProvider(resource=resource) if os.environ.get("ENABLE_TRACING") == "true": processor = SimpleSpanProcessor(OTLPSpanExporter()) @@ -38,7 +37,7 @@ if os.environ.get("ENABLE_TRACING") == "true": propagator = TraceContextTextMapPropagator() else: - propagator = CompositePropagator([]) # No-op propagator + propagator = CompositePropagator([]) # No-op propagator set_global_textmap(propagator) @@ -49,6 +48,7 @@ def inject_context(ctx): get_global_textmap().inject(carrier, context=ctx) return carrier + # Wrapper Function to perform instrumentation def instrumentation_wrapper(func): def wrapper(self, *args, **kwargs): @@ -60,8 +60,10 @@ def wrapper(self, *args, **kwargs): result = func(self, carrier, *args, **kwargs) span.end() return result + return wrapper + # Wrapper function for the streaming predict call def predict_instrumentation_wrapper(func): def wrapper(self, *args, **kwargs): @@ -72,9 +74,10 @@ def wrapper(self, *args, **kwargs): carrier = inject_context(span_ctx) constructed_response = "" for chunk in func(self, carrier, *args, **kwargs): - if chunk: + if chunk: constructed_response += chunk yield chunk span.set_attribute("response", constructed_response) span.end() - return wrapper \ No newline at end of file + + return wrapper diff --git a/RetrievalAugmentedGeneration/frontend/requirements.txt b/RAG/src/rag_playground/requirements.txt similarity index 100% rename from RetrievalAugmentedGeneration/frontend/requirements.txt rename to RAG/src/rag_playground/requirements.txt diff --git a/RAG/src/rag_playground/speech/__init__.py b/RAG/src/rag_playground/speech/__init__.py new file mode 100644 index 00000000..e57aa978 --- /dev/null +++ b/RAG/src/rag_playground/speech/__init__.py @@ -0,0 +1,92 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Document Retrieval Service. + +Handle document ingestion and retrieval from a VectorDB. +""" + +import logging +import os +import sys +import typing + +if typing.TYPE_CHECKING: + from frontend.api import APIServer + + +_LOG_FMT = f"[{os.getpid()}] %(asctime)15s [%(levelname)7s] - %(name)s - %(message)s" +_LOG_DATE_FMT = "%b %d %H:%M:%S" +_LOGGER = logging.getLogger(__name__) + + +def bootstrap_logging(verbosity: int = 0) -> None: + """Configure Python's logger according to the given verbosity level. + + :param verbosity: The desired verbosity level. Must be one of 0, 1, or 2. + :type verbosity: typing.Literal[0, 1, 2] + """ + # determine log level + verbosity = min(2, max(0, verbosity)) # limit verbosity to 0-2 + log_level = [logging.WARN, logging.INFO, logging.DEBUG][verbosity] + + # configure python's logger + logging.basicConfig(format=_LOG_FMT, datefmt=_LOG_DATE_FMT, level=log_level) + # update existing loggers + _LOGGER.setLevel(log_level) + for logger in [ + __name__, + "uvicorn", + "uvicorn.access", + "uvicorn.error", + ]: + for handler in logging.getLogger(logger).handlers: + handler.setFormatter(logging.Formatter(fmt=_LOG_FMT, datefmt=_LOG_DATE_FMT)) + + +def main() -> "APIServer": + """Bootstrap and Execute the application. + + :returns: 0 if the application completed successfully, 1 if an error occurred. + :rtype: Literal[0,1] + """ + # boostrap python loggers + verbosity = int(os.environ.get("APP_VERBOSITY", "1")) + bootstrap_logging(verbosity) + + # load the application libraries + # pylint: disable=import-outside-toplevel; this is intentional to allow for the environment to be configured before + # any of the application libraries are loaded. + from frontend import api, chat_client, configuration + + # load config + config_file = os.environ.get("APP_CONFIG_FILE", "/dev/null") + _LOGGER.info("Loading application configuration.") + config = configuration.AppConfig.from_file(config_file) + if not config: + sys.exit(1) + _LOGGER.info("Configuration: \n%s", config.to_yaml()) + + # connect to other services + client = chat_client.ChatClient(f"{config.server_url}:{config.server_port}", config.model_name) + + # create api server + _LOGGER.info("Instantiating the API Server.") + server = api.APIServer(client) + server.configure_routes() + + # run until complete + _LOGGER.info("Starting the API Server.") + return server diff --git a/RAG/src/rag_playground/speech/__main__.py b/RAG/src/rag_playground/speech/__main__.py new file mode 100644 index 00000000..df0bda71 --- /dev/null +++ b/RAG/src/rag_playground/speech/__main__.py @@ -0,0 +1,97 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Entrypoint for the Conversation GUI. + +The functions in this module are responsible for bootstrapping then executing the Conversation GUI server. +""" + +import argparse +import os +import sys + +import uvicorn + + +def parse_args() -> argparse.Namespace: + """Parse command-line arguments for the program. + + :returns: A namespace containing the parsed arguments. + :rtype: argparse.Namespace + """ + parser = argparse.ArgumentParser(description="Document Retrieval Service") + + parser.add_argument( + "--help-config", action="store_true", default=False, help="show the configuration help text", + ) + + parser.add_argument( + "-c", + "--config", + metavar="CONFIGURATION_FILE", + default="/dev/null", + help="path to the configuration file (json or yaml)", + ) + parser.add_argument( + "-v", "--verbose", action="count", default=1, help="increase output verbosity", + ) + parser.add_argument( + "-q", "--quiet", action="count", default=0, help="decrease output verbosity", + ) + + parser.add_argument( + "--host", + metavar="HOSTNAME", + type=str, + default="0.0.0.0", # nosec # this is intentional + help="Bind socket to this host.", + ) + parser.add_argument( + "--port", metavar="PORT_NUM", type=int, default=8080, help="Bind socket to this port.", + ) + parser.add_argument( + "--workers", metavar="NUM_WORKERS", type=int, default=1, help="Number of worker processes.", + ) + parser.add_argument("--ssl-keyfile", metavar="SSL_KEY", type=str, default=None, help="SSL key file") + parser.add_argument( + "--ssl-certfile", metavar="SSL_CERT", type=str, default=None, help="SSL certificate file", + ) + + cliargs = parser.parse_args() + if cliargs.help_config: + # pylint: disable=import-outside-toplevel; this is intentional to allow for the environment to be configured + # before any of the application libraries are loaded. + from frontend.configuration import AppConfig + + sys.stdout.write("\nconfiguration file format:\n") + AppConfig.print_help(sys.stdout.write) + sys.exit(0) + + return cliargs + + +if __name__ == "__main__": + args = parse_args() + os.environ["APP_VERBOSITY"] = f"{args.verbose - args.quiet}" + os.environ["APP_CONFIG_FILE"] = args.config + uvicorn.run( + "frontend:main", + factory=True, + host=args.host, + port=args.port, + workers=args.workers, + ssl_keyfile=args.ssl_keyfile, + ssl_certfile=args.ssl_certfile, + ) diff --git a/RAG/src/rag_playground/speech/api.py b/RAG/src/rag_playground/speech/api.py new file mode 100644 index 00000000..96b5ec38 --- /dev/null +++ b/RAG/src/rag_playground/speech/api.py @@ -0,0 +1,65 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""This module contains the Server that will host the frontend and API.""" +import os + +import gradio as gr +from fastapi import FastAPI +from fastapi.responses import FileResponse +from fastapi.staticfiles import StaticFiles +from frontend import pages +from frontend.chat_client import ChatClient + +STATIC_DIR = os.path.join(os.path.abspath(os.path.dirname(__file__)), "static") + + +class APIServer(FastAPI): + """A class that hosts the service api. + + :cvar title: The title of the server. + :type title: str + :cvar desc: A description of the server. + :type desc: str + """ + + title = "Chat" + desc = "This service provides a sample conversation frontend flow." + + def __init__(self, client: ChatClient) -> None: + """Initialize the API server.""" + self._client = client + super().__init__(title=self.title, description=self.desc) + + def configure_routes(self) -> None: + """Configure the routes in the API Server.""" + _ = gr.mount_gradio_app( + self, blocks=pages.converse.build_page(self._client), path=f"/content{pages.converse.PATH}", + ) + _ = gr.mount_gradio_app(self, blocks=pages.kb.build_page(self._client), path=f"/content{pages.kb.PATH}",) + + @self.get("/") + async def root_redirect() -> FileResponse: + return FileResponse(os.path.join(STATIC_DIR, "converse.html")) + + @self.get("/converse") + async def converse_redirect() -> FileResponse: + return FileResponse(os.path.join(STATIC_DIR, "converse.html")) + + @self.get("/kb") + async def kb_redirect() -> FileResponse: + return FileResponse(os.path.join(STATIC_DIR, "kb.html")) + + self.mount("/", StaticFiles(directory=STATIC_DIR, html=True)) diff --git a/RetrievalAugmentedGeneration/frontend/frontend/asr_utils.py b/RAG/src/rag_playground/speech/asr_utils.py similarity index 86% rename from RetrievalAugmentedGeneration/frontend/frontend/asr_utils.py rename to RAG/src/rag_playground/speech/asr_utils.py index e707bfb2..f4cd20e5 100644 --- a/RetrievalAugmentedGeneration/frontend/frontend/asr_utils.py +++ b/RAG/src/rag_playground/speech/asr_utils.py @@ -13,18 +13,19 @@ # See the License for the specific language governing permissions and # limitations under the License. +import logging import queue from threading import Thread -import logging -import grpc -import pycountry import gradio as gr +import grpc import numpy as np +import pycountry import riva.client import riva.client.proto.riva_asr_pb2 as riva_asr import riva.client.proto.riva_asr_pb2_grpc as rasr_srv + class ASRSession: def __init__(self): self.is_first_buffer = True @@ -33,12 +34,14 @@ def __init__(self): self.response_thread = None self.transcript = "" + _LOGGER = logging.getLogger(__name__) # Obtain the ASR languages available on the Riva server ASR_LANGS = dict() grpc_auth = None + def asr_init(auth): global ASR_LANGS global grpc_auth @@ -57,11 +60,16 @@ def asr_init(auth): except grpc.RpcError as e: _LOGGER.info(e.details()) ASR_LANGS["No ASR languages available"] = "No ASR languages available" - gr.Info('The app could not find any available ASR languages. Thus, none will appear in the "ASR Language" dropdown menu. Check that you are connected to a Riva server with ASR enabled.') - _LOGGER.info('The app could not find any available ASR languages. Thus, none will appear in the "ASR Language" dropdown menu. Check that you are connected to a Riva server with ASR enabled.') + gr.Info( + 'The app could not find any available ASR languages. Thus, none will appear in the "ASR Language" dropdown menu. Check that you are connected to a Riva server with ASR enabled.' + ) + _LOGGER.info( + 'The app could not find any available ASR languages. Thus, none will appear in the "ASR Language" dropdown menu. Check that you are connected to a Riva server with ASR enabled.' + ) ASR_LANGS = dict(sorted(ASR_LANGS.items())) + def print_streaming_response(asr_session): asr_session.transcript = "" final_transcript = "" @@ -88,12 +96,14 @@ def print_streaming_response(asr_session): asr_session.transcript = rpc_error.details() return + def start_recording(audio, language, asr_session): _LOGGER.info('start_recording') asr_session.is_first_buffer = True asr_session.request_queue = queue.Queue() return "", asr_session + def stop_recording(asr_session): _LOGGER.info('stop_recording') try: @@ -103,11 +113,16 @@ def stop_recording(asr_session): pass return asr_session + def transcribe_streaming(audio, language, asr_session): _LOGGER.info('transcribe_streaming') if language == 'No ASR languages available': - gr.Info('The app cannot access ASR services. Any attempt to transcribe audio will be unsuccessful. Check that you are connected to a Riva server with ASR enabled.') - _LOGGER.info('The app cannot access ASR services. Any attempt to transcribe audio will be unsuccessful. Check that you are connected to a Riva server with ASR enabled.') + gr.Info( + 'The app cannot access ASR services. Any attempt to transcribe audio will be unsuccessful. Check that you are connected to a Riva server with ASR enabled.' + ) + _LOGGER.info( + 'The app cannot access ASR services. Any attempt to transcribe audio will be unsuccessful. Check that you are connected to a Riva server with ASR enabled.' + ) return None, None rate, data = audio if len(data.shape) > 1: diff --git a/RetrievalAugmentedGeneration/common/base.py b/RAG/src/rag_playground/speech/assets/__init__.py similarity index 50% rename from RetrievalAugmentedGeneration/common/base.py rename to RAG/src/rag_playground/speech/assets/__init__.py index 7b61a51a..5e26052c 100644 --- a/RetrievalAugmentedGeneration/common/base.py +++ b/RAG/src/rag_playground/speech/assets/__init__.py @@ -13,21 +13,26 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Base interface that all RAG examples should implement.""" +"""This module contains theming assets.""" +import os.path +from typing import Tuple -from abc import ABC, abstractmethod -from typing import Generator +import gradio as gr -class BaseExample(ABC): +_ASSET_DIR = os.path.dirname(__file__) - @abstractmethod - def llm_chain(self, context: str, question: str, num_tokens: int) -> Generator[str, None, None]: - pass - @abstractmethod - def rag_chain(self, prompt: str, num_tokens: int) -> Generator[str, None, None]: - pass +def load_theme(name: str) -> Tuple[gr.Theme, str]: + """Load a pre-defined frontend theme. - @abstractmethod - def ingest_docs(self, data_dir: str, filename: str) -> None: - pass \ No newline at end of file + :param name: The name of the theme to load. + :type name: str + :returns: A tuple containing the Gradio theme and custom CSS. + :rtype: Tuple[gr.Theme, str] + """ + theme_json_path = os.path.join(_ASSET_DIR, f"{name}-theme.json") + theme_css_path = os.path.join(_ASSET_DIR, f"{name}-theme.css") + return ( + gr.themes.Default().load(theme_json_path), + open(theme_css_path, encoding="UTF-8").read(), + ) diff --git a/RetrievalAugmentedGeneration/frontend/frontend/assets/kaizen-theme.css b/RAG/src/rag_playground/speech/assets/kaizen-theme.css similarity index 100% rename from RetrievalAugmentedGeneration/frontend/frontend/assets/kaizen-theme.css rename to RAG/src/rag_playground/speech/assets/kaizen-theme.css diff --git a/experimental/fm-asr-streaming-rag/frontend/frontend/assets/kaizen-theme.json b/RAG/src/rag_playground/speech/assets/kaizen-theme.json similarity index 100% rename from experimental/fm-asr-streaming-rag/frontend/frontend/assets/kaizen-theme.json rename to RAG/src/rag_playground/speech/assets/kaizen-theme.json diff --git a/RAG/src/rag_playground/speech/chat_client.py b/RAG/src/rag_playground/speech/chat_client.py new file mode 100644 index 00000000..21816997 --- /dev/null +++ b/RAG/src/rag_playground/speech/chat_client.py @@ -0,0 +1,177 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""The API client for the langchain-esque service.""" +import json +import logging +import mimetypes +import typing + +import requests +from frontend import tracing +from requests.exceptions import ConnectionError + +_LOGGER = logging.getLogger(__name__) + + +class ChatClient: + """A client for connecting the the lanchain-esque service.""" + + def __init__(self, server_url: str, model_name: str) -> None: + """Initialize the client.""" + self.server_url = server_url + self._model_name = model_name + self.default_model = "meta/llama3-70b-instruct" + + @property + def model_name(self) -> str: + """Return the friendly model name.""" + return self._model_name + + @tracing.instrumentation_wrapper + def search(self, carrier, prompt: str) -> typing.List[typing.Dict[str, typing.Union[str, float]]]: + """Search for relevant documents and return json data.""" + data = {"query": prompt, "top_k": 4} + headers = {**carrier, "accept": "application/json", "Content-Type": "application/json"} + url = f"{self.server_url}/search" + _LOGGER.debug("looking up documents - %s", str({"server_url": url, "post_data": data})) + + try: + with requests.post(url, headers=headers, json=data, timeout=30) as req: + req.raise_for_status() + response = req.json() + return typing.cast(typing.List[typing.Dict[str, typing.Union[str, float]]], response) + except Exception as e: + _LOGGER.error( + f"Failed to get response from /documentSearch endpoint of chain-server. Error details: {e}. Refer to chain-server logs for details." + ) + return typing.cast(typing.List[typing.Dict[str, typing.Union[str, float]]], []) + + @tracing.predict_instrumentation_wrapper + def predict( + self, carrier, query: str, use_knowledge_base: bool, num_tokens: int + ) -> typing.Generator[str, None, None]: + """Make a model prediction.""" + data = { + "messages": [{"role": "user", "content": query}], + "use_knowledge_base": use_knowledge_base, + } + url = f"{self.server_url}/generate" + _LOGGER.debug("making inference request - %s", str({"server_url": url, "post_data": data})) + + try: + with requests.post(url, stream=True, json=data, timeout=50, headers=carrier) as req: + req.raise_for_status() + for chunk in req.iter_lines(): + raw_resp = chunk.decode("UTF-8") + if not raw_resp: + continue + resp_dict = None + try: + resp_dict = json.loads(raw_resp[6:]) + resp_choices = resp_dict.get("choices", []) + if len(resp_choices): + resp_str = resp_choices[0].get("message", {}).get("content", "") + yield resp_str + else: + yield "" + except Exception as e: + raise ValueError(f"Invalid response json: {raw_resp}") from e + + except Exception as e: + _LOGGER.error( + f"Failed to get response from /generate endpoint of chain-server. Error details: {e}. Refer to chain-server logs for details." + ) + yield str( + "Failed to get response from /generate endpoint of chain-server. Check if the fastapi server in chain-server is up. Refer to chain-server logs for details." + ) + + # Send None to indicate end of response + yield None + + @tracing.instrumentation_wrapper + def upload_documents(self, carrier, file_paths: typing.List[str]) -> None: + """Upload documents to the kb.""" + url = f"{self.server_url}/documents" + headers = { + **carrier, + "accept": "application/json", + } + + try: + for fpath in file_paths: + mime_type, _ = mimetypes.guess_type(fpath) + # pylint: disable-next=consider-using-with # with pattern is not intuitive here + files = {"file": (fpath, open(fpath, "rb"), mime_type)} + + _LOGGER.debug( + "uploading file - %s", str({"server_url": url, "file": fpath}), + ) + + resp = requests.post( + url, headers=headers, files=files, timeout=600 # type: ignore [arg-type] + ) + if resp.status_code == 500: + raise ValueError(f"{resp.json().get('message', 'Failed to upload document')}") + except Exception as e: + _LOGGER.error( + f"Failed to get response from /documents endpoint of chain-server. Error details: {e}. Refer to chain-server logs for details." + ) + raise ValueError(f"{e}") + + @tracing.instrumentation_wrapper + def delete_documents(self, carrier, file_name: str) -> str: + """ Delete Selected documents""" + headers = {**carrier, "accept": "application/json", "Content-Type": "application/json"} + params = {'filename': file_name} + url = f"{self.server_url}/documents" + + try: + _LOGGER.debug(f"Delete request received for file_name: {file_name}") + with requests.delete(url, headers=headers, params=params, timeout=30) as req: + req.raise_for_status() + response = req.json() + return response + except Exception as e: + _LOGGER.error( + f"Failed to delete {file_name} using /documents endpoint of chain-server. Error details: {e}. Refer to chain-server logs for details." + ) + return "" + + @tracing.instrumentation_wrapper + def get_uploaded_documents(self, carrier) -> typing.List[str]: + """Get list of Uploaded documents.""" + url = f"{self.server_url}/documents" + headers = { + **carrier, + "accept": "application/json", + } + uploaded_files = [] + try: + resp = requests.get(url, headers=headers, timeout=600) + response = json.loads(resp.content) + if resp.status_code == 500: + raise ValueError(f"{resp.json().get('message', 'Failed to get uploaded documents')}") + else: + uploaded_files = response['documents'] + except ConnectionError as e: + # Avoid playground crash when chain server starts after rag-playground + _LOGGER.error(f"Failed to connect /documents endpoint of chain-server. Error details: {e}.") + except Exception as e: + _LOGGER.error( + f"Failed to get response from /documents endpoint of chain-server. Error details: {e}. Refer to chain-server logs for details." + ) + raise ValueError(f"{e}") + return uploaded_files diff --git a/RAG/src/rag_playground/speech/configuration.py b/RAG/src/rag_playground/speech/configuration.py new file mode 100644 index 00000000..2ae91fd8 --- /dev/null +++ b/RAG/src/rag_playground/speech/configuration.py @@ -0,0 +1,38 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""The definition of the application configuration.""" +from frontend.configuration_wizard import ConfigWizard, configclass, configfield + + +@configclass +class AppConfig(ConfigWizard): + """Configuration class for the application. + + :cvar triton: The configuration of the chat server. + :type triton: ChatConfig + :cvar model: The configuration of the model + :type triton: ModelConfig + """ + + server_url: str = configfield( + "serverUrl", default="http://localhost", help_txt="The location of the chat server.", + ) + server_port: str = configfield( + "serverPort", default="8000", help_txt="The port on which the chat server is listening for HTTP requests.", + ) + model_name: str = configfield( + "modelName", default="meta/llama3-70b-instruct", help_txt="The name of the hosted LLM model.", + ) diff --git a/RAG/src/rag_playground/speech/configuration_wizard.py b/RAG/src/rag_playground/speech/configuration_wizard.py new file mode 100644 index 00000000..5e53a6b6 --- /dev/null +++ b/RAG/src/rag_playground/speech/configuration_wizard.py @@ -0,0 +1,377 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""A module containing utilities for defining application configuration. + +This module provides a configuration wizard class that can read configuration data from YAML, JSON, and environment +variables. The configuration wizard is based heavily off of the JSON and YAML wizards from the `dataclass-wizard` +Python package. That package is in-turn based heavily off of the built-in `dataclass` module. + +This module adds Environment Variable parsing to config file reading. +""" +# pylint: disable=too-many-lines; this file is meant to be portable between projects so everything is put into one file + +import json +import logging +import os +from dataclasses import _MISSING_TYPE, dataclass +from typing import Any, Callable, Dict, List, Optional, TextIO, Tuple, Union + +import yaml +from dataclass_wizard import JSONWizard, LoadMeta, YAMLWizard, errors, fromdict, json_field +from dataclass_wizard.models import JSONField +from dataclass_wizard.utils.string_conv import to_camel_case + +configclass = dataclass(frozen=True) +ENV_BASE = "APP" +_LOGGER = logging.getLogger(__name__) + + +def configfield(name: str, *, env: bool = True, help_txt: str = "", **kwargs: Any) -> JSONField: + """Create a data class field with the specified name in JSON format. + + :param name: The name of the field. + :type name: str + :param env: Whether this field should be configurable from an environment variable. + :type env: bool + :param help_txt: The description of this field that is used in help docs. + :type help_txt: str + :param **kwargs: Optional keyword arguments to customize the JSON field. More information here: + https://dataclass-wizard.readthedocs.io/en/latest/dataclass_wizard.html#dataclass_wizard.json_field + :type **kwargs: Any + :returns: A JSONField instance with the specified name and optional parameters. + :rtype: JSONField + + :raises TypeError: If the provided name is not a string. + """ + # sanitize specified name + if not isinstance(name, str): + raise TypeError("Provided name must be a string.") + json_name = to_camel_case(name) + + # update metadata + meta = kwargs.get("metadata", {}) + meta["env"] = env + meta["help"] = help_txt + kwargs["metadata"] = meta + + # create the data class field + field = json_field(json_name, **kwargs) + return field + + +class _Color: + """A collection of colors used when writing output to the shell.""" + + # pylint: disable=too-few-public-methods; this class does not require methods. + + PURPLE = "\033[95m" + BLUE = "\033[94m" + GREEN = "\033[92m" + YELLOW = "\033[93m" + RED = "\033[91m" + BOLD = "\033[1m" + UNDERLINE = "\033[4m" + END = "\033[0m" + + +class ConfigWizard(JSONWizard, YAMLWizard): # type: ignore[misc] # dataclass-wizard doesn't provide stubs + """A configuration wizard class that can read configuration data from YAML, JSON, and environment variables.""" + + # pylint: disable=arguments-differ,arguments-renamed; this class intentionally reduces arguments for some methods. + + @classmethod + def print_help( + cls, + help_printer: Callable[[str], Any], + *, + env_parent: Optional[str] = None, + json_parent: Optional[Tuple[str, ...]] = None, + ) -> None: + """Print the help documentation for the application configuration with the provided `write` function. + + :param help_printer: The `write` function that will be used to output the data. + :param help_printer: Callable[[str], None] + :param env_parent: The name of the parent environment variable. Leave blank, used for recursion. + :type env_parent: Optional[str] + :param json_parent: The name of the parent JSON key. Leave blank, used for recursion. + :type json_parent: Optional[Tuple[str, ...]] + :returns: A list of tuples with one item per configuration value. Each item will have the environment variable + and a tuple to the path in configuration. + :rtype: List[Tuple[str, Tuple[str, ...]]] + """ + if not env_parent: + env_parent = "" + help_printer("---\n") + if not json_parent: + json_parent = () + + for ( + _, + val, + ) in ( + cls.__dataclass_fields__.items() # pylint: disable=no-member; false positive + ): # pylint: disable=no-member; member is added by dataclass. + jsonname = val.json.keys[0] + envname = jsonname.upper() + full_envname = f"{ENV_BASE}{env_parent}_{envname}" + is_embedded_config = hasattr(val.type, "envvars") + + # print the help data + indent = len(json_parent) * 2 + if is_embedded_config: + default = "" + elif not isinstance(val.default_factory, _MISSING_TYPE): + default = val.default_factory() + elif isinstance(val.default, _MISSING_TYPE): + default = "NO-DEFAULT-VALUE" + else: + default = val.default + help_printer(f"{_Color.BOLD}{' ' * indent}{jsonname}:{_Color.END} {default}\n") + + # print comments + if is_embedded_config: + indent += 2 + if val.metadata.get("help"): + help_printer(f"{' ' * indent}# {val.metadata['help']}\n") + if not is_embedded_config: + typestr = getattr(val.type, "__name__", None) or str(val.type).replace("typing.", "") + help_printer(f"{' ' * indent}# Type: {typestr}\n") + if val.metadata.get("env", True): + help_printer(f"{' ' * indent}# ENV Variable: {full_envname}\n") + # if not is_embedded_config: + help_printer("\n") + + if is_embedded_config: + new_env_parent = f"{env_parent}_{envname}" + new_json_parent = json_parent + (jsonname,) + val.type.print_help(help_printer, env_parent=new_env_parent, json_parent=new_json_parent) + + help_printer("\n") + + @classmethod + def envvars( + cls, env_parent: Optional[str] = None, json_parent: Optional[Tuple[str, ...]] = None, + ) -> List[Tuple[str, Tuple[str, ...], type]]: + """Calculate valid environment variables and their config structure location. + + :param env_parent: The name of the parent environment variable. + :type env_parent: Optional[str] + :param json_parent: The name of the parent JSON key. + :type json_parent: Optional[Tuple[str, ...]] + :returns: A list of tuples with one item per configuration value. Each item will have the environment variable, + a tuple to the path in configuration, and they type of the value. + :rtype: List[Tuple[str, Tuple[str, ...], type]] + """ + if not env_parent: + env_parent = "" + if not json_parent: + json_parent = () + output = [] + + for ( + _, + val, + ) in ( + cls.__dataclass_fields__.items() # pylint: disable=no-member; false positive + ): # pylint: disable=no-member; member is added by dataclass. + jsonname = val.json.keys[0] + envname = jsonname.upper() + full_envname = f"{ENV_BASE}{env_parent}_{envname}" + is_embedded_config = hasattr(val.type, "envvars") + + # add entry to output list + if is_embedded_config: + new_env_parent = f"{env_parent}_{envname}" + new_json_parent = json_parent + (jsonname,) + output += val.type.envvars(env_parent=new_env_parent, json_parent=new_json_parent) + elif val.metadata.get("env", True): + output += [(full_envname, json_parent + (jsonname,), val.type)] + + return output + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> "ConfigWizard": + """Create a ConfigWizard instance from a dictionary. + + :param data: The dictionary containing the configuration data. + :type data: Dict[str, Any] + :returns: A ConfigWizard instance created from the input dictionary. + :rtype: ConfigWizard + + :raises RuntimeError: If the configuration data is not a dictionary. + """ + # sanitize data + if not data: + data = {} + if not isinstance(data, dict): + raise RuntimeError("Configuration data is not a dictionary.") + + # parse env variables + for envvar in cls.envvars(): + var_name, conf_path, var_type = envvar + var_value = os.environ.get(var_name) + if var_value: + var_value = try_json_load(var_value) + update_dict(data, conf_path, var_value) + _LOGGER.debug( + "Found EnvVar Config - %s:%s = %s", var_name, str(var_type), repr(var_value), + ) + + LoadMeta(key_transform="CAMEL").bind_to(cls) + return fromdict(cls, data) # type: ignore[no-any-return] # dataclass-wizard doesn't provide stubs + + @classmethod + def from_file(cls, filepath: str) -> Optional["ConfigWizard"]: + """Load the application configuration from the specified file. + + The file must be either in JSON or YAML format. + + :returns: The fully processed configuration file contents. If the file was unreadable, None will be returned. + :rtype: Optional["ConfigWizard"] + """ + # open the file + try: + # pylint: disable-next=consider-using-with; using a with would make exception handling even more ugly + file = open(filepath, encoding="utf-8") + except FileNotFoundError: + _LOGGER.error("The configuration file cannot be found.") + file = None + except PermissionError: + _LOGGER.error("Permission denied when trying to read the configuration file.") + file = None + if not file: + return None + + # read the file + try: + data = read_json_or_yaml(file) + except ValueError as err: + _LOGGER.error( + "Configuration file must be valid JSON or YAML. The following errors occured:\n%s", str(err), + ) + data = None + config = None + finally: + file.close() + + # parse the file + if data: + try: + config = cls.from_dict(data) + except errors.MissingFields as err: + _LOGGER.error("Configuration is missing required fields: \n%s", str(err)) + config = None + except errors.ParseError as err: + _LOGGER.error("Invalid configuration value provided:\n%s", str(err)) + config = None + else: + config = cls.from_dict({}) + + return config + + +def read_json_or_yaml(stream: TextIO) -> Dict[str, Any]: + """Read a file without knowing if it is JSON or YAML formatted. + + The file will first be assumed to be JSON formatted. If this fails, an attempt to parse the file with the YAML + parser will be made. If both of these fail, an exception will be raised that contains the exception strings returned + by both the parsers. + + :param stream: An IO stream that allows seeking. + :type stream: typing.TextIO + :returns: The parsed file contents. + :rtype: typing.Dict[str, typing.Any]: + :raises ValueError: If the IO stream is not seekable or if the file doesn't appear to be JSON or YAML formatted. + """ + exceptions: Dict[str, Union[None, ValueError, yaml.error.YAMLError]] = { + "JSON": None, + "YAML": None, + } + data: Dict[str, Any] + + # ensure we can rewind the file + if not stream.seekable(): + raise ValueError("The provided stream must be seekable.") + + # attempt to read json + try: + data = json.loads(stream.read()) + except ValueError as err: + exceptions["JSON"] = err + else: + return data + finally: + stream.seek(0) + + # attempt to read yaml + try: + data = yaml.safe_load(stream.read()) + except (yaml.error.YAMLError, ValueError) as err: + exceptions["YAML"] = err + else: + return data + + # neither json nor yaml + err_msg = "\n\n".join([key + " Parser Errors:\n" + str(val) for key, val in exceptions.items()]) + raise ValueError(err_msg) + + +def try_json_load(value: str) -> Any: + """Try parsing the value as JSON and silently ignore errors. + + :param value: The value on which a JSON load should be attempted. + :type value: str + :returns: Either the parsed JSON or the provided value. + :rtype: typing.Any + """ + try: + return json.loads(value) + except json.JSONDecodeError: + return value + + +def update_dict(data: Dict[str, Any], path: Tuple[str, ...], value: Any, overwrite: bool = False,) -> None: + """Update a dictionary with a new value at a given path. + + :param data: The dictionary to be updated. + :type data: Dict[str, Any] + :param path: The path to the key that should be updated. + :type path: Tuple[str, ...] + :param value: The new value to be set at the specified path. + :type value: Any + :param overwrite: If True, overwrite the existing value. Otherwise, don't update if the key already exists. + :type overwrite: bool + :returns: None + """ + end = len(path) + target = data + for idx, key in enumerate(path, 1): + # on the last field in path, update the dict if necessary + if idx == end: + if overwrite or not target.get(key): + target[key] = value + return + + # verify the next hop exists + if not target.get(key): + target[key] = {} + + # if the next hop is not a dict, exit + if not isinstance(target.get(key), dict): + return + + # get next hop + target = target.get(key) # type: ignore[assignment] # type has already been enforced. diff --git a/RAG/src/rag_playground/speech/pages/__init__.py b/RAG/src/rag_playground/speech/pages/__init__.py new file mode 100644 index 00000000..f2b6c770 --- /dev/null +++ b/RAG/src/rag_playground/speech/pages/__init__.py @@ -0,0 +1,19 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""This module contains definitions for all the frontend pages.""" +from frontend.pages import converse, kb + +__all__ = ["converse", "kb"] diff --git a/RetrievalAugmentedGeneration/frontend/frontend/pages/converse.py b/RAG/src/rag_playground/speech/pages/converse.py similarity index 69% rename from RetrievalAugmentedGeneration/frontend/frontend/pages/converse.py rename to RAG/src/rag_playground/speech/pages/converse.py index 2a39e85b..a355e0a9 100644 --- a/RetrievalAugmentedGeneration/frontend/frontend/pages/converse.py +++ b/RAG/src/rag_playground/speech/pages/converse.py @@ -18,11 +18,10 @@ import logging import os from typing import Any, Dict, List, Tuple, Union -import riva.client import gradio as gr - -from frontend import assets, chat_client, asr_utils, tts_utils +import riva.client +from frontend import asr_utils, assets, chat_client, tts_utils _LOGGER = logging.getLogger(__name__) PATH = "/converse" @@ -40,34 +39,39 @@ # Extract environmental variables RIVA_API_URI = os.getenv("RIVA_API_URI", None) -RIVA_API_KEY = os.getenv("RIVA_API_KEY", None) -RIVA_FUNCTION_ID = os.getenv("RIVA_FUNCTION_ID", None) +NVIDIA_API_KEY = os.getenv("NVIDIA_API_KEY", None) +RIVA_ASR_FUNCTION_ID = os.getenv("RIVA_ASR_FUNCTION_ID", None) +RIVA_TTS_FUNCTION_ID = os.getenv("RIVA_TTS_FUNCTION_ID", None) # Establish a connection to the Riva server try: use_ssl = False - metadata = [] - if RIVA_API_KEY: + metadata_asr = [] + metadata_tts = [] + if NVIDIA_API_KEY: use_ssl = True - metadata.append(("authorization", "Bearer " + RIVA_API_KEY)) - if RIVA_FUNCTION_ID: + metadata_asr.append(("authorization", "Bearer " + NVIDIA_API_KEY)) + metadata_tts.append(("authorization", "Bearer " + NVIDIA_API_KEY)) + if RIVA_ASR_FUNCTION_ID: use_ssl = True - metadata.append(("function-id", RIVA_FUNCTION_ID)) - auth = riva.client.Auth( - None, use_ssl=use_ssl, - uri=RIVA_API_URI, - metadata_args=metadata - ) + metadata_asr.append(("function-id", RIVA_ASR_FUNCTION_ID)) + if RIVA_TTS_FUNCTION_ID: + use_ssl = True + metadata_tts.append(("function-id", RIVA_TTS_FUNCTION_ID)) + + auth_tts = riva.client.Auth(None, use_ssl=use_ssl, uri=RIVA_API_URI, metadata_args=metadata_tts) + auth_asr = riva.client.Auth(None, use_ssl=use_ssl, uri=RIVA_API_URI, metadata_args=metadata_asr) _LOGGER.info('Created riva.client.Auth success') except: _LOGGER.info('Error creating riva.client.Auth') + def build_page(client: chat_client.ChatClient) -> gr.Blocks: """Build the gradio page to be mounted in the frame.""" kui_theme, kui_styles = assets.load_theme("kaizen") - asr_utils.asr_init(auth) - tts_utils.tts_init(auth) + asr_utils.asr_init(auth_asr) + tts_utils.tts_init(auth_tts) with gr.Blocks(title=TITLE, theme=kui_theme, css=kui_styles + _LOCAL_CSS) as page: @@ -81,12 +85,7 @@ def build_page(client: chat_client.ChatClient) -> gr.Blocks: with gr.Row(equal_height=True): chatbot = gr.Chatbot(scale=2, label=client.model_name) latest_response = gr.Textbox(visible=False) - context = gr.JSON( - scale=1, - label="Knowledge Base Context", - visible=False, - elem_id="contextbox", - ) + context = gr.JSON(scale=1, label="Knowledge Base Context", visible=False, elem_id="contextbox",) # TTS output box # visible so that users can stop or replay playback @@ -97,34 +96,26 @@ def build_page(client: chat_client.ChatClient) -> gr.Blocks: interactive=False, streaming=True, visible=True, - show_download_button=False + show_download_button=False, ) # check boxes with gr.Row(): with gr.Column(scale=10, min_width=150): - kb_checkbox = gr.Checkbox( - label="Use knowledge base", info="", value=False - ) + kb_checkbox = gr.Checkbox(label="Use knowledge base", info="", value=False) with gr.Column(scale=10, min_width=150): - tts_checkbox = gr.Checkbox( - label="Enable TTS output", info="", value=False - ) + tts_checkbox = gr.Checkbox(label="Enable TTS output", info="", value=False) # dropdowns with gr.Accordion("ASR and TTS Settings"): with gr.Row(): asr_language_list = list(asr_utils.ASR_LANGS) asr_language_dropdown = gr.components.Dropdown( - label="ASR Language", - choices=asr_language_list, - value=asr_language_list[0], + label="ASR Language", choices=asr_language_list, value=asr_language_list[0], ) tts_language_list = list(tts_utils.TTS_MODELS) tts_language_dropdown = gr.components.Dropdown( - label="TTS Language", - choices=tts_language_list, - value=tts_language_list[0], + label="TTS Language", choices=tts_language_list, value=tts_language_list[0], ) all_voices = [] try: @@ -135,19 +126,13 @@ def build_page(client: chat_client.ChatClient) -> gr.Blocks: all_voices.append("No TTS voices available") default_voice = "No TTS voices available" tts_voice_dropdown = gr.components.Dropdown( - label="TTS Voice", - choices=all_voices, - value=default_voice, + label="TTS Voice", choices=all_voices, value=default_voice, ) # audio and text input boxes with gr.Row(): with gr.Column(scale=10, min_width=500): - msg = gr.Textbox( - show_label=False, - placeholder="Enter text and press ENTER", - container=False, - ) + msg = gr.Textbox(show_label=False, placeholder="Enter text and press ENTER", container=False,) # For (at least) Gradio 3.39.0 and lower, the first argument # in the list below is named `source`. If not None, it must # be a single string, namely either "upload" or "microphone". @@ -193,50 +178,27 @@ def _toggle_context(btn: str) -> Dict[gr.component, Dict[Any, Any]]: # form actions _my_build_stream = functools.partial(_stream_predict, client) - msg.submit( - _my_build_stream, [kb_checkbox, msg, chatbot], [msg, chatbot, context, latest_response] - ) - submit_btn.click( - _my_build_stream, [kb_checkbox, msg, chatbot], [msg, chatbot, context, latest_response] - ) + msg.submit(_my_build_stream, [kb_checkbox, msg, chatbot], [msg, chatbot, context, latest_response]) + submit_btn.click(_my_build_stream, [kb_checkbox, msg, chatbot], [msg, chatbot, context, latest_response]) tts_language_dropdown.change( - tts_utils.update_voice_dropdown, - [tts_language_dropdown], - [tts_voice_dropdown], - api_name=False + tts_utils.update_voice_dropdown, [tts_language_dropdown], [tts_voice_dropdown], api_name=False ) audio_mic.start_recording( - asr_utils.start_recording, - [audio_mic, asr_language_dropdown, state], - [msg, state], - api_name=False, - ) - audio_mic.stop_recording( - asr_utils.stop_recording, - [state], - [state], - api_name=False + asr_utils.start_recording, [audio_mic, asr_language_dropdown, state], [msg, state], api_name=False, ) + audio_mic.stop_recording(asr_utils.stop_recording, [state], [state], api_name=False) audio_mic.stream( - asr_utils.transcribe_streaming, - [audio_mic, asr_language_dropdown, state], - [msg, state], - api_name=False - ) - audio_mic.clear( - lambda: "", - [], - [msg], - api_name=False + asr_utils.transcribe_streaming, [audio_mic, asr_language_dropdown, state], [msg, state], api_name=False ) + audio_mic.clear(lambda: "", [], [msg], api_name=False) latest_response.change( tts_utils.text_to_speech, [latest_response, tts_language_dropdown, tts_voice_dropdown, tts_checkbox], [output_audio], - api_name=False + api_name=False, ) page.queue() @@ -244,22 +206,18 @@ def _toggle_context(btn: str) -> Dict[gr.component, Dict[Any, Any]]: def _stream_predict( - client: chat_client.ChatClient, - use_knowledge_base: bool, - question: str, - chat_history: List[Tuple[str, str]], + client: chat_client.ChatClient, use_knowledge_base: bool, question: str, chat_history: List[Tuple[str, str]], ) -> Any: """Make a prediction of the response to the prompt.""" chunks = "" chat_history = chat_history or [] _LOGGER.info( - "processing inference request - %s", - str({"prompt": question, "use_knowledge_base": use_knowledge_base}), + "processing inference request - %s", str({"prompt": question, "use_knowledge_base": use_knowledge_base}), ) documents: Union[None, List[Dict[str, Union[str, float]]]] = None if use_knowledge_base: - documents = client.search(prompt = question) + documents = client.search(prompt=question) for chunk in client.predict(query=question, use_knowledge_base=use_knowledge_base, num_tokens=OUTPUT_TOKENS): if chunk: diff --git a/RAG/src/rag_playground/speech/pages/kb.py b/RAG/src/rag_playground/speech/pages/kb.py new file mode 100644 index 00000000..94e93666 --- /dev/null +++ b/RAG/src/rag_playground/speech/pages/kb.py @@ -0,0 +1,115 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""This module contains the frontend gui for chat.""" +import os +from functools import partial +from pathlib import Path +from typing import List + +import gradio as gr +from frontend import assets, chat_client + +PATH = "/kb" +TITLE = "Knowledge Base Management" +STATE_FILE = '/tmp/uploaded_files.txt' + + +def build_page(client: chat_client.ChatClient) -> gr.Blocks: + """Buiild the gradio page to be mounted in the frame.""" + kui_theme, kui_styles = assets.load_theme("kaizen") + + with gr.Blocks(title=TITLE, theme=kui_theme, css=kui_styles) as page: + # create the page header + gr.Markdown(f"# {TITLE}") + + with gr.Row(): + upload_button = gr.UploadButton("Add File", file_types=["pdf"], file_count="multiple") + with gr.Row(): + file_output = gr.File() + + with gr.Row(): + files_df = gr.Dataframe( + headers=["File Uploaded"], + datatype=["str"], + col_count=(1, "fixed"), + value=lambda: get_uploaded_files(client), + every=5, + ) + + with gr.Row(): + buffer_textbox = gr.Textbox(interactive=False, visible=False) + message_textbox = gr.Textbox(label="Message", interactive=False, visible=True) + + with gr.Row(): + delete_button = gr.Button("Delete") + + # form actions + # Upload dutton action + upload_button.upload(lambda files: upload_file(files, client), upload_button, file_output) + + # Files dataframe action + files_df.select(return_selected_file, inputs=[files_df], outputs=[buffer_textbox]) + + # Delete button action + partial_delete_file = partial(delete_file, client=client) + delete_button.click(fn=partial_delete_file, inputs=buffer_textbox, outputs=message_textbox) + + page.queue() + return page + + +def delete_file(input_text, client: chat_client.ChatClient): + """Deletes selected files from knowledge base using client""" + + try: + response = client.delete_documents(file_name=input_text) + return response + except Exception as e: + raise gr.Error(f"{e}") + + +def return_selected_file(selected_index: gr.SelectData, dataframe): + """Returns selected files from DataFrame""" + if selected_index: + val = dataframe.iloc[selected_index.index[0]] + dataframe = dataframe.drop(selected_index.index[0]) + return val.iloc[0] + + +def upload_file(files: List[Path], client: chat_client.ChatClient) -> List[str]: + """Use the client to upload a file to the knowledge base.""" + try: + file_paths = [file.name for file in files] + client.upload_documents(file_paths=file_paths) + + # Save the uploaded file names to the state file + with open(STATE_FILE, 'a') as file: + for file_path in file_paths: + file_path = os.path.basename(file_path) + file.write(file_path + '\n') + + return file_paths + except Exception as e: + raise gr.Error(f"{e}") + + +def get_uploaded_files(client: chat_client.ChatClient) -> List[str]: + """Load previously uploaded files if the file exists""" + uploaded_files = [["No Files uploaded"]] + resp = client.get_uploaded_documents() + if len(resp) > 0: + uploaded_files = [[file] for file in resp] + return uploaded_files diff --git a/RAG/src/rag_playground/speech/static/404.html b/RAG/src/rag_playground/speech/static/404.html new file mode 100644 index 00000000..bafa01be --- /dev/null +++ b/RAG/src/rag_playground/speech/static/404.html @@ -0,0 +1 @@ +

\ No newline at end of file diff --git a/RAG/src/rag_playground/speech/static/_next/static/WuNGAl0x4o1D5HqLxhHMt/_buildManifest.js b/RAG/src/rag_playground/speech/static/_next/static/WuNGAl0x4o1D5HqLxhHMt/_buildManifest.js new file mode 100644 index 00000000..9556320b --- /dev/null +++ b/RAG/src/rag_playground/speech/static/_next/static/WuNGAl0x4o1D5HqLxhHMt/_buildManifest.js @@ -0,0 +1 @@ +self.__BUILD_MANIFEST=function(e){return{__rewrites:{beforeFiles:[],afterFiles:[],fallback:[]},"/":["static/chunks/pages/index-1a1d31dae38463f7.js"],"/_error":["static/chunks/pages/_error-54de1933a164a1ff.js"],"/converse":[e,"static/chunks/pages/converse-61880f01babd873a.js"],"/kb":[e,"static/chunks/pages/kb-cf0d102293dc0a74.js"],sortedPages:["/","/_app","/_error","/converse","/kb"]}}("static/chunks/78-a36dca5d49fafb86.js"),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB(); \ No newline at end of file diff --git a/experimental/fm-asr-streaming-rag/frontend/frontend/static/_next/static/ZuyLfTn0WWGPn0wKTmN0V/_ssgManifest.js b/RAG/src/rag_playground/speech/static/_next/static/WuNGAl0x4o1D5HqLxhHMt/_ssgManifest.js similarity index 100% rename from experimental/fm-asr-streaming-rag/frontend/frontend/static/_next/static/ZuyLfTn0WWGPn0wKTmN0V/_ssgManifest.js rename to RAG/src/rag_playground/speech/static/_next/static/WuNGAl0x4o1D5HqLxhHMt/_ssgManifest.js diff --git a/RAG/src/rag_playground/speech/static/_next/static/chunks/78-a36dca5d49fafb86.js b/RAG/src/rag_playground/speech/static/_next/static/chunks/78-a36dca5d49fafb86.js new file mode 100644 index 00000000..c26ec333 --- /dev/null +++ b/RAG/src/rag_playground/speech/static/_next/static/chunks/78-a36dca5d49fafb86.js @@ -0,0 +1 @@ +(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[78],{6649:function(e,n,t){"use strict";var i,o,r=t(5697),a=t.n(r),s=t(7294);function c(){return(c=Object.assign||function(e){for(var n=1;n=0||(o[t]=e[t]);return o}var u=(i=o={exports:{}},o.exports,function(e){if("undefined"!=typeof window){var n,t=0,o=!1,r=!1,a=7,s="[iFrameSizer]",c=s.length,d=null,u=window.requestAnimationFrame,l={max:1,scroll:1,bodyScroll:1,documentElementScroll:1},f={},m=null,g={autoResize:!0,bodyBackground:null,bodyMargin:null,bodyMarginV1:8,bodyPadding:null,checkOrigin:!0,inPageLinks:!1,enablePublicMethods:!0,heightCalculationMethod:"bodyOffset",id:"iFrameResizer",interval:32,log:!1,maxHeight:1/0,maxWidth:1/0,minHeight:0,minWidth:0,resizeFrom:"parent",scrolling:!1,sizeHeight:!0,sizeWidth:!1,warningTimeout:5e3,tolerance:0,widthCalculationMethod:"scroll",onClose:function(){return!0},onClosed:function(){},onInit:function(){},onMessage:function(){z("onMessage function not defined")},onMouseEnter:function(){},onMouseLeave:function(){},onResized:function(){},onScroll:function(){return!0}},h={};window.jQuery&&((n=window.jQuery).fn?n.fn.iFrameResize||(n.fn.iFrameResize=function(e){return this.filter("iframe").each(function(n,t){S(t,e)}).end()}):M("","Unable to bind to jQuery, it is not fully loaded.")),"function"==typeof e&&e.amd?e([],A):i.exports=A(),window.iFrameResize=window.iFrameResize||A()}function p(){return window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver}function w(e,n,t){e.addEventListener(n,t,!1)}function b(e,n,t){e.removeEventListener(n,t,!1)}function y(e){return f[e]?f[e].log:o}function v(e,n){k("log",e,n,y(e))}function M(e,n){k("info",e,n,y(e))}function z(e,n){k("warn",e,n,!0)}function k(e,n,t,i){if(!0===i&&"object"==typeof window.console){var o;console[e](s+"["+(o="Host page: "+n,window.top!==window.self&&(o=window.parentIFrame&&window.parentIFrame.getId?window.parentIFrame.getId()+": "+n:"Nested host page: "+n),o)+"]",t)}}function x(e){function n(){t("Height"),t("Width"),W(function(){var e;C(L),T(A),R(A,"onResized",L)},L,"init")}function t(e){var n=Number(f[A]["max"+e]),t=Number(f[A]["min"+e]),i=e.toLowerCase(),o=Number(L[i]);v(A,"Checking "+i+" is in range "+t+"-"+n),on&&(o=n,v(A,"Set "+i+" to max value")),L[i]=""+o}function i(e){return j.substr(j.indexOf(":")+a+e)}function o(e,n){var t;t=function(){var t,i;P("Send Page Info","pageInfo:"+(t=document.body.getBoundingClientRect(),JSON.stringify({iframeHeight:(i=L.iframe.getBoundingClientRect()).height,iframeWidth:i.width,clientHeight:Math.max(document.documentElement.clientHeight,window.innerHeight||0),clientWidth:Math.max(document.documentElement.clientWidth,window.innerWidth||0),offsetTop:parseInt(i.top-t.top,10),offsetLeft:parseInt(i.left-t.left,10),scrollTop:window.pageYOffset,scrollLeft:window.pageXOffset,documentHeight:document.documentElement.clientHeight,documentWidth:document.documentElement.clientWidth,windowHeight:window.innerHeight,windowWidth:window.innerWidth})),e,n)},h[n]||(h[n]=setTimeout(function(){h[n]=null,t()},32))}function r(e){var n=e.getBoundingClientRect();return F(A),{x:Math.floor(Number(n.left)+Number(d.x)),y:Math.floor(Number(n.top)+Number(d.y))}}function u(e){var n=e?r(L.iframe):{x:0,y:0},t={x:Number(L.width)+n.x,y:Number(L.height)+n.y};v(A,"Reposition requested from iFrame (offset x:"+n.x+" y:"+n.y+")"),window.top!==window.self?window.parentIFrame?window.parentIFrame["scrollTo"+(e?"Offset":"")](t.x,t.y):z(A,"Unable to scroll to requested position, window.parentIFrame not found"):(d=t,l(),v(A,"--"))}function l(){var e;!1!==R(A,"onScroll",d)?T(A):d=null}function m(e){var n;R(A,e,{iframe:L.iframe,screenX:L.width,screenY:L.height,type:L.type})}var g,p,y,k,x,I,S,N,j=e.data,L={},A=null;"[iFrameResizerChild]Ready"===j?!function(){for(var e in f)P("iFrame requested init",H(e),f[e].iframe,e)}():s===(""+j).substr(0,c)&&j.substr(c).split(":")[0]in f?(p=(g=j.substr(c).split(":"))[1]?parseInt(g[1],10):0,y=f[g[0]]&&f[g[0]].iframe,k=getComputedStyle(y),f[A=(L={iframe:y,id:g[0],height:p+("border-box"!==k.boxSizing?0:(k.paddingTop?parseInt(k.paddingTop,10):0)+(k.paddingBottom?parseInt(k.paddingBottom,10):0))+("border-box"!==k.boxSizing?0:(k.borderTopWidth?parseInt(k.borderTopWidth,10):0)+(k.borderBottomWidth?parseInt(k.borderBottomWidth,10):0)),width:g[2],type:g[3]}).id]&&(f[A].loaded=!0),(x=L.type in{true:1,false:1,undefined:1})&&v(A,"Ignoring init message from meta parent page"),!x&&(S=!0,f[I=A]||(S=!1,z(L.type+" No settings for "+I+". Message was: "+j)),S)&&(v(A,"Received: "+j),N=!0,null===L.iframe&&(z(A,"IFrame ("+L.id+") not found"),N=!1),N&&function(){var n,t=e.origin,i=f[A]&&f[A].checkOrigin;if(i&&""+t!="null"&&!(i.constructor===Array?function(){var e=0,n=!1;for(v(A,"Checking connection is from allowed list of origins: "+i);ef[c]["max"+e])throw Error("Value for min"+e+" can not be greater than max"+e)}t("Height"),t("Width"),e("maxHeight"),e("minHeight"),e("maxWidth"),e("minWidth")}(),("number"==typeof(f[c]&&f[c].bodyMargin)||"0"===(f[c]&&f[c].bodyMargin))&&(f[c].bodyMarginV1=f[c].bodyMargin,f[c].bodyMargin=""+f[c].bodyMargin+"px"),a=H(c),(s=p())&&n.parentNode&&new s(function(e){e.forEach(function(e){Array.prototype.slice.call(e.removedNodes).forEach(function(e){e===n&&O(n)})})}).observe(n.parentNode,{childList:!0}),w(n,"load",function(){var t,i;P("iFrame.onload",a,n,e,!0),t=f[c]&&f[c].firstRun,i=f[c]&&f[c].heightCalculationMethod in l,!t&&i&&E({iframe:n,height:0,width:0,type:"init"})}),P("init",a,n,e,!0),f[c]&&(f[c].iframe.iFrameResizer={close:O.bind(null,f[c].iframe),removeListeners:I.bind(null,f[c].iframe),resize:P.bind(null,"Window resize","resize",f[c].iframe),moveToAnchor:function(e){P("Move to anchor","moveToAnchor:"+e,f[c].iframe,c)},sendMessage:function(e){P("Send Message","message:"+(e=JSON.stringify(e)),f[c].iframe,c)}}))}function N(e,n){null===m&&(m=setTimeout(function(){m=null,e()},n))}function j(){"hidden"!==document.visibilityState&&(v("document","Trigger event: Visiblity change"),N(function(){L("Tab Visable","resize")},16))}function L(e,n){Object.keys(f).forEach(function(t){f[t]&&"parent"===f[t].resizeFrom&&f[t].autoResize&&!f[t].firstRun&&P(e,n,f[t].iframe,t)})}function A(){var n;function t(e,t){t&&(function(){if(t.tagName){if("IFRAME"!==t.tagName.toUpperCase())throw TypeError("Expected