Skip to content

Commit

Permalink
[Fix langchain-ai#3365]: Changed regex to cover new line before actio…
Browse files Browse the repository at this point in the history
…n serious (langchain-ai#3367)

Fix for: [Changed regex to cover new line before action
serious.](langchain-ai#3365)
---

This PR fixes the issue where `ValueError: Could not parse LLM output:`
was thrown on seems to be valid input.

Changed regex to cover new lines before action serious (after the
keywords "Action:" and "Action Input:").

regex101: https://regex101.com/r/CXl1kB/1

---------

Co-authored-by: msarskus <msarskus@cisco.com>
  • Loading branch information
2 people authored and samching committed May 1, 2023
1 parent 67a7114 commit 993b256
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 1 deletion.
4 changes: 3 additions & 1 deletion langchain/agents/mrkl/output_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ def parse(self, text: str) -> Union[AgentAction, AgentFinish]:
{"output": text.split(FINAL_ANSWER_ACTION)[-1].strip()}, text
)
# \s matches against tab/newline/whitespace
regex = r"Action\s*\d*\s*:(.*?)\nAction\s*\d*\s*Input\s*\d*\s*:[\s]*(.*)"
regex = (
r"Action\s*\d*\s*:[\s]*(.*?)[\s]*Action\s*\d*\s*Input\s*\d*\s*:[\s]*(.*)"
)
match = re.search(regex, text, re.DOTALL)
if not match:
raise OutputParserException(f"Could not parse LLM output: `{text}`")
Expand Down
21 changes: 21 additions & 0 deletions tests/unit_tests/agents/test_mrkl.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,27 @@ def test_get_action_and_input_newline() -> None:
assert action_input == "```\nimport unittest\n\nunittest.main()\n```"


def test_get_action_and_input_newline_after_keyword() -> None:
"""Test getting an action and action input from the text
when there is a new line before the action
(after the keywords "Action:" and "Action Input:")
"""
llm_output = """
I can use the `ls` command to list the contents of the directory \
and `grep` to search for the specific file.
Action:
Terminal
Action Input:
ls -l ~/.bashrc.d/
"""

action, action_input = get_action_and_input(llm_output)
assert action == "Terminal"
assert action_input == "ls -l ~/.bashrc.d/\n"


def test_get_final_answer() -> None:
"""Test getting final answer."""
llm_output = (
Expand Down

0 comments on commit 993b256

Please sign in to comment.