From 2281f00198625ca155b0f3b87c2c147e0c0f4bbe Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 7 Feb 2024 22:46:17 +0100 Subject: [PATCH] langchain: Standardize `output_parser.py` across all agent types for custom `FORMAT_INSTRUCTIONS` (#17168) - **Description:** This PR standardizes the `output_parser.py` file across all agent types to ensure a uniform parsing mechanism is implemented. It introduces a cohesive structure and common interface for output parsing, facilitating easier modifications and extensions by users. The standardized approach enhances maintainability and scalability of the codebase by providing a consistent pattern for output parsing, which can be easily understood and utilized across different agent types. This PR builds upon the foundation set by a previously merged PR, which focused exclusively on standardizing the `output_parser.py` for the `conversational_agent` ([PR #16945](https://github.com/langchain-ai/langchain/pull/16945)). With this new update, I extend the standardization efforts to encompass `output_parser.py` files across all agent types. This enhancement not only unifies the parsing mechanism across the board but also introduces the flexibility for users to incorporate custom `FORMAT_INSTRUCTIONS`. - **Issue:** https://github.com/langchain-ai/langchain/issues/10721 https://github.com/langchain-ai/langchain/issues/4044 - **Dependencies:** No new dependencies required for this change - **Twitter handle:** With my github user is enough. Thanks I hope you accept my PR. --- libs/langchain/langchain/agents/chat/output_parser.py | 6 +++++- .../langchain/agents/conversational/output_parser.py | 6 +++++- .../langchain/agents/conversational_chat/output_parser.py | 1 + libs/langchain/langchain/agents/mrkl/output_parser.py | 6 +++++- .../langchain/agents/structured_chat/output_parser.py | 7 ++++++- 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/libs/langchain/langchain/agents/chat/output_parser.py b/libs/langchain/langchain/agents/chat/output_parser.py index 069a7fdbb5c..cdb8c0d0dae 100644 --- a/libs/langchain/langchain/agents/chat/output_parser.py +++ b/libs/langchain/langchain/agents/chat/output_parser.py @@ -14,11 +14,15 @@ FINAL_ANSWER_ACTION = "Final Answer:" class ChatOutputParser(AgentOutputParser): """Output parser for the chat agent.""" + format_instructions: str = FORMAT_INSTRUCTIONS + """Default formatting instructions""" + pattern = re.compile(r"^.*?`{3}(?:json)?\n(.*?)`{3}.*?$", re.DOTALL) """Regex pattern to parse the output.""" def get_format_instructions(self) -> str: - return FORMAT_INSTRUCTIONS + """Returns formatting instructions for the given output parser.""" + return self.format_instructions def parse(self, text: str) -> Union[AgentAction, AgentFinish]: includes_answer = FINAL_ANSWER_ACTION in text diff --git a/libs/langchain/langchain/agents/conversational/output_parser.py b/libs/langchain/langchain/agents/conversational/output_parser.py index 6d0446b81bf..e74e626faa9 100644 --- a/libs/langchain/langchain/agents/conversational/output_parser.py +++ b/libs/langchain/langchain/agents/conversational/output_parser.py @@ -14,8 +14,12 @@ class ConvoOutputParser(AgentOutputParser): ai_prefix: str = "AI" """Prefix to use before AI output.""" + format_instructions: str = FORMAT_INSTRUCTIONS + """Default formatting instructions""" + def get_format_instructions(self) -> str: - return FORMAT_INSTRUCTIONS + """Returns formatting instructions for the given output parser.""" + return self.format_instructions def parse(self, text: str) -> Union[AgentAction, AgentFinish]: if f"{self.ai_prefix}:" in text: diff --git a/libs/langchain/langchain/agents/conversational_chat/output_parser.py b/libs/langchain/langchain/agents/conversational_chat/output_parser.py index ea3a380f4bc..6fd330ccf8d 100644 --- a/libs/langchain/langchain/agents/conversational_chat/output_parser.py +++ b/libs/langchain/langchain/agents/conversational_chat/output_parser.py @@ -15,6 +15,7 @@ class ConvoOutputParser(AgentOutputParser): """Output parser for the conversational agent.""" format_instructions: str = FORMAT_INSTRUCTIONS + """Default formatting instructions""" def get_format_instructions(self) -> str: """Returns formatting instructions for the given output parser.""" diff --git a/libs/langchain/langchain/agents/mrkl/output_parser.py b/libs/langchain/langchain/agents/mrkl/output_parser.py index b716c49db48..f6489c2a792 100644 --- a/libs/langchain/langchain/agents/mrkl/output_parser.py +++ b/libs/langchain/langchain/agents/mrkl/output_parser.py @@ -22,8 +22,12 @@ FINAL_ANSWER_AND_PARSABLE_ACTION_ERROR_MESSAGE = ( class MRKLOutputParser(AgentOutputParser): """MRKL Output parser for the chat agent.""" + format_instructions: str = FORMAT_INSTRUCTIONS + """Default formatting instructions""" + def get_format_instructions(self) -> str: - return FORMAT_INSTRUCTIONS + """Returns formatting instructions for the given output parser.""" + return self.format_instructions def parse(self, text: str) -> Union[AgentAction, AgentFinish]: includes_answer = FINAL_ANSWER_ACTION in text diff --git a/libs/langchain/langchain/agents/structured_chat/output_parser.py b/libs/langchain/langchain/agents/structured_chat/output_parser.py index eb85d6684b6..2f91a8352a0 100644 --- a/libs/langchain/langchain/agents/structured_chat/output_parser.py +++ b/libs/langchain/langchain/agents/structured_chat/output_parser.py @@ -20,10 +20,15 @@ logger = logging.getLogger(__name__) class StructuredChatOutputParser(AgentOutputParser): """Output parser for the structured chat agent.""" + format_instructions: str = FORMAT_INSTRUCTIONS + """Default formatting instructions""" + pattern = re.compile(r"```(?:json\s+)?(\W.*?)```", re.DOTALL) + """Regex pattern to parse the output.""" def get_format_instructions(self) -> str: - return FORMAT_INSTRUCTIONS + """Returns formatting instructions for the given output parser.""" + return self.format_instructions def parse(self, text: str) -> Union[AgentAction, AgentFinish]: try: