Source code for langchain.output_parsers.fix

from __future__ import annotations

from typing import Any, TypeVar

from langchain_core.exceptions import OutputParserException
from langchain_core.language_models import BaseLanguageModel
from langchain_core.output_parsers import BaseOutputParser
from langchain_core.prompts import BasePromptTemplate

from langchain.output_parsers.prompts import NAIVE_FIX_PROMPT

T = TypeVar("T")


[docs]class OutputFixingParser(BaseOutputParser[T]): """封装一个解析器并尝试修复解析错误。"""
[docs] @classmethod def is_lc_serializable(cls) -> bool: return True
parser: BaseOutputParser[T] """用于解析输出的解析器。""" # Should be an LLMChain but we want to avoid top-level imports from langchain.chains retry_chain: Any """用于重试完成的LLMChain。""" max_retries: int = 1 """最大重试解析次数。"""
[docs] @classmethod def from_llm( cls, llm: BaseLanguageModel, parser: BaseOutputParser[T], prompt: BasePromptTemplate = NAIVE_FIX_PROMPT, max_retries: int = 1, ) -> OutputFixingParser[T]: """从语言模型和解析器创建一个OutputFixingParser。 参数: llm:用于修复的llm parser:用于解析的解析器 prompt:用于修复的提示 max_retries:最大重试解析次数。 返回: OutputFixingParser """ from langchain.chains.llm import LLMChain chain = LLMChain(llm=llm, prompt=prompt) return cls(parser=parser, retry_chain=chain, max_retries=max_retries)
[docs] def parse(self, completion: str) -> T: retries = 0 while retries <= self.max_retries: try: return self.parser.parse(completion) except OutputParserException as e: if retries == self.max_retries: raise e else: retries += 1 completion = self.retry_chain.run( instructions=self.parser.get_format_instructions(), completion=completion, error=repr(e), ) raise OutputParserException("Failed to parse")
[docs] async def aparse(self, completion: str) -> T: retries = 0 while retries <= self.max_retries: try: return await self.parser.aparse(completion) except OutputParserException as e: if retries == self.max_retries: raise e else: retries += 1 completion = await self.retry_chain.arun( instructions=self.parser.get_format_instructions(), completion=completion, error=repr(e), ) raise OutputParserException("Failed to parse")
[docs] def get_format_instructions(self) -> str: return self.parser.get_format_instructions()
@property def _type(self) -> str: return "output_fixing"