From 469481f4522e921547806d5766abcab5b4cb2ca6 Mon Sep 17 00:00:00 2001 From: dusvyat <13661123+dusvyat@users.noreply.github.com> Date: Thu, 18 Apr 2024 13:42:25 +0300 Subject: [PATCH 1/5] Update default params and handle missing embedding args The default chunk size and overlap values in file_handler have been increased for better performance. In langchain_handler, checks have been added to use the same provider and model for embeddings if 'embedding_model_args' are not provided in input params. Skill_tool's retriever_config has been renamed to 'config' for clarity. --- .../handlers/file_handler/file_handler.py | 4 ++-- .../langchain_handler/langchain_handler.py | 15 ++++++++++++++- mindsdb/interfaces/skills/skill_tool.py | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/mindsdb/integrations/handlers/file_handler/file_handler.py b/mindsdb/integrations/handlers/file_handler/file_handler.py index 29620871182..ce4396318b0 100644 --- a/mindsdb/integrations/handlers/file_handler/file_handler.py +++ b/mindsdb/integrations/handlers/file_handler/file_handler.py @@ -26,8 +26,8 @@ logger = log.getLogger(__name__) -DEFAULT_CHUNK_SIZE = 200 -DEFAULT_CHUNK_OVERLAP = 50 +DEFAULT_CHUNK_SIZE = 500 +DEFAULT_CHUNK_OVERLAP = 100 def clean_cell(val): diff --git a/mindsdb/integrations/handlers/langchain_handler/langchain_handler.py b/mindsdb/integrations/handlers/langchain_handler/langchain_handler.py index 8f2c0dab030..1e846ec2850 100644 --- a/mindsdb/integrations/handlers/langchain_handler/langchain_handler.py +++ b/mindsdb/integrations/handlers/langchain_handler/langchain_handler.py @@ -212,8 +212,21 @@ def create_agent(self, df: pd.DataFrame, args: Dict=None, pred_args: Dict=None) # Set up embeddings model if needed. if args.get('mode') == 'retrieval': - # get args for embeddings model + embeddings_args = args.pop('embedding_model_args', {}) + + # no embedding model args provided, use same provider as llm + if not embeddings_args: + logger.warning("'embedding_model_args' not found in input params, " + "Trying to use the same provider and model as used for llm. " + f"provider: {args['provider']}" + f"model: {args['model_name']}" + ) + + # get args for embeddings model + embeddings_args['class'] = args['provider'] + embeddings_args['model'] = args['model_name'] + # create embeddings model pred_args['embeddings_model'] = self._create_embeddings_model(embeddings_args) pred_args['llm'] = llm diff --git a/mindsdb/interfaces/skills/skill_tool.py b/mindsdb/interfaces/skills/skill_tool.py index db621b286f3..f8d44a976de 100644 --- a/mindsdb/interfaces/skills/skill_tool.py +++ b/mindsdb/interfaces/skills/skill_tool.py @@ -84,7 +84,7 @@ def _make_retrieval_tools(self, skill: db.Skills) -> dict: params = skill.params return dict( name=params.get('name', skill.name), - config=params.get('retriever_config', {}), + config=params.get('config', {}), description=f'You must use this tool to get more context or information ' f'to answer a question about {params["description"]}. ' f'The input should be the exact question the user is asking.', From c12c24299cfdbee3946753f4e3e08227357e183c Mon Sep 17 00:00:00 2001 From: dusvyat <13661123+dusvyat@users.noreply.github.com> Date: Thu, 18 Apr 2024 14:15:47 +0300 Subject: [PATCH 2/5] Handle invoke errors in langchain_handler This update modifies the langchain handler to accommodate errors during the invocation process. Specifically, it implements exception handling for the agent_executor's invoke method. If an error occurs, instead of crashing, it will now return the error message. However, if the error doesn't match a specific format, the exception will still be raised. --- .../handlers/langchain_handler/langchain_handler.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/mindsdb/integrations/handlers/langchain_handler/langchain_handler.py b/mindsdb/integrations/handlers/langchain_handler/langchain_handler.py index 1e846ec2850..c5c0a248414 100644 --- a/mindsdb/integrations/handlers/langchain_handler/langchain_handler.py +++ b/mindsdb/integrations/handlers/langchain_handler/langchain_handler.py @@ -304,8 +304,13 @@ def run_agent(self, df: pd.DataFrame, agent: AgentExecutor, args: Dict, pred_arg def _invoke_agent_executor_with_prompt(agent_executor, prompt): if not prompt: return '' - - answer = agent_executor.invoke(prompt) + try: + answer = agent_executor.invoke(prompt) + except Exception as e: + answer = str(e) + if not answer.startswith("Could not parse LLM output: `"): + raise e + answer = {'output': answer.removeprefix("Could not parse LLM output: `").removesuffix("`")} if 'output' not in answer: # This should never happen unless Langchain changes invoke output format, but just in case. From 63ca0e654697eca275804d014a40e61ea9db7ca2 Mon Sep 17 00:00:00 2001 From: Daniel Usvyat Date: Thu, 18 Apr 2024 15:30:53 +0300 Subject: [PATCH 3/5] Update file_handler.py --- mindsdb/integrations/handlers/file_handler/file_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mindsdb/integrations/handlers/file_handler/file_handler.py b/mindsdb/integrations/handlers/file_handler/file_handler.py index ce4396318b0..7fde864b932 100644 --- a/mindsdb/integrations/handlers/file_handler/file_handler.py +++ b/mindsdb/integrations/handlers/file_handler/file_handler.py @@ -27,7 +27,7 @@ logger = log.getLogger(__name__) DEFAULT_CHUNK_SIZE = 500 -DEFAULT_CHUNK_OVERLAP = 100 +DEFAULT_CHUNK_OVERLAP = 250 def clean_cell(val): From 8b78be11621d2eb77959304435ee12a4b664af88 Mon Sep 17 00:00:00 2001 From: dusvyat <13661123+dusvyat@users.noreply.github.com> Date: Fri, 19 Apr 2024 09:10:45 +0300 Subject: [PATCH 4/5] Add logging and refactor default vector store in langchain handler This change introduces logging for situations where 'vector_store_config' is not present in the `langchain_handler` tool configuration. It also modifies the condition that checks for the absence of this property to add a persisting directory. Furthermore, it refactors the code in `langchain_handler.py` related to the absence of 'embedding_model_args'. --- .../handlers/langchain_handler/langchain_handler.py | 4 +--- mindsdb/integrations/handlers/langchain_handler/tools.py | 9 ++++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/mindsdb/integrations/handlers/langchain_handler/langchain_handler.py b/mindsdb/integrations/handlers/langchain_handler/langchain_handler.py index c5c0a248414..469bee73559 100644 --- a/mindsdb/integrations/handlers/langchain_handler/langchain_handler.py +++ b/mindsdb/integrations/handlers/langchain_handler/langchain_handler.py @@ -218,14 +218,12 @@ def create_agent(self, df: pd.DataFrame, args: Dict=None, pred_args: Dict=None) # no embedding model args provided, use same provider as llm if not embeddings_args: logger.warning("'embedding_model_args' not found in input params, " - "Trying to use the same provider and model as used for llm. " + "Trying to use the same provider used for llm. " f"provider: {args['provider']}" - f"model: {args['model_name']}" ) # get args for embeddings model embeddings_args['class'] = args['provider'] - embeddings_args['model'] = args['model_name'] # create embeddings model pred_args['embeddings_model'] = self._create_embeddings_model(embeddings_args) diff --git a/mindsdb/integrations/handlers/langchain_handler/tools.py b/mindsdb/integrations/handlers/langchain_handler/tools.py index 90757e41e4e..9c65ed94d2e 100644 --- a/mindsdb/integrations/handlers/langchain_handler/tools.py +++ b/mindsdb/integrations/handlers/langchain_handler/tools.py @@ -19,6 +19,9 @@ from mindsdb.integrations.utilities.rag.rag_pipeline_builder import RAG from mindsdb.integrations.utilities.rag.settings import RAGPipelineModel from mindsdb.interfaces.skills.skill_tool import skill_tool, SkillType +from mindsdb.utilities import log + +logger = log.getLogger(__name__) # Individual tools # Note: all tools are defined in a closure to pass required args (apart from LLM input) through it, as custom tools don't allow custom field assignment. # noqa @@ -173,8 +176,11 @@ def _build_retrieval_tool(tool: dict, pred_args: dict): rag_params = _get_rag_params(tools_config) if 'vector_store_config' not in rag_params: + persist_dir = mindsdb_path('persisted_chroma') + rag_params['vector_store_config'] = {'persist_directory': persist_dir} - rag_params['vector_store_config'] = {'persist_directory': mindsdb_path('persisted_chroma')} + logger.warning("No 'vector_store_config' provided, using default vector store " + f"and persist_directory: {persist_dir}") rag_config = RAGPipelineModel(**rag_params) @@ -188,6 +194,7 @@ def _build_retrieval_tool(tool: dict, pred_args: dict): description=tool['description'] ) + def langchain_tool_from_skill(skill, pred_args): # Makes Langchain compatible tools from a skill tool = skill_tool.get_tool_from_skill(skill) From 98698e43a6142119713874e9ce815cd9529a6f39 Mon Sep 17 00:00:00 2001 From: dusvyat <13661123+dusvyat@users.noreply.github.com> Date: Fri, 19 Apr 2024 09:18:23 +0300 Subject: [PATCH 5/5] Remove default vector store from langchain handler The default vector store setup was removed from the langchain handler. The 'vector_store_config' is no longer automatically assigned, and an alert for this missing parameter is no longer logged. The code was adjusted to operate without the previously used 'mindsdb_path'. --- .../handlers/langchain_handler/langchain_handler.py | 1 - mindsdb/integrations/handlers/langchain_handler/tools.py | 9 --------- 2 files changed, 10 deletions(-) diff --git a/mindsdb/integrations/handlers/langchain_handler/langchain_handler.py b/mindsdb/integrations/handlers/langchain_handler/langchain_handler.py index 469bee73559..4680b49f52b 100644 --- a/mindsdb/integrations/handlers/langchain_handler/langchain_handler.py +++ b/mindsdb/integrations/handlers/langchain_handler/langchain_handler.py @@ -228,7 +228,6 @@ def create_agent(self, df: pd.DataFrame, args: Dict=None, pred_args: Dict=None) # create embeddings model pred_args['embeddings_model'] = self._create_embeddings_model(embeddings_args) pred_args['llm'] = llm - pred_args['mindsdb_path'] = self.engine_storage.folder_get tools = setup_tools(llm, model_kwargs, diff --git a/mindsdb/integrations/handlers/langchain_handler/tools.py b/mindsdb/integrations/handlers/langchain_handler/tools.py index 9c65ed94d2e..37bafd75d76 100644 --- a/mindsdb/integrations/handlers/langchain_handler/tools.py +++ b/mindsdb/integrations/handlers/langchain_handler/tools.py @@ -168,20 +168,11 @@ def _build_retrieval_tool(tool: dict, pred_args: dict): tools_config = tool['config'] - mindsdb_path = pred_args['mindsdb_path'] - # we update the config with the pred_args to allow for custom config tools_config.update(pred_args) rag_params = _get_rag_params(tools_config) - if 'vector_store_config' not in rag_params: - persist_dir = mindsdb_path('persisted_chroma') - rag_params['vector_store_config'] = {'persist_directory': persist_dir} - - logger.warning("No 'vector_store_config' provided, using default vector store " - f"and persist_directory: {persist_dir}") - rag_config = RAGPipelineModel(**rag_params) # build retriever