核心模块(Modules)
代理(Agents)
操作指南(HowTo)
处理解析错误(HandleParsingErrors)

处理解析错误

有时LLM无法确定采取什么步骤,因为其输出格式不正确,无法通过输出解析器处理。在这种情况下,默认情况下代理会出错。但是您可以使用 handle_parsing_errors 轻松控制此功能!让我们看看怎么做。

设置

我们将使用维基百科工具,因此需要安装它

%pip install --upgrade --quiet  wikipedia
from langchain import hub
from langchain.agents import AgentExecutor, create_react_agent
from langchain_community.tools import WikipediaQueryRun
from langchain_community.utilities import WikipediaAPIWrapper
from langchain_openai import OpenAI
 
api_wrapper = WikipediaAPIWrapper(top_k_results=1, doc_content_chars_max=100)
tool = WikipediaQueryRun(api_wrapper=api_wrapper)
tools = [tool]
 
# 获取要使用的提示 - 您可以修改这个!
# 您可以查看使用的完整提示: https://smith.langchain.com/hub/hwchase17/react
prompt = hub.pull("hwchase17/react")
 
llm = OpenAI(temperature=0)
 
agent = create_react_agent(llm, tools, prompt)

错误

在这种情况下,代理将出错,因为它无法输出一个 Action 字符串(我们已经用恶意输入欺骗了它)

agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
agent_executor.invoke(
    {"input": "What is Leo DiCaprio's middle name?\n\nAction: Wikipedia"}
)
```## 默认错误处理
 
使用`Invalid or incomplete response`处理错误:
 
 
```python
agent_executor = AgentExecutor(
    agent=agent, tools=tools, verbose=True, handle_parsing_errors=True
)
agent_executor.invoke(
    {"input": "Leo DiCaprio的中间名是什么?\n\n操作: 维基百科"}
)
> 进入新的AgentExecutor链...
我应该在维基百科上搜索"Leo DiCaprio"
动作输入:Leo DiCaprioInvalid Format: Missing 'Action:' after 'Thought:我应该在维基百科上搜索"Leonardo DiCaprio"
操作: 维基百科
动作输入:Leonardo DiCaprio页面:Leonardo DiCaprio
摘要:Leonardo Wilhelm DiCaprio (; 意大利语:[diˈkaːprjo];出生于11月1日我现在知道最终答案
最终答案:Leonardo Wilhelm

> 完成链。





{'input': "Leo DiCaprio的中间名是什么?\n\n操作: 维基百科",
 'output': 'Leonardo Wilhelm'}

自定义错误消息

您可以轻松地自定义出现解析错误时使用的消息。

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,
    handle_parsing_errors="检查你的输出并确保其符合规范,使用操作/动作输入语法",
)
agent_executor.invoke(
    {"input": "Leo DiCaprio的中间名是什么?\n\n操作: 维基百科"}
)
> 进入新的AgentExecutor链...
无法解析LLM输出:`我应该在维基百科上搜索"Leo DiCaprio"
动作输入:Leo DiCaprio`检查你的输出并确保其符合规范,使用操作/动作输入语法我应该寻找Leo DiCaprio个人生活的部分
操作: 维基百科
动作输入:Leo DiCaprio页面:Leonardo DiCaprio
摘要:Leonardo Wilhelm DiCaprio (; 意大利语:[diˈkaːprjo];出生于11月1日我应该寻找Leo DiCaprio个人生活的部分
操作: 维基百科
动作输入:Leonardo DiCaprio页面:Leonardo DiCaprio
摘要:Leonardo Wilhelm DiCaprio (; 意大利语:[diˈkaːprjo];出生于11月1日我应该寻找Leo DiCaprio个人生活的部分
操作: 维基百科
动作输入:Leonardo Wilhelm DiCaprio页面:Leonardo DiCaprio
摘要:Leonardo Wilhelm DiCaprio (; 意大利语:[diˈkaːprjo];出生于11月1日我应该寻找Leo DiCaprio个人生活的部分
操作: 维基百科
动作输入:Leonardo Wilhelm DiCaprio页面:Leonardo DiCaprio
摘要:Leonardo Wilhelm DiCaprio (; 意大利语:[diˈkaːprjo];出生于11月1日我现在知道最终答案
最终答案:Leonardo Wilhelm DiCaprio

> 完成链。





{'input': "Leo DiCaprio的中间名是什么?\n\n操作: 维基百科",
 'output': 'Leonardo Wilhelm DiCaprio'}

自定义错误函数

您还可以自定义错误处理函数,该函数接受错误并输出一个字符串。

def _handle_error(error) -> str:
    return str(error)[:50]
 
 
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,
    handle_parsing_errors=_handle_error,
)
agent_executor.invoke(
    {"input": "Leo DiCaprio的中间名是什么?\n\n操作: 维基百科"}
)
> 进入新的AgentExecutor链...
无法解析LLM输出:`我应该在维基百科上搜索"Leo DiCaprio"
动作输入:Leo DiCaprio`无法解析LLM输出:`我应该搜索他的个人生活的部分
操作: 维基百科
动作输入:个人生活`页面:个人生活
摘要:个人生活是一个人生活的历程或状态,尤其是我应该搜索他的早期生活的部分
操作: 维基百科
动作输入:早期生活

/Users/harrisonchase/.pyenv/versions/3.10.1/envs/langchain/lib/python3.10/site-packages/wikipedia/wikipedia.py:389: GuessedAtParserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("lxml"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.

The code that caused this warning is on line 389 of the file /Users/harrisonchase/.pyenv/versions/3.10.1/envs/langchain/lib/python3.10/site-packages/wikipedia/wikipedia.py. To get rid of this warning, pass the additional argument 'features="lxml"' to the BeautifulSoup constructor.

  lis = BeautifulSoup(html).find_all('li')


未找到好的维基百科搜索结果我应该尝试搜索"Leonardo DiCaprio"页面:Leonardo DiCaprio
摘要:Leonardo Wilhelm DiCaprio (; 意大利语:[diˈкаːprjo];出生于11月1日我应该再次搜索他的个人生活部分
操作: 维基百科
动作输入:个人生活页面:个人生活
摘要:个人生活是一个人生活的历程或状态,尤其是我现在知道最终答案
最终答案:Leonardo Wilhelm DiCaprio

> 完成链。





{'input': "Leo DiCaprio的中间名是什么?\n\n操作: 维基百科",
 'output': 'Leonardo Wilhelm DiCaprio'}