Source code for langchain.agents.output_parsers.react_json_single_input

import json
import re
from typing import Union

from langchain_core.agents import AgentAction, AgentFinish
from langchain_core.exceptions import OutputParserException

from langchain.agents.agent import AgentOutputParser
from langchain.agents.chat.prompt import FORMAT_INSTRUCTIONS

FINAL_ANSWER_ACTION = "Final Answer:"


[docs]class ReActJsonSingleInputOutputParser(AgentOutputParser): """解析具有json格式中单个工具输入的ReAct风格LLM调用。 期望输出为以下两种格式之一。 如果输出信号表明应采取行动,则应采用以下格式。这将导致返回AgentAction。 ``` Thought: agent thought here Action: ``` { "action": "search", "action_input": "what is the temperature in SF" } ``` ``` 如果输出信号表明应给出最终答案,则应采用以下格式。这将导致返回AgentFinish。 ``` Thought: agent thought here Final Answer: The temperature is 100 degrees ```""" pattern = re.compile(r"^.*?`{3}(?:json)?\n?(.*?)`{3}.*?$", re.DOTALL) """用于解析输出的正则表达式模式。"""
[docs] def get_format_instructions(self) -> str: return FORMAT_INSTRUCTIONS
[docs] def parse(self, text: str) -> Union[AgentAction, AgentFinish]: includes_answer = FINAL_ANSWER_ACTION in text try: found = self.pattern.search(text) if not found: # Fast fail to parse Final Answer. raise ValueError("action not found") action = found.group(1) response = json.loads(action.strip()) includes_action = "action" in response if includes_answer and includes_action: raise OutputParserException( "Parsing LLM output produced a final answer " f"and a parse-able action: {text}" ) return AgentAction( response["action"], response.get("action_input", {}), text ) except Exception: if not includes_answer: raise OutputParserException(f"Could not parse LLM output: {text}") output = text.split(FINAL_ANSWER_ACTION)[-1].strip() return AgentFinish({"output": output}, text)
@property def _type(self) -> str: return "react-json-single-input"