diff --git a/docs/docs/Components/components-rag.md b/docs/docs/Components/components-rag.md new file mode 100644 index 000000000..d39eef27c --- /dev/null +++ b/docs/docs/Components/components-rag.md @@ -0,0 +1,31 @@ +--- +title: RAG +sidebar_position: 9 +slug: /components-rag +--- + +RAG (Retrieval-Augmented Generation) components process a user query by retrieving relevant documents and generating a concise summary that addresses the user's question. + + +### Vectara + + + `Vectara` performs RAG using a Vectara corpus, including document retrieval, reranking results, and summary generation. + + + **Parameters:** + + - **Vectara Customer ID:** Customer ID. + - **Vectara Corpus ID:** Corpus ID. + - **Vectara API Key:** API key. + - **Search Query:** User query. + - **Lexical Interpolation:** How much to weigh lexical vs. embedding scores. + - **Metadata Filters:** Filters to narrow down the search documents and parts. + - **Reranker Type:** How to rerank the retrieved results. + - **Number of Results to Rerank:** Maximum reranked results. + - **Diversity Bias:** How much to diversify retrieved results (only for MMR reranker). + - **Max Results to Summarize:** Maximum search results to provide to summarizer. + - **Response Language:** The language code (use ISO 639-1 or 639-3 codes) of the summary. + - **Prompt Name:** The summarizer prompt. + + For more information, consult the [Vectara documentation](https://docs.vectara.com/docs) diff --git a/docs/docs/Integrations/integrations-langwatch.mdx b/docs/docs/Integrations/integrations-langwatch.mdx new file mode 100644 index 000000000..8060ad480 --- /dev/null +++ b/docs/docs/Integrations/integrations-langwatch.mdx @@ -0,0 +1,46 @@ +import Admonition from "@theme/Admonition"; +import ThemedImage from "@theme/ThemedImage"; +import useBaseUrl from "@docusaurus/useBaseUrl"; +import ZoomableImage from "/src/theme/ZoomableImage.js"; + +# LangWatch + +LangWatch is an all-in-one LLMOps platform for monitoring, observability, analytics, evaluations and alerting for getting user insights and improve your LLM workflows. + +To integrate with Langflow, just add your LangWatch API as a Langflow environment variable and you are good to go! + +## Step-by-step Configuration + +1. Obtain your LangWatch API key from https://app.langwatch.com/ +2. Add the following key to Langflow .env file: + +```bash +LANGWATCH_API_KEY="your-api-key" +``` + +or export it in your terminal: + +```bash +export LANGWATCH_API_KEY="your-api-key" +``` + +3. Restart Langflow using `langflow run --env-file .env` +4. Run any project and check the LangWatch dashboard for monitoring and observability. + + + + diff --git a/poetry.lock b/poetry.lock index 0ab430b5f..64d52e6cd 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1332,6 +1332,17 @@ files = [ {file = "coolname-2.2.0.tar.gz", hash = "sha256:6c5d5731759104479e7ca195a9b64f7900ac5bead40183c09323c7d0be9e75c7"}, ] +[[package]] +name = "coolname" +version = "2.2.0" +description = "Random name and slug generator" +optional = false +python-versions = "*" +files = [ + {file = "coolname-2.2.0-py2.py3-none-any.whl", hash = "sha256:4d1563186cfaf71b394d5df4c744f8c41303b6846413645e31d31915cdeb13e8"}, + {file = "coolname-2.2.0.tar.gz", hash = "sha256:6c5d5731759104479e7ca195a9b64f7900ac5bead40183c09323c7d0be9e75c7"}, +] + [[package]] name = "couchbase" version = "4.3.0" @@ -2707,8 +2718,8 @@ files = [ [package.dependencies] cffi = {version = ">=1.12.2", markers = "platform_python_implementation == \"CPython\" and sys_platform == \"win32\""} greenlet = [ - {version = ">=3.0rc3", markers = "platform_python_implementation == \"CPython\" and python_version >= \"3.11\""}, {version = ">=2.0.0", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.11\""}, + {version = ">=3.0rc3", markers = "platform_python_implementation == \"CPython\" and python_version >= \"3.11\""}, ] "zope.event" = "*" "zope.interface" = "*" @@ -2867,12 +2878,12 @@ files = [ google-auth = ">=2.14.1,<3.0.dev0" googleapis-common-protos = ">=1.56.2,<2.0.dev0" grpcio = [ - {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, {version = ">=1.33.2,<2.0dev", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, + {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, ] grpcio-status = [ - {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, + {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, ] proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" @@ -5220,8 +5231,8 @@ psutil = ">=5.9.1" pywin32 = {version = "*", markers = "platform_system == \"Windows\""} pyzmq = ">=25.0.0" requests = [ - {version = ">=2.32.2", markers = "python_version > \"3.11\""}, {version = ">=2.26.0", markers = "python_version <= \"3.11\""}, + {version = ">=2.32.2", markers = "python_version > \"3.11\""}, ] tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.11\""} @@ -6826,9 +6837,9 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, {version = ">=1.22.4", markers = "python_version < \"3.11\""}, {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" diff --git a/src/backend/base/langflow/components/vectorstores/vectara_rag.py b/src/backend/base/langflow/components/vectorstores/vectara_rag.py new file mode 100644 index 000000000..10ea8c192 --- /dev/null +++ b/src/backend/base/langflow/components/vectorstores/vectara_rag.py @@ -0,0 +1,127 @@ +from langflow.custom import Component +from langflow.field_typing.range_spec import RangeSpec +from langflow.io import DropdownInput, FloatInput, IntInput, MessageTextInput, Output +from langflow.schema.message import Message + + +class VectaraRagComponent(Component): + display_name = "Vectara RAG" + description = "Vectara's full end to end RAG" + documentation = "https://docs.vectara.com/docs" + icon = "Vectara" + name = "VectaraRAG" + SUMMARIZER_PROMPTS = [ + "vectara-summary-ext-24-05-sml", + "vectara-summary-ext-24-05-med-omni", + "vectara-summary-ext-24-05-large", + "vectara-summary-ext-24-05-med", + "vectara-summary-ext-v1.3.0", + ] + + RERANKER_TYPES = ["mmr", "rerank_multilingual_v1", "none"] + + field_order = ["vectara_customer_id", "vectara_corpus_id", "vectara_api_key", "search_query", "reranker"] + # return { + # "vectara_customer_id": {"display_name": "Vectara Customer ID", "field_type": "str", "required": True}, + # "vectara_corpus_id": {"display_name": "Vectara Corpus ID", "field_type": "str", "required": True}, + # "vectara_api_key": {"display_name": "Vectara API Key", "field_type": "str", "required": True}, + # "search_query": {"display_name": "Search Query", "field_type": "str", "info": "The query to receive an answer on.", "required": True}, + # "lexical_interpolation": {"display_name": "Hybrid Search Factor", "field_type": "float", "value": 0.005, "info": "How much to weigh lexical scores compared to the embedding score. 0 means lexical search is not used at all, and 1 means only lexical search is used.", "advanced": True}, + # "filter": {"display_name": "Metadata Filters", "field_type": "str", "value": '', "info": "The filter string to narrow the search to according to metadata attributes.", "advanced": True}, + # "reranker": {"display_name": "Reranker Type", "options": RERANKER_TYPES, "value": RERANKER_TYPES[0], "info": "How to rerank the retrieved search results."}, + # "reranker_k": {"display_name": "Number of Results to Rerank", "field_type": "int", "value": 50, "advanced": True}, + # "diversity_bias": {"display_name": "Diversity Bias", "field_type": "float", "value": 0.2, "info": "Ranges from 0 to 1, with higher values indicating greater diversity (only applies to MMR reranker).", "advanced": True}, + # "max_results": {"display_name": "Max Results to Summarize", "field_type": "int", "value": 7, "info": "The maximum number of search results to be available to the prompt.", "advanced": True}, + # "response_lang": {"display_name": "Response Language", "field_type": "str", "value": "eng", "info": "Use the ISO 639-1 or 639-3 language code or auto to automatically detect the language.", "advanced": True}, + # "prompt": {"display_name": "Prompt Name", "options": SUMMARIZER_PROMPTS, "value": SUMMARIZER_PROMPTS[0], "info": "Only vectara-summary-ext-24-05-sml is for Growth customers; all other prompts are for Scale customers only.", "advanced": True} + # } + + inputs = [ + MessageTextInput(name="search_query", display_name="Search Query", info="The query to receive an answer on."), + FloatInput( + name="lexical_interpolation", + display_name="Hybrid Search Factor", + range_spec=RangeSpec(min=0.005, max=0.1, step=0.005), + value=0.005, + info="How much to weigh lexical scores compared to the embedding score. 0 means lexical search is not used at all, and 1 means only lexical search is used.", + ), + MessageTextInput( + name="filter", + display_name="Metadata Filters", + value="", + info="The filter string to narrow the search to according to metadata attributes.", + ), + DropdownInput( + name="reranker", + display_name="Reranker Type", + options=RERANKER_TYPES, + value=RERANKER_TYPES[0], + info="How to rerank the retrieved search results.", + ), + IntInput( + name="reranker_k", + display_name="Number of Results to Rerank", + value=50, + range_spec=RangeSpec(min=1, max=100, step=1), + ), + FloatInput( + name="diversity_bias", + display_name="Diversity Bias", + value=0.2, + range_spec=RangeSpec(min=0, max=1, step=0.01), + info="Ranges from 0 to 1, with higher values indicating greater diversity (only applies to MMR reranker).", + ), + IntInput( + name="max_results", + display_name="Max Results to Summarize", + value=7, + range_spec=RangeSpec(min=1, max=100, step=1), + ), + DropdownInput( + name="response_lang", + display_name="Response Language", + options=["auto", "eng", "deu", "fra", "ita", "nld", "por", "rus", "spa", "zho"], + value="eng", + info="Use the ISO 639-1 or 639-3 language code or auto to automatically detect the language.", + ), + DropdownInput( + name="prompt", + display_name="Prompt Name", + options=SUMMARIZER_PROMPTS, + value=SUMMARIZER_PROMPTS[0], + info="Only vectara-summary-ext-24-05-sml is for Growth customers; all other prompts are for Scale customers only.", + ), + ] + + outputs = [ + Output(name="answer", display_name="Answer", method="generate_response"), + ] + + def generate_response( + self, + ) -> Message: + text_output = "" + + try: + from langchain_community.vectorstores import Vectara + from langchain_community.vectorstores.vectara import RerankConfig, SummaryConfig, VectaraQueryConfig + except ImportError: + raise ImportError("Could not import Vectara. Please install it with `pip install langchain-community`.") + + vectara = Vectara(self.vectara_customer_id, self.vectara_corpus_id, self.vectara_api_key) + rerank_config = RerankConfig(self.reranker, self.reranker_k, self.diversity_bias) + summary_config = SummaryConfig( + is_enabled=True, max_results=self.max_results, response_lang=self.response_lang, prompt_name=self.prompt + ) + config = VectaraQueryConfig( + lambda_val=self.lexical_interpolation, + filter=self.filter, + summary_config=summary_config, + rerank_config=rerank_config, + ) + rag = vectara.as_rag(config) + response = rag.invoke(self.search_query) + + text_output = response["answer"] + + return Message(text=text_output) diff --git a/src/backend/base/langflow/graph/graph/base.py b/src/backend/base/langflow/graph/graph/base.py index 903eb9674..76516c14b 100644 --- a/src/backend/base/langflow/graph/graph/base.py +++ b/src/backend/base/langflow/graph/graph/base.py @@ -1013,7 +1013,7 @@ class Graph: next_runnable_vertices.remove(v_id) else: self.run_manager.add_to_vertices_being_run(next_v_id) - if cache: + if cache and self.flow_id: set_cache_coro = partial(get_chat_service().set_cache, key=self.flow_id) await set_cache_coro(self, lock) return next_runnable_vertices diff --git a/src/backend/base/langflow/services/tracing/base.py b/src/backend/base/langflow/services/tracing/base.py index 5da28f744..3d2c06cef 100644 --- a/src/backend/base/langflow/services/tracing/base.py +++ b/src/backend/base/langflow/services/tracing/base.py @@ -1,6 +1,7 @@ from abc import ABC, abstractmethod from typing import TYPE_CHECKING, Any, Dict, Optional from uuid import UUID + from langflow.services.tracing.schema import Log if TYPE_CHECKING: diff --git a/src/backend/base/poetry.lock b/src/backend/base/poetry.lock index 6d8026116..67f031f3a 100644 --- a/src/backend/base/poetry.lock +++ b/src/backend/base/poetry.lock @@ -1850,17 +1850,6 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] -[[package]] -name = "nanoid" -version = "2.0.0" -description = "A tiny, secure, URL-friendly, unique string ID generator for Python" -optional = false -python-versions = "*" -files = [ - {file = "nanoid-2.0.0-py3-none-any.whl", hash = "sha256:90aefa650e328cffb0893bbd4c236cfd44c48bc1f2d0b525ecc53c3187b653bb"}, - {file = "nanoid-2.0.0.tar.gz", hash = "sha256:5a80cad5e9c6e9ae3a41fa2fb34ae189f7cb420b2a5d8f82bd9d23466e4efa68"}, -] - [[package]] name = "nest-asyncio" version = "1.6.0"