In lecture Agents of LangChain for LLM Application Development, the following call
agent(“What is limit of sin(x)/x when x goes to 0?”) generated the following error message (note that I asked the same question to bard and openai chatGPT free version, both gave correct answer):
Entering new AgentExecutor chain…
Thought: This is a math question that requires evaluating a limit.
Action:
{
"action": "Calculator",
"action_input": "limit(sin(x)/x, x, 0)"
}
KeyError Traceback (most recent call last)
File /usr/local/lib/python3.9/site-packages/numexpr/necompiler.py:743, in getArguments(names, local_dict, global_dict)
742 try:
→ 743 a = local_dict[name]
744 except KeyError:
KeyError: ‘x’
During handling of the above exception, another exception occurred:
KeyError Traceback (most recent call last)
File /usr/local/lib/python3.9/site-packages/langchain/chains/llm_math/base.py:80, in LLMMathChain._evaluate_expression(self, expression)
78 local_dict = {“pi”: math.pi, “e”: math.e}
79 output = str(
—> 80 numexpr.evaluate(
81 expression.strip(),
82 global_dict={}, # restrict access to globals
83 local_dict=local_dict, # add common mathematical functions
84 )
85 )
86 except Exception as e:
File /usr/local/lib/python3.9/site-packages/numexpr/necompiler.py:819, in evaluate(ex, local_dict, global_dict, out, order, casting, **kwargs)
818 names, ex_uses_vml = _names_cache[expr_key]
→ 819 arguments = getArguments(names, local_dict, global_dict)
821 # Create a signature
File /usr/local/lib/python3.9/site-packages/numexpr/necompiler.py:745, in getArguments(names, local_dict, global_dict)
744 except KeyError:
→ 745 a = global_dict[name]
746 arguments.append(numpy.asarray(a))
KeyError: ‘x’
During handling of the above exception, another exception occurred:
ValueError Traceback (most recent call last)
Cell In[20], line 1
----> 1 agent(“What is limit of sin(x)/x when x goes to 0?”)
File /usr/local/lib/python3.9/site-packages/langchain/chains/base.py:140, in Chain.call(self, inputs, return_only_outputs, callbacks)
138 except (KeyboardInterrupt, Exception) as e:
139 run_manager.on_chain_error(e)
→ 140 raise e
141 run_manager.on_chain_end(outputs)
142 return self.prep_outputs(inputs, outputs, return_only_outputs)
File /usr/local/lib/python3.9/site-packages/langchain/chains/base.py:134, in Chain.call(self, inputs, return_only_outputs, callbacks)
128 run_manager = callback_manager.on_chain_start(
129 {“name”: self.class.name},
130 inputs,
131 )
132 try:
133 outputs = (
→ 134 self._call(inputs, run_manager=run_manager)
135 if new_arg_supported
136 else self._call(inputs)
137 )
138 except (KeyboardInterrupt, Exception) as e:
139 run_manager.on_chain_error(e)
File /usr/local/lib/python3.9/site-packages/langchain/agents/agent.py:951, in AgentExecutor._call(self, inputs, run_manager)
949 # We now enter the agent loop (until it returns something).
950 while self._should_continue(iterations, time_elapsed):
→ 951 next_step_output = self._take_next_step(
952 name_to_tool_map,
953 color_mapping,
954 inputs,
955 intermediate_steps,
956 run_manager=run_manager,
957 )
958 if isinstance(next_step_output, AgentFinish):
959 return self._return(
960 next_step_output, intermediate_steps, run_manager=run_manager
961 )
File /usr/local/lib/python3.9/site-packages/langchain/agents/agent.py:818, in AgentExecutor._take_next_step(self, name_to_tool_map, color_mapping, inputs, intermediate_steps, run_manager)
816 tool_run_kwargs[“llm_prefix”] = “”
817 # We then call the tool on the tool input to get an observation
→ 818 observation = tool.run(
819 agent_action.tool_input,
820 verbose=self.verbose,
821 color=color,
822 callbacks=run_manager.get_child() if run_manager else None,
823 **tool_run_kwargs,
824 )
825 else:
826 tool_run_kwargs = self.agent.tool_run_logging_kwargs()
File /usr/local/lib/python3.9/site-packages/langchain/tools/base.py:255, in BaseTool.run(self, tool_input, verbose, start_color, color, callbacks, **kwargs)
253 except (Exception, KeyboardInterrupt) as e:
254 run_manager.on_tool_error(e)
→ 255 raise e
256 run_manager.on_tool_end(str(observation), color=color, name=self.name, **kwargs)
257 return observation
File /usr/local/lib/python3.9/site-packages/langchain/tools/base.py:249, in BaseTool.run(self, tool_input, verbose, start_color, color, callbacks, **kwargs)
246 try:
247 tool_args, tool_kwargs = self._to_args_and_kwargs(parsed_input)
248 observation = (
→ 249 self._run(*tool_args, run_manager=run_manager, **tool_kwargs)
250 if new_arg_supported
251 else self._run(*tool_args, **tool_kwargs)
252 )
253 except (Exception, KeyboardInterrupt) as e:
254 run_manager.on_tool_error(e)
File /usr/local/lib/python3.9/site-packages/langchain/tools/base.py:344, in Tool._run(self, run_manager, *args, **kwargs)
341 “”“Use the tool.”“”
342 new_argument_supported = signature(self.func).parameters.get(“callbacks”)
343 return (
→ 344 self.func(
345 *args,
346 callbacks=run_manager.get_child() if run_manager else None,
347 **kwargs,
348 )
349 if new_argument_supported
350 else self.func(*args, **kwargs)
351 )
File /usr/local/lib/python3.9/site-packages/langchain/chains/base.py:236, in Chain.run(self, callbacks, *args, **kwargs)
234 if len(args) != 1:
235 raise ValueError(“run
supports only one positional argument.”)
→ 236 return self(args[0], callbacks=callbacks)[self.output_keys[0]]
238 if kwargs and not args:
239 return self(kwargs, callbacks=callbacks)[self.output_keys[0]]
File /usr/local/lib/python3.9/site-packages/langchain/chains/base.py:140, in Chain.call(self, inputs, return_only_outputs, callbacks)
138 except (KeyboardInterrupt, Exception) as e:
139 run_manager.on_chain_error(e)
→ 140 raise e
141 run_manager.on_chain_end(outputs)
142 return self.prep_outputs(inputs, outputs, return_only_outputs)
File /usr/local/lib/python3.9/site-packages/langchain/chains/base.py:134, in Chain.call(self, inputs, return_only_outputs, callbacks)
128 run_manager = callback_manager.on_chain_start(
129 {“name”: self.class.name},
130 inputs,
131 )
132 try:
133 outputs = (
→ 134 self._call(inputs, run_manager=run_manager)
135 if new_arg_supported
136 else self._call(inputs)
137 )
138 except (KeyboardInterrupt, Exception) as e:
139 run_manager.on_chain_error(e)
File /usr/local/lib/python3.9/site-packages/langchain/chains/llm_math/base.py:149, in LLMMathChain._call(self, inputs, run_manager)
143 _run_manager.on_text(inputs[self.input_key])
144 llm_output = self.llm_chain.predict(
145 question=inputs[self.input_key],
146 stop=[“```output”],
147 callbacks=_run_manager.get_child(),
148 )
→ 149 return self._process_llm_result(llm_output, _run_manager)
File /usr/local/lib/python3.9/site-packages/langchain/chains/llm_math/base.py:103, in LLMMathChain._process_llm_result(self, llm_output, run_manager)
101 if text_match:
102 expression = text_match.group(1)
→ 103 output = self._evaluate_expression(expression)
104 run_manager.on_text("\nAnswer: ", verbose=self.verbose)
105 run_manager.on_text(output, color=“yellow”, verbose=self.verbose)
File /usr/local/lib/python3.9/site-packages/langchain/chains/llm_math/base.py:87, in LLMMathChain._evaluate_expression(self, expression)
79 output = str(
80 numexpr.evaluate(
81 expression.strip(),
(…)
84 )
85 )
86 except Exception as e:
—> 87 raise ValueError(
88 f’LLMMathChain._evaluate(“{expression}”) raised error: {e}.’
89 " Please try again with a valid numerical expression"
90 )
92 # Remove any leading and trailing brackets from the output
93 return re.sub(r"^[|]$", “”, output)
ValueError: LLMMathChain._evaluate("
sin(x)/x
") raised error: ‘x’. Please try again with a valid numerical expression