Source code for langchain_experimental.llm_symbolic_math.base
"""Chain that interprets a prompt and executes python code to do symbolic math."""from__future__importannotationsimportrefromtypingimportAny,Dict,List,Optionalfromlangchain.base_languageimportBaseLanguageModelfromlangchain.chains.baseimportChainfromlangchain.chains.llmimportLLMChainfromlangchain_core.callbacks.managerimport(AsyncCallbackManagerForChainRun,CallbackManagerForChainRun,)fromlangchain_core.prompts.baseimportBasePromptTemplatefromlangchain_experimental.llm_symbolic_math.promptimportPROMPT
[docs]classLLMSymbolicMathChain(Chain):"""Chain that interprets a prompt and executes python code to do symbolic math. It is based on the sympy library and can be used to evaluate mathematical expressions. See https://www.sympy.org/ for more information. Example: .. code-block:: python from langchain.chains import LLMSymbolicMathChain from langchain_community.llms import OpenAI llm_symbolic_math = LLMSymbolicMathChain.from_llm(OpenAI()) """llm_chain:LLMChaininput_key:str="question"#: :meta private:output_key:str="answer"#: :meta private:classConfig:arbitrary_types_allowed=Trueextra="forbid"@propertydefinput_keys(self)->List[str]:"""Expect input key. :meta private: """return[self.input_key]@propertydefoutput_keys(self)->List[str]:"""Expect output key. :meta private: """return[self.output_key]def_evaluate_expression(self,expression:str)->str:try:importsympyexceptImportErrorase:raiseImportError("Unable to import sympy, please install it with `pip install sympy`.")frometry:output=str(sympy.sympify(expression,evaluate=True))exceptExceptionase:raiseValueError(f'LLMSymbolicMathChain._evaluate("{expression}") raised error: {e}.'" Please try again with a valid numerical expression")# Remove any leading and trailing brackets from the outputreturnre.sub(r"^\[|\]$","",output)def_process_llm_result(self,llm_output:str,run_manager:CallbackManagerForChainRun)->Dict[str,str]:run_manager.on_text(llm_output,color="green",verbose=self.verbose)llm_output=llm_output.strip()text_match=re.search(r"^```text(.*?)```",llm_output,re.DOTALL)iftext_match:expression=text_match.group(1)output=self._evaluate_expression(expression)run_manager.on_text("\nAnswer: ",verbose=self.verbose)run_manager.on_text(output,color="yellow",verbose=self.verbose)answer="Answer: "+outputelifllm_output.startswith("Answer:"):answer=llm_outputelif"Answer:"inllm_output:answer="Answer: "+llm_output.split("Answer:")[-1]else:raiseValueError(f"unknown format from LLM: {llm_output}")return{self.output_key:answer}asyncdef_aprocess_llm_result(self,llm_output:str,run_manager:AsyncCallbackManagerForChainRun,)->Dict[str,str]:awaitrun_manager.on_text(llm_output,color="green",verbose=self.verbose)llm_output=llm_output.strip()text_match=re.search(r"^```text(.*?)```",llm_output,re.DOTALL)iftext_match:expression=text_match.group(1)output=self._evaluate_expression(expression)awaitrun_manager.on_text("\nAnswer: ",verbose=self.verbose)awaitrun_manager.on_text(output,color="yellow",verbose=self.verbose)answer="Answer: "+outputelifllm_output.startswith("Answer:"):answer=llm_outputelif"Answer:"inllm_output:answer="Answer: "+llm_output.split("Answer:")[-1]else:raiseValueError(f"unknown format from LLM: {llm_output}")return{self.output_key:answer}def_call(self,inputs:Dict[str,str],run_manager:Optional[CallbackManagerForChainRun]=None,)->Dict[str,str]:_run_manager=run_managerorCallbackManagerForChainRun.get_noop_manager()_run_manager.on_text(inputs[self.input_key])llm_output=self.llm_chain.predict(question=inputs[self.input_key],stop=["```output"],callbacks=_run_manager.get_child(),)returnself._process_llm_result(llm_output,_run_manager)asyncdef_acall(self,inputs:Dict[str,str],run_manager:Optional[AsyncCallbackManagerForChainRun]=None,)->Dict[str,str]:_run_manager=run_managerorAsyncCallbackManagerForChainRun.get_noop_manager()await_run_manager.on_text(inputs[self.input_key])llm_output=awaitself.llm_chain.apredict(question=inputs[self.input_key],stop=["```output"],callbacks=_run_manager.get_child(),)returnawaitself._aprocess_llm_result(llm_output,_run_manager)@propertydef_chain_type(self)->str:return"llm_symbolic_math_chain"