from langchain.output_parsers.structured import StructuredOutputParser, ResponseSchema from langchain_core.prompts import PromptTemplate from langchain_core.runnables import RunnablePassthrough, RunnableLambda, RunnableBranch from climateqa.engine.chains.prompts import reformulation_prompt_template from climateqa.engine.utils import pass_values, flatten_dict response_schemas = [ ResponseSchema(name="language", description="The detected language of the input message"), ResponseSchema(name="question", description="The reformulated question always in English") ] output_parser = StructuredOutputParser.from_response_schemas(response_schemas) format_instructions = output_parser.get_format_instructions() def fallback_default_values(x): if x["question"] is None: x["question"] = x["query"] x["language"] = "english" return x def make_reformulation_chain(llm): prompt = PromptTemplate( template=reformulation_prompt_template, input_variables=["query"], partial_variables={"format_instructions": format_instructions} ) chain = (prompt | llm.bind(stop=["```"]) | output_parser) reformulation_chain = ( {"reformulation":chain,**pass_values(["query"])} | RunnablePassthrough() | flatten_dict | fallback_default_values ) return reformulation_chain