Source code for langchain.chains.query_constructor.base
"""LLM Chain for turning a user text query into a structured query."""from__future__importannotationsimportjsonfromtypingimportAny,Callable,List,Optional,Sequence,Tuple,Union,castfromlangchain_core._apiimportdeprecatedfromlangchain_core.exceptionsimportOutputParserExceptionfromlangchain_core.language_modelsimportBaseLanguageModelfromlangchain_core.output_parsersimportBaseOutputParserfromlangchain_core.output_parsers.jsonimportparse_and_check_json_markdownfromlangchain_core.promptsimportBasePromptTemplatefromlangchain_core.prompts.few_shotimportFewShotPromptTemplatefromlangchain_core.runnablesimportRunnablefromlangchain_core.structured_queryimport(Comparator,Comparison,FilterDirective,Operation,Operator,StructuredQuery,)fromlangchain.chains.llmimportLLMChainfromlangchain.chains.query_constructor.parserimportget_parserfromlangchain.chains.query_constructor.promptimport(DEFAULT_EXAMPLES,DEFAULT_PREFIX,DEFAULT_SCHEMA_PROMPT,DEFAULT_SUFFIX,EXAMPLE_PROMPT,EXAMPLES_WITH_LIMIT,PREFIX_WITH_DATA_SOURCE,SCHEMA_WITH_LIMIT_PROMPT,SUFFIX_WITHOUT_DATA_SOURCE,USER_SPECIFIED_EXAMPLE_PROMPT,)fromlangchain.chains.query_constructor.schemaimportAttributeInfo
[docs]classStructuredQueryOutputParser(BaseOutputParser[StructuredQuery]):"""Output parser that parses a structured query."""ast_parse:Callable"""Callable that parses dict into internal representation of query language."""
[docs]defparse(self,text:str)->StructuredQuery:try:expected_keys=["query","filter"]allowed_keys=["query","filter","limit"]parsed=parse_and_check_json_markdown(text,expected_keys)ifparsed["query"]isNoneorlen(parsed["query"])==0:parsed["query"]=" "ifparsed["filter"]=="NO_FILTER"ornotparsed["filter"]:parsed["filter"]=Noneelse:parsed["filter"]=self.ast_parse(parsed["filter"])ifnotparsed.get("limit"):parsed.pop("limit",None)returnStructuredQuery(**{k:vfork,vinparsed.items()ifkinallowed_keys})exceptExceptionase:raiseOutputParserException(f"Parsing text\n{text}\n raised following error:\n{e}")
[docs]@classmethoddeffrom_components(cls,allowed_comparators:Optional[Sequence[Comparator]]=None,allowed_operators:Optional[Sequence[Operator]]=None,allowed_attributes:Optional[Sequence[str]]=None,fix_invalid:bool=False,)->StructuredQueryOutputParser:""" Create a structured query output parser from components. Args: allowed_comparators: allowed comparators allowed_operators: allowed operators Returns: a structured query output parser """ast_parse:Callableiffix_invalid:defast_parse(raw_filter:str)->Optional[FilterDirective]:filter=cast(Optional[FilterDirective],get_parser().parse(raw_filter))fixed=fix_filter_directive(filter,allowed_comparators=allowed_comparators,allowed_operators=allowed_operators,allowed_attributes=allowed_attributes,)returnfixedelse:ast_parse=get_parser(allowed_comparators=allowed_comparators,allowed_operators=allowed_operators,allowed_attributes=allowed_attributes,).parsereturncls(ast_parse=ast_parse)
[docs]deffix_filter_directive(filter:Optional[FilterDirective],*,allowed_comparators:Optional[Sequence[Comparator]]=None,allowed_operators:Optional[Sequence[Operator]]=None,allowed_attributes:Optional[Sequence[str]]=None,)->Optional[FilterDirective]:"""Fix invalid filter directive. Args: filter: Filter directive to fix. allowed_comparators: allowed comparators. Defaults to all comparators. allowed_operators: allowed operators. Defaults to all operators. allowed_attributes: allowed attributes. Defaults to all attributes. Returns: Fixed filter directive. """if(not(allowed_comparatorsorallowed_operatorsorallowed_attributes))ornotfilter:returnfilterelifisinstance(filter,Comparison):ifallowed_comparatorsandfilter.comparatornotinallowed_comparators:returnNoneifallowed_attributesandfilter.attributenotinallowed_attributes:returnNonereturnfilterelifisinstance(filter,Operation):ifallowed_operatorsandfilter.operatornotinallowed_operators:returnNoneargs=[cast(FilterDirective,fix_filter_directive(arg,allowed_comparators=allowed_comparators,allowed_operators=allowed_operators,allowed_attributes=allowed_attributes,),)forarginfilter.argumentsifargisnotNone]ifnotargs:returnNoneeliflen(args)==1andfilter.operatorin(Operator.AND,Operator.OR):returnargs[0]else:returnOperation(operator=filter.operator,arguments=args,)else:returnfilter
[docs]defconstruct_examples(input_output_pairs:Sequence[Tuple[str,dict]])->List[dict]:"""Construct examples from input-output pairs. Args: input_output_pairs: Sequence of input-output pairs. Returns: List of examples. """examples=[]fori,(_input,output)inenumerate(input_output_pairs):structured_request=(json.dumps(output,indent=4).replace("{","{{").replace("}","}}"))example={"i":i+1,"user_query":_input,"structured_request":structured_request,}examples.append(example)returnexamples
[docs]defget_query_constructor_prompt(document_contents:str,attribute_info:Sequence[Union[AttributeInfo,dict]],*,examples:Optional[Sequence]=None,allowed_comparators:Sequence[Comparator]=tuple(Comparator),allowed_operators:Sequence[Operator]=tuple(Operator),enable_limit:bool=False,schema_prompt:Optional[BasePromptTemplate]=None,**kwargs:Any,)->BasePromptTemplate:"""Create query construction prompt. Args: document_contents: The contents of the document to be queried. attribute_info: A list of AttributeInfo objects describing the attributes of the document. examples: Optional list of examples to use for the chain. allowed_comparators: Sequence of allowed comparators. allowed_operators: Sequence of allowed operators. enable_limit: Whether to enable the limit operator. Defaults to False. schema_prompt: Prompt for describing query schema. Should have string input variables allowed_comparators and allowed_operators. kwargs: Additional named params to pass to FewShotPromptTemplate init. Returns: A prompt template that can be used to construct queries. """default_schema_prompt=(SCHEMA_WITH_LIMIT_PROMPTifenable_limitelseDEFAULT_SCHEMA_PROMPT)schema_prompt=schema_promptordefault_schema_promptattribute_str=_format_attribute_info(attribute_info)schema=schema_prompt.format(allowed_comparators=" | ".join(allowed_comparators),allowed_operators=" | ".join(allowed_operators),)ifexamplesandisinstance(examples[0],tuple):examples=construct_examples(examples)example_prompt=USER_SPECIFIED_EXAMPLE_PROMPTprefix=PREFIX_WITH_DATA_SOURCE.format(schema=schema,content=document_contents,attributes=attribute_str)suffix=SUFFIX_WITHOUT_DATA_SOURCE.format(i=len(examples)+1)else:examples=examplesor(EXAMPLES_WITH_LIMITifenable_limitelseDEFAULT_EXAMPLES)example_prompt=EXAMPLE_PROMPTprefix=DEFAULT_PREFIX.format(schema=schema)suffix=DEFAULT_SUFFIX.format(i=len(examples)+1,content=document_contents,attributes=attribute_str)returnFewShotPromptTemplate(examples=list(examples),example_prompt=example_prompt,input_variables=["query"],suffix=suffix,prefix=prefix,**kwargs,)
[docs]@deprecated(since="0.2.13",alternative="load_query_constructor_runnable",removal="1.0",)defload_query_constructor_chain(llm:BaseLanguageModel,document_contents:str,attribute_info:Sequence[Union[AttributeInfo,dict]],examples:Optional[List]=None,allowed_comparators:Sequence[Comparator]=tuple(Comparator),allowed_operators:Sequence[Operator]=tuple(Operator),enable_limit:bool=False,schema_prompt:Optional[BasePromptTemplate]=None,**kwargs:Any,)->LLMChain:"""Load a query constructor chain. Args: llm: BaseLanguageModel to use for the chain. document_contents: The contents of the document to be queried. attribute_info: Sequence of attributes in the document. examples: Optional list of examples to use for the chain. allowed_comparators: Sequence of allowed comparators. Defaults to all Comparators. allowed_operators: Sequence of allowed operators. Defaults to all Operators. enable_limit: Whether to enable the limit operator. Defaults to False. schema_prompt: Prompt for describing query schema. Should have string input variables allowed_comparators and allowed_operators. **kwargs: Arbitrary named params to pass to LLMChain. Returns: A LLMChain that can be used to construct queries. """prompt=get_query_constructor_prompt(document_contents,attribute_info,examples=examples,allowed_comparators=allowed_comparators,allowed_operators=allowed_operators,enable_limit=enable_limit,schema_prompt=schema_prompt,)allowed_attributes=[]forainfoinattribute_info:allowed_attributes.append(ainfo.nameifisinstance(ainfo,AttributeInfo)elseainfo["name"])output_parser=StructuredQueryOutputParser.from_components(allowed_comparators=allowed_comparators,allowed_operators=allowed_operators,allowed_attributes=allowed_attributes,)# For backwards compatibility.prompt.output_parser=output_parserreturnLLMChain(llm=llm,prompt=prompt,output_parser=output_parser,**kwargs)
[docs]defload_query_constructor_runnable(llm:BaseLanguageModel,document_contents:str,attribute_info:Sequence[Union[AttributeInfo,dict]],*,examples:Optional[Sequence]=None,allowed_comparators:Sequence[Comparator]=tuple(Comparator),allowed_operators:Sequence[Operator]=tuple(Operator),enable_limit:bool=False,schema_prompt:Optional[BasePromptTemplate]=None,fix_invalid:bool=False,**kwargs:Any,)->Runnable:"""Load a query constructor runnable chain. Args: llm: BaseLanguageModel to use for the chain. document_contents: Description of the page contents of the document to be queried. attribute_info: Sequence of attributes in the document. examples: Optional list of examples to use for the chain. allowed_comparators: Sequence of allowed comparators. Defaults to all Comparators. allowed_operators: Sequence of allowed operators. Defaults to all Operators. enable_limit: Whether to enable the limit operator. Defaults to False. schema_prompt: Prompt for describing query schema. Should have string input variables allowed_comparators and allowed_operators. fix_invalid: Whether to fix invalid filter directives by ignoring invalid operators, comparators and attributes. kwargs: Additional named params to pass to FewShotPromptTemplate init. Returns: A Runnable that can be used to construct queries. """prompt=get_query_constructor_prompt(document_contents,attribute_info,examples=examples,allowed_comparators=allowed_comparators,allowed_operators=allowed_operators,enable_limit=enable_limit,schema_prompt=schema_prompt,**kwargs,)allowed_attributes=[]forainfoinattribute_info:allowed_attributes.append(ainfo.nameifisinstance(ainfo,AttributeInfo)elseainfo["name"])output_parser=StructuredQueryOutputParser.from_components(allowed_comparators=allowed_comparators,allowed_operators=allowed_operators,allowed_attributes=allowed_attributes,fix_invalid=fix_invalid,)returnprompt|llm|output_parser